decoder_test.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. package decoders
  2. import (
  3. "bytes"
  4. "io"
  5. "strings"
  6. "testing"
  7. )
  8. func TestUnboundedDecoder_SmallEvent(t *testing.T) {
  9. data := "event: test\ndata: hello world\n\n"
  10. rc := io.NopCloser(strings.NewReader(data))
  11. decoder := NewUnboundedDecoder(rc)
  12. if !decoder.Next() {
  13. t.Fatal("Expected Next() to return true")
  14. }
  15. evt := decoder.Event()
  16. if evt.Type != "test" {
  17. t.Errorf("Expected event type 'test', got '%s'", evt.Type)
  18. }
  19. if string(evt.Data) != "hello world\n" {
  20. t.Errorf("Expected data 'hello world\\n', got '%s'", string(evt.Data))
  21. }
  22. if decoder.Next() {
  23. t.Error("Expected Next() to return false at end of stream")
  24. }
  25. if err := decoder.Err(); err != nil {
  26. t.Errorf("Expected no error, got %v", err)
  27. }
  28. }
  29. func TestUnboundedDecoder_LargeEvent(t *testing.T) {
  30. // Create a large event (50MB)
  31. size := 50 * 1024 * 1024
  32. largeData := strings.Repeat("x", size)
  33. var buf bytes.Buffer
  34. buf.WriteString("event: large\n")
  35. buf.WriteString("data: ")
  36. buf.WriteString(largeData)
  37. buf.WriteString("\n\n")
  38. rc := io.NopCloser(&buf)
  39. decoder := NewUnboundedDecoder(rc)
  40. if !decoder.Next() {
  41. t.Fatal("Expected Next() to return true")
  42. }
  43. evt := decoder.Event()
  44. if evt.Type != "large" {
  45. t.Errorf("Expected event type 'large', got '%s'", evt.Type)
  46. }
  47. expectedData := largeData + "\n"
  48. if string(evt.Data) != expectedData {
  49. t.Errorf("Data size mismatch: expected %d, got %d", len(expectedData), len(evt.Data))
  50. }
  51. if decoder.Next() {
  52. t.Error("Expected Next() to return false at end of stream")
  53. }
  54. if err := decoder.Err(); err != nil {
  55. t.Errorf("Expected no error, got %v", err)
  56. }
  57. }
  58. func TestUnboundedDecoder_MultipleEvents(t *testing.T) {
  59. data := "event: first\ndata: data1\n\nevent: second\ndata: data2\n\n"
  60. rc := io.NopCloser(strings.NewReader(data))
  61. decoder := NewUnboundedDecoder(rc)
  62. // First event
  63. if !decoder.Next() {
  64. t.Fatal("Expected Next() to return true for first event")
  65. }
  66. evt := decoder.Event()
  67. if evt.Type != "first" {
  68. t.Errorf("Expected event type 'first', got '%s'", evt.Type)
  69. }
  70. if string(evt.Data) != "data1\n" {
  71. t.Errorf("Expected data 'data1\\n', got '%s'", string(evt.Data))
  72. }
  73. // Second event
  74. if !decoder.Next() {
  75. t.Fatal("Expected Next() to return true for second event")
  76. }
  77. evt = decoder.Event()
  78. if evt.Type != "second" {
  79. t.Errorf("Expected event type 'second', got '%s'", evt.Type)
  80. }
  81. if string(evt.Data) != "data2\n" {
  82. t.Errorf("Expected data 'data2\\n', got '%s'", string(evt.Data))
  83. }
  84. // No more events
  85. if decoder.Next() {
  86. t.Error("Expected Next() to return false at end of stream")
  87. }
  88. if err := decoder.Err(); err != nil {
  89. t.Errorf("Expected no error, got %v", err)
  90. }
  91. }
  92. func TestUnboundedDecoder_MultilineData(t *testing.T) {
  93. data := "event: multiline\ndata: line1\ndata: line2\ndata: line3\n\n"
  94. rc := io.NopCloser(strings.NewReader(data))
  95. decoder := NewUnboundedDecoder(rc)
  96. if !decoder.Next() {
  97. t.Fatal("Expected Next() to return true")
  98. }
  99. evt := decoder.Event()
  100. if evt.Type != "multiline" {
  101. t.Errorf("Expected event type 'multiline', got '%s'", evt.Type)
  102. }
  103. expectedData := "line1\nline2\nline3\n"
  104. if string(evt.Data) != expectedData {
  105. t.Errorf("Expected data '%s', got '%s'", expectedData, string(evt.Data))
  106. }
  107. }
  108. func TestUnboundedDecoder_Comments(t *testing.T) {
  109. data := ": this is a comment\nevent: test\n: another comment\ndata: hello\n\n"
  110. rc := io.NopCloser(strings.NewReader(data))
  111. decoder := NewUnboundedDecoder(rc)
  112. if !decoder.Next() {
  113. t.Fatal("Expected Next() to return true")
  114. }
  115. evt := decoder.Event()
  116. if evt.Type != "test" {
  117. t.Errorf("Expected event type 'test', got '%s'", evt.Type)
  118. }
  119. if string(evt.Data) != "hello\n" {
  120. t.Errorf("Expected data 'hello\\n', got '%s'", string(evt.Data))
  121. }
  122. }
  123. func TestUnboundedDecoder_NoEventType(t *testing.T) {
  124. data := "data: hello\n\n"
  125. rc := io.NopCloser(strings.NewReader(data))
  126. decoder := NewUnboundedDecoder(rc)
  127. if !decoder.Next() {
  128. t.Fatal("Expected Next() to return true")
  129. }
  130. evt := decoder.Event()
  131. if evt.Type != "" {
  132. t.Errorf("Expected empty event type, got '%s'", evt.Type)
  133. }
  134. if string(evt.Data) != "hello\n" {
  135. t.Errorf("Expected data 'hello\\n', got '%s'", string(evt.Data))
  136. }
  137. }
  138. func BenchmarkUnboundedDecoder_LargeEvent(b *testing.B) {
  139. // Create a 10MB event for benchmarking
  140. size := 10 * 1024 * 1024
  141. largeData := strings.Repeat("x", size)
  142. var buf bytes.Buffer
  143. buf.WriteString("event: bench\n")
  144. buf.WriteString("data: ")
  145. buf.WriteString(largeData)
  146. buf.WriteString("\n\n")
  147. data := buf.Bytes()
  148. b.ResetTimer()
  149. b.SetBytes(int64(len(data)))
  150. for i := 0; i < b.N; i++ {
  151. rc := io.NopCloser(bytes.NewReader(data))
  152. decoder := NewUnboundedDecoder(rc)
  153. if !decoder.Next() {
  154. b.Fatal("Expected Next() to return true")
  155. }
  156. _ = decoder.Event()
  157. }
  158. }