6
6
"context"
7
7
"encoding/json"
8
8
"fmt"
9
+ "io"
9
10
"net"
10
11
"net/http"
11
12
"net/http/httptest"
@@ -162,10 +163,11 @@ func TestWebsocketCloseMsg(t *testing.T) {
162
163
// Our WebSocket library accepts any arbitrary ResponseWriter at the type level,
163
164
// but it must also implement http.Hijack
164
165
type mockWsResponseWriter struct {
165
- recorder http. ResponseWriter
166
+ recorder * httptest. ResponseRecorder
166
167
clientConn net.Conn
167
168
serverConn net.Conn
168
169
serverReadWriter * bufio.ReadWriter
170
+ close func ()
169
171
}
170
172
171
173
func (m mockWsResponseWriter ) Hijack () (net.Conn , * bufio.ReadWriter , error ) {
@@ -233,6 +235,11 @@ func TestOneWayWebSocket(t *testing.T) {
233
235
bufio .NewReader (server ),
234
236
bufio .NewWriter (write ),
235
237
),
238
+ close : func () {
239
+ _ = recorder .Result ().Body .Close ()
240
+ _ = server .Close ()
241
+ _ = client .Close ()
242
+ },
236
243
}
237
244
}
238
245
@@ -256,6 +263,7 @@ func TestOneWayWebSocket(t *testing.T) {
256
263
writer := newWebsocketWriter ()
257
264
_ , _ , err := httpapi .OneWayWebSocket [any ](writer , req )
258
265
require .ErrorContains (t , err , p .proto )
266
+ writer .close ()
259
267
}
260
268
})
261
269
@@ -264,15 +272,26 @@ func TestOneWayWebSocket(t *testing.T) {
264
272
265
273
req := newBaseRequest (t )
266
274
writer := newWebsocketWriter ()
275
+ defer writer .close ()
267
276
send , _ , err := httpapi .OneWayWebSocket [codersdk.ServerSentEvent ](writer , req )
268
277
require .NoError (t , err )
269
278
270
- payload := codersdk.ServerSentEvent {
279
+ serverPayload := codersdk.ServerSentEvent {
271
280
Type : codersdk .ServerSentEventTypeData ,
272
281
Data : "Blah" ,
273
282
}
274
- err = send (payload )
283
+ err = send (serverPayload )
275
284
require .NoError (t , err )
285
+
286
+ b , err := io .ReadAll (writer .clientConn )
287
+ require .NoError (t , err )
288
+ clientPayload := codersdk.ServerSentEvent {}
289
+ err = json .Unmarshal (b , & clientPayload )
290
+ require .NoError (t , err )
291
+ require .Equal (t , serverPayload .Type , clientPayload .Type )
292
+ cb , ok := clientPayload .Data .([]byte )
293
+ require .True (t , ok )
294
+ require .Equal (t , serverPayload .Data , string (cb ))
276
295
})
277
296
278
297
t .Run ("Signals to an outside consumer when the socket has been closed" , func (t * testing.T ) {
0 commit comments