github.com/ruphin/docker@v1.10.1/daemon/events/events_test.go (about) 1 package events 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/docker/engine-api/types/events" 9 ) 10 11 func TestEventsLog(t *testing.T) { 12 e := New() 13 _, l1, _ := e.Subscribe() 14 _, l2, _ := e.Subscribe() 15 defer e.Evict(l1) 16 defer e.Evict(l2) 17 count := e.SubscribersCount() 18 if count != 2 { 19 t.Fatalf("Must be 2 subscribers, got %d", count) 20 } 21 actor := events.Actor{ 22 ID: "cont", 23 Attributes: map[string]string{"image": "image"}, 24 } 25 e.Log("test", events.ContainerEventType, actor) 26 select { 27 case msg := <-l1: 28 jmsg, ok := msg.(events.Message) 29 if !ok { 30 t.Fatalf("Unexpected type %T", msg) 31 } 32 if len(e.events) != 1 { 33 t.Fatalf("Must be only one event, got %d", len(e.events)) 34 } 35 if jmsg.Status != "test" { 36 t.Fatalf("Status should be test, got %s", jmsg.Status) 37 } 38 if jmsg.ID != "cont" { 39 t.Fatalf("ID should be cont, got %s", jmsg.ID) 40 } 41 if jmsg.From != "image" { 42 t.Fatalf("From should be image, got %s", jmsg.From) 43 } 44 case <-time.After(1 * time.Second): 45 t.Fatal("Timeout waiting for broadcasted message") 46 } 47 select { 48 case msg := <-l2: 49 jmsg, ok := msg.(events.Message) 50 if !ok { 51 t.Fatalf("Unexpected type %T", msg) 52 } 53 if len(e.events) != 1 { 54 t.Fatalf("Must be only one event, got %d", len(e.events)) 55 } 56 if jmsg.Status != "test" { 57 t.Fatalf("Status should be test, got %s", jmsg.Status) 58 } 59 if jmsg.ID != "cont" { 60 t.Fatalf("ID should be cont, got %s", jmsg.ID) 61 } 62 if jmsg.From != "image" { 63 t.Fatalf("From should be image, got %s", jmsg.From) 64 } 65 case <-time.After(1 * time.Second): 66 t.Fatal("Timeout waiting for broadcasted message") 67 } 68 } 69 70 func TestEventsLogTimeout(t *testing.T) { 71 e := New() 72 _, l, _ := e.Subscribe() 73 defer e.Evict(l) 74 75 c := make(chan struct{}) 76 go func() { 77 actor := events.Actor{ 78 ID: "image", 79 } 80 e.Log("test", events.ImageEventType, actor) 81 close(c) 82 }() 83 84 select { 85 case <-c: 86 case <-time.After(time.Second): 87 t.Fatal("Timeout publishing message") 88 } 89 } 90 91 func TestLogEvents(t *testing.T) { 92 e := New() 93 94 for i := 0; i < eventsLimit+16; i++ { 95 action := fmt.Sprintf("action_%d", i) 96 id := fmt.Sprintf("cont_%d", i) 97 from := fmt.Sprintf("image_%d", i) 98 99 actor := events.Actor{ 100 ID: id, 101 Attributes: map[string]string{"image": from}, 102 } 103 e.Log(action, events.ContainerEventType, actor) 104 } 105 time.Sleep(50 * time.Millisecond) 106 current, l, _ := e.Subscribe() 107 for i := 0; i < 10; i++ { 108 num := i + eventsLimit + 16 109 action := fmt.Sprintf("action_%d", num) 110 id := fmt.Sprintf("cont_%d", num) 111 from := fmt.Sprintf("image_%d", num) 112 113 actor := events.Actor{ 114 ID: id, 115 Attributes: map[string]string{"image": from}, 116 } 117 e.Log(action, events.ContainerEventType, actor) 118 } 119 if len(e.events) != eventsLimit { 120 t.Fatalf("Must be %d events, got %d", eventsLimit, len(e.events)) 121 } 122 123 var msgs []events.Message 124 for len(msgs) < 10 { 125 m := <-l 126 jm, ok := (m).(events.Message) 127 if !ok { 128 t.Fatalf("Unexpected type %T", m) 129 } 130 msgs = append(msgs, jm) 131 } 132 if len(current) != eventsLimit { 133 t.Fatalf("Must be %d events, got %d", eventsLimit, len(current)) 134 } 135 first := current[0] 136 if first.Status != "action_16" { 137 t.Fatalf("First action is %s, must be action_16", first.Status) 138 } 139 last := current[len(current)-1] 140 if last.Status != "action_79" { 141 t.Fatalf("Last action is %s, must be action_79", last.Status) 142 } 143 144 firstC := msgs[0] 145 if firstC.Status != "action_80" { 146 t.Fatalf("First action is %s, must be action_80", firstC.Status) 147 } 148 lastC := msgs[len(msgs)-1] 149 if lastC.Status != "action_89" { 150 t.Fatalf("Last action is %s, must be action_89", lastC.Status) 151 } 152 }