File: httpreceiver_test.go

package info (click to toggle)
golang-github-igm-sockjs-go 3.0.2-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid, trixie
  • size: 512 kB
  • sloc: javascript: 39; makefile: 5
file content (106 lines) | stat: -rw-r--r-- 3,127 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package sockjs

import (
	"io"
	"net/http/httptest"
	"testing"
	"time"
)

type testFrameWriter struct {
	frames []string
}

func (t *testFrameWriter) write(w io.Writer, frame string) (int, error) {
	t.frames = append(t.frames, frame)
	return len(frame), nil
}

func TestHttpReceiver_Create(t *testing.T) {
	rec := httptest.NewRecorder()
	recv := newHTTPReceiver(rec, 1024, new(testFrameWriter))
	if recv.doneCh != recv.doneNotify() {
		t.Errorf("Calling done() must return close channel, but it does not")
	}
	if recv.rw != rec {
		t.Errorf("Http.ResponseWriter not properly initialized")
	}
	if recv.maxResponseSize != 1024 {
		t.Errorf("MaxResponseSize not properly initialized")
	}
}

func TestHttpReceiver_SendEmptyFrames(t *testing.T) {
	rec := httptest.NewRecorder()
	recv := newHTTPReceiver(rec, 1024, new(testFrameWriter))
	recv.sendBulk()
	if rec.Body.String() != "" {
		t.Errorf("Incorrect body content received from receiver '%s'", rec.Body.String())
	}
}

func TestHttpReceiver_SendFrame(t *testing.T) {
	rec := httptest.NewRecorder()
	fw := new(testFrameWriter)
	recv := newHTTPReceiver(rec, 1024, fw)
	var frame = "some frame content"
	recv.sendFrame(frame)
	if len(fw.frames) != 1 || fw.frames[0] != frame {
		t.Errorf("Incorrect body content received, got '%s', expected '%s'", fw.frames, frame)
	}

}

func TestHttpReceiver_SendBulk(t *testing.T) {
	rec := httptest.NewRecorder()
	fw := new(testFrameWriter)
	recv := newHTTPReceiver(rec, 1024, fw)
	recv.sendBulk("message 1", "message 2", "message 3")
	expected := "a[\"message 1\",\"message 2\",\"message 3\"]"
	if len(fw.frames) != 1 || fw.frames[0] != expected {
		t.Errorf("Incorrect body content received from receiver, got '%s' expected '%s'", fw.frames, expected)
	}
}

func TestHttpReceiver_MaximumResponseSize(t *testing.T) {
	rec := httptest.NewRecorder()
	recv := newHTTPReceiver(rec, 52, new(testFrameWriter))
	recv.sendBulk("message 1", "message 2") // produces 26 bytes of response in 1 frame
	if recv.currentResponseSize != 26 {
		t.Errorf("Incorrect response size calcualated, got '%d' expected '%d'", recv.currentResponseSize, 26)
	}
	select {
	case <-recv.doneNotify():
		t.Errorf("Receiver should not be done yet")
	default: // ok
	}
	recv.sendBulk("message 1", "message 2") // produces another 26 bytes of response in 1 frame to go over max resposne size
	select {
	case <-recv.doneNotify(): // ok
	default:
		t.Errorf("Receiver closed channel did not close")
	}
}

func TestHttpReceiver_Close(t *testing.T) {
	rec := httptest.NewRecorder()
	recv := newHTTPReceiver(rec, 1024, nil)
	recv.close()
	if recv.state != stateHTTPReceiverClosed {
		t.Errorf("Unexpected state, got '%d', expected '%d'", recv.state, stateHTTPReceiverClosed)
	}
}

func TestHttpReceiver_ConnectionInterrupt(t *testing.T) {
	rw := newClosableRecorder()
	recv := newHTTPReceiver(rw, 1024, nil)
	rw.closeNotifCh <- true
	select {
	case <-recv.interruptCh:
	case <-time.After(1 * time.Second):
		t.Errorf("should interrupt")
	}
	if recv.state != stateHTTPReceiverClosed {
		t.Errorf("Unexpected state, got '%d', expected '%d'", recv.state, stateHTTPReceiverClosed)
	}
}