diff --git a/.github/labeler.yml b/.github/labeler.yml index 321f074e1..d3961e5d7 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -10,15 +10,15 @@ local: cli: - cli/**/* +metrics: + - cli/metrics/**/* + api: - api/**/* - - protos/**/* + - cli/server/protos/**/* ci: - .github/**/* documentation: - docs/**/* - -metrics: - - metrics/**/* diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d2af599b2..40a64fec7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,7 +64,6 @@ jobs: run: make -f builder.Makefile cross - name: Test - env: run: make -f builder.Makefile test - name: Build for local E2E diff --git a/Makefile b/Makefile index 557852deb..0bf71ebb7 100644 --- a/Makefile +++ b/Makefile @@ -44,16 +44,16 @@ cli: ## Compile the cli --output ./bin e2e-local: ## Run End to end local tests. Set E2E_TEST=TestName to run a single test - go test -count=1 -v $(TEST_FLAGS) ./tests/e2e ./tests/compose-e2e ./tests/skip-win-ci-e2e ./local/e2e + go test -count=1 -v $(TEST_FLAGS) ./local/e2e/compose ./local/e2e/container ./local/e2e/cli-only e2e-win-ci: ## Run end to end local tests on Windows CI, no Docker for Linux containers available ATM. Set E2E_TEST=TestName to run a single test - go test -count=1 -v $(TEST_FLAGS) ./tests/e2e + go test -count=1 -v $(TEST_FLAGS) ./local/e2e/cli-only e2e-aci: ## Run End to end ACI tests. Set E2E_TEST=TestName to run a single test - go test -count=1 -v $(TEST_FLAGS) ./tests/aci-e2e + go test -count=1 -v $(TEST_FLAGS) ./aci/e2e e2e-ecs: ## Run End to end ECS tests. Set E2E_TEST=TestName to run a single test - go test -timeout 20m -count=1 -v $(TEST_FLAGS) ./tests/ecs-e2e + go test -timeout 20m -count=1 -v $(TEST_FLAGS) ./ecs/e2e/ecs ./ecs/e2e/ecs-local cross: ## Compile the CLI for linux, darwin and windows @docker build . --target cross \ diff --git a/tests/composefiles/aci-demo/aci_demo_port_secrets.yaml b/aci/e2e/aci-demo/aci_demo_port_secrets.yaml similarity index 100% rename from tests/composefiles/aci-demo/aci_demo_port_secrets.yaml rename to aci/e2e/aci-demo/aci_demo_port_secrets.yaml diff --git a/tests/composefiles/aci-demo/aci_demo_port_volumes.yaml b/aci/e2e/aci-demo/aci_demo_port_volumes.yaml similarity index 100% rename from tests/composefiles/aci-demo/aci_demo_port_volumes.yaml rename to aci/e2e/aci-demo/aci_demo_port_volumes.yaml diff --git a/tests/composefiles/aci-demo/db/Dockerfile b/aci/e2e/aci-demo/db/Dockerfile similarity index 100% rename from tests/composefiles/aci-demo/db/Dockerfile rename to aci/e2e/aci-demo/db/Dockerfile diff --git a/tests/composefiles/aci-demo/db/words.sql b/aci/e2e/aci-demo/db/words.sql similarity index 100% rename from tests/composefiles/aci-demo/db/words.sql rename to aci/e2e/aci-demo/db/words.sql diff --git a/tests/composefiles/demo_multi_port.yaml b/aci/e2e/aci-demo/demo_multi_port.yaml similarity index 100% rename from tests/composefiles/demo_multi_port.yaml rename to aci/e2e/aci-demo/demo_multi_port.yaml diff --git a/tests/composefiles/aci-demo/img/dockercon-barcelona-logo.svg b/aci/e2e/aci-demo/img/dockercon-barcelona-logo.svg similarity index 100% rename from tests/composefiles/aci-demo/img/dockercon-barcelona-logo.svg rename to aci/e2e/aci-demo/img/dockercon-barcelona-logo.svg diff --git a/tests/composefiles/aci-demo/img/dockercon_EU_17.jpg b/aci/e2e/aci-demo/img/dockercon_EU_17.jpg similarity index 100% rename from tests/composefiles/aci-demo/img/dockercon_EU_17.jpg rename to aci/e2e/aci-demo/img/dockercon_EU_17.jpg diff --git a/tests/composefiles/aci-demo/my_secret1.txt b/aci/e2e/aci-demo/my_secret1.txt similarity index 100% rename from tests/composefiles/aci-demo/my_secret1.txt rename to aci/e2e/aci-demo/my_secret1.txt diff --git a/tests/composefiles/aci-demo/my_secret2.txt b/aci/e2e/aci-demo/my_secret2.txt similarity index 100% rename from tests/composefiles/aci-demo/my_secret2.txt rename to aci/e2e/aci-demo/my_secret2.txt diff --git a/tests/composefiles/aci-demo/web/Dockerfile b/aci/e2e/aci-demo/web/Dockerfile similarity index 100% rename from tests/composefiles/aci-demo/web/Dockerfile rename to aci/e2e/aci-demo/web/Dockerfile diff --git a/tests/composefiles/aci-demo/web/dispatcher.go b/aci/e2e/aci-demo/web/dispatcher.go similarity index 100% rename from tests/composefiles/aci-demo/web/dispatcher.go rename to aci/e2e/aci-demo/web/dispatcher.go diff --git a/tests/composefiles/aci-demo/web/static/angular.min.js b/aci/e2e/aci-demo/web/static/angular.min.js similarity index 100% rename from tests/composefiles/aci-demo/web/static/angular.min.js rename to aci/e2e/aci-demo/web/static/angular.min.js diff --git a/tests/composefiles/aci-demo/web/static/app.js b/aci/e2e/aci-demo/web/static/app.js similarity index 100% rename from tests/composefiles/aci-demo/web/static/app.js rename to aci/e2e/aci-demo/web/static/app.js diff --git a/tests/composefiles/aci-demo/web/static/favicon.ico b/aci/e2e/aci-demo/web/static/favicon.ico similarity index 100% rename from tests/composefiles/aci-demo/web/static/favicon.ico rename to aci/e2e/aci-demo/web/static/favicon.ico diff --git a/tests/composefiles/aci-demo/web/static/fonts/font1.woff2 b/aci/e2e/aci-demo/web/static/fonts/font1.woff2 similarity index 100% rename from tests/composefiles/aci-demo/web/static/fonts/font1.woff2 rename to aci/e2e/aci-demo/web/static/fonts/font1.woff2 diff --git a/tests/composefiles/aci-demo/web/static/fonts/font2.woff2 b/aci/e2e/aci-demo/web/static/fonts/font2.woff2 similarity index 100% rename from tests/composefiles/aci-demo/web/static/fonts/font2.woff2 rename to aci/e2e/aci-demo/web/static/fonts/font2.woff2 diff --git a/tests/composefiles/aci-demo/web/static/images/dockercon-log.png b/aci/e2e/aci-demo/web/static/images/dockercon-log.png similarity index 100% rename from tests/composefiles/aci-demo/web/static/images/dockercon-log.png rename to aci/e2e/aci-demo/web/static/images/dockercon-log.png diff --git a/tests/composefiles/aci-demo/web/static/images/dockercon-logo-2020.png b/aci/e2e/aci-demo/web/static/images/dockercon-logo-2020.png similarity index 100% rename from tests/composefiles/aci-demo/web/static/images/dockercon-logo-2020.png rename to aci/e2e/aci-demo/web/static/images/dockercon-logo-2020.png diff --git a/tests/composefiles/aci-demo/web/static/images/homes.png b/aci/e2e/aci-demo/web/static/images/homes.png similarity index 100% rename from tests/composefiles/aci-demo/web/static/images/homes.png rename to aci/e2e/aci-demo/web/static/images/homes.png diff --git a/tests/composefiles/aci-demo/web/static/images/lego_blue.png b/aci/e2e/aci-demo/web/static/images/lego_blue.png similarity index 100% rename from tests/composefiles/aci-demo/web/static/images/lego_blue.png rename to aci/e2e/aci-demo/web/static/images/lego_blue.png diff --git a/tests/composefiles/aci-demo/web/static/images/lego_light_blue.png b/aci/e2e/aci-demo/web/static/images/lego_light_blue.png similarity index 100% rename from tests/composefiles/aci-demo/web/static/images/lego_light_blue.png rename to aci/e2e/aci-demo/web/static/images/lego_light_blue.png diff --git a/tests/composefiles/aci-demo/web/static/images/lego_yellow.png b/aci/e2e/aci-demo/web/static/images/lego_yellow.png similarity index 100% rename from tests/composefiles/aci-demo/web/static/images/lego_yellow.png rename to aci/e2e/aci-demo/web/static/images/lego_yellow.png diff --git a/tests/composefiles/aci-demo/web/static/images/logo.svg b/aci/e2e/aci-demo/web/static/images/logo.svg similarity index 100% rename from tests/composefiles/aci-demo/web/static/images/logo.svg rename to aci/e2e/aci-demo/web/static/images/logo.svg diff --git a/tests/composefiles/aci-demo/web/static/index.html b/aci/e2e/aci-demo/web/static/index.html similarity index 100% rename from tests/composefiles/aci-demo/web/static/index.html rename to aci/e2e/aci-demo/web/static/index.html diff --git a/tests/composefiles/aci-demo/web/static/style.css b/aci/e2e/aci-demo/web/static/style.css similarity index 100% rename from tests/composefiles/aci-demo/web/static/style.css rename to aci/e2e/aci-demo/web/static/style.css diff --git a/tests/composefiles/aci-demo/words/.dockerignore b/aci/e2e/aci-demo/words/.dockerignore similarity index 100% rename from tests/composefiles/aci-demo/words/.dockerignore rename to aci/e2e/aci-demo/words/.dockerignore diff --git a/tests/composefiles/aci-demo/words/Dockerfile b/aci/e2e/aci-demo/words/Dockerfile similarity index 100% rename from tests/composefiles/aci-demo/words/Dockerfile rename to aci/e2e/aci-demo/words/Dockerfile diff --git a/tests/composefiles/aci-demo/words/pom.xml b/aci/e2e/aci-demo/words/pom.xml similarity index 100% rename from tests/composefiles/aci-demo/words/pom.xml rename to aci/e2e/aci-demo/words/pom.xml diff --git a/tests/composefiles/aci-demo/words/src/main/java/Main.java b/aci/e2e/aci-demo/words/src/main/java/Main.java similarity index 100% rename from tests/composefiles/aci-demo/words/src/main/java/Main.java rename to aci/e2e/aci-demo/words/src/main/java/Main.java diff --git a/tests/composefiles/aci_secrets_resources/compose.yml b/aci/e2e/aci_secrets_resources/compose.yml similarity index 100% rename from tests/composefiles/aci_secrets_resources/compose.yml rename to aci/e2e/aci_secrets_resources/compose.yml diff --git a/tests/composefiles/aci_secrets_resources/my_secret1.txt b/aci/e2e/aci_secrets_resources/my_secret1.txt similarity index 100% rename from tests/composefiles/aci_secrets_resources/my_secret1.txt rename to aci/e2e/aci_secrets_resources/my_secret1.txt diff --git a/tests/composefiles/aci_secrets_resources/my_secret2.txt b/aci/e2e/aci_secrets_resources/my_secret2.txt similarity index 100% rename from tests/composefiles/aci_secrets_resources/my_secret2.txt rename to aci/e2e/aci_secrets_resources/my_secret2.txt diff --git a/tests/composefiles/aci_secrets_resources/web/Dockerfile b/aci/e2e/aci_secrets_resources/web/Dockerfile similarity index 100% rename from tests/composefiles/aci_secrets_resources/web/Dockerfile rename to aci/e2e/aci_secrets_resources/web/Dockerfile diff --git a/tests/composefiles/aci_secrets_resources/web/main.go b/aci/e2e/aci_secrets_resources/web/main.go similarity index 100% rename from tests/composefiles/aci_secrets_resources/web/main.go rename to aci/e2e/aci_secrets_resources/web/main.go diff --git a/tests/aci-e2e/e2e-aci_test.go b/aci/e2e/e2e-aci_test.go similarity index 98% rename from tests/aci-e2e/e2e-aci_test.go rename to aci/e2e/e2e-aci_test.go index 0ac81b976..669297d74 100644 --- a/tests/aci-e2e/e2e-aci_test.go +++ b/aci/e2e/e2e-aci_test.go @@ -542,10 +542,9 @@ func TestUpSecretsResources(t *testing.T) { secret2Name = "mysecret2" secret2Value = "another_password\n" ) - var ( - basefilePath = filepath.Join("..", "composefiles", "aci_secrets_resources") - composefilePath = filepath.Join(basefilePath, "compose.yml") - ) + + composefilePath := filepath.Join("aci_secrets_resources", "compose.yml") + c := NewParallelE2eCLI(t, binDir) _, _, _ = setupTestResourceGroup(t, c) @@ -660,13 +659,12 @@ func TestUpUpdate(t *testing.T) { composeAccountName := strings.ToLower(strings.ReplaceAll(groupID, "-", "") + "sa") dstDir := filepath.Join(os.TempDir(), "e2e-aci-volume-"+composeAccountName) - srcDir := filepath.Join("..", "composefiles", "aci-demo") - err := fileutil.CopyDirs(srcDir, dstDir) + err := fileutil.CopyDirs("aci-demo", dstDir) assert.NilError(t, err) t.Cleanup(func() { assert.NilError(t, os.RemoveAll(dstDir)) }) - _, err = fileutils.CopyFile(filepath.Join(filepath.Join("..", "composefiles"), multiPortComposefile), filepath.Join(dstDir, multiPortComposefile)) + _, err = fileutils.CopyFile(filepath.Join(filepath.Join("aci-demo"), multiPortComposefile), filepath.Join(dstDir, multiPortComposefile)) assert.NilError(t, err) singlePortVolumesComposefile = filepath.Join(dstDir, singlePortVolumesComposefile) diff --git a/tests/ecs-local-e2e/context_test.go b/ecs/e2e/ecs-local/context_test.go similarity index 100% rename from tests/ecs-local-e2e/context_test.go rename to ecs/e2e/ecs-local/context_test.go diff --git a/tests/ecs-e2e/e2e-ecs_test.go b/ecs/e2e/ecs/e2e-ecs_test.go similarity index 98% rename from tests/ecs-e2e/e2e-ecs_test.go rename to ecs/e2e/ecs/e2e-ecs_test.go index 739f79447..4c5d08dd6 100644 --- a/tests/ecs-e2e/e2e-ecs_test.go +++ b/ecs/e2e/ecs/e2e-ecs_test.go @@ -81,7 +81,7 @@ func TestCompose(t *testing.T) { c, stack := setupTest(t) t.Run("compose up", func(t *testing.T) { - c.RunDockerCmd("compose", "up", "--project-name", stack, "-f", "../composefiles/ecs_e2e/multi_port_secrets.yaml") + c.RunDockerCmd("compose", "up", "--project-name", stack, "-f", "./multi_port_secrets.yaml") }) var webURL, wordsURL, secretsURL string @@ -133,7 +133,7 @@ func TestCompose(t *testing.T) { }) t.Run("Words GET validating cross service connection", func(t *testing.T) { - out := HTTPGetWithRetry(t, wordsURL, http.StatusOK, 5*time.Second, 240*time.Second) + out := HTTPGetWithRetry(t, wordsURL, http.StatusOK, 5*time.Second, 300*time.Second) assert.Assert(t, strings.Contains(out, `"word":`)) }) diff --git a/tests/composefiles/ecs_e2e/multi_port_secrets.yaml b/ecs/e2e/ecs/multi_port_secrets.yaml similarity index 100% rename from tests/composefiles/ecs_e2e/multi_port_secrets.yaml rename to ecs/e2e/ecs/multi_port_secrets.yaml diff --git a/tests/composefiles/ecs_e2e/my_secret1.txt b/ecs/e2e/ecs/my_secret1.txt similarity index 100% rename from tests/composefiles/ecs_e2e/my_secret1.txt rename to ecs/e2e/ecs/my_secret1.txt diff --git a/tests/e2e/e2e_test.go b/local/e2e/cli-only/e2e_test.go similarity index 100% rename from tests/e2e/e2e_test.go rename to local/e2e/cli-only/e2e_test.go diff --git a/tests/e2e/testdata/ls-out-default-windows.golden b/local/e2e/cli-only/testdata/ls-out-default-windows.golden similarity index 100% rename from tests/e2e/testdata/ls-out-default-windows.golden rename to local/e2e/cli-only/testdata/ls-out-default-windows.golden diff --git a/tests/e2e/testdata/ls-out-default.golden b/local/e2e/cli-only/testdata/ls-out-default.golden similarity index 100% rename from tests/e2e/testdata/ls-out-default.golden rename to local/e2e/cli-only/testdata/ls-out-default.golden diff --git a/tests/e2e/testdata/ls-out-json-windows.golden b/local/e2e/cli-only/testdata/ls-out-json-windows.golden similarity index 100% rename from tests/e2e/testdata/ls-out-json-windows.golden rename to local/e2e/cli-only/testdata/ls-out-json-windows.golden diff --git a/tests/e2e/testdata/ls-out-json.golden b/local/e2e/cli-only/testdata/ls-out-json.golden similarity index 100% rename from tests/e2e/testdata/ls-out-json.golden rename to local/e2e/cli-only/testdata/ls-out-json.golden diff --git a/tests/e2e/testdata/ls-out-legacy-json-windows.golden b/local/e2e/cli-only/testdata/ls-out-legacy-json-windows.golden similarity index 100% rename from tests/e2e/testdata/ls-out-legacy-json-windows.golden rename to local/e2e/cli-only/testdata/ls-out-legacy-json-windows.golden diff --git a/tests/e2e/testdata/ls-out-legacy-json.golden b/local/e2e/cli-only/testdata/ls-out-legacy-json.golden similarity index 100% rename from tests/e2e/testdata/ls-out-legacy-json.golden rename to local/e2e/cli-only/testdata/ls-out-legacy-json.golden diff --git a/tests/e2e/testdata/ls-out-test-docker-quiet.golden b/local/e2e/cli-only/testdata/ls-out-test-docker-quiet.golden similarity index 100% rename from tests/e2e/testdata/ls-out-test-docker-quiet.golden rename to local/e2e/cli-only/testdata/ls-out-test-docker-quiet.golden diff --git a/tests/e2e/testdata/ls-out-test-docker-windows.golden b/local/e2e/cli-only/testdata/ls-out-test-docker-windows.golden similarity index 100% rename from tests/e2e/testdata/ls-out-test-docker-windows.golden rename to local/e2e/cli-only/testdata/ls-out-test-docker-windows.golden diff --git a/tests/e2e/testdata/ls-out-test-docker.golden b/local/e2e/cli-only/testdata/ls-out-test-docker.golden similarity index 100% rename from tests/e2e/testdata/ls-out-test-docker.golden rename to local/e2e/cli-only/testdata/ls-out-test-docker.golden diff --git a/tests/compose-e2e/compose_test.go b/local/e2e/compose/compose_test.go similarity index 99% rename from tests/compose-e2e/compose_test.go rename to local/e2e/compose/compose_test.go index 8b17a09b2..5c73dbb2b 100644 --- a/tests/compose-e2e/compose_test.go +++ b/local/e2e/compose/compose_test.go @@ -264,7 +264,7 @@ func TestLocalComposeVolume(t *testing.T) { res := c.RunDockerCmd("inspect", "compose-e2e-volume_nginx2_1", "--format", "{{ json .Mounts }}") output := res.Stdout() //nolint - assert.Assert(t, strings.Contains(output, `"Destination":"/usr/src/app/node_modules","Driver":"local","Mode":"","RW":true,"Propagation":""`)) + assert.Assert(t, strings.Contains(output, `"Destination":"/usr/src/app/node_modules","Driver":"local","Mode":"","RW":true,"Propagation":""`), output) }) t.Run("check container bind-mounts specs", func(t *testing.T) { diff --git a/tests/compose-e2e/fixtures/build-test/docker-compose.yml b/local/e2e/compose/fixtures/build-test/docker-compose.yml similarity index 100% rename from tests/compose-e2e/fixtures/build-test/docker-compose.yml rename to local/e2e/compose/fixtures/build-test/docker-compose.yml diff --git a/tests/compose-e2e/fixtures/build-test/nginx-build/Dockerfile b/local/e2e/compose/fixtures/build-test/nginx-build/Dockerfile similarity index 100% rename from tests/compose-e2e/fixtures/build-test/nginx-build/Dockerfile rename to local/e2e/compose/fixtures/build-test/nginx-build/Dockerfile diff --git a/tests/compose-e2e/fixtures/build-test/nginx-build/static/index.html b/local/e2e/compose/fixtures/build-test/nginx-build/static/index.html similarity index 100% rename from tests/compose-e2e/fixtures/build-test/nginx-build/static/index.html rename to local/e2e/compose/fixtures/build-test/nginx-build/static/index.html diff --git a/tests/compose-e2e/fixtures/logs-test/compose.yaml b/local/e2e/compose/fixtures/logs-test/compose.yaml similarity index 100% rename from tests/compose-e2e/fixtures/logs-test/compose.yaml rename to local/e2e/compose/fixtures/logs-test/compose.yaml diff --git a/tests/compose-e2e/fixtures/network-test/docker-compose.yaml b/local/e2e/compose/fixtures/network-test/docker-compose.yaml similarity index 100% rename from tests/compose-e2e/fixtures/network-test/docker-compose.yaml rename to local/e2e/compose/fixtures/network-test/docker-compose.yaml diff --git a/tests/compose-e2e/fixtures/run-test/docker-compose.yml b/local/e2e/compose/fixtures/run-test/docker-compose.yml similarity index 100% rename from tests/compose-e2e/fixtures/run-test/docker-compose.yml rename to local/e2e/compose/fixtures/run-test/docker-compose.yml diff --git a/tests/compose-e2e/fixtures/sentences/docker-compose.yaml b/local/e2e/compose/fixtures/sentences/docker-compose.yaml similarity index 100% rename from tests/compose-e2e/fixtures/sentences/docker-compose.yaml rename to local/e2e/compose/fixtures/sentences/docker-compose.yaml diff --git a/tests/compose-e2e/fixtures/simple-composefile/docker-compose.yml b/local/e2e/compose/fixtures/simple-composefile/docker-compose.yml similarity index 100% rename from tests/compose-e2e/fixtures/simple-composefile/docker-compose.yml rename to local/e2e/compose/fixtures/simple-composefile/docker-compose.yml diff --git a/tests/compose-e2e/fixtures/volume-test/docker-compose.yml b/local/e2e/compose/fixtures/volume-test/docker-compose.yml similarity index 100% rename from tests/compose-e2e/fixtures/volume-test/docker-compose.yml rename to local/e2e/compose/fixtures/volume-test/docker-compose.yml diff --git a/tests/compose-e2e/fixtures/volume-test/nginx-build/Dockerfile b/local/e2e/compose/fixtures/volume-test/nginx-build/Dockerfile similarity index 100% rename from tests/compose-e2e/fixtures/volume-test/nginx-build/Dockerfile rename to local/e2e/compose/fixtures/volume-test/nginx-build/Dockerfile diff --git a/tests/compose-e2e/fixtures/volume-test/static/index.html b/local/e2e/compose/fixtures/volume-test/static/index.html similarity index 100% rename from tests/compose-e2e/fixtures/volume-test/static/index.html rename to local/e2e/compose/fixtures/volume-test/static/index.html diff --git a/tests/compose-e2e/logs_test.go b/local/e2e/compose/logs_test.go similarity index 100% rename from tests/compose-e2e/logs_test.go rename to local/e2e/compose/logs_test.go diff --git a/local/e2e/backend_test.go b/local/e2e/container/container_test.go similarity index 80% rename from local/e2e/backend_test.go rename to local/e2e/container/container_test.go index a04f5cc70..cbd520143 100644 --- a/local/e2e/backend_test.go +++ b/local/e2e/container/container_test.go @@ -17,6 +17,7 @@ package e2e import ( + "encoding/json" "fmt" "os" "strings" @@ -24,10 +25,10 @@ import ( "time" "gotest.tools/v3/assert" - "gotest.tools/v3/assert/cmp" "gotest.tools/v3/icmd" "gotest.tools/v3/poll" + "github.com/docker/compose-cli/cli/cmd" . "github.com/docker/compose-cli/tests/framework" ) @@ -80,15 +81,38 @@ func TestLocalBackendRun(t *testing.T) { }) t.Run("run with ports", func(t *testing.T) { - res := c.RunDockerCmd("run", "-d", "-p", "80", "nginx") + res := c.RunDockerCmd("run", "-d", "-p", "85:80", "nginx") containerName := strings.TrimSpace(res.Combined()) t.Cleanup(func() { _ = c.RunDockerOrExitError("rm", "-f", containerName) }) res = c.RunDockerCmd("inspect", containerName) - res.Assert(t, icmd.Expected{Out: `"Status": "running"`}) + + inspect := &cmd.ContainerInspectView{} + err := json.Unmarshal([]byte(res.Stdout()), inspect) + assert.NilError(t, err) + assert.Equal(t, inspect.Status, "running") + nginxID := inspect.ID + res = c.RunDockerCmd("ps") - assert.Assert(t, cmp.Regexp(`0\.0\.0\.0:\d*->80/tcp`, res.Stdout())) + nginxFound := false + lines := Lines(res.Stdout()) + for _, line := range lines { + fields := strings.Fields(line) + if fields[0] == nginxID { + nginxFound = true + assert.Equal(t, fields[1], "nginx") + assert.Equal(t, fields[2], "/docker-entrypoint.sh") + assert.Equal(t, fields[len(fields)-1], "0.0.0.0:85->80/tcp") + } + } + assert.Assert(t, nginxFound, res.Stdout()) + + res = c.RunDockerCmd("ps", "--format", "json") + res.Assert(t, icmd.Expected{Out: `"Image":"nginx","Status":"Up Less than a second","Command":"/docker-entrypoint.sh nginx -g 'daemon off;'","Ports":["0.0.0.0:85->80/tcp"`}) + + res = c.RunDockerCmd("ps", "--quiet") + res.Assert(t, icmd.Expected{Out: nginxID + "\n"}) }) t.Run("run with volume", func(t *testing.T) { diff --git a/local/e2e/container/skip_win_ci_test.go b/local/e2e/container/skip_win_ci_test.go new file mode 100644 index 000000000..db53fb1f9 --- /dev/null +++ b/local/e2e/container/skip_win_ci_test.go @@ -0,0 +1,83 @@ +/* + Copyright 2020 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package e2e + +import ( + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strings" + "syscall" + "testing" + "time" + + "gotest.tools/v3/assert" + "gotest.tools/v3/icmd" + "gotest.tools/v3/poll" + + . "github.com/docker/compose-cli/tests/framework" +) + +func TestKillChildProcess(t *testing.T) { + assert.Assert(t, runtime.GOOS != "windows", "cannot test process signals on windows") + c := NewParallelE2eCLI(t, binDir) + + image := "test-sleep-image" + psCmd := icmd.Command("ps", "-x") + psRes := icmd.RunCmd(psCmd) + psRes.Assert(t, icmd.Success) + assert.Assert(t, !strings.Contains(psRes.Combined(), image)) + + d := writeDockerfile(t) + buildArgs := []string{"build", "--no-cache", "-t", image, "."} + cmd := c.NewDockerCmd(buildArgs...) + cmd.Dir = d + res := icmd.StartCmd(cmd) + + buildRunning := func(t poll.LogT) poll.Result { + res := icmd.RunCmd(psCmd) + if strings.Contains(res.Combined(), strings.Join(buildArgs, " ")) { + return poll.Success() + } + return poll.Continue("waiting for child process to be running") + } + poll.WaitOn(t, buildRunning, poll.WithDelay(1*time.Second)) + + err := res.Cmd.Process.Signal(syscall.SIGTERM) + assert.NilError(t, err) + buildStopped := func(t poll.LogT) poll.Result { + res := icmd.RunCmd(psCmd) + if !strings.Contains(res.Combined(), strings.Join(buildArgs, " ")) { + return poll.Success() + } + return poll.Continue("waiting for child process to be killed") + } + poll.WaitOn(t, buildStopped, poll.WithDelay(1*time.Second), poll.WithTimeout(60*time.Second)) +} + +func writeDockerfile(t *testing.T) string { + d, err := ioutil.TempDir("", "") + assert.NilError(t, err) + t.Cleanup(func() { + _ = os.RemoveAll(d) + }) + err = ioutil.WriteFile(filepath.Join(d, "Dockerfile"), []byte(`FROM alpine:3.10 +RUN sleep 100`), 0644) + assert.NilError(t, err) + return d +} diff --git a/tests/skip-win-ci-e2e/testdata/ls-out-test-local.golden b/local/e2e/container/testdata/ls-out-test-local.golden similarity index 100% rename from tests/skip-win-ci-e2e/testdata/ls-out-test-local.golden rename to local/e2e/container/testdata/ls-out-test-local.golden diff --git a/tests/skip-win-ci-e2e/skip_win_ci_test.go b/tests/skip-win-ci-e2e/skip_win_ci_test.go deleted file mode 100644 index 8a52e2dce..000000000 --- a/tests/skip-win-ci-e2e/skip_win_ci_test.go +++ /dev/null @@ -1,161 +0,0 @@ -/* - Copyright 2020 Docker Compose CLI authors - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -package main - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strings" - "syscall" - "testing" - "time" - - "gotest.tools/golden" - "gotest.tools/v3/assert" - "gotest.tools/v3/icmd" - "gotest.tools/v3/poll" - - "github.com/docker/compose-cli/cli/cmd" - . "github.com/docker/compose-cli/tests/framework" -) - -var binDir string - -func TestMain(m *testing.M) { - p, cleanup, err := SetupExistingCLI() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - binDir = p - exitCode := m.Run() - cleanup() - os.Exit(exitCode) -} - -func TestKillChildProcess(t *testing.T) { - c := NewParallelE2eCLI(t, binDir) - - image := "test-sleep-image" - pCmd := icmd.Command("ps", "-x") - if runtime.GOOS == "windows" { - pCmd = icmd.Command("tasklist") - } - pRes := icmd.RunCmd(pCmd) - pRes.Assert(t, icmd.Success) - assert.Assert(t, !strings.Contains(pRes.Combined(), image)) - - d := writeDockerfile(t) - buildArgs := []string{"build", "--no-cache", "-t", image, "."} - cmd := c.NewDockerCmd(buildArgs...) - cmd.Dir = d - res := icmd.StartCmd(cmd) - - buildRunning := func(t poll.LogT) poll.Result { - res := icmd.RunCmd(pCmd) - if strings.Contains(res.Combined(), strings.Join(buildArgs, " ")) { - return poll.Success() - } - return poll.Continue("waiting for child process to be running") - } - poll.WaitOn(t, buildRunning, poll.WithDelay(1*time.Second)) - - if runtime.GOOS == "windows" { - err := res.Cmd.Process.Kill() - assert.NilError(t, err) - } else { - err := res.Cmd.Process.Signal(syscall.SIGTERM) - assert.NilError(t, err) - } - buildStopped := func(t poll.LogT) poll.Result { - res := icmd.RunCmd(pCmd) - if !strings.Contains(res.Combined(), strings.Join(buildArgs, " ")) { - return poll.Success() - } - return poll.Continue("waiting for child process to be killed") - } - poll.WaitOn(t, buildStopped, poll.WithDelay(1*time.Second), poll.WithTimeout(60*time.Second)) -} - -// no linux containers on GHA Windows CI nodes (windows server) -func TestLocalContainers(t *testing.T) { - c := NewParallelE2eCLI(t, binDir) - c.RunDockerCmd("context", "create", "local", "test-local") - res := c.RunDockerCmd("context", "use", "test-local") - res.Assert(t, icmd.Expected{Out: "test-local"}) - - t.Run("use", func(t *testing.T) { - res := c.RunDockerCmd("context", "show") - res.Assert(t, icmd.Expected{Out: "test-local"}) - res = c.RunDockerCmd("context", "ls") - golden.Assert(t, res.Stdout(), GoldenFile("ls-out-test-local")) - }) - - var nginxContainerName string - t.Run("run", func(t *testing.T) { - res := c.RunDockerCmd("run", "-d", "-p", "85:80", "nginx") - nginxContainerName = strings.TrimSpace(res.Stdout()) - }) - defer c.RunDockerOrExitError("rm", "-f", nginxContainerName) - - var nginxID string - t.Run("inspect", func(t *testing.T) { - res = c.RunDockerCmd("inspect", nginxContainerName) - - inspect := &cmd.ContainerInspectView{} - err := json.Unmarshal([]byte(res.Stdout()), inspect) - assert.NilError(t, err) - nginxID = inspect.ID - }) - - t.Run("ps", func(t *testing.T) { - res = c.RunDockerCmd("ps") - lines := Lines(res.Stdout()) - nginxFound := false - for _, line := range lines { - fields := strings.Fields(line) - if fields[0] == nginxID { - nginxFound = true - assert.Equal(t, fields[1], "nginx") - assert.Equal(t, fields[2], "/docker-entrypoint.sh") - } - } - assert.Assert(t, nginxFound, res.Stdout()) - - res = c.RunDockerCmd("ps", "--format", "json") - res.Assert(t, icmd.Expected{Out: `"Image":"nginx","Status":"Up Less than a second","Command":"/docker-entrypoint.sh nginx -g 'daemon off;'","Ports":["0.0.0.0:85->80/tcp"`}) - - res = c.RunDockerCmd("ps", "--quiet") - res.Assert(t, icmd.Expected{Out: nginxID + "\n"}) - }) -} - -func writeDockerfile(t *testing.T) string { - d, err := ioutil.TempDir("", "") - assert.NilError(t, err) - t.Cleanup(func() { - _ = os.RemoveAll(d) - }) - err = ioutil.WriteFile(filepath.Join(d, "Dockerfile"), []byte(`FROM alpine:3.10 -RUN sleep 100`), 0644) - assert.NilError(t, err) - return d -}