mirror of https://github.com/docker/compose.git
Merge pull request #9609 from milas/e2e-pause
e2e: split out `pause` tests and add more cases
This commit is contained in:
commit
06649442eb
|
@ -0,0 +1,9 @@
|
||||||
|
services:
|
||||||
|
a:
|
||||||
|
image: nginx:alpine
|
||||||
|
ports: [80]
|
||||||
|
b:
|
||||||
|
image: nginx:alpine
|
||||||
|
ports: [80]
|
||||||
|
depends_on:
|
||||||
|
- a
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
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 (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
"gotest.tools/v3/icmd"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPause(t *testing.T) {
|
||||||
|
cli := NewParallelCLI(t, WithEnv(
|
||||||
|
"COMPOSE_PROJECT_NAME=e2e-pause",
|
||||||
|
"COMPOSE_FILE=./fixtures/pause/compose.yaml"))
|
||||||
|
|
||||||
|
cleanup := func() {
|
||||||
|
cli.RunDockerComposeCmd(t, "down", "-v", "--remove-orphans", "-t", "0")
|
||||||
|
}
|
||||||
|
cleanup()
|
||||||
|
t.Cleanup(cleanup)
|
||||||
|
|
||||||
|
// launch both services and verify that they are accessible
|
||||||
|
cli.RunDockerComposeCmd(t, "up", "-d")
|
||||||
|
urls := map[string]string{
|
||||||
|
"a": urlForService(t, cli, "a", 80),
|
||||||
|
"b": urlForService(t, cli, "b", 80),
|
||||||
|
}
|
||||||
|
for _, url := range urls {
|
||||||
|
HTTPGetWithRetry(t, url, http.StatusOK, 50*time.Millisecond, 5*time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
// pause a and verify that it can no longer be hit but b still can
|
||||||
|
cli.RunDockerComposeCmd(t, "pause", "a")
|
||||||
|
httpClient := http.Client{Timeout: 250 * time.Millisecond}
|
||||||
|
resp, err := httpClient.Get(urls["a"])
|
||||||
|
if resp != nil {
|
||||||
|
_ = resp.Body.Close()
|
||||||
|
}
|
||||||
|
require.Error(t, err, "a should no longer respond")
|
||||||
|
require.True(t, err.(net.Error).Timeout(), "Error should have indicated a timeout")
|
||||||
|
HTTPGetWithRetry(t, urls["b"], http.StatusOK, 50*time.Millisecond, 5*time.Second)
|
||||||
|
|
||||||
|
// unpause a and verify that both containers work again
|
||||||
|
cli.RunDockerComposeCmd(t, "unpause", "a")
|
||||||
|
for _, url := range urls {
|
||||||
|
HTTPGetWithRetry(t, url, http.StatusOK, 50*time.Millisecond, 5*time.Second)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPauseServiceNotRunning(t *testing.T) {
|
||||||
|
cli := NewParallelCLI(t, WithEnv(
|
||||||
|
"COMPOSE_PROJECT_NAME=e2e-pause-svc-not-running",
|
||||||
|
"COMPOSE_FILE=./fixtures/pause/compose.yaml"))
|
||||||
|
|
||||||
|
cleanup := func() {
|
||||||
|
cli.RunDockerComposeCmd(t, "down", "-v", "--remove-orphans", "-t", "0")
|
||||||
|
}
|
||||||
|
cleanup()
|
||||||
|
t.Cleanup(cleanup)
|
||||||
|
|
||||||
|
// pause a and verify that it can no longer be hit but b still can
|
||||||
|
res := cli.RunDockerComposeCmdNoCheck(t, "pause", "a")
|
||||||
|
|
||||||
|
// TODO: `docker pause` errors in this case, should Compose be consistent?
|
||||||
|
res.Assert(t, icmd.Expected{ExitCode: 0})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPauseServiceAlreadyPaused(t *testing.T) {
|
||||||
|
cli := NewParallelCLI(t, WithEnv(
|
||||||
|
"COMPOSE_PROJECT_NAME=e2e-pause-svc-already-paused",
|
||||||
|
"COMPOSE_FILE=./fixtures/pause/compose.yaml"))
|
||||||
|
|
||||||
|
cleanup := func() {
|
||||||
|
cli.RunDockerComposeCmd(t, "down", "-v", "--remove-orphans", "-t", "0")
|
||||||
|
}
|
||||||
|
cleanup()
|
||||||
|
t.Cleanup(cleanup)
|
||||||
|
|
||||||
|
// launch a and wait for it to come up
|
||||||
|
cli.RunDockerComposeCmd(t, "up", "-d", "a")
|
||||||
|
HTTPGetWithRetry(t, urlForService(t, cli, "a", 80), http.StatusOK, 50*time.Millisecond, 5*time.Second)
|
||||||
|
|
||||||
|
// pause a twice - first time should pass, second time fail
|
||||||
|
cli.RunDockerComposeCmd(t, "pause", "a")
|
||||||
|
res := cli.RunDockerComposeCmdNoCheck(t, "pause", "a")
|
||||||
|
res.Assert(t, icmd.Expected{ExitCode: 1, Err: "already paused"})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPauseServiceDoesNotExist(t *testing.T) {
|
||||||
|
cli := NewParallelCLI(t, WithEnv(
|
||||||
|
"COMPOSE_PROJECT_NAME=e2e-pause-svc-not-exist",
|
||||||
|
"COMPOSE_FILE=./fixtures/pause/compose.yaml"))
|
||||||
|
|
||||||
|
cleanup := func() {
|
||||||
|
cli.RunDockerComposeCmd(t, "down", "-v", "--remove-orphans", "-t", "0")
|
||||||
|
}
|
||||||
|
cleanup()
|
||||||
|
t.Cleanup(cleanup)
|
||||||
|
|
||||||
|
// pause a and verify that it can no longer be hit but b still can
|
||||||
|
res := cli.RunDockerComposeCmdNoCheck(t, "pause", "does_not_exist")
|
||||||
|
// TODO: `compose down does_not_exist` and similar error, this should too
|
||||||
|
res.Assert(t, icmd.Expected{ExitCode: 0})
|
||||||
|
}
|
||||||
|
|
||||||
|
func urlForService(t testing.TB, cli *CLI, service string, targetPort int) string {
|
||||||
|
t.Helper()
|
||||||
|
return fmt.Sprintf(
|
||||||
|
"http://localhost:%d",
|
||||||
|
publishedPortForService(t, cli, service, targetPort),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func publishedPortForService(t testing.TB, cli *CLI, service string, targetPort int) int {
|
||||||
|
t.Helper()
|
||||||
|
res := cli.RunDockerComposeCmd(t, "ps", "--format=json", service)
|
||||||
|
var psOut []struct {
|
||||||
|
Publishers []struct {
|
||||||
|
TargetPort int
|
||||||
|
PublishedPort int
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require.NoError(t, json.Unmarshal([]byte(res.Stdout()), &psOut),
|
||||||
|
"Failed to parse `%s` output", res.Cmd.String())
|
||||||
|
require.Len(t, psOut, 1, "Expected exactly 1 service")
|
||||||
|
svc := psOut[0]
|
||||||
|
for _, pp := range svc.Publishers {
|
||||||
|
if pp.TargetPort == targetPort {
|
||||||
|
return pp.PublishedPort
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require.Failf(t, "No published port for target port",
|
||||||
|
"Target port: %d\nService: %s", targetPort, res.Combined())
|
||||||
|
return -1
|
||||||
|
}
|
|
@ -78,20 +78,6 @@ func TestStartStop(t *testing.T) {
|
||||||
testify.Regexp(t, getProjectRegx("running"), res.Stdout())
|
testify.Regexp(t, getProjectRegx("running"), res.Stdout())
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("pause project", func(t *testing.T) {
|
|
||||||
c.RunDockerComposeCmd(t, "-f", "./fixtures/start-stop/compose.yaml", "--project-name", projectName, "pause")
|
|
||||||
|
|
||||||
res := c.RunDockerComposeCmd(t, "ls", "--all")
|
|
||||||
testify.Regexp(t, getProjectRegx("paused"), res.Stdout())
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("unpause project", func(t *testing.T) {
|
|
||||||
c.RunDockerComposeCmd(t, "-f", "./fixtures/start-stop/compose.yaml", "--project-name", projectName, "unpause")
|
|
||||||
|
|
||||||
res := c.RunDockerComposeCmd(t, "ls")
|
|
||||||
testify.Regexp(t, getProjectRegx("running"), res.Stdout())
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("down", func(t *testing.T) {
|
t.Run("down", func(t *testing.T) {
|
||||||
_ = c.RunDockerComposeCmd(t, "--project-name", projectName, "down")
|
_ = c.RunDockerComposeCmd(t, "--project-name", projectName, "down")
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue