events_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package events
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "testing"
  8. "time"
  9. "github.com/docker/docker/engine"
  10. "github.com/docker/docker/utils"
  11. )
  12. func TestEventsPublish(t *testing.T) {
  13. e := New()
  14. l1 := make(chan *utils.JSONMessage)
  15. l2 := make(chan *utils.JSONMessage)
  16. e.subscribe(l1)
  17. e.subscribe(l2)
  18. count := e.subscribersCount()
  19. if count != 2 {
  20. t.Fatalf("Must be 2 subscribers, got %d", count)
  21. }
  22. go e.log("test", "cont", "image")
  23. select {
  24. case msg := <-l1:
  25. if len(e.events) != 1 {
  26. t.Fatalf("Must be only one event, got %d", len(e.events))
  27. }
  28. if msg.Status != "test" {
  29. t.Fatalf("Status should be test, got %s", msg.Status)
  30. }
  31. if msg.ID != "cont" {
  32. t.Fatalf("ID should be cont, got %s", msg.ID)
  33. }
  34. if msg.From != "image" {
  35. t.Fatalf("From should be image, got %s", msg.From)
  36. }
  37. case <-time.After(1 * time.Second):
  38. t.Fatal("Timeout waiting for broadcasted message")
  39. }
  40. select {
  41. case msg := <-l2:
  42. if len(e.events) != 1 {
  43. t.Fatalf("Must be only one event, got %d", len(e.events))
  44. }
  45. if msg.Status != "test" {
  46. t.Fatalf("Status should be test, got %s", msg.Status)
  47. }
  48. if msg.ID != "cont" {
  49. t.Fatalf("ID should be cont, got %s", msg.ID)
  50. }
  51. if msg.From != "image" {
  52. t.Fatalf("From should be image, got %s", msg.From)
  53. }
  54. case <-time.After(1 * time.Second):
  55. t.Fatal("Timeout waiting for broadcasted message")
  56. }
  57. }
  58. func TestEventsPublishTimeout(t *testing.T) {
  59. e := New()
  60. l := make(chan *utils.JSONMessage)
  61. e.subscribe(l)
  62. c := make(chan struct{})
  63. go func() {
  64. e.log("test", "cont", "image")
  65. close(c)
  66. }()
  67. select {
  68. case <-c:
  69. case <-time.After(time.Second):
  70. t.Fatal("Timeout publishing message")
  71. }
  72. }
  73. func TestLogEvents(t *testing.T) {
  74. e := New()
  75. eng := engine.New()
  76. if err := e.Install(eng); err != nil {
  77. t.Fatal(err)
  78. }
  79. for i := 0; i < eventsLimit+16; i++ {
  80. action := fmt.Sprintf("action_%d", i)
  81. id := fmt.Sprintf("cont_%d", i)
  82. from := fmt.Sprintf("image_%d", i)
  83. job := eng.Job("log", action, id, from)
  84. if err := job.Run(); err != nil {
  85. t.Fatal(err)
  86. }
  87. }
  88. time.Sleep(50 * time.Millisecond)
  89. if len(e.events) != eventsLimit {
  90. t.Fatalf("Must be %d events, got %d", eventsLimit, len(e.events))
  91. }
  92. job := eng.Job("events")
  93. job.SetenvInt64("since", 1)
  94. job.SetenvInt64("until", time.Now().Unix())
  95. buf := bytes.NewBuffer(nil)
  96. job.Stdout.Add(buf)
  97. if err := job.Run(); err != nil {
  98. t.Fatal(err)
  99. }
  100. buf = bytes.NewBuffer(buf.Bytes())
  101. dec := json.NewDecoder(buf)
  102. var msgs []utils.JSONMessage
  103. for {
  104. var jm utils.JSONMessage
  105. if err := dec.Decode(&jm); err != nil {
  106. if err == io.EOF {
  107. break
  108. }
  109. t.Fatal(err)
  110. }
  111. msgs = append(msgs, jm)
  112. }
  113. if len(msgs) != eventsLimit {
  114. t.Fatalf("Must be %d events, got %d", eventsLimit, len(msgs))
  115. }
  116. first := msgs[0]
  117. if first.Status != "action_16" {
  118. t.Fatalf("First action is %s, must be action_15", first.Status)
  119. }
  120. last := msgs[len(msgs)-1]
  121. if last.Status != "action_79" {
  122. t.Fatalf("First action is %s, must be action_79", first.Status)
  123. }
  124. }
  125. func TestEventsCountJob(t *testing.T) {
  126. e := New()
  127. eng := engine.New()
  128. if err := e.Install(eng); err != nil {
  129. t.Fatal(err)
  130. }
  131. l1 := make(chan *utils.JSONMessage)
  132. l2 := make(chan *utils.JSONMessage)
  133. e.subscribe(l1)
  134. e.subscribe(l2)
  135. job := eng.Job("subscribers_count")
  136. env, _ := job.Stdout.AddEnv()
  137. if err := job.Run(); err != nil {
  138. t.Fatal(err)
  139. }
  140. count := env.GetInt("count")
  141. if count != 2 {
  142. t.Fatalf("There must be 2 subscribers, got %d", count)
  143. }
  144. }