فهرست منبع

Added sequential and parallel benchmarks in order to stress test docker
(create, run, destroy workflow)

Andrea Luzzardi 12 سال پیش
والد
کامیت
a2d7dd1a19
1فایلهای تغییر یافته به همراه86 افزوده شده و 0 حذف شده
  1. 86 0
      container_test.go

+ 86 - 0
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)
+	}
+}