package server import ( "testing" "time" "github.com/dotcloud/docker/utils" ) func TestPools(t *testing.T) { srv := &Server{ pullingPool: make(map[string]chan struct{}), pushingPool: make(map[string]chan struct{}), } if _, err := srv.poolAdd("pull", "test1"); err != nil { t.Fatal(err) } if _, err := srv.poolAdd("pull", "test2"); err != nil { t.Fatal(err) } if _, err := srv.poolAdd("push", "test1"); err == nil || err.Error() != "pull test1 is already in progress" { t.Fatalf("Expected `pull test1 is already in progress`") } if _, err := srv.poolAdd("pull", "test1"); err == nil || err.Error() != "pull test1 is already in progress" { t.Fatalf("Expected `pull test1 is already in progress`") } if _, err := srv.poolAdd("wait", "test3"); err == nil || err.Error() != "Unknown pool type" { t.Fatalf("Expected `Unknown pool type`") } if err := srv.poolRemove("pull", "test2"); err != nil { t.Fatal(err) } if err := srv.poolRemove("pull", "test2"); err != nil { t.Fatal(err) } if err := srv.poolRemove("pull", "test1"); err != nil { t.Fatal(err) } if err := srv.poolRemove("push", "test1"); err != nil { t.Fatal(err) } if err := srv.poolRemove("wait", "test3"); err == nil || err.Error() != "Unknown pool type" { t.Fatalf("Expected `Unknown pool type`") } } func TestLogEvent(t *testing.T) { srv := &Server{ events: make([]utils.JSONMessage, 0, 64), eventPublisher: utils.NewJSONMessagePublisher(), } srv.LogEvent("fakeaction", "fakeid", "fakeimage") listener := make(chan utils.JSONMessage) srv.eventPublisher.Subscribe(listener) srv.LogEvent("fakeaction2", "fakeid", "fakeimage") numEvents := len(srv.GetEvents()) if numEvents != 2 { t.Fatalf("Expected 2 events, found %d", numEvents) } go func() { time.Sleep(200 * time.Millisecond) srv.LogEvent("fakeaction3", "fakeid", "fakeimage") time.Sleep(200 * time.Millisecond) srv.LogEvent("fakeaction4", "fakeid", "fakeimage") }() setTimeout(t, "Listening for events timed out", 2*time.Second, func() { for i := 2; i < 4; i++ { event := <-listener if event != srv.GetEvents()[i] { t.Fatalf("Event received it different than expected") } } }) } // FIXME: this is duplicated from integration/commands_test.go func setTimeout(t *testing.T, msg string, d time.Duration, f func()) { c := make(chan bool) // Make sure we are not too long go func() { time.Sleep(d) c <- true }() go func() { f() c <- false }() if <-c && msg != "" { t.Fatal(msg) } }