| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- package decoders
- import (
- "bytes"
- "io"
- "strings"
- "testing"
- )
- func TestUnboundedDecoder_SmallEvent(t *testing.T) {
- data := "event: test\ndata: hello world\n\n"
- rc := io.NopCloser(strings.NewReader(data))
- decoder := NewUnboundedDecoder(rc)
- if !decoder.Next() {
- t.Fatal("Expected Next() to return true")
- }
- evt := decoder.Event()
- if evt.Type != "test" {
- t.Errorf("Expected event type 'test', got '%s'", evt.Type)
- }
- if string(evt.Data) != "hello world\n" {
- t.Errorf("Expected data 'hello world\\n', got '%s'", string(evt.Data))
- }
- if decoder.Next() {
- t.Error("Expected Next() to return false at end of stream")
- }
- if err := decoder.Err(); err != nil {
- t.Errorf("Expected no error, got %v", err)
- }
- }
- func TestUnboundedDecoder_LargeEvent(t *testing.T) {
- // Create a large event (50MB)
- size := 50 * 1024 * 1024
- largeData := strings.Repeat("x", size)
- var buf bytes.Buffer
- buf.WriteString("event: large\n")
- buf.WriteString("data: ")
- buf.WriteString(largeData)
- buf.WriteString("\n\n")
- rc := io.NopCloser(&buf)
- decoder := NewUnboundedDecoder(rc)
- if !decoder.Next() {
- t.Fatal("Expected Next() to return true")
- }
- evt := decoder.Event()
- if evt.Type != "large" {
- t.Errorf("Expected event type 'large', got '%s'", evt.Type)
- }
- expectedData := largeData + "\n"
- if string(evt.Data) != expectedData {
- t.Errorf("Data size mismatch: expected %d, got %d", len(expectedData), len(evt.Data))
- }
- if decoder.Next() {
- t.Error("Expected Next() to return false at end of stream")
- }
- if err := decoder.Err(); err != nil {
- t.Errorf("Expected no error, got %v", err)
- }
- }
- func TestUnboundedDecoder_MultipleEvents(t *testing.T) {
- data := "event: first\ndata: data1\n\nevent: second\ndata: data2\n\n"
- rc := io.NopCloser(strings.NewReader(data))
- decoder := NewUnboundedDecoder(rc)
- // First event
- if !decoder.Next() {
- t.Fatal("Expected Next() to return true for first event")
- }
- evt := decoder.Event()
- if evt.Type != "first" {
- t.Errorf("Expected event type 'first', got '%s'", evt.Type)
- }
- if string(evt.Data) != "data1\n" {
- t.Errorf("Expected data 'data1\\n', got '%s'", string(evt.Data))
- }
- // Second event
- if !decoder.Next() {
- t.Fatal("Expected Next() to return true for second event")
- }
- evt = decoder.Event()
- if evt.Type != "second" {
- t.Errorf("Expected event type 'second', got '%s'", evt.Type)
- }
- if string(evt.Data) != "data2\n" {
- t.Errorf("Expected data 'data2\\n', got '%s'", string(evt.Data))
- }
- // No more events
- if decoder.Next() {
- t.Error("Expected Next() to return false at end of stream")
- }
- if err := decoder.Err(); err != nil {
- t.Errorf("Expected no error, got %v", err)
- }
- }
- func TestUnboundedDecoder_MultilineData(t *testing.T) {
- data := "event: multiline\ndata: line1\ndata: line2\ndata: line3\n\n"
- rc := io.NopCloser(strings.NewReader(data))
- decoder := NewUnboundedDecoder(rc)
- if !decoder.Next() {
- t.Fatal("Expected Next() to return true")
- }
- evt := decoder.Event()
- if evt.Type != "multiline" {
- t.Errorf("Expected event type 'multiline', got '%s'", evt.Type)
- }
- expectedData := "line1\nline2\nline3\n"
- if string(evt.Data) != expectedData {
- t.Errorf("Expected data '%s', got '%s'", expectedData, string(evt.Data))
- }
- }
- func TestUnboundedDecoder_Comments(t *testing.T) {
- data := ": this is a comment\nevent: test\n: another comment\ndata: hello\n\n"
- rc := io.NopCloser(strings.NewReader(data))
- decoder := NewUnboundedDecoder(rc)
- if !decoder.Next() {
- t.Fatal("Expected Next() to return true")
- }
- evt := decoder.Event()
- if evt.Type != "test" {
- t.Errorf("Expected event type 'test', got '%s'", evt.Type)
- }
- if string(evt.Data) != "hello\n" {
- t.Errorf("Expected data 'hello\\n', got '%s'", string(evt.Data))
- }
- }
- func TestUnboundedDecoder_NoEventType(t *testing.T) {
- data := "data: hello\n\n"
- rc := io.NopCloser(strings.NewReader(data))
- decoder := NewUnboundedDecoder(rc)
- if !decoder.Next() {
- t.Fatal("Expected Next() to return true")
- }
- evt := decoder.Event()
- if evt.Type != "" {
- t.Errorf("Expected empty event type, got '%s'", evt.Type)
- }
- if string(evt.Data) != "hello\n" {
- t.Errorf("Expected data 'hello\\n', got '%s'", string(evt.Data))
- }
- }
- func BenchmarkUnboundedDecoder_LargeEvent(b *testing.B) {
- // Create a 10MB event for benchmarking
- size := 10 * 1024 * 1024
- largeData := strings.Repeat("x", size)
- var buf bytes.Buffer
- buf.WriteString("event: bench\n")
- buf.WriteString("data: ")
- buf.WriteString(largeData)
- buf.WriteString("\n\n")
- data := buf.Bytes()
- b.ResetTimer()
- b.SetBytes(int64(len(data)))
- for i := 0; i < b.N; i++ {
- rc := io.NopCloser(bytes.NewReader(data))
- decoder := NewUnboundedDecoder(rc)
- if !decoder.Next() {
- b.Fatal("Expected Next() to return true")
- }
- _ = decoder.Event()
- }
- }
|