xref: /unit/test/test_java_websockets.py (revision 1165:998b521bbdb8)
1import time
2import struct
3import unittest
4from unit.applications.lang.java import TestApplicationJava
5from unit.applications.websockets import TestApplicationWebsocket
6
7
8class TestJavaWebsockets(TestApplicationJava):
9    prerequisites = {'modules': ['java']}
10
11    ws = TestApplicationWebsocket(True)
12
13    def setUp(self):
14        super().setUp()
15
16        self.assertIn(
17            'success',
18            self.conf(
19                {'http': {'websocket': {'keepalive_interval': 0}}}, 'settings'
20            ),
21            'clear keepalive_interval',
22        )
23
24        self.skip_alerts.extend(
25            [r'last message send failed', r'socket close\(\d+\) failed']
26        )
27
28    def close_connection(self, sock):
29        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock')
30
31        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
32
33        self.check_close(sock)
34
35    def check_close(self, sock, code=1000, no_close=False):
36        frame = self.ws.frame_read(sock)
37
38        self.assertEqual(frame['fin'], True, 'close fin')
39        self.assertEqual(frame['opcode'], self.ws.OP_CLOSE, 'close opcode')
40        self.assertEqual(frame['code'], code, 'close code')
41
42        if not no_close:
43            sock.close()
44
45    def check_frame(self, frame, fin, opcode, payload, decode=True):
46        if opcode == self.ws.OP_BINARY or not decode:
47            data = frame['data']
48        else:
49            data = frame['data'].decode('utf-8')
50
51        self.assertEqual(frame['fin'], fin, 'fin')
52        self.assertEqual(frame['opcode'], opcode, 'opcode')
53        self.assertEqual(data, payload, 'payload')
54
55    def test_java_websockets_handshake(self):
56        self.load('websockets_mirror')
57
58        resp, sock, key = self.ws.upgrade()
59        sock.close()
60
61        self.assertEqual(resp['status'], 101, 'status')
62        self.assertEqual(resp['headers']['Upgrade'], 'websocket', 'upgrade')
63        self.assertEqual(
64            resp['headers']['Connection'], 'Upgrade', 'connection'
65        )
66        self.assertEqual(
67            resp['headers']['Sec-WebSocket-Accept'], self.ws.accept(key), 'key'
68        )
69
70    def test_java_websockets_mirror(self):
71        self.load('websockets_mirror')
72
73        message = 'blah'
74
75        _, sock, _ = self.ws.upgrade()
76
77        self.ws.frame_write(sock, self.ws.OP_TEXT, message)
78        frame = self.ws.frame_read(sock)
79
80        self.assertEqual(message, frame['data'].decode('utf-8'), 'mirror')
81
82        self.ws.frame_write(sock, self.ws.OP_TEXT, message)
83        frame = self.ws.frame_read(sock)
84
85        self.assertEqual(message, frame['data'].decode('utf-8'), 'mirror 2')
86
87        sock.close()
88
89    def test_java_websockets_no_mask(self):
90        self.load('websockets_mirror')
91
92        message = 'blah'
93
94        _, sock, _ = self.ws.upgrade()
95
96        self.ws.frame_write(sock, self.ws.OP_TEXT, message, mask=False)
97
98        frame = self.ws.frame_read(sock)
99
100        self.assertEqual(frame['opcode'], self.ws.OP_CLOSE, 'no mask opcode')
101        self.assertEqual(frame['code'], 1002, 'no mask close code')
102
103        sock.close()
104
105    def test_java_websockets_fragmentation(self):
106        self.load('websockets_mirror')
107
108        message = 'blah'
109
110        _, sock, _ = self.ws.upgrade()
111
112        self.ws.frame_write(sock, self.ws.OP_TEXT, message, fin=False)
113        self.ws.frame_write(sock, self.ws.OP_CONT, ' ', fin=False)
114        self.ws.frame_write(sock, self.ws.OP_CONT, message)
115
116        frame = self.ws.frame_read(sock)
117
118        self.assertEqual(
119            message + ' ' + message,
120            frame['data'].decode('utf-8'),
121            'mirror framing',
122        )
123
124        sock.close()
125
126    def test_java_websockets_frame_fragmentation_invalid(self):
127        self.load('websockets_mirror')
128
129        message = 'blah'
130
131        _, sock, _ = self.ws.upgrade()
132
133        self.ws.frame_write(sock, self.ws.OP_PING, message, fin=False)
134
135        frame = self.ws.frame_read(sock)
136
137        frame.pop('data')
138        self.assertDictEqual(
139            frame,
140            {
141                'fin': True,
142                'rsv1': False,
143                'rsv2': False,
144                'rsv3': False,
145                'opcode': self.ws.OP_CLOSE,
146                'mask': 0,
147                'code': 1002,
148                'reason': 'Fragmented control frame',
149            },
150            'close frame',
151        )
152
153        sock.close()
154
155    def test_java_websockets_two_clients(self):
156        self.load('websockets_mirror')
157
158        message1 = 'blah1'
159        message2 = 'blah2'
160
161        _, sock1, _ = self.ws.upgrade()
162        _, sock2, _ = self.ws.upgrade()
163
164        self.ws.frame_write(sock1, self.ws.OP_TEXT, message1)
165        self.ws.frame_write(sock2, self.ws.OP_TEXT, message2)
166
167        frame1 = self.ws.frame_read(sock1)
168        frame2 = self.ws.frame_read(sock2)
169
170        self.assertEqual(message1, frame1['data'].decode('utf-8'), 'client 1')
171        self.assertEqual(message2, frame2['data'].decode('utf-8'), 'client 2')
172
173        sock1.close()
174        sock2.close()
175
176    @unittest.skip('not yet')
177    def test_java_websockets_handshake_upgrade_absent(
178        self
179    ):  # FAIL https://tools.ietf.org/html/rfc6455#section-4.2.1
180        self.load('websockets_mirror')
181
182        self.get()
183
184        key = self.ws.key()
185        resp = self.get(
186            headers={
187                'Host': 'localhost',
188                'Connection': 'Upgrade',
189                'Sec-WebSocket-Key': key,
190                'Sec-WebSocket-Protocol': 'chat',
191                'Sec-WebSocket-Version': 13,
192            },
193            read_timeout=1,
194        )
195
196        self.assertEqual(resp['status'], 400, 'upgrade absent')
197
198    def test_java_websockets_handshake_case_insensitive(self):
199        self.load('websockets_mirror')
200
201        self.get()
202
203        key = self.ws.key()
204        resp = self.get(
205            headers={
206                'Host': 'localhost',
207                'Upgrade': 'WEBSOCKET',
208                'Connection': 'UPGRADE',
209                'Sec-WebSocket-Key': key,
210                'Sec-WebSocket-Protocol': 'chat',
211                'Sec-WebSocket-Version': 13,
212            },
213            read_timeout=1,
214        )
215
216        self.assertEqual(resp['status'], 101, 'status')
217
218    @unittest.skip('not yet')
219    def test_java_websockets_handshake_connection_absent(self):  # FAIL
220        self.load('websockets_mirror')
221
222        self.get()
223
224        key = self.ws.key()
225        resp = self.get(
226            headers={
227                'Host': 'localhost',
228                'Upgrade': 'websocket',
229                'Sec-WebSocket-Key': key,
230                'Sec-WebSocket-Protocol': 'chat',
231                'Sec-WebSocket-Version': 13,
232            },
233            read_timeout=1,
234        )
235
236        self.assertEqual(resp['status'], 400, 'status')
237
238    def test_java_websockets_handshake_version_absent(self):
239        self.load('websockets_mirror')
240
241        self.get()
242
243        key = self.ws.key()
244        resp = self.get(
245            headers={
246                'Host': 'localhost',
247                'Upgrade': 'websocket',
248                'Connection': 'Upgrade',
249                'Sec-WebSocket-Key': key,
250                'Sec-WebSocket-Protocol': 'chat',
251            },
252            read_timeout=1,
253        )
254
255        self.assertEqual(resp['status'], 426, 'status')
256
257    @unittest.skip('not yet')
258    def test_java_websockets_handshake_key_invalid(self):
259        self.load('websockets_mirror')
260
261        self.get()
262
263        resp = self.get(
264            headers={
265                'Host': 'localhost',
266                'Upgrade': 'websocket',
267                'Connection': 'Upgrade',
268                'Sec-WebSocket-Key': '!',
269                'Sec-WebSocket-Protocol': 'chat',
270                'Sec-WebSocket-Version': 13,
271            },
272            read_timeout=1,
273        )
274
275        self.assertEqual(resp['status'], 400, 'key length')
276
277        key = self.ws.key()
278        resp = self.get(
279            headers={
280                'Host': 'localhost',
281                'Upgrade': 'websocket',
282                'Connection': 'Upgrade',
283                'Sec-WebSocket-Key': [key, key],
284                'Sec-WebSocket-Protocol': 'chat',
285                'Sec-WebSocket-Version': 13,
286            },
287            read_timeout=1,
288        )
289
290        self.assertEqual(
291            resp['status'], 400, 'key double'
292        )  # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1
293
294    def test_java_websockets_handshake_method_invalid(self):
295        self.load('websockets_mirror')
296
297        self.get()
298
299        key = self.ws.key()
300        resp = self.post(
301            headers={
302                'Host': 'localhost',
303                'Upgrade': 'websocket',
304                'Connection': 'Upgrade',
305                'Sec-WebSocket-Key': key,
306                'Sec-WebSocket-Protocol': 'chat',
307                'Sec-WebSocket-Version': 13,
308            },
309            read_timeout=1,
310        )
311
312        self.assertEqual(resp['status'], 400, 'status')
313
314    def test_java_websockets_handshake_http_10(self):
315        self.load('websockets_mirror')
316
317        self.get()
318
319        key = self.ws.key()
320        resp = self.get(
321            headers={
322                'Host': 'localhost',
323                'Upgrade': 'websocket',
324                'Connection': 'Upgrade',
325                'Sec-WebSocket-Key': key,
326                'Sec-WebSocket-Protocol': 'chat',
327                'Sec-WebSocket-Version': 13,
328            },
329            http_10=True,
330            read_timeout=1,
331        )
332
333        self.assertEqual(resp['status'], 400, 'status')
334
335    def test_java_websockets_handshake_uri_invalid(self):
336        self.load('websockets_mirror')
337
338        self.get()
339
340        key = self.ws.key()
341        resp = self.get(
342            headers={
343                'Host': 'localhost',
344                'Upgrade': 'websocket',
345                'Connection': 'Upgrade',
346                'Sec-WebSocket-Key': key,
347                'Sec-WebSocket-Protocol': 'chat',
348                'Sec-WebSocket-Version': 13,
349            },
350            url='!',
351            read_timeout=1,
352        )
353
354        self.assertEqual(resp['status'], 400, 'status')
355
356    def test_java_websockets_protocol_absent(self):
357        self.load('websockets_mirror')
358
359        self.get()
360
361        key = self.ws.key()
362        resp = self.get(
363            headers={
364                'Host': 'localhost',
365                'Upgrade': 'websocket',
366                'Connection': 'Upgrade',
367                'Sec-WebSocket-Key': key,
368                'Sec-WebSocket-Version': 13,
369            },
370            read_timeout=1,
371        )
372
373        self.assertEqual(resp['status'], 101, 'status')
374        self.assertEqual(resp['headers']['Upgrade'], 'websocket', 'upgrade')
375        self.assertEqual(
376            resp['headers']['Connection'], 'Upgrade', 'connection'
377        )
378        self.assertEqual(
379            resp['headers']['Sec-WebSocket-Accept'], self.ws.accept(key), 'key'
380        )
381
382    # autobahn-testsuite
383    #
384    # Some following tests fail because of Unit does not support UTF-8
385    # validation for websocket frames.  It should be implemented
386    # by application, if necessary.
387
388    def test_java_websockets_1_1_1__1_1_8(self):
389        self.load('websockets_mirror')
390
391        opcode = self.ws.OP_TEXT
392
393        _, sock, _ = self.ws.upgrade()
394
395        def check_length(length, chopsize=None):
396            payload = '*' * length
397
398            self.ws.frame_write(sock, opcode, payload, chopsize=chopsize)
399
400            frame = self.ws.message_read(sock)
401            self.check_frame(frame, True, opcode, payload)
402
403        check_length(0)                      # 1_1_1
404        check_length(125)                    # 1_1_2
405        check_length(126)                    # 1_1_3
406        check_length(127)                    # 1_1_4
407        check_length(128)                    # 1_1_5
408        check_length(65535)                  # 1_1_6
409        check_length(65536)                  # 1_1_7
410        check_length(65536, chopsize = 997)  # 1_1_8
411
412        self.close_connection(sock)
413
414    def test_java_websockets_1_2_1__1_2_8(self):
415        self.load('websockets_mirror')
416
417        opcode = self.ws.OP_BINARY
418
419        _, sock, _ = self.ws.upgrade()
420
421        def check_length(length, chopsize=None):
422            payload = b'\xfe' * length
423
424            self.ws.frame_write(sock, opcode, payload, chopsize=chopsize)
425
426            frame = self.ws.message_read(sock)
427            self.check_frame(frame, True, opcode, payload)
428
429        check_length(0)                      # 1_2_1
430        check_length(125)                    # 1_2_2
431        check_length(126)                    # 1_2_3
432        check_length(127)                    # 1_2_4
433        check_length(128)                    # 1_2_5
434        check_length(65535)                  # 1_2_6
435        check_length(65536)                  # 1_2_7
436        check_length(65536, chopsize = 997)  # 1_2_8
437
438        self.close_connection(sock)
439
440    def test_java_websockets_2_1__2_6(self):
441        self.load('websockets_mirror')
442
443        op_ping = self.ws.OP_PING
444        op_pong = self.ws.OP_PONG
445
446        _, sock, _ = self.ws.upgrade()
447
448        def check_ping(payload, chopsize=None, decode=True):
449            self.ws.frame_write(sock, op_ping, payload, chopsize=chopsize)
450            frame = self.ws.frame_read(sock)
451
452            self.check_frame(frame, True, op_pong, payload, decode=decode)
453
454        check_ping('')                                                 # 2_1
455        check_ping('Hello, world!')                                    # 2_2
456        check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False)  # 2_3
457        check_ping(b'\xfe' * 125, decode=False)                        # 2_4
458        check_ping(b'\xfe' * 125, chopsize=1, decode=False)            # 2_6
459
460        self.close_connection(sock)
461
462        # 2_5
463
464        _, sock, _ = self.ws.upgrade()
465
466        self.ws.frame_write(sock, self.ws.OP_PING, b'\xfe' * 126)
467        self.check_close(sock, 1002)
468
469    def test_java_websockets_2_7__2_9(self):
470        self.load('websockets_mirror')
471
472        # 2_7
473
474        _, sock, _ = self.ws.upgrade()
475
476        self.ws.frame_write(sock, self.ws.OP_PONG, '')
477        self.assertEqual(self.recvall(sock, read_timeout=1), b'', '2_7')
478
479        # 2_8
480
481        self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload')
482        self.assertEqual(self.recvall(sock, read_timeout=1), b'', '2_8')
483
484        # 2_9
485
486        payload = 'ping payload'
487
488        self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload')
489        self.ws.frame_write(sock, self.ws.OP_PING, payload)
490
491        frame = self.ws.frame_read(sock)
492        self.check_frame(frame, True, self.ws.OP_PONG, payload)
493
494        self.close_connection(sock)
495
496    def test_java_websockets_2_10__2_11(self):
497        self.load('websockets_mirror')
498
499        # 2_10
500
501        _, sock, _ = self.ws.upgrade()
502
503        for i in range(0, 10):
504            self.ws.frame_write(sock, self.ws.OP_PING, 'payload-%d' % i)
505
506        for i in range(0, 10):
507            frame = self.ws.frame_read(sock)
508            self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i)
509
510        # 2_11
511
512        for i in range(0, 10):
513            opcode = self.ws.OP_PING
514            self.ws.frame_write(sock, opcode, 'payload-%d' % i, chopsize=1)
515
516        for i in range(0, 10):
517            frame = self.ws.frame_read(sock)
518            self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i)
519
520        self.close_connection(sock)
521
522    @unittest.skip('not yet')
523    def test_java_websockets_3_1__3_7(self):
524        self.load('websockets_mirror')
525
526        payload = 'Hello, world!'
527
528        # 3_1
529
530        _, sock, _ = self.ws.upgrade()
531
532        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv1=True)
533        self.check_close(sock, 1002)
534
535        # 3_2
536
537        _, sock, _ = self.ws.upgrade()
538
539        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
540        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv2=True)
541        self.ws.frame_write(sock, self.ws.OP_PING, '')
542
543        frame = self.ws.frame_read(sock)
544        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
545
546        self.check_close(sock, 1002, no_close=True)
547
548        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_2')
549        sock.close()
550
551        # 3_3
552
553        _, sock, _ = self.ws.upgrade()
554
555        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
556
557        frame = self.ws.frame_read(sock)
558        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
559
560        self.ws.frame_write(
561            sock, self.ws.OP_TEXT, payload, rsv1=True, rsv2=True
562        )
563
564        self.check_close(sock, 1002, no_close=True)
565
566        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_3')
567        sock.close()
568
569        # 3_4
570
571        _, sock, _ = self.ws.upgrade()
572
573        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1)
574        self.ws.frame_write(
575            sock, self.ws.OP_TEXT, payload, rsv3=True, chopsize=1
576        )
577        self.ws.frame_write(sock, self.ws.OP_PING, '')
578
579        frame = self.ws.frame_read(sock)
580        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
581
582        self.check_close(sock, 1002, no_close=True)
583
584        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_4')
585        sock.close()
586
587        # 3_5
588
589        _, sock, _ = self.ws.upgrade()
590
591        self.ws.frame_write(
592            sock,
593            self.ws.OP_BINARY,
594            b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff',
595            rsv1=True,
596            rsv3=True,
597        )
598
599        self.check_close(sock, 1002)
600
601        # 3_6
602
603        _, sock, _ = self.ws.upgrade()
604
605        self.ws.frame_write(
606            sock, self.ws.OP_PING, payload, rsv2=True, rsv3=True
607        )
608
609        self.check_close(sock, 1002)
610
611        # 3_7
612
613        _, sock, _ = self.ws.upgrade()
614
615        self.ws.frame_write(
616            sock, self.ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True
617        )
618
619        self.check_close(sock, 1002)
620
621    def test_java_websockets_4_1_1__4_2_5(self):
622        self.load('websockets_mirror')
623
624        payload = 'Hello, world!'
625
626        # 4_1_1
627
628        _, sock, _ = self.ws.upgrade()
629
630        self.ws.frame_write(sock, 0x03, '')
631        self.check_close(sock, 1002)
632
633        # 4_1_2
634
635        _, sock, _ = self.ws.upgrade()
636
637        self.ws.frame_write(sock, 0x04, 'reserved opcode payload')
638        self.check_close(sock, 1002)
639
640        # 4_1_3
641
642        _, sock, _ = self.ws.upgrade()
643
644        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
645
646        frame = self.ws.frame_read(sock)
647        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
648
649        self.ws.frame_write(sock, 0x05, '')
650        self.ws.frame_write(sock, self.ws.OP_PING, '')
651
652        self.check_close(sock, 1002)
653
654        # 4_1_4
655
656        _, sock, _ = self.ws.upgrade()
657
658        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
659
660        frame = self.ws.frame_read(sock)
661        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
662
663        self.ws.frame_write(sock, 0x06, payload)
664        self.ws.frame_write(sock, self.ws.OP_PING, '')
665
666        self.check_close(sock, 1002)
667
668        # 4_1_5
669
670        _, sock, _ = self.ws.upgrade()
671
672        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1)
673
674        frame = self.ws.frame_read(sock)
675        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
676
677        self.ws.frame_write(sock, 0x07, payload, chopsize=1)
678        self.ws.frame_write(sock, self.ws.OP_PING, '')
679
680        self.check_close(sock, 1002)
681
682        # 4_2_1
683
684        _, sock, _ = self.ws.upgrade()
685
686        self.ws.frame_write(sock, 0x0B, '')
687        self.check_close(sock, 1002)
688
689        # 4_2_2
690
691        _, sock, _ = self.ws.upgrade()
692
693        self.ws.frame_write(sock, 0x0C, 'reserved opcode payload')
694        self.check_close(sock, 1002)
695
696        # 4_2_3
697
698        _, sock, _ = self.ws.upgrade()
699
700        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
701
702        frame = self.ws.frame_read(sock)
703        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
704
705        self.ws.frame_write(sock, 0x0D, '')
706        self.ws.frame_write(sock, self.ws.OP_PING, '')
707
708        self.check_close(sock, 1002)
709
710        # 4_2_4
711
712        _, sock, _ = self.ws.upgrade()
713
714        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
715
716        frame = self.ws.frame_read(sock)
717        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
718
719        self.ws.frame_write(sock, 0x0E, payload)
720        self.ws.frame_write(sock, self.ws.OP_PING, '')
721
722        self.check_close(sock, 1002)
723
724        # 4_2_5
725
726        _, sock, _ = self.ws.upgrade()
727
728        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1)
729
730        frame = self.ws.frame_read(sock)
731        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
732
733        self.ws.frame_write(sock, 0x0F, payload, chopsize=1)
734        self.ws.frame_write(sock, self.ws.OP_PING, '')
735
736        self.check_close(sock, 1002)
737
738    def test_java_websockets_5_1__5_20(self):
739        self.load('websockets_mirror')
740
741        # 5_1
742
743        _, sock, _ = self.ws.upgrade()
744
745        self.ws.frame_write(sock, self.ws.OP_PING, 'fragment1', fin=False)
746        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
747        self.check_close(sock, 1002)
748
749        # 5_2
750
751        _, sock, _ = self.ws.upgrade()
752
753        self.ws.frame_write(sock, self.ws.OP_PONG, 'fragment1', fin=False)
754        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
755        self.check_close(sock, 1002)
756
757        # 5_3
758
759        _, sock, _ = self.ws.upgrade()
760
761        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
762        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
763
764        frame = self.ws.frame_read(sock)
765        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
766
767        # 5_4
768
769        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
770        self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_4')
771        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
772
773        frame = self.ws.frame_read(sock)
774        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
775
776        # 5_5
777
778        self.ws.frame_write(
779            sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1
780        )
781        self.ws.frame_write(
782            sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1
783        )
784
785        frame = self.ws.frame_read(sock)
786        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
787
788        # 5_6
789
790        ping_payload = 'ping payload'
791
792        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
793        self.ws.frame_write(sock, self.ws.OP_PING, ping_payload)
794        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
795
796        frame = self.ws.frame_read(sock)
797        self.check_frame(frame, True, self.ws.OP_PONG, ping_payload)
798
799        frame = self.ws.frame_read(sock)
800        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
801
802        # 5_7
803
804        ping_payload = 'ping payload'
805
806        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
807        self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_7')
808
809        self.ws.frame_write(sock, self.ws.OP_PING, ping_payload)
810
811        frame = self.ws.frame_read(sock)
812        self.check_frame(frame, True, self.ws.OP_PONG, ping_payload)
813
814        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
815
816        frame = self.ws.frame_read(sock)
817        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
818
819        # 5_8
820
821        ping_payload = 'ping payload'
822
823        self.ws.frame_write(
824            sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1
825        )
826        self.ws.frame_write(sock, self.ws.OP_PING, ping_payload, chopsize=1)
827        self.ws.frame_write(
828            sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1
829        )
830
831        frame = self.ws.frame_read(sock)
832        self.check_frame(frame, True, self.ws.OP_PONG, ping_payload)
833
834        frame = self.ws.frame_read(sock)
835        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
836
837        # 5_9
838
839        self.ws.frame_write(
840            sock, self.ws.OP_CONT, 'non-continuation payload', fin=True
841        )
842        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
843        self.check_close(sock, 1002)
844
845        # 5_10
846
847        _, sock, _ = self.ws.upgrade()
848
849        self.ws.frame_write(
850            sock, self.ws.OP_CONT, 'non-continuation payload', fin=True
851        )
852        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
853        self.check_close(sock, 1002)
854
855        # 5_11
856
857        _, sock, _ = self.ws.upgrade()
858
859        self.ws.frame_write(
860            sock,
861            self.ws.OP_CONT,
862            'non-continuation payload',
863            fin=True,
864            chopsize=1,
865        )
866        self.ws.frame_write(
867            sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1
868        )
869        self.check_close(sock, 1002)
870
871        # 5_12
872
873        _, sock, _ = self.ws.upgrade()
874
875        self.ws.frame_write(
876            sock, self.ws.OP_CONT, 'non-continuation payload', fin=False
877        )
878        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
879        self.check_close(sock, 1002)
880
881        # 5_13
882
883        _, sock, _ = self.ws.upgrade()
884
885        self.ws.frame_write(
886            sock, self.ws.OP_CONT, 'non-continuation payload', fin=False
887        )
888        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
889        self.check_close(sock, 1002)
890
891        # 5_14
892
893        _, sock, _ = self.ws.upgrade()
894
895        self.ws.frame_write(
896            sock,
897            self.ws.OP_CONT,
898            'non-continuation payload',
899            fin=False,
900            chopsize=1,
901        )
902        self.ws.frame_write(
903            sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1
904        )
905        self.check_close(sock, 1002)
906
907        # 5_15
908
909        _, sock, _ = self.ws.upgrade()
910
911        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
912        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
913        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
914        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment4', fin=True)
915        self.check_close(sock, 1002)
916
917        # 5_16
918
919        _, sock, _ = self.ws.upgrade()
920
921        for i in range(0, 2):
922            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=False)
923            self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False)
924            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True)
925        self.check_close(sock, 1002)
926
927        # 5_17
928
929        _, sock, _ = self.ws.upgrade()
930
931        for i in range(0, 2):
932            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=True)
933            self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False)
934            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True)
935        self.check_close(sock, 1002)
936
937        # 5_18
938
939        _, sock, _ = self.ws.upgrade()
940
941        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
942        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2')
943        self.check_close(sock, 1002)
944
945        # 5_19
946
947        _, sock, _ = self.ws.upgrade()
948
949        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
950        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False)
951        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!')
952
953        time.sleep(1)
954
955        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
956        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False)
957        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!')
958        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5')
959
960        frame = self.ws.frame_read(sock)
961        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!')
962
963        frame = self.ws.frame_read(sock)
964        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!')
965
966        self.check_frame(
967            self.ws.frame_read(sock),
968            True,
969            self.ws.OP_TEXT,
970            'fragment1fragment2fragment3fragment4fragment5',
971        )
972
973        # 5_20
974
975        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
976        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False)
977        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!')
978
979        frame = self.ws.frame_read(sock)
980        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!')
981
982        time.sleep(1)
983
984        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
985        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False)
986        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!')
987
988        frame = self.ws.frame_read(sock)
989        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!')
990
991        self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_20')
992        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5')
993
994        self.check_frame(
995            self.ws.frame_read(sock),
996            True,
997            self.ws.OP_TEXT,
998            'fragment1fragment2fragment3fragment4fragment5',
999        )
1000
1001        self.close_connection(sock)
1002
1003    def test_java_websockets_6_1_1__6_4_4(self):
1004        self.load('websockets_mirror')
1005
1006        # 6_1_1
1007
1008        _, sock, _ = self.ws.upgrade()
1009
1010        self.ws.frame_write(sock, self.ws.OP_TEXT, '')
1011        frame = self.ws.frame_read(sock, read_timeout=3)
1012        self.check_frame(frame, True, self.ws.OP_TEXT, '')
1013
1014        # 6_1_2
1015
1016        self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False)
1017        self.ws.frame_write(sock, self.ws.OP_CONT, '', fin=False)
1018        self.ws.frame_write(sock, self.ws.OP_CONT, '')
1019
1020        frame = self.ws.frame_read(sock, read_timeout=3)
1021        self.check_frame(frame, True, self.ws.OP_TEXT, '')
1022
1023        # 6_1_3
1024
1025        payload = 'middle frame payload'
1026
1027        self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False)
1028        self.ws.frame_write(sock, self.ws.OP_CONT, payload, fin=False)
1029        self.ws.frame_write(sock, self.ws.OP_CONT, '')
1030
1031        frame = self.ws.frame_read(sock)
1032        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
1033
1034        # 6_2_1
1035
1036        payload = 'Hello-µ@ßöäüàá-UTF-8!!'
1037
1038        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
1039
1040        frame = self.ws.frame_read(sock)
1041        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
1042
1043        # 6_2_2
1044
1045        self.ws.frame_write(sock, self.ws.OP_TEXT, payload[:12], fin=False)
1046        self.ws.frame_write(sock, self.ws.OP_CONT, payload[12:])
1047
1048        frame = self.ws.frame_read(sock)
1049        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
1050
1051        # 6_2_3
1052
1053        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1)
1054
1055        frame = self.ws.frame_read(sock)
1056        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
1057
1058        # 6_2_4
1059
1060        payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5'
1061
1062        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1)
1063
1064        frame = self.ws.frame_read(sock)
1065        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
1066
1067        self.close_connection(sock)
1068
1069#        Unit does not support UTF-8 validation
1070#
1071#        # 6_3_1 FAIL
1072#
1073#        payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5'
1074#        payload_2 = '\xed\xa0\x80'
1075#        payload_3 = '\x65\x64\x69\x74\x65\x64'
1076#
1077#        payload = payload_1 + payload_2 + payload_3
1078#
1079#        self.ws.message(sock, self.ws.OP_TEXT, payload)
1080#        self.check_close(sock, 1007)
1081#
1082#        # 6_3_2 FAIL
1083#
1084#        _, sock, _ = self.ws.upgrade()
1085#
1086#        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1)
1087#        self.check_close(sock, 1007)
1088#
1089#        # 6_4_1 ... 6_4_4 FAIL
1090
1091    def test_java_websockets_7_1_1__7_5_1(self):
1092        self.load('websockets_mirror')
1093
1094        # 7_1_1
1095
1096        _, sock, _ = self.ws.upgrade()
1097
1098        payload = "Hello World!"
1099
1100        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
1101
1102        frame = self.ws.frame_read(sock)
1103        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
1104
1105        self.close_connection(sock)
1106
1107        # 7_1_2
1108
1109        _, sock, _ = self.ws.upgrade()
1110
1111        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
1112        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
1113
1114        self.check_close(sock)
1115
1116        # 7_1_3
1117
1118        _, sock, _ = self.ws.upgrade()
1119
1120        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
1121        self.check_close(sock, no_close=True)
1122
1123        self.ws.frame_write(sock, self.ws.OP_PING, '')
1124        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock')
1125
1126        sock.close()
1127
1128        # 7_1_4
1129
1130        _, sock, _ = self.ws.upgrade()
1131
1132        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
1133        self.check_close(sock, no_close=True)
1134
1135        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
1136        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock')
1137
1138        sock.close()
1139
1140        # 7_1_5
1141
1142        _, sock, _ = self.ws.upgrade()
1143
1144        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
1145        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
1146        self.check_close(sock, no_close=True)
1147
1148        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2')
1149        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock')
1150
1151        sock.close()
1152
1153        # 7_1_6
1154
1155        _, sock, _ = self.ws.upgrade()
1156
1157        self.ws.frame_write(sock, self.ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2 ** 10)
1158        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
1159        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
1160
1161        self.recvall(sock, read_timeout=1)
1162
1163        self.ws.frame_write(sock, self.ws.OP_PING, '')
1164        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock')
1165
1166        sock.close()
1167
1168        # 7_3_1 # FAIL
1169
1170        _, sock, _ = self.ws.upgrade()
1171
1172        self.ws.frame_write(sock, self.ws.OP_CLOSE, '')
1173        self.check_close(sock)
1174
1175        # 7_3_2
1176
1177        _, sock, _ = self.ws.upgrade()
1178
1179        self.ws.frame_write(sock, self.ws.OP_CLOSE, 'a')
1180        self.check_close(sock, 1002)
1181
1182        # 7_3_3
1183
1184        _, sock, _ = self.ws.upgrade()
1185
1186        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
1187        self.check_close(sock)
1188
1189        # 7_3_4
1190
1191        _, sock, _ = self.ws.upgrade()
1192
1193        payload = self.ws.serialize_close(reason='Hello World!')
1194
1195        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
1196        self.check_close(sock)
1197
1198        # 7_3_5
1199
1200        _, sock, _ = self.ws.upgrade()
1201
1202        payload = self.ws.serialize_close(reason='*' * 123)
1203
1204        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
1205        self.check_close(sock)
1206
1207        # 7_3_6
1208
1209        _, sock, _ = self.ws.upgrade()
1210
1211        payload = self.ws.serialize_close(reason='*' * 124)
1212
1213        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
1214        self.check_close(sock, 1002)
1215
1216#        # 7_5_1 FAIL Unit does not support UTF-8 validation
1217#
1218#        _, sock, _ = self.ws.upgrade()
1219#
1220#        payload = self.ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \
1221#            '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64')
1222#
1223#        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
1224#        self.check_close(sock, 1007)
1225
1226    def test_java_websockets_7_7_X__7_9_X(self):
1227        self.load('websockets_mirror')
1228
1229        valid_codes = [
1230            1000,
1231            1001,
1232            1002,
1233            1003,
1234            1007,
1235            1008,
1236            1009,
1237            1010,
1238            1011,
1239            3000,
1240            3999,
1241            4000,
1242            4999,
1243        ]
1244
1245        invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999]
1246
1247        for code in valid_codes:
1248            _, sock, _ = self.ws.upgrade()
1249
1250            payload = self.ws.serialize_close(code=code)
1251
1252            self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
1253            self.check_close(sock, code=code)
1254
1255        for code in invalid_codes:
1256            _, sock, _ = self.ws.upgrade()
1257
1258            payload = self.ws.serialize_close(code=code)
1259
1260            self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
1261            self.check_close(sock, 1002)
1262
1263    def test_java_websockets_7_13_1__7_13_2(self):
1264        self.load('websockets_mirror')
1265
1266        # 7_13_1
1267
1268        _, sock, _ = self.ws.upgrade()
1269
1270        payload = self.ws.serialize_close(code=5000)
1271
1272        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
1273        self.check_close(sock, 1002)
1274
1275        # 7_13_2
1276
1277        _, sock, _ = self.ws.upgrade()
1278
1279        payload = struct.pack('!I', 65536) + ''.encode('utf-8')
1280
1281        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
1282        self.check_close(sock, 1002)
1283
1284    def test_java_websockets_9_1_1__9_6_6(self):
1285        if not self.unsafe:
1286            self.skipTest("unsafe, long run")
1287
1288        self.load('websockets_mirror')
1289
1290        self.assertIn(
1291            'success',
1292            self.conf(
1293                {
1294                    'http': {
1295                        'websocket': {
1296                            'max_frame_size': 33554432,
1297                            'keepalive_interval': 0,
1298                        }
1299                    }
1300                },
1301                'settings',
1302            ),
1303            'increase max_frame_size and keepalive_interval',
1304        )
1305
1306        _, sock, _ = self.ws.upgrade()
1307
1308        op_text = self.ws.OP_TEXT
1309        op_binary = self.ws.OP_BINARY
1310
1311        def check_payload(opcode, length, chopsize=None):
1312            if opcode == self.ws.OP_TEXT:
1313                payload = '*' * length
1314            else:
1315                payload = b'*' * length
1316
1317            self.ws.frame_write(sock, opcode, payload, chopsize=chopsize)
1318            frame = self.ws.frame_read(sock)
1319            self.check_frame(frame, True, opcode, payload)
1320
1321        def check_message(opcode, f_size):
1322            if opcode == self.ws.OP_TEXT:
1323                payload = '*' * 4 * 2 ** 20
1324            else:
1325                payload = b'*' * 4 * 2 ** 20
1326
1327            self.ws.message(sock, opcode, payload, fragmention_size=f_size)
1328            frame = self.ws.frame_read(sock, read_timeout=5)
1329            self.check_frame(frame, True, opcode, payload)
1330
1331        check_payload(op_text, 64 * 2 ** 10)              # 9_1_1
1332        check_payload(op_text, 256 * 2 ** 10)             # 9_1_2
1333        check_payload(op_text, 2 ** 20)                   # 9_1_3
1334        check_payload(op_text, 4 * 2 ** 20)               # 9_1_4
1335        check_payload(op_text, 8 * 2 ** 20)               # 9_1_5
1336        check_payload(op_text, 16 * 2 ** 20)              # 9_1_6
1337
1338        check_payload(op_binary, 64 * 2 ** 10)            # 9_2_1
1339        check_payload(op_binary, 256 * 2 ** 10)           # 9_2_2
1340        check_payload(op_binary, 2 ** 20)                 # 9_2_3
1341        check_payload(op_binary, 4 * 2 ** 20)             # 9_2_4
1342        check_payload(op_binary, 8 * 2 ** 20)             # 9_2_5
1343        check_payload(op_binary, 16 * 2 ** 20)            # 9_2_6
1344
1345        if self.system != 'Darwin' and self.system != 'FreeBSD':
1346            check_message(op_text, 64)                    # 9_3_1
1347            check_message(op_text, 256)                   # 9_3_2
1348            check_message(op_text, 2 ** 10)               # 9_3_3
1349            check_message(op_text, 4 * 2 ** 10)           # 9_3_4
1350            check_message(op_text, 16 * 2 ** 10)          # 9_3_5
1351            check_message(op_text, 64 * 2 ** 10)          # 9_3_6
1352            check_message(op_text, 256 * 2 ** 10)         # 9_3_7
1353            check_message(op_text, 2 ** 20)               # 9_3_8
1354            check_message(op_text, 4 * 2 ** 20)           # 9_3_9
1355
1356            check_message(op_binary, 64)                  # 9_4_1
1357            check_message(op_binary, 256)                 # 9_4_2
1358            check_message(op_binary, 2 ** 10)             # 9_4_3
1359            check_message(op_binary, 4 * 2 ** 10)         # 9_4_4
1360            check_message(op_binary, 16 * 2 ** 10)        # 9_4_5
1361            check_message(op_binary, 64 * 2 ** 10)        # 9_4_6
1362            check_message(op_binary, 256 * 2 ** 10)       # 9_4_7
1363            check_message(op_binary, 2 ** 20)             # 9_4_8
1364            check_message(op_binary, 4 * 2 ** 20)         # 9_4_9
1365
1366        check_payload(op_text, 2 ** 20, chopsize=64)      # 9_5_1
1367        check_payload(op_text, 2 ** 20, chopsize=128)     # 9_5_2
1368        check_payload(op_text, 2 ** 20, chopsize=256)     # 9_5_3
1369        check_payload(op_text, 2 ** 20, chopsize=512)     # 9_5_4
1370        check_payload(op_text, 2 ** 20, chopsize=1024)    # 9_5_5
1371        check_payload(op_text, 2 ** 20, chopsize=2048)    # 9_5_6
1372
1373        check_payload(op_binary, 2 ** 20, chopsize=64)    # 9_6_1
1374        check_payload(op_binary, 2 ** 20, chopsize=128)   # 9_6_2
1375        check_payload(op_binary, 2 ** 20, chopsize=256)   # 9_6_3
1376        check_payload(op_binary, 2 ** 20, chopsize=512)   # 9_6_4
1377        check_payload(op_binary, 2 ** 20, chopsize=1024)  # 9_6_5
1378        check_payload(op_binary, 2 ** 20, chopsize=2048)  # 9_6_6
1379
1380        self.close_connection(sock)
1381
1382    def test_java_websockets_10_1_1(self):
1383        self.load('websockets_mirror')
1384
1385        _, sock, _ = self.ws.upgrade()
1386
1387        payload = '*' * 65536
1388
1389        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1300)
1390
1391        frame = self.ws.message_read(sock)
1392        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
1393
1394        self.close_connection(sock)
1395
1396    # settings
1397
1398    def test_java_websockets_max_frame_size(self):
1399        self.load('websockets_mirror')
1400
1401        self.assertIn(
1402            'success',
1403            self.conf(
1404                {'http': {'websocket': {'max_frame_size': 100}}}, 'settings'
1405            ),
1406            'configure max_frame_size',
1407        )
1408
1409        _, sock, _ = self.ws.upgrade()
1410
1411        payload = '*' * 94
1412        opcode = self.ws.OP_TEXT
1413
1414        self.ws.frame_write(sock, opcode, payload)  # frame length is 100
1415
1416        frame = self.ws.frame_read(sock)
1417        self.check_frame(frame, True, opcode, payload)
1418
1419        payload = '*' * 95
1420
1421        self.ws.frame_write(sock, opcode, payload)  # frame length is 101
1422        self.check_close(sock, 1009)  # 1009 - CLOSE_TOO_LARGE
1423
1424    def test_java_websockets_read_timeout(self):
1425        self.load('websockets_mirror')
1426
1427        self.assertIn(
1428            'success',
1429            self.conf(
1430                {'http': {'websocket': {'read_timeout': 5}}}, 'settings'
1431            ),
1432            'configure read_timeout',
1433        )
1434
1435        _, sock, _ = self.ws.upgrade()
1436
1437        frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah')
1438        sock.sendall(frame[:2])
1439
1440        time.sleep(2)
1441
1442        self.check_close(sock, 1001)  # 1001 - CLOSE_GOING_AWAY
1443
1444    def test_java_websockets_keepalive_interval(self):
1445        self.load('websockets_mirror')
1446
1447        self.assertIn(
1448            'success',
1449            self.conf(
1450                {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings'
1451            ),
1452            'configure keepalive_interval',
1453        )
1454
1455        _, sock, _ = self.ws.upgrade()
1456
1457        frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah')
1458        sock.sendall(frame[:2])
1459
1460        time.sleep(2)
1461
1462        frame = self.ws.frame_read(sock)
1463        self.check_frame(frame, True, self.ws.OP_PING, '')  # PING frame
1464
1465        sock.close()
1466
1467
1468if __name__ == '__main__':
1469    TestJavaWebsockets.main()
1470