From a2d7dd1a1908fc3dc6ac5648b5ea12eaecb19b1b Mon Sep 17 00:00:00 2001 From: Andrea Luzzardi Date: Mon, 28 Jan 2013 11:51:51 -0800 Subject: [PATCH] Added sequential and parallel benchmarks in order to stress test docker (create, run, destroy workflow) --- container_test.go | 86 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/container_test.go b/container_test.go index 6eedc6c658..161b32d76b 100644 --- a/container_test.go +++ b/container_test.go @@ -1,7 +1,9 @@ package docker import ( + "fmt" "testing" + "time" ) func TestStart(t *testing.T) { @@ -240,3 +242,87 @@ func TestMultipleContainers(t *testing.T) { t.Fatal(err) } } + +func BenchmarkRunSequencial(b *testing.B) { + docker, err := newTestDocker() + if err != nil { + b.Fatal(err) + } + for i := 0; i < b.N; i++ { + container, err := docker.Create( + fmt.Sprintf("bench_%v", i), + "echo", + []string{"-n", "foo"}, + []string{"/var/lib/docker/images/ubuntu"}, + &Config{}, + ) + if err != nil { + b.Fatal(err) + } + defer docker.Destroy(container) + output, err := container.Output() + if err != nil { + b.Fatal(err) + } + if string(output) != "foo" { + b.Fatalf("Unexecpted output: %v", string(output)) + } + if err := docker.Destroy(container); err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkRunParallel(b *testing.B) { + docker, err := newTestDocker() + if err != nil { + b.Fatal(err) + } + + var tasks []chan error + + for i := 0; i < b.N; i++ { + complete := make(chan error) + tasks = append(tasks, complete) + go func(i int, complete chan error) { + container, err := docker.Create( + fmt.Sprintf("bench_%v", i), + "echo", + []string{"-n", "foo"}, + []string{"/var/lib/docker/images/ubuntu"}, + &Config{}, + ) + if err != nil { + complete <- err + return + } + defer docker.Destroy(container) + if err := container.Start(); err != nil { + complete <- err + return + } + if err := container.WaitTimeout(15 * time.Second); err != nil { + complete <- err + return + } + // if string(output) != "foo" { + // complete <- fmt.Errorf("Unexecpted output: %v", string(output)) + // } + if err := docker.Destroy(container); err != nil { + complete <- err + return + } + complete <- nil + }(i, complete) + } + var errors []error + for _, task := range tasks { + err := <-task + if err != nil { + errors = append(errors, err) + } + } + if len(errors) > 0 { + b.Fatal(errors) + } +}