events_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
  2. // All rights reserved. Use of this source code is governed by an MIT-style
  3. // license that can be found in the LICENSE file.
  4. package events_test
  5. import (
  6. "fmt"
  7. "testing"
  8. "time"
  9. "github.com/syncthing/syncthing/internal/events"
  10. )
  11. var timeout = 100 * time.Millisecond
  12. func TestNewLogger(t *testing.T) {
  13. l := events.NewLogger()
  14. if l == nil {
  15. t.Fatal("Unexpected nil Logger")
  16. }
  17. }
  18. func TestSubscriber(t *testing.T) {
  19. l := events.NewLogger()
  20. s := l.Subscribe(0)
  21. if s == nil {
  22. t.Fatal("Unexpected nil Subscription")
  23. }
  24. }
  25. func TestTimeout(t *testing.T) {
  26. l := events.NewLogger()
  27. s := l.Subscribe(0)
  28. _, err := s.Poll(timeout)
  29. if err != events.ErrTimeout {
  30. t.Fatal("Unexpected non-Timeout error:", err)
  31. }
  32. }
  33. func TestEventBeforeSubscribe(t *testing.T) {
  34. l := events.NewLogger()
  35. l.Log(events.NodeConnected, "foo")
  36. s := l.Subscribe(0)
  37. _, err := s.Poll(timeout)
  38. if err != events.ErrTimeout {
  39. t.Fatal("Unexpected non-Timeout error:", err)
  40. }
  41. }
  42. func TestEventAfterSubscribe(t *testing.T) {
  43. l := events.NewLogger()
  44. s := l.Subscribe(events.AllEvents)
  45. l.Log(events.NodeConnected, "foo")
  46. ev, err := s.Poll(timeout)
  47. if err != nil {
  48. t.Fatal("Unexpected error:", err)
  49. }
  50. if ev.Type != events.NodeConnected {
  51. t.Error("Incorrect event type", ev.Type)
  52. }
  53. switch v := ev.Data.(type) {
  54. case string:
  55. if v != "foo" {
  56. t.Error("Incorrect Data string", v)
  57. }
  58. default:
  59. t.Errorf("Incorrect Data type %#v", v)
  60. }
  61. }
  62. func TestEventAfterSubscribeIgnoreMask(t *testing.T) {
  63. l := events.NewLogger()
  64. s := l.Subscribe(events.NodeDisconnected)
  65. l.Log(events.NodeConnected, "foo")
  66. _, err := s.Poll(timeout)
  67. if err != events.ErrTimeout {
  68. t.Fatal("Unexpected non-Timeout error:", err)
  69. }
  70. }
  71. func TestBufferOverflow(t *testing.T) {
  72. l := events.NewLogger()
  73. _ = l.Subscribe(events.AllEvents)
  74. t0 := time.Now()
  75. for i := 0; i < events.BufferSize*2; i++ {
  76. l.Log(events.NodeConnected, "foo")
  77. }
  78. if time.Since(t0) > timeout {
  79. t.Fatalf("Logging took too long")
  80. }
  81. }
  82. func TestUnsubscribe(t *testing.T) {
  83. l := events.NewLogger()
  84. s := l.Subscribe(events.AllEvents)
  85. l.Log(events.NodeConnected, "foo")
  86. _, err := s.Poll(timeout)
  87. if err != nil {
  88. t.Fatal("Unexpected error:", err)
  89. }
  90. l.Unsubscribe(s)
  91. l.Log(events.NodeConnected, "foo")
  92. _, err = s.Poll(timeout)
  93. if err != events.ErrClosed {
  94. t.Fatal("Unexpected non-Closed error:", err)
  95. }
  96. }
  97. func TestIDs(t *testing.T) {
  98. l := events.NewLogger()
  99. s := l.Subscribe(events.AllEvents)
  100. l.Log(events.NodeConnected, "foo")
  101. l.Log(events.NodeConnected, "bar")
  102. ev, err := s.Poll(timeout)
  103. if err != nil {
  104. t.Fatal("Unexpected error:", err)
  105. }
  106. if ev.Data.(string) != "foo" {
  107. t.Fatal("Incorrect event:", ev)
  108. }
  109. id := ev.ID
  110. ev, err = s.Poll(timeout)
  111. if err != nil {
  112. t.Fatal("Unexpected error:", err)
  113. }
  114. if ev.Data.(string) != "bar" {
  115. t.Fatal("Incorrect event:", ev)
  116. }
  117. if !(ev.ID > id) {
  118. t.Fatalf("ID not incremented (%d !> %d)", ev.ID, id)
  119. }
  120. }
  121. func TestBufferedSub(t *testing.T) {
  122. l := events.NewLogger()
  123. s := l.Subscribe(events.AllEvents)
  124. bs := events.NewBufferedSubscription(s, 10*events.BufferSize)
  125. go func() {
  126. for i := 0; i < 10*events.BufferSize; i++ {
  127. l.Log(events.NodeConnected, fmt.Sprintf("event-%d", i))
  128. if i%30 == 0 {
  129. // Give the buffer routine time to pick up the events
  130. time.Sleep(20 * time.Millisecond)
  131. }
  132. }
  133. }()
  134. recv := 0
  135. for recv < 10*events.BufferSize {
  136. evs := bs.Since(recv, nil)
  137. for _, ev := range evs {
  138. if ev.ID != recv+1 {
  139. t.Fatalf("Incorrect ID; %d != %d", ev.ID, recv+1)
  140. }
  141. recv = ev.ID
  142. }
  143. }
  144. }