From 02081bdaccc7cc1e686b8a34fb879ae7d00ac02c Mon Sep 17 00:00:00 2001 From: Ben Elgar Date: Thu, 11 Nov 2021 13:54:10 +0000 Subject: [PATCH 1/5] Add simple start counter test --- test/e2etests.go | 37 ++++++++++++++++++++++ test/image/fixtures/simple-example/exo.hcl | 3 -- test/image/fixtures/start-counter/exo.hcl | 13 ++++++++ test/tester/tester.go | 15 ++++++--- 4 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 test/image/fixtures/start-counter/exo.hcl diff --git a/test/e2etests.go b/test/e2etests.go index 57a740246..0fb9f91cc 100644 --- a/test/e2etests.go +++ b/test/e2etests.go @@ -85,6 +85,43 @@ var tests = map[string]tester.ExoTest{ return err } + return nil + }, + }, + "start-counter": { + FixtureDir: "start-counter", + Test: func(ctx context.Context, t tester.ExoTester) error { + // FIXME: This doesn't work right now because we don't have an easy way of + // removing volumes that are still attached to a previous container. + if _, _, err := t.RunCmd(ctx, "docker", []string{"volume", "rm", "e2etest-start-counter"}); err != nil { + return err + } + + if _, _, err := t.RunExo(ctx, "init"); err != nil { + return err + } + if _, _, err := t.RunExo(ctx, "start"); err != nil { + return err + } + + if err := t.WaitTillProcessesReachState(ctx, "running", []string{"counter"}); err != nil { + return err + } + if err := tester.ExpectResponse(ctx, "http://localhost:44225/count", "1"); err != nil { + return err + } + + if _, _, err := t.RunExo(ctx, "stop"); err != nil { + return err + } + if _, _, err := t.RunExo(ctx, "start"); err != nil { + return err + } + + if err := tester.ExpectResponse(ctx, "http://localhost:44225/count", "2"); err != nil { + return err + } + return nil }, }, diff --git a/test/image/fixtures/simple-example/exo.hcl b/test/image/fixtures/simple-example/exo.hcl index 913069aa1..5d54a7963 100644 --- a/test/image/fixtures/simple-example/exo.hcl +++ b/test/image/fixtures/simple-example/exo.hcl @@ -22,7 +22,4 @@ components { } env_file = "./env" } - - volume "logvolume01" {} - } diff --git a/test/image/fixtures/start-counter/exo.hcl b/test/image/fixtures/start-counter/exo.hcl new file mode 100644 index 000000000..660386ba3 --- /dev/null +++ b/test/image/fixtures/start-counter/exo.hcl @@ -0,0 +1,13 @@ +exo = "0.1" + +components { + container "counter" { + image = "python:3" + working_dir = "/my-count" + command = "expr $(cat count) + 1 > count ; python3 -m http.server" + volumes = ["e2etest-start-counter:/my-count"] + ports = ["44225:8000"] + } + + volume "e2etest-start-counter" {} +} diff --git a/test/tester/tester.go b/test/tester/tester.go index b32a2d255..9cbb4d526 100644 --- a/test/tester/tester.go +++ b/test/tester/tester.go @@ -88,9 +88,9 @@ func (et ExoTester) WaitTillProcessesReachState(ctx context.Context, state strin } // Runs an exo CLI command and blocks until it terminates. -func (et ExoTester) RunExo(ctx context.Context, arguments ...string) (stdout, stderr string, err error) { +func (et ExoTester) RunCmd(ctx context.Context, program string, arguments []string) (stdout, stderr string, err error) { path, _ := os.LookupEnv("PATH") - cmd := exec.CommandContext(ctx, et.exoBinary, arguments...) + cmd := exec.CommandContext(ctx, program, arguments...) cmd.Dir = et.fixtureDir cmd.Env = append(cmd.Env, "EXO_HOME="+et.exoHome) cmd.Env = append(cmd.Env, "PATH="+path) @@ -101,14 +101,19 @@ func (et ExoTester) RunExo(ctx context.Context, arguments ...string) (stdout, st stderrWriter := io.MultiWriter(&stderrBuffer, logWriter) cmd.Stderr = stderrWriter cmd.Stdout = stdoutWriter - et.logger.Debug("Running exo ", cmd.Args) - et.logger.Debug("env ", cmd.Env) - et.logger.Debug("wd ", cmd.Dir) + et.logger.Debug("Running ", cmd.Args) + et.logger.Debug("env: ", cmd.Env) + et.logger.Debug("working dir: ", cmd.Dir) err = cmd.Run() et.logger.Debug("exit code: ", cmd.ProcessState.ExitCode()) return stdoutBuffer.String(), stderrBuffer.String(), err } +// Runs an exo CLI command and blocks until it terminates. +func (et ExoTester) RunExo(ctx context.Context, arguments ...string) (stdout, stderr string, err error) { + return et.RunCmd(ctx, et.exoBinary, arguments) +} + type psProcessInfo struct { Name string ID string From c5f52783e43e69bcf0702bf3418db22de54f2318 Mon Sep 17 00:00:00 2001 From: Ben Elgar Date: Thu, 11 Nov 2021 14:08:01 +0000 Subject: [PATCH 2/5] Ignore error if volume doesn't exist --- test/e2etests.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/e2etests.go b/test/e2etests.go index 0fb9f91cc..a6924169b 100644 --- a/test/e2etests.go +++ b/test/e2etests.go @@ -3,6 +3,7 @@ package main import ( "context" "fmt" + "strings" "time" "github.com/deref/exo/test/tester" @@ -93,8 +94,10 @@ var tests = map[string]tester.ExoTest{ Test: func(ctx context.Context, t tester.ExoTester) error { // FIXME: This doesn't work right now because we don't have an easy way of // removing volumes that are still attached to a previous container. - if _, _, err := t.RunCmd(ctx, "docker", []string{"volume", "rm", "e2etest-start-counter"}); err != nil { - return err + if _, stderr, err := t.RunCmd(ctx, "docker", []string{"volume", "rm", "e2etest-start-counter"}); err != nil { + if !strings.Contains(stderr, "No such volume") { + return err + } } if _, _, err := t.RunExo(ctx, "init"); err != nil { From 1cba6576766c72876d4a1cc8c8795f221100a63e Mon Sep 17 00:00:00 2001 From: Ben Elgar Date: Thu, 11 Nov 2021 14:35:32 +0000 Subject: [PATCH 3/5] Trim whitespace from response --- test/tester/utils.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/tester/utils.go b/test/tester/utils.go index e74555ac7..db7f117a5 100644 --- a/test/tester/utils.go +++ b/test/tester/utils.go @@ -1,6 +1,7 @@ package tester import ( + "bytes" "context" "fmt" "io/ioutil" @@ -42,6 +43,7 @@ func ExpectResponse(ctx context.Context, endpoint string, expectedResponse strin return fmt.Errorf("failed to read response body: %w", err) } + body = bytes.TrimSpace(body) if string(body) != expectedResponse { return fmt.Errorf("expected response body to be %q, got %q", expectedResponse, string(body)) } From a907c9ba77b57609d94bec7dd99c44bc4ebb34de Mon Sep 17 00:00:00 2001 From: Ben Elgar Date: Thu, 11 Nov 2021 14:52:53 +0000 Subject: [PATCH 4/5] Add log message --- test/tester/tester.go | 1 + 1 file changed, 1 insertion(+) diff --git a/test/tester/tester.go b/test/tester/tester.go index 9cbb4d526..2c14c1593 100644 --- a/test/tester/tester.go +++ b/test/tester/tester.go @@ -53,6 +53,7 @@ func (et ExoTester) RunTest(ctx context.Context, test ExoTest) (io.Reader, error } func (et ExoTester) WaitTillProcessesReachState(ctx context.Context, state string, names []string) error { + et.logger.Info("Waiting for ", names, " to reach state ", state) errTimeout := fmt.Errorf("timed out waiting for %q to reach %s", strings.Join(names, ", "), state) for { processes, err := et.PS(ctx) From 8139c20cbccdbf5bfa36135a1d43f9e2f19dc467 Mon Sep 17 00:00:00 2001 From: Ben Elgar Date: Thu, 11 Nov 2021 14:53:03 +0000 Subject: [PATCH 5/5] Wait for processes to reach state --- test/e2etests.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/e2etests.go b/test/e2etests.go index a6924169b..ce937e886 100644 --- a/test/e2etests.go +++ b/test/e2etests.go @@ -121,6 +121,9 @@ var tests = map[string]tester.ExoTest{ return err } + if err := t.WaitTillProcessesReachState(ctx, "running", []string{"counter"}); err != nil { + return err + } if err := tester.ExpectResponse(ctx, "http://localhost:44225/count", "2"); err != nil { return err }