Events subscription (/events API endpoint) attributes pseudo-unique identifiers to incoming subscribers: originally its host, then its subscription time. This is unecessary and leads to code complexity. Introduce a JSONMessagePublisher to provide simple pub/sub mechanism for JSONMessage, and rely on this new type to publish events to all subscribed listeners. The original logic is kept for the 'since' and 'until' parameters, and for client disconnection handling. Docker-DCO-1.1-Signed-off-by: Arnaud Porterie <icecrime@gmail.com> (github: icecrime) Upstream-commit: d0c4e448632f49b73bf63862a4b20b142ff7f2c9 Component: engine
99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
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)
|
|
}
|
|
}
|