11130Szelenkov@nginx.comimport time
21130Szelenkov@nginx.comimport struct
31130Szelenkov@nginx.comimport unittest
41130Szelenkov@nginx.comfrom unit.applications.lang.node import TestApplicationNode
51130Szelenkov@nginx.comfrom unit.applications.websockets import TestApplicationWebsocket
61130Szelenkov@nginx.com
71150Szelenkov@nginx.com
81130Szelenkov@nginx.comclass TestNodeWebsockets(TestApplicationNode):
9*1165Szelenkov@nginx.com    prerequisites = {'modules': ['node']}
101130Szelenkov@nginx.com
111130Szelenkov@nginx.com    ws = TestApplicationWebsocket()
121130Szelenkov@nginx.com
131133Szelenkov@nginx.com    def setUp(self):
141133Szelenkov@nginx.com        super().setUp()
151133Szelenkov@nginx.com
161138Szelenkov@nginx.com        self.assertIn(
171138Szelenkov@nginx.com            'success',
181138Szelenkov@nginx.com            self.conf(
191138Szelenkov@nginx.com                {'http': {'websocket': {'keepalive_interval': 0}}}, 'settings'
201138Szelenkov@nginx.com            ),
211138Szelenkov@nginx.com            'clear keepalive_interval',
221138Szelenkov@nginx.com        )
231138Szelenkov@nginx.com
241133Szelenkov@nginx.com        self.skip_alerts.extend(
251150Szelenkov@nginx.com            [r'last message send failed', r'socket close\(\d+\) failed']
261133Szelenkov@nginx.com        )
271130Szelenkov@nginx.com
281130Szelenkov@nginx.com    def close_connection(self, sock):
291130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock')
301130Szelenkov@nginx.com
311130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
321130Szelenkov@nginx.com
331130Szelenkov@nginx.com        self.check_close(sock)
341130Szelenkov@nginx.com
351150Szelenkov@nginx.com    def check_close(self, sock, code=1000, no_close=False):
361130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
371130Szelenkov@nginx.com
381130Szelenkov@nginx.com        self.assertEqual(frame['fin'], True, 'close fin')
391130Szelenkov@nginx.com        self.assertEqual(frame['opcode'], self.ws.OP_CLOSE, 'close opcode')
401130Szelenkov@nginx.com        self.assertEqual(frame['code'], code, 'close code')
411130Szelenkov@nginx.com
421130Szelenkov@nginx.com        if not no_close:
431130Szelenkov@nginx.com            sock.close()
441130Szelenkov@nginx.com
451130Szelenkov@nginx.com    def check_frame(self, frame, fin, opcode, payload, decode=True):
461130Szelenkov@nginx.com        if opcode == self.ws.OP_BINARY or not decode:
471130Szelenkov@nginx.com            data = frame['data']
481130Szelenkov@nginx.com        else:
491130Szelenkov@nginx.com            data = frame['data'].decode('utf-8')
501130Szelenkov@nginx.com
511130Szelenkov@nginx.com        self.assertEqual(frame['fin'], fin, 'fin')
521130Szelenkov@nginx.com        self.assertEqual(frame['opcode'], opcode, 'opcode')
531130Szelenkov@nginx.com        self.assertEqual(data, payload, 'payload')
541130Szelenkov@nginx.com
551130Szelenkov@nginx.com    def test_node_websockets_handshake(self):
561130Szelenkov@nginx.com        self.load('websockets/mirror')
571130Szelenkov@nginx.com
581130Szelenkov@nginx.com        resp, sock, key = self.ws.upgrade()
591130Szelenkov@nginx.com        sock.close()
601130Szelenkov@nginx.com
611130Szelenkov@nginx.com        self.assertEqual(resp['status'], 101, 'status')
621150Szelenkov@nginx.com        self.assertEqual(resp['headers']['Upgrade'], 'websocket', 'upgrade')
631130Szelenkov@nginx.com        self.assertEqual(
641130Szelenkov@nginx.com            resp['headers']['Connection'], 'Upgrade', 'connection'
651130Szelenkov@nginx.com        )
661130Szelenkov@nginx.com        self.assertEqual(
671130Szelenkov@nginx.com            resp['headers']['Sec-WebSocket-Accept'], self.ws.accept(key), 'key'
681130Szelenkov@nginx.com        )
691130Szelenkov@nginx.com
701130Szelenkov@nginx.com    def test_node_websockets_mirror(self):
711130Szelenkov@nginx.com        self.load('websockets/mirror')
721130Szelenkov@nginx.com
731130Szelenkov@nginx.com        message = 'blah'
741130Szelenkov@nginx.com
751130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
761130Szelenkov@nginx.com
771130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, message)
781130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
791130Szelenkov@nginx.com
801150Szelenkov@nginx.com        self.assertEqual(message, frame['data'].decode('utf-8'), 'mirror')
811130Szelenkov@nginx.com
821130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, message)
831130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
841130Szelenkov@nginx.com
851150Szelenkov@nginx.com        self.assertEqual(message, frame['data'].decode('utf-8'), 'mirror 2')
861130Szelenkov@nginx.com
871130Szelenkov@nginx.com        sock.close()
881130Szelenkov@nginx.com
891130Szelenkov@nginx.com    def test_node_websockets_no_mask(self):
901130Szelenkov@nginx.com        self.load('websockets/mirror')
911130Szelenkov@nginx.com
921130Szelenkov@nginx.com        message = 'blah'
931130Szelenkov@nginx.com
941130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
951130Szelenkov@nginx.com
961130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, message, mask=False)
971130Szelenkov@nginx.com
981130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
991130Szelenkov@nginx.com
1001130Szelenkov@nginx.com        self.assertEqual(frame['opcode'], self.ws.OP_CLOSE, 'no mask opcode')
1011130Szelenkov@nginx.com        self.assertEqual(frame['code'], 1002, 'no mask close code')
1021130Szelenkov@nginx.com
1031130Szelenkov@nginx.com        sock.close()
1041130Szelenkov@nginx.com
1051130Szelenkov@nginx.com    def test_node_websockets_fragmentation(self):
1061130Szelenkov@nginx.com        self.load('websockets/mirror')
1071130Szelenkov@nginx.com
1081130Szelenkov@nginx.com        message = 'blah'
1091130Szelenkov@nginx.com
1101130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
1111130Szelenkov@nginx.com
1121130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, message, fin=False)
1131130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, ' ', fin=False)
1141130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, message)
1151130Szelenkov@nginx.com
1161130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
1171130Szelenkov@nginx.com
1181130Szelenkov@nginx.com        self.assertEqual(
1191130Szelenkov@nginx.com            message + ' ' + message,
1201130Szelenkov@nginx.com            frame['data'].decode('utf-8'),
1211130Szelenkov@nginx.com            'mirror framing',
1221130Szelenkov@nginx.com        )
1231130Szelenkov@nginx.com
1241130Szelenkov@nginx.com        sock.close()
1251130Szelenkov@nginx.com
1261130Szelenkov@nginx.com    def test_node_websockets_frame_fragmentation_invalid(self):
1271130Szelenkov@nginx.com        self.load('websockets/mirror')
1281130Szelenkov@nginx.com
1291130Szelenkov@nginx.com        message = 'blah'
1301130Szelenkov@nginx.com
1311130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
1321130Szelenkov@nginx.com
1331130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, message, fin=False)
1341130Szelenkov@nginx.com
1351130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
1361130Szelenkov@nginx.com
1371130Szelenkov@nginx.com        frame.pop('data')
1381130Szelenkov@nginx.com        self.assertDictEqual(
1391130Szelenkov@nginx.com            frame,
1401130Szelenkov@nginx.com            {
1411130Szelenkov@nginx.com                'fin': True,
1421130Szelenkov@nginx.com                'rsv1': False,
1431130Szelenkov@nginx.com                'rsv2': False,
1441130Szelenkov@nginx.com                'rsv3': False,
1451130Szelenkov@nginx.com                'opcode': self.ws.OP_CLOSE,
1461130Szelenkov@nginx.com                'mask': 0,
1471130Szelenkov@nginx.com                'code': 1002,
1481130Szelenkov@nginx.com                'reason': 'Fragmented control frame',
1491130Szelenkov@nginx.com            },
1501130Szelenkov@nginx.com            'close frame',
1511130Szelenkov@nginx.com        )
1521130Szelenkov@nginx.com
1531130Szelenkov@nginx.com        sock.close()
1541130Szelenkov@nginx.com
1551130Szelenkov@nginx.com    def test_node_websockets_large(self):
1561130Szelenkov@nginx.com        self.load('websockets/mirror_fragmentation')
1571130Szelenkov@nginx.com
1581130Szelenkov@nginx.com        message = '0123456789' * 3000
1591130Szelenkov@nginx.com
1601130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
1611130Szelenkov@nginx.com
1621130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, message)
1631130Szelenkov@nginx.com
1641130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
1651130Szelenkov@nginx.com        data = frame['data'].decode('utf-8')
1661130Szelenkov@nginx.com
1671130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
1681130Szelenkov@nginx.com        data += frame['data'].decode('utf-8')
1691130Szelenkov@nginx.com
1701130Szelenkov@nginx.com        self.assertEqual(message, data, 'large')
1711130Szelenkov@nginx.com
1721130Szelenkov@nginx.com        sock.close()
1731130Szelenkov@nginx.com
1741130Szelenkov@nginx.com    def test_node_websockets_two_clients(self):
1751130Szelenkov@nginx.com        self.load('websockets/mirror')
1761130Szelenkov@nginx.com
1771130Szelenkov@nginx.com        message1 = 'blah1'
1781130Szelenkov@nginx.com        message2 = 'blah2'
1791130Szelenkov@nginx.com
1801130Szelenkov@nginx.com        _, sock1, _ = self.ws.upgrade()
1811130Szelenkov@nginx.com        _, sock2, _ = self.ws.upgrade()
1821130Szelenkov@nginx.com
1831130Szelenkov@nginx.com        self.ws.frame_write(sock1, self.ws.OP_TEXT, message1)
1841130Szelenkov@nginx.com        self.ws.frame_write(sock2, self.ws.OP_TEXT, message2)
1851130Szelenkov@nginx.com
1861130Szelenkov@nginx.com        frame1 = self.ws.frame_read(sock1)
1871130Szelenkov@nginx.com        frame2 = self.ws.frame_read(sock2)
1881130Szelenkov@nginx.com
1891150Szelenkov@nginx.com        self.assertEqual(message1, frame1['data'].decode('utf-8'), 'client 1')
1901150Szelenkov@nginx.com        self.assertEqual(message2, frame2['data'].decode('utf-8'), 'client 2')
1911130Szelenkov@nginx.com
1921130Szelenkov@nginx.com        sock1.close()
1931130Szelenkov@nginx.com        sock2.close()
1941130Szelenkov@nginx.com
1951130Szelenkov@nginx.com    @unittest.skip('not yet')
1961150Szelenkov@nginx.com    def test_node_websockets_handshake_upgrade_absent(
1971150Szelenkov@nginx.com        self
1981150Szelenkov@nginx.com    ):  # FAIL https://tools.ietf.org/html/rfc6455#section-4.2.1
1991130Szelenkov@nginx.com        self.load('websockets/mirror')
2001130Szelenkov@nginx.com
2011130Szelenkov@nginx.com        key = self.ws.key()
2021150Szelenkov@nginx.com        resp = self.get(
2031150Szelenkov@nginx.com            headers={
2041150Szelenkov@nginx.com                'Host': 'localhost',
2051150Szelenkov@nginx.com                'Connection': 'Upgrade',
2061150Szelenkov@nginx.com                'Sec-WebSocket-Key': key,
2071150Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2081150Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
2091150Szelenkov@nginx.com            },
2101150Szelenkov@nginx.com            read_timeout=1,
2111150Szelenkov@nginx.com        )
2121130Szelenkov@nginx.com
2131130Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'upgrade absent')
2141130Szelenkov@nginx.com
2151130Szelenkov@nginx.com    def test_node_websockets_handshake_case_insensitive(self):
2161130Szelenkov@nginx.com        self.load('websockets/mirror')
2171130Szelenkov@nginx.com
2181130Szelenkov@nginx.com        key = self.ws.key()
2191150Szelenkov@nginx.com        resp = self.get(
2201150Szelenkov@nginx.com            headers={
2211150Szelenkov@nginx.com                'Host': 'localhost',
2221150Szelenkov@nginx.com                'Upgrade': 'WEBSOCKET',
2231150Szelenkov@nginx.com                'Connection': 'UPGRADE',
2241150Szelenkov@nginx.com                'Sec-WebSocket-Key': key,
2251150Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2261150Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
2271150Szelenkov@nginx.com            },
2281150Szelenkov@nginx.com            read_timeout=1,
2291150Szelenkov@nginx.com        )
2301130Szelenkov@nginx.com
2311130Szelenkov@nginx.com        self.assertEqual(resp['status'], 101, 'status')
2321130Szelenkov@nginx.com
2331130Szelenkov@nginx.com    @unittest.skip('not yet')
2341150Szelenkov@nginx.com    def test_node_websockets_handshake_connection_absent(self):  # FAIL
2351130Szelenkov@nginx.com        self.load('websockets/mirror')
2361130Szelenkov@nginx.com
2371130Szelenkov@nginx.com        key = self.ws.key()
2381150Szelenkov@nginx.com        resp = self.get(
2391150Szelenkov@nginx.com            headers={
2401150Szelenkov@nginx.com                'Host': 'localhost',
2411150Szelenkov@nginx.com                'Upgrade': 'websocket',
2421150Szelenkov@nginx.com                'Sec-WebSocket-Key': key,
2431150Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2441150Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
2451150Szelenkov@nginx.com            },
2461150Szelenkov@nginx.com            read_timeout=1,
2471150Szelenkov@nginx.com        )
2481130Szelenkov@nginx.com
2491130Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'status')
2501130Szelenkov@nginx.com
2511130Szelenkov@nginx.com    def test_node_websockets_handshake_version_absent(self):
2521130Szelenkov@nginx.com        self.load('websockets/mirror')
2531130Szelenkov@nginx.com
2541130Szelenkov@nginx.com        key = self.ws.key()
2551150Szelenkov@nginx.com        resp = self.get(
2561150Szelenkov@nginx.com            headers={
2571150Szelenkov@nginx.com                'Host': 'localhost',
2581150Szelenkov@nginx.com                'Upgrade': 'websocket',
2591150Szelenkov@nginx.com                'Connection': 'Upgrade',
2601150Szelenkov@nginx.com                'Sec-WebSocket-Key': key,
2611150Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2621150Szelenkov@nginx.com            },
2631150Szelenkov@nginx.com            read_timeout=1,
2641150Szelenkov@nginx.com        )
2651130Szelenkov@nginx.com
2661130Szelenkov@nginx.com        self.assertEqual(resp['status'], 426, 'status')
2671130Szelenkov@nginx.com
2681130Szelenkov@nginx.com    @unittest.skip('not yet')
2691130Szelenkov@nginx.com    def test_node_websockets_handshake_key_invalid(self):
2701130Szelenkov@nginx.com        self.load('websockets/mirror')
2711130Szelenkov@nginx.com
2721150Szelenkov@nginx.com        resp = self.get(
2731150Szelenkov@nginx.com            headers={
2741150Szelenkov@nginx.com                'Host': 'localhost',
2751150Szelenkov@nginx.com                'Upgrade': 'websocket',
2761150Szelenkov@nginx.com                'Connection': 'Upgrade',
2771150Szelenkov@nginx.com                'Sec-WebSocket-Key': '!',
2781150Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2791150Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
2801150Szelenkov@nginx.com            },
2811150Szelenkov@nginx.com            read_timeout=1,
2821150Szelenkov@nginx.com        )
2831130Szelenkov@nginx.com
2841130Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'key length')
2851130Szelenkov@nginx.com
2861130Szelenkov@nginx.com        key = self.ws.key()
2871150Szelenkov@nginx.com        resp = self.get(
2881150Szelenkov@nginx.com            headers={
2891150Szelenkov@nginx.com                'Host': 'localhost',
2901150Szelenkov@nginx.com                'Upgrade': 'websocket',
2911150Szelenkov@nginx.com                'Connection': 'Upgrade',
2921150Szelenkov@nginx.com                'Sec-WebSocket-Key': [key, key],
2931150Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
2941150Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
2951150Szelenkov@nginx.com            },
2961150Szelenkov@nginx.com            read_timeout=1,
2971150Szelenkov@nginx.com        )
2981130Szelenkov@nginx.com
2991150Szelenkov@nginx.com        self.assertEqual(
3001150Szelenkov@nginx.com            resp['status'], 400, 'key double'
3011150Szelenkov@nginx.com        )  # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1
3021130Szelenkov@nginx.com
3031130Szelenkov@nginx.com    def test_node_websockets_handshake_method_invalid(self):
3041130Szelenkov@nginx.com        self.load('websockets/mirror')
3051130Szelenkov@nginx.com
3061130Szelenkov@nginx.com        key = self.ws.key()
3071150Szelenkov@nginx.com        resp = self.post(
3081150Szelenkov@nginx.com            headers={
3091150Szelenkov@nginx.com                'Host': 'localhost',
3101150Szelenkov@nginx.com                'Upgrade': 'websocket',
3111150Szelenkov@nginx.com                'Connection': 'Upgrade',
3121150Szelenkov@nginx.com                'Sec-WebSocket-Key': key,
3131150Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
3141150Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
3151150Szelenkov@nginx.com            },
3161150Szelenkov@nginx.com            read_timeout=1,
3171150Szelenkov@nginx.com        )
3181130Szelenkov@nginx.com
3191130Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'status')
3201130Szelenkov@nginx.com
3211130Szelenkov@nginx.com    def test_node_websockets_handshake_http_10(self):
3221130Szelenkov@nginx.com        self.load('websockets/mirror')
3231130Szelenkov@nginx.com
3241130Szelenkov@nginx.com        key = self.ws.key()
3251150Szelenkov@nginx.com        resp = self.get(
3261150Szelenkov@nginx.com            headers={
3271150Szelenkov@nginx.com                'Host': 'localhost',
3281150Szelenkov@nginx.com                'Upgrade': 'websocket',
3291150Szelenkov@nginx.com                'Connection': 'Upgrade',
3301150Szelenkov@nginx.com                'Sec-WebSocket-Key': key,
3311150Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
3321150Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
3331150Szelenkov@nginx.com            },
3341150Szelenkov@nginx.com            http_10=True,
3351150Szelenkov@nginx.com            read_timeout=1,
3361150Szelenkov@nginx.com        )
3371130Szelenkov@nginx.com
3381130Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'status')
3391130Szelenkov@nginx.com
3401130Szelenkov@nginx.com    def test_node_websockets_handshake_uri_invalid(self):
3411130Szelenkov@nginx.com        self.load('websockets/mirror')
3421130Szelenkov@nginx.com
3431130Szelenkov@nginx.com        key = self.ws.key()
3441150Szelenkov@nginx.com        resp = self.get(
3451150Szelenkov@nginx.com            headers={
3461150Szelenkov@nginx.com                'Host': 'localhost',
3471150Szelenkov@nginx.com                'Upgrade': 'websocket',
3481150Szelenkov@nginx.com                'Connection': 'Upgrade',
3491150Szelenkov@nginx.com                'Sec-WebSocket-Key': key,
3501150Szelenkov@nginx.com                'Sec-WebSocket-Protocol': 'chat',
3511150Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
3521150Szelenkov@nginx.com            },
3531150Szelenkov@nginx.com            url='!',
3541150Szelenkov@nginx.com            read_timeout=1,
3551150Szelenkov@nginx.com        )
3561130Szelenkov@nginx.com
3571130Szelenkov@nginx.com        self.assertEqual(resp['status'], 400, 'status')
3581130Szelenkov@nginx.com
3591130Szelenkov@nginx.com    def test_node_websockets_protocol_absent(self):
3601130Szelenkov@nginx.com        self.load('websockets/mirror')
3611130Szelenkov@nginx.com
3621130Szelenkov@nginx.com        key = self.ws.key()
3631150Szelenkov@nginx.com        resp = self.get(
3641150Szelenkov@nginx.com            headers={
3651150Szelenkov@nginx.com                'Host': 'localhost',
3661150Szelenkov@nginx.com                'Upgrade': 'websocket',
3671150Szelenkov@nginx.com                'Connection': 'Upgrade',
3681150Szelenkov@nginx.com                'Sec-WebSocket-Key': key,
3691150Szelenkov@nginx.com                'Sec-WebSocket-Version': 13,
3701150Szelenkov@nginx.com            },
3711150Szelenkov@nginx.com            read_timeout=1,
3721150Szelenkov@nginx.com        )
3731130Szelenkov@nginx.com
3741130Szelenkov@nginx.com        self.assertEqual(resp['status'], 101, 'status')
3751150Szelenkov@nginx.com        self.assertEqual(resp['headers']['Upgrade'], 'websocket', 'upgrade')
3761130Szelenkov@nginx.com        self.assertEqual(
3771130Szelenkov@nginx.com            resp['headers']['Connection'], 'Upgrade', 'connection'
3781130Szelenkov@nginx.com        )
3791130Szelenkov@nginx.com        self.assertEqual(
3801130Szelenkov@nginx.com            resp['headers']['Sec-WebSocket-Accept'], self.ws.accept(key), 'key'
3811130Szelenkov@nginx.com        )
3821130Szelenkov@nginx.com
3831130Szelenkov@nginx.com    # autobahn-testsuite
3841150Szelenkov@nginx.com    #
3851130Szelenkov@nginx.com    # Some following tests fail because of Unit does not support UTF-8
3861130Szelenkov@nginx.com    # validation for websocket frames.  It should be implemented
3871130Szelenkov@nginx.com    # by application, if necessary.
3881130Szelenkov@nginx.com
3891130Szelenkov@nginx.com    def test_node_websockets_1_1_1__1_1_8(self):
3901130Szelenkov@nginx.com        self.load('websockets/mirror')
3911130Szelenkov@nginx.com
3921130Szelenkov@nginx.com        opcode = self.ws.OP_TEXT
3931130Szelenkov@nginx.com
3941130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
3951130Szelenkov@nginx.com
3961130Szelenkov@nginx.com        def check_length(length, chopsize=None):
3971130Szelenkov@nginx.com            payload = '*' * length
3981130Szelenkov@nginx.com
3991130Szelenkov@nginx.com            self.ws.frame_write(sock, opcode, payload, chopsize=chopsize)
4001130Szelenkov@nginx.com
4011130Szelenkov@nginx.com            frame = self.ws.frame_read(sock)
4021130Szelenkov@nginx.com            self.check_frame(frame, True, opcode, payload)
4031130Szelenkov@nginx.com
4041130Szelenkov@nginx.com        check_length(0)                      # 1_1_1
4051130Szelenkov@nginx.com        check_length(125)                    # 1_1_2
4061130Szelenkov@nginx.com        check_length(126)                    # 1_1_3
4071130Szelenkov@nginx.com        check_length(127)                    # 1_1_4
4081130Szelenkov@nginx.com        check_length(128)                    # 1_1_5
4091130Szelenkov@nginx.com        check_length(65535)                  # 1_1_6
4101130Szelenkov@nginx.com        check_length(65536)                  # 1_1_7
4111130Szelenkov@nginx.com        check_length(65536, chopsize = 997)  # 1_1_8
4121130Szelenkov@nginx.com
4131130Szelenkov@nginx.com        self.close_connection(sock)
4141130Szelenkov@nginx.com
4151130Szelenkov@nginx.com    def test_node_websockets_1_2_1__1_2_8(self):
4161130Szelenkov@nginx.com        self.load('websockets/mirror')
4171130Szelenkov@nginx.com
4181130Szelenkov@nginx.com        opcode = self.ws.OP_BINARY
4191130Szelenkov@nginx.com
4201130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
4211130Szelenkov@nginx.com
4221130Szelenkov@nginx.com        def check_length(length, chopsize=None):
4231130Szelenkov@nginx.com            payload = b'\xfe' * length
4241130Szelenkov@nginx.com
4251130Szelenkov@nginx.com            self.ws.frame_write(sock, opcode, payload, chopsize=chopsize)
4261130Szelenkov@nginx.com            frame = self.ws.frame_read(sock)
4271130Szelenkov@nginx.com
4281130Szelenkov@nginx.com            self.check_frame(frame, True, opcode, payload)
4291130Szelenkov@nginx.com
4301130Szelenkov@nginx.com        check_length(0)                      # 1_2_1
4311130Szelenkov@nginx.com        check_length(125)                    # 1_2_2
4321130Szelenkov@nginx.com        check_length(126)                    # 1_2_3
4331130Szelenkov@nginx.com        check_length(127)                    # 1_2_4
4341130Szelenkov@nginx.com        check_length(128)                    # 1_2_5
4351130Szelenkov@nginx.com        check_length(65535)                  # 1_2_6
4361130Szelenkov@nginx.com        check_length(65536)                  # 1_2_7
4371130Szelenkov@nginx.com        check_length(65536, chopsize = 997)  # 1_2_8
4381130Szelenkov@nginx.com
4391130Szelenkov@nginx.com        self.close_connection(sock)
4401130Szelenkov@nginx.com
4411130Szelenkov@nginx.com    def test_node_websockets_2_1__2_6(self):
4421130Szelenkov@nginx.com        self.load('websockets/mirror')
4431130Szelenkov@nginx.com
4441130Szelenkov@nginx.com        op_ping = self.ws.OP_PING
4451130Szelenkov@nginx.com        op_pong = self.ws.OP_PONG
4461130Szelenkov@nginx.com
4471130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
4481130Szelenkov@nginx.com
4491130Szelenkov@nginx.com        def check_ping(payload, chopsize=None, decode=True):
4501130Szelenkov@nginx.com            self.ws.frame_write(sock, op_ping, payload, chopsize=chopsize)
4511130Szelenkov@nginx.com            frame = self.ws.frame_read(sock)
4521130Szelenkov@nginx.com
4531130Szelenkov@nginx.com            self.check_frame(frame, True, op_pong, payload, decode=decode)
4541130Szelenkov@nginx.com
4551130Szelenkov@nginx.com        check_ping('')                                                 # 2_1
4561130Szelenkov@nginx.com        check_ping('Hello, world!')                                    # 2_2
4571130Szelenkov@nginx.com        check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False)  # 2_3
4581130Szelenkov@nginx.com        check_ping(b'\xfe' * 125, decode=False)                        # 2_4
4591130Szelenkov@nginx.com        check_ping(b'\xfe' * 125, chopsize=1, decode=False)            # 2_6
4601130Szelenkov@nginx.com
4611130Szelenkov@nginx.com        self.close_connection(sock)
4621130Szelenkov@nginx.com
4631130Szelenkov@nginx.com        # 2_5
4641130Szelenkov@nginx.com
4651130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
4661130Szelenkov@nginx.com
4671130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, b'\xfe' * 126)
4681130Szelenkov@nginx.com        self.check_close(sock, 1002)
4691130Szelenkov@nginx.com
4701130Szelenkov@nginx.com    def test_node_websockets_2_7__2_9(self):
4711130Szelenkov@nginx.com        self.load('websockets/mirror')
4721130Szelenkov@nginx.com
4731130Szelenkov@nginx.com        # 2_7
4741130Szelenkov@nginx.com
4751130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
4761130Szelenkov@nginx.com
4771130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PONG, '')
4781130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', '2_7')
4791130Szelenkov@nginx.com
4801130Szelenkov@nginx.com        # 2_8
4811130Szelenkov@nginx.com
4821130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload')
4831130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', '2_8')
4841130Szelenkov@nginx.com
4851130Szelenkov@nginx.com        # 2_9
4861130Szelenkov@nginx.com
4871130Szelenkov@nginx.com        payload = 'ping payload'
4881130Szelenkov@nginx.com
4891130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PONG, 'unsolicited pong payload')
4901130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, payload)
4911130Szelenkov@nginx.com
4921130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
4931130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, payload)
4941130Szelenkov@nginx.com
4951130Szelenkov@nginx.com        self.close_connection(sock)
4961130Szelenkov@nginx.com
4971130Szelenkov@nginx.com    def test_node_websockets_2_10__2_11(self):
4981130Szelenkov@nginx.com        self.load('websockets/mirror')
4991130Szelenkov@nginx.com
5001130Szelenkov@nginx.com        # 2_10
5011130Szelenkov@nginx.com
5021130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5031130Szelenkov@nginx.com
5041130Szelenkov@nginx.com        for i in range(0, 10):
5051130Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_PING, 'payload-%d' % i)
5061130Szelenkov@nginx.com
5071130Szelenkov@nginx.com        for i in range(0, 10):
5081130Szelenkov@nginx.com            frame = self.ws.frame_read(sock)
5091130Szelenkov@nginx.com            self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i)
5101130Szelenkov@nginx.com
5111130Szelenkov@nginx.com        # 2_11
5121130Szelenkov@nginx.com
5131130Szelenkov@nginx.com        for i in range(0, 10):
5141130Szelenkov@nginx.com            opcode = self.ws.OP_PING
5151130Szelenkov@nginx.com            self.ws.frame_write(sock, opcode, 'payload-%d' % i, chopsize=1)
5161130Szelenkov@nginx.com
5171130Szelenkov@nginx.com        for i in range(0, 10):
5181130Szelenkov@nginx.com            frame = self.ws.frame_read(sock)
5191130Szelenkov@nginx.com            self.check_frame(frame, True, self.ws.OP_PONG, 'payload-%d' % i)
5201130Szelenkov@nginx.com
5211130Szelenkov@nginx.com        self.close_connection(sock)
5221130Szelenkov@nginx.com
5231130Szelenkov@nginx.com    @unittest.skip('not yet')
5241130Szelenkov@nginx.com    def test_node_websockets_3_1__3_7(self):
5251130Szelenkov@nginx.com        self.load('websockets/mirror')
5261130Szelenkov@nginx.com
5271130Szelenkov@nginx.com        payload = 'Hello, world!'
5281130Szelenkov@nginx.com
5291130Szelenkov@nginx.com        # 3_1
5301130Szelenkov@nginx.com
5311130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5321130Szelenkov@nginx.com
5331130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv1=True)
5341130Szelenkov@nginx.com        self.check_close(sock, 1002)
5351130Szelenkov@nginx.com
5361130Szelenkov@nginx.com        # 3_2
5371130Szelenkov@nginx.com
5381130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5391130Szelenkov@nginx.com
5401130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
5411130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, rsv2=True)
5421130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
5431130Szelenkov@nginx.com
5441130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
5451130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
5461130Szelenkov@nginx.com
5471150Szelenkov@nginx.com        self.check_close(sock, 1002, no_close=True)
5481130Szelenkov@nginx.com
5491130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_2')
5501130Szelenkov@nginx.com        sock.close()
5511130Szelenkov@nginx.com
5521130Szelenkov@nginx.com        # 3_3
5531130Szelenkov@nginx.com
5541130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5551130Szelenkov@nginx.com
5561130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
5571130Szelenkov@nginx.com
5581130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
5591130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
5601130Szelenkov@nginx.com
5611130Szelenkov@nginx.com        self.ws.frame_write(
5621150Szelenkov@nginx.com            sock, self.ws.OP_TEXT, payload, rsv1=True, rsv2=True
5631130Szelenkov@nginx.com        )
5641130Szelenkov@nginx.com
5651150Szelenkov@nginx.com        self.check_close(sock, 1002, no_close=True)
5661130Szelenkov@nginx.com
5671130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_3')
5681130Szelenkov@nginx.com        sock.close()
5691130Szelenkov@nginx.com
5701130Szelenkov@nginx.com        # 3_4
5711130Szelenkov@nginx.com
5721130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5731130Szelenkov@nginx.com
5741130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1)
5751130Szelenkov@nginx.com        self.ws.frame_write(
5761150Szelenkov@nginx.com            sock, self.ws.OP_TEXT, payload, rsv3=True, chopsize=1
5771130Szelenkov@nginx.com        )
5781130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
5791130Szelenkov@nginx.com
5801130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
5811130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
5821130Szelenkov@nginx.com
5831150Szelenkov@nginx.com        self.check_close(sock, 1002, no_close=True)
5841130Szelenkov@nginx.com
5851130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty 3_4')
5861130Szelenkov@nginx.com        sock.close()
5871130Szelenkov@nginx.com
5881130Szelenkov@nginx.com        # 3_5
5891130Szelenkov@nginx.com
5901130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
5911130Szelenkov@nginx.com
5921130Szelenkov@nginx.com        self.ws.frame_write(
5931130Szelenkov@nginx.com            sock,
5941130Szelenkov@nginx.com            self.ws.OP_BINARY,
5951130Szelenkov@nginx.com            b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff',
5961130Szelenkov@nginx.com            rsv1=True,
5971130Szelenkov@nginx.com            rsv3=True,
5981130Szelenkov@nginx.com        )
5991130Szelenkov@nginx.com
6001130Szelenkov@nginx.com        self.check_close(sock, 1002)
6011130Szelenkov@nginx.com
6021130Szelenkov@nginx.com        # 3_6
6031130Szelenkov@nginx.com
6041130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6051130Szelenkov@nginx.com
6061130Szelenkov@nginx.com        self.ws.frame_write(
6071150Szelenkov@nginx.com            sock, self.ws.OP_PING, payload, rsv2=True, rsv3=True
6081130Szelenkov@nginx.com        )
6091130Szelenkov@nginx.com
6101130Szelenkov@nginx.com        self.check_close(sock, 1002)
6111130Szelenkov@nginx.com
6121130Szelenkov@nginx.com        # 3_7
6131130Szelenkov@nginx.com
6141130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6151130Szelenkov@nginx.com
6161130Szelenkov@nginx.com        self.ws.frame_write(
6171150Szelenkov@nginx.com            sock, self.ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True
6181130Szelenkov@nginx.com        )
6191130Szelenkov@nginx.com
6201130Szelenkov@nginx.com        self.check_close(sock, 1002)
6211130Szelenkov@nginx.com
6221130Szelenkov@nginx.com    def test_node_websockets_4_1_1__4_2_5(self):
6231130Szelenkov@nginx.com        self.load('websockets/mirror')
6241130Szelenkov@nginx.com
6251130Szelenkov@nginx.com        payload = 'Hello, world!'
6261130Szelenkov@nginx.com
6271130Szelenkov@nginx.com        # 4_1_1
6281130Szelenkov@nginx.com
6291130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6301130Szelenkov@nginx.com
6311130Szelenkov@nginx.com        self.ws.frame_write(sock, 0x03, '')
6321130Szelenkov@nginx.com        self.check_close(sock, 1002)
6331130Szelenkov@nginx.com
6341130Szelenkov@nginx.com        # 4_1_2
6351130Szelenkov@nginx.com
6361130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6371130Szelenkov@nginx.com
6381130Szelenkov@nginx.com        self.ws.frame_write(sock, 0x04, 'reserved opcode payload')
6391130Szelenkov@nginx.com        self.check_close(sock, 1002)
6401130Szelenkov@nginx.com
6411130Szelenkov@nginx.com        # 4_1_3
6421130Szelenkov@nginx.com
6431130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6441130Szelenkov@nginx.com
6451130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
6461130Szelenkov@nginx.com
6471130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
6481130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
6491130Szelenkov@nginx.com
6501130Szelenkov@nginx.com        self.ws.frame_write(sock, 0x05, '')
6511130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
6521130Szelenkov@nginx.com
6531130Szelenkov@nginx.com        self.check_close(sock, 1002)
6541130Szelenkov@nginx.com
6551130Szelenkov@nginx.com        # 4_1_4
6561130Szelenkov@nginx.com
6571130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6581130Szelenkov@nginx.com
6591130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
6601130Szelenkov@nginx.com
6611130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
6621130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
6631130Szelenkov@nginx.com
6641130Szelenkov@nginx.com        self.ws.frame_write(sock, 0x06, payload)
6651130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
6661130Szelenkov@nginx.com
6671130Szelenkov@nginx.com        self.check_close(sock, 1002)
6681130Szelenkov@nginx.com
6691130Szelenkov@nginx.com        # 4_1_5
6701130Szelenkov@nginx.com
6711130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6721130Szelenkov@nginx.com
6731130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1)
6741130Szelenkov@nginx.com
6751130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
6761130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
6771130Szelenkov@nginx.com
6781130Szelenkov@nginx.com        self.ws.frame_write(sock, 0x07, payload, chopsize=1)
6791130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
6801130Szelenkov@nginx.com
6811130Szelenkov@nginx.com        self.check_close(sock, 1002)
6821130Szelenkov@nginx.com
6831130Szelenkov@nginx.com        # 4_2_1
6841130Szelenkov@nginx.com
6851130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6861130Szelenkov@nginx.com
6871130Szelenkov@nginx.com        self.ws.frame_write(sock, 0x0B, '')
6881130Szelenkov@nginx.com        self.check_close(sock, 1002)
6891130Szelenkov@nginx.com
6901130Szelenkov@nginx.com        # 4_2_2
6911130Szelenkov@nginx.com
6921130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
6931130Szelenkov@nginx.com
6941130Szelenkov@nginx.com        self.ws.frame_write(sock, 0x0C, 'reserved opcode payload')
6951130Szelenkov@nginx.com        self.check_close(sock, 1002)
6961130Szelenkov@nginx.com
6971130Szelenkov@nginx.com        # 4_2_3
6981130Szelenkov@nginx.com
6991130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
7001130Szelenkov@nginx.com
7011130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
7021130Szelenkov@nginx.com
7031130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7041130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
7051130Szelenkov@nginx.com
7061130Szelenkov@nginx.com        self.ws.frame_write(sock, 0x0D, '')
7071130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
7081130Szelenkov@nginx.com
7091130Szelenkov@nginx.com        self.check_close(sock, 1002)
7101130Szelenkov@nginx.com
7111130Szelenkov@nginx.com        # 4_2_4
7121130Szelenkov@nginx.com
7131130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
7141130Szelenkov@nginx.com
7151130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
7161130Szelenkov@nginx.com
7171130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7181130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
7191130Szelenkov@nginx.com
7201130Szelenkov@nginx.com        self.ws.frame_write(sock, 0x0E, payload)
7211130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
7221130Szelenkov@nginx.com
7231130Szelenkov@nginx.com        self.check_close(sock, 1002)
7241130Szelenkov@nginx.com
7251130Szelenkov@nginx.com        # 4_2_5
7261130Szelenkov@nginx.com
7271130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
7281130Szelenkov@nginx.com
7291130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload, chopsize=1)
7301130Szelenkov@nginx.com
7311130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7321130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
7331130Szelenkov@nginx.com
7341130Szelenkov@nginx.com        self.ws.frame_write(sock, 0x0F, payload, chopsize=1)
7351130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
7361130Szelenkov@nginx.com
7371130Szelenkov@nginx.com        self.check_close(sock, 1002)
7381130Szelenkov@nginx.com
7391130Szelenkov@nginx.com    def test_node_websockets_5_1__5_20(self):
7401130Szelenkov@nginx.com        self.load('websockets/mirror')
7411130Szelenkov@nginx.com
7421130Szelenkov@nginx.com        # 5_1
7431130Szelenkov@nginx.com
7441130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
7451130Szelenkov@nginx.com
7461130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, 'fragment1', fin=False)
7471130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
7481130Szelenkov@nginx.com        self.check_close(sock, 1002)
7491130Szelenkov@nginx.com
7501130Szelenkov@nginx.com        # 5_2
7511130Szelenkov@nginx.com
7521130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
7531130Szelenkov@nginx.com
7541130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PONG, 'fragment1', fin=False)
7551130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
7561130Szelenkov@nginx.com        self.check_close(sock, 1002)
7571130Szelenkov@nginx.com
7581130Szelenkov@nginx.com        # 5_3
7591130Szelenkov@nginx.com
7601130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
7611130Szelenkov@nginx.com
7621130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
7631130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
7641130Szelenkov@nginx.com
7651130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7661130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
7671130Szelenkov@nginx.com
7681130Szelenkov@nginx.com        # 5_4
7691130Szelenkov@nginx.com
7701130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
7711130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_4')
7721130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
7731130Szelenkov@nginx.com
7741130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7751130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
7761130Szelenkov@nginx.com
7771130Szelenkov@nginx.com        # 5_5
7781130Szelenkov@nginx.com
7791130Szelenkov@nginx.com        self.ws.frame_write(
7801150Szelenkov@nginx.com            sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1
7811130Szelenkov@nginx.com        )
7821130Szelenkov@nginx.com        self.ws.frame_write(
7831150Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1
7841130Szelenkov@nginx.com        )
7851130Szelenkov@nginx.com
7861130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7871130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
7881130Szelenkov@nginx.com
7891130Szelenkov@nginx.com        # 5_6
7901130Szelenkov@nginx.com
7911130Szelenkov@nginx.com        ping_payload = 'ping payload'
7921130Szelenkov@nginx.com
7931130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
7941130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, ping_payload)
7951130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
7961130Szelenkov@nginx.com
7971130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
7981130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, ping_payload)
7991130Szelenkov@nginx.com
8001130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
8011130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
8021130Szelenkov@nginx.com
8031130Szelenkov@nginx.com        # 5_7
8041130Szelenkov@nginx.com
8051130Szelenkov@nginx.com        ping_payload = 'ping payload'
8061130Szelenkov@nginx.com
8071130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
8081130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_7')
8091130Szelenkov@nginx.com
8101130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, ping_payload)
8111130Szelenkov@nginx.com
8121130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
8131130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, ping_payload)
8141130Szelenkov@nginx.com
8151130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
8161130Szelenkov@nginx.com
8171130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
8181130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
8191130Szelenkov@nginx.com
8201130Szelenkov@nginx.com        # 5_8
8211130Szelenkov@nginx.com
8221130Szelenkov@nginx.com        ping_payload = 'ping payload'
8231130Szelenkov@nginx.com
8241130Szelenkov@nginx.com        self.ws.frame_write(
8251150Szelenkov@nginx.com            sock, self.ws.OP_TEXT, 'fragment1', fin=False, chopsize=1
8261130Szelenkov@nginx.com        )
8271130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, ping_payload, chopsize=1)
8281130Szelenkov@nginx.com        self.ws.frame_write(
8291150Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'fragment2', fin=True, chopsize=1
8301130Szelenkov@nginx.com        )
8311130Szelenkov@nginx.com
8321130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
8331130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, ping_payload)
8341130Szelenkov@nginx.com
8351130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
8361130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, 'fragment1fragment2')
8371130Szelenkov@nginx.com
8381130Szelenkov@nginx.com        # 5_9
8391130Szelenkov@nginx.com
8401130Szelenkov@nginx.com        self.ws.frame_write(
8411150Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'non-continuation payload', fin=True
8421130Szelenkov@nginx.com        )
8431130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
8441130Szelenkov@nginx.com        self.check_close(sock, 1002)
8451130Szelenkov@nginx.com
8461130Szelenkov@nginx.com        # 5_10
8471130Szelenkov@nginx.com
8481130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8491130Szelenkov@nginx.com
8501130Szelenkov@nginx.com        self.ws.frame_write(
8511150Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'non-continuation payload', fin=True
8521130Szelenkov@nginx.com        )
8531130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
8541130Szelenkov@nginx.com        self.check_close(sock, 1002)
8551130Szelenkov@nginx.com
8561130Szelenkov@nginx.com        # 5_11
8571130Szelenkov@nginx.com
8581130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8591130Szelenkov@nginx.com
8601130Szelenkov@nginx.com        self.ws.frame_write(
8611130Szelenkov@nginx.com            sock,
8621130Szelenkov@nginx.com            self.ws.OP_CONT,
8631130Szelenkov@nginx.com            'non-continuation payload',
8641130Szelenkov@nginx.com            fin=True,
8651130Szelenkov@nginx.com            chopsize=1,
8661130Szelenkov@nginx.com        )
8671130Szelenkov@nginx.com        self.ws.frame_write(
8681150Szelenkov@nginx.com            sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1
8691130Szelenkov@nginx.com        )
8701130Szelenkov@nginx.com        self.check_close(sock, 1002)
8711130Szelenkov@nginx.com
8721130Szelenkov@nginx.com        # 5_12
8731130Szelenkov@nginx.com
8741130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8751130Szelenkov@nginx.com
8761130Szelenkov@nginx.com        self.ws.frame_write(
8771150Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'non-continuation payload', fin=False
8781130Szelenkov@nginx.com        )
8791130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
8801130Szelenkov@nginx.com        self.check_close(sock, 1002)
8811130Szelenkov@nginx.com
8821130Szelenkov@nginx.com        # 5_13
8831130Szelenkov@nginx.com
8841130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8851130Szelenkov@nginx.com
8861130Szelenkov@nginx.com        self.ws.frame_write(
8871150Szelenkov@nginx.com            sock, self.ws.OP_CONT, 'non-continuation payload', fin=False
8881130Szelenkov@nginx.com        )
8891130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'Hello, world!', fin=True)
8901130Szelenkov@nginx.com        self.check_close(sock, 1002)
8911130Szelenkov@nginx.com
8921130Szelenkov@nginx.com        # 5_14
8931130Szelenkov@nginx.com
8941130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
8951130Szelenkov@nginx.com
8961130Szelenkov@nginx.com        self.ws.frame_write(
8971130Szelenkov@nginx.com            sock,
8981130Szelenkov@nginx.com            self.ws.OP_CONT,
8991130Szelenkov@nginx.com            'non-continuation payload',
9001130Szelenkov@nginx.com            fin=False,
9011130Szelenkov@nginx.com            chopsize=1,
9021130Szelenkov@nginx.com        )
9031130Szelenkov@nginx.com        self.ws.frame_write(
9041150Szelenkov@nginx.com            sock, self.ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1
9051130Szelenkov@nginx.com        )
9061130Szelenkov@nginx.com        self.check_close(sock, 1002)
9071130Szelenkov@nginx.com
9081130Szelenkov@nginx.com        # 5_15
9091130Szelenkov@nginx.com
9101130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
9111130Szelenkov@nginx.com
9121130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
9131130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=True)
9141130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
9151130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment4', fin=True)
9161130Szelenkov@nginx.com        self.check_close(sock, 1002)
9171130Szelenkov@nginx.com
9181130Szelenkov@nginx.com        # 5_16
9191130Szelenkov@nginx.com
9201130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
9211130Szelenkov@nginx.com
9221130Szelenkov@nginx.com        for i in range(0, 2):
9231130Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=False)
9241130Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False)
9251130Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True)
9261130Szelenkov@nginx.com        self.check_close(sock, 1002)
9271130Szelenkov@nginx.com
9281130Szelenkov@nginx.com        # 5_17
9291130Szelenkov@nginx.com
9301130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
9311130Szelenkov@nginx.com
9321130Szelenkov@nginx.com        for i in range(0, 2):
9331130Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment1', fin=True)
9341130Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2', fin=False)
9351130Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=True)
9361130Szelenkov@nginx.com        self.check_close(sock, 1002)
9371130Szelenkov@nginx.com
9381130Szelenkov@nginx.com        # 5_18
9391130Szelenkov@nginx.com
9401130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
9411130Szelenkov@nginx.com
9421130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
9431130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment2')
9441130Szelenkov@nginx.com        self.check_close(sock, 1002)
9451130Szelenkov@nginx.com
9461130Szelenkov@nginx.com        # 5_19
9471130Szelenkov@nginx.com
9481130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
9491130Szelenkov@nginx.com
9501130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
9511130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False)
9521130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!')
9531130Szelenkov@nginx.com
9541130Szelenkov@nginx.com        time.sleep(1)
9551130Szelenkov@nginx.com
9561130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
9571130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False)
9581130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!')
9591130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5')
9601130Szelenkov@nginx.com
9611130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
9621130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!')
9631130Szelenkov@nginx.com
9641130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
9651130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!')
9661130Szelenkov@nginx.com
9671130Szelenkov@nginx.com        self.check_frame(
9681130Szelenkov@nginx.com            self.ws.frame_read(sock),
9691130Szelenkov@nginx.com            True,
9701130Szelenkov@nginx.com            self.ws.OP_TEXT,
9711130Szelenkov@nginx.com            'fragment1fragment2fragment3fragment4fragment5',
9721130Szelenkov@nginx.com        )
9731130Szelenkov@nginx.com
9741130Szelenkov@nginx.com        # 5_20
9751130Szelenkov@nginx.com
9761130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
9771130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2', fin=False)
9781130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 1!')
9791130Szelenkov@nginx.com
9801130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
9811130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 1!')
9821130Szelenkov@nginx.com
9831130Szelenkov@nginx.com        time.sleep(1)
9841130Szelenkov@nginx.com
9851130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment3', fin=False)
9861130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment4', fin=False)
9871130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, 'pongme 2!')
9881130Szelenkov@nginx.com
9891130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
9901130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PONG, 'pongme 2!')
9911130Szelenkov@nginx.com
9921130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', '5_20')
9931130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment5')
9941130Szelenkov@nginx.com
9951130Szelenkov@nginx.com        self.check_frame(
9961130Szelenkov@nginx.com            self.ws.frame_read(sock),
9971130Szelenkov@nginx.com            True,
9981130Szelenkov@nginx.com            self.ws.OP_TEXT,
9991130Szelenkov@nginx.com            'fragment1fragment2fragment3fragment4fragment5',
10001130Szelenkov@nginx.com        )
10011130Szelenkov@nginx.com
10021130Szelenkov@nginx.com        self.close_connection(sock)
10031130Szelenkov@nginx.com
10041130Szelenkov@nginx.com    def test_node_websockets_6_1_1__6_4_4(self):
10051130Szelenkov@nginx.com        self.load('websockets/mirror')
10061130Szelenkov@nginx.com
10071130Szelenkov@nginx.com        # 6_1_1
10081130Szelenkov@nginx.com
10091130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
10101130Szelenkov@nginx.com
10111130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, '')
10121130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10131130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, '')
10141130Szelenkov@nginx.com
10151130Szelenkov@nginx.com        # 6_1_2
10161130Szelenkov@nginx.com
10171130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False)
10181130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, '', fin=False)
10191130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, '')
10201130Szelenkov@nginx.com
10211130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10221130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, '')
10231130Szelenkov@nginx.com
10241130Szelenkov@nginx.com        # 6_1_3
10251130Szelenkov@nginx.com
10261130Szelenkov@nginx.com        payload = 'middle frame payload'
10271130Szelenkov@nginx.com
10281130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, '', fin=False)
10291130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, payload, fin=False)
10301130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, '')
10311130Szelenkov@nginx.com
10321130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10331130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
10341130Szelenkov@nginx.com
10351130Szelenkov@nginx.com        # 6_2_1
10361130Szelenkov@nginx.com
10371130Szelenkov@nginx.com        payload = 'Hello-µ@ßöäüàá-UTF-8!!'
10381130Szelenkov@nginx.com
10391130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
10401130Szelenkov@nginx.com
10411130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10421130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
10431130Szelenkov@nginx.com
10441130Szelenkov@nginx.com        # 6_2_2
10451130Szelenkov@nginx.com
10461130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload[:12], fin=False)
10471130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, payload[12:])
10481130Szelenkov@nginx.com
10491130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10501130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
10511130Szelenkov@nginx.com
10521130Szelenkov@nginx.com        # 6_2_3
10531130Szelenkov@nginx.com
10541130Szelenkov@nginx.com        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1)
10551130Szelenkov@nginx.com
10561130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10571130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
10581130Szelenkov@nginx.com
10591130Szelenkov@nginx.com        # 6_2_4
10601130Szelenkov@nginx.com
10611130Szelenkov@nginx.com        payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5'
10621130Szelenkov@nginx.com
10631130Szelenkov@nginx.com        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1)
10641130Szelenkov@nginx.com
10651130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
10661130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
10671130Szelenkov@nginx.com
10681130Szelenkov@nginx.com        self.close_connection(sock)
10691130Szelenkov@nginx.com
10701150Szelenkov@nginx.com#        Unit does not support UTF-8 validation
10711150Szelenkov@nginx.com#
10721130Szelenkov@nginx.com#        # 6_3_1 FAIL
10731130Szelenkov@nginx.com#
10741130Szelenkov@nginx.com#        payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5'
10751130Szelenkov@nginx.com#        payload_2 = '\xed\xa0\x80'
10761130Szelenkov@nginx.com#        payload_3 = '\x65\x64\x69\x74\x65\x64'
10771130Szelenkov@nginx.com#
10781130Szelenkov@nginx.com#        payload = payload_1 + payload_2 + payload_3
10791130Szelenkov@nginx.com#
10801130Szelenkov@nginx.com#        self.ws.message(sock, self.ws.OP_TEXT, payload)
10811130Szelenkov@nginx.com#        self.check_close(sock, 1007)
10821130Szelenkov@nginx.com#
10831130Szelenkov@nginx.com#        # 6_3_2 FAIL
10841130Szelenkov@nginx.com#
10851130Szelenkov@nginx.com#        _, sock, _ = self.ws.upgrade()
10861130Szelenkov@nginx.com#
10871130Szelenkov@nginx.com#        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1)
10881130Szelenkov@nginx.com#        self.check_close(sock, 1007)
10891130Szelenkov@nginx.com#
10901130Szelenkov@nginx.com#        # 6_4_1 ... 6_4_4 FAIL
10911130Szelenkov@nginx.com
10921130Szelenkov@nginx.com    def test_node_websockets_7_1_1__7_5_1(self):
10931130Szelenkov@nginx.com        self.load('websockets/mirror')
10941130Szelenkov@nginx.com
10951130Szelenkov@nginx.com        # 7_1_1
10961130Szelenkov@nginx.com
10971130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
10981130Szelenkov@nginx.com
10991130Szelenkov@nginx.com        payload = "Hello World!"
11001130Szelenkov@nginx.com
11011130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
11021130Szelenkov@nginx.com
11031130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
11041130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
11051130Szelenkov@nginx.com
11061130Szelenkov@nginx.com        self.close_connection(sock)
11071130Szelenkov@nginx.com
11081130Szelenkov@nginx.com        # 7_1_2
11091130Szelenkov@nginx.com
11101130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11111130Szelenkov@nginx.com
11121130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
11131130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
11141130Szelenkov@nginx.com
11151130Szelenkov@nginx.com        self.check_close(sock)
11161130Szelenkov@nginx.com
11171130Szelenkov@nginx.com        # 7_1_3
11181130Szelenkov@nginx.com
11191130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11201130Szelenkov@nginx.com
11211130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
11221150Szelenkov@nginx.com        self.check_close(sock, no_close=True)
11231130Szelenkov@nginx.com
11241130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
11251130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock')
11261130Szelenkov@nginx.com
11271130Szelenkov@nginx.com        sock.close()
11281130Szelenkov@nginx.com
11291130Szelenkov@nginx.com        # 7_1_4
11301130Szelenkov@nginx.com
11311130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11321130Szelenkov@nginx.com
11331130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
11341150Szelenkov@nginx.com        self.check_close(sock, no_close=True)
11351130Szelenkov@nginx.com
11361130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
11371130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock')
11381130Szelenkov@nginx.com
11391130Szelenkov@nginx.com        sock.close()
11401130Szelenkov@nginx.com
11411130Szelenkov@nginx.com        # 7_1_5
11421130Szelenkov@nginx.com
11431130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11441130Szelenkov@nginx.com
11451130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'fragment1', fin=False)
11461130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
11471150Szelenkov@nginx.com        self.check_close(sock, no_close=True)
11481130Szelenkov@nginx.com
11491130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CONT, 'fragment2')
11501130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock')
11511130Szelenkov@nginx.com
11521130Szelenkov@nginx.com        sock.close()
11531130Szelenkov@nginx.com
11541130Szelenkov@nginx.com        # 7_1_6
11551130Szelenkov@nginx.com
11561130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11571130Szelenkov@nginx.com
11581150Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2 ** 10)
11591130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_TEXT, payload)
11601130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
11611130Szelenkov@nginx.com
11621130Szelenkov@nginx.com        self.recvall(sock, read_timeout=1)
11631130Szelenkov@nginx.com
11641130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_PING, '')
11651130Szelenkov@nginx.com        self.assertEqual(self.recvall(sock, read_timeout=1), b'', 'empty sock')
11661130Szelenkov@nginx.com
11671130Szelenkov@nginx.com        sock.close()
11681130Szelenkov@nginx.com
11691130Szelenkov@nginx.com        # 7_3_1 # FAIL
11701130Szelenkov@nginx.com
11711130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11721130Szelenkov@nginx.com
11731130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, '')
11741130Szelenkov@nginx.com        self.check_close(sock)
11751130Szelenkov@nginx.com
11761130Szelenkov@nginx.com        # 7_3_2
11771130Szelenkov@nginx.com
11781130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11791130Szelenkov@nginx.com
11801130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, 'a')
11811130Szelenkov@nginx.com        self.check_close(sock, 1002)
11821130Szelenkov@nginx.com
11831130Szelenkov@nginx.com        # 7_3_3
11841130Szelenkov@nginx.com
11851130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11861130Szelenkov@nginx.com
11871130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, self.ws.serialize_close())
11881130Szelenkov@nginx.com        self.check_close(sock)
11891130Szelenkov@nginx.com
11901130Szelenkov@nginx.com        # 7_3_4
11911130Szelenkov@nginx.com
11921130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
11931130Szelenkov@nginx.com
11941150Szelenkov@nginx.com        payload = self.ws.serialize_close(reason='Hello World!')
11951130Szelenkov@nginx.com
11961130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
11971130Szelenkov@nginx.com        self.check_close(sock)
11981130Szelenkov@nginx.com
11991130Szelenkov@nginx.com        # 7_3_5
12001130Szelenkov@nginx.com
12011130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
12021130Szelenkov@nginx.com
12031150Szelenkov@nginx.com        payload = self.ws.serialize_close(reason='*' * 123)
12041130Szelenkov@nginx.com
12051130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12061130Szelenkov@nginx.com        self.check_close(sock)
12071130Szelenkov@nginx.com
12081130Szelenkov@nginx.com        # 7_3_6
12091130Szelenkov@nginx.com
12101130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
12111130Szelenkov@nginx.com
12121150Szelenkov@nginx.com        payload = self.ws.serialize_close(reason='*' * 124)
12131130Szelenkov@nginx.com
12141130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12151130Szelenkov@nginx.com        self.check_close(sock, 1002)
12161130Szelenkov@nginx.com
12171150Szelenkov@nginx.com#        # 7_5_1 FAIL Unit does not support UTF-8 validation
12181150Szelenkov@nginx.com#
12191130Szelenkov@nginx.com#        _, sock, _ = self.ws.upgrade()
12201130Szelenkov@nginx.com#
12211130Szelenkov@nginx.com#        payload = self.ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \
12221130Szelenkov@nginx.com#            '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64')
12231130Szelenkov@nginx.com#
12241130Szelenkov@nginx.com#        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12251130Szelenkov@nginx.com#        self.check_close(sock, 1007)
12261130Szelenkov@nginx.com
12271130Szelenkov@nginx.com    def test_node_websockets_7_7_X__7_9_X(self):
12281130Szelenkov@nginx.com        self.load('websockets/mirror')
12291130Szelenkov@nginx.com
12301130Szelenkov@nginx.com        valid_codes = [
12311130Szelenkov@nginx.com            1000,
12321130Szelenkov@nginx.com            1001,
12331130Szelenkov@nginx.com            1002,
12341130Szelenkov@nginx.com            1003,
12351130Szelenkov@nginx.com            1007,
12361130Szelenkov@nginx.com            1008,
12371130Szelenkov@nginx.com            1009,
12381130Szelenkov@nginx.com            1010,
12391130Szelenkov@nginx.com            1011,
12401130Szelenkov@nginx.com            3000,
12411130Szelenkov@nginx.com            3999,
12421130Szelenkov@nginx.com            4000,
12431130Szelenkov@nginx.com            4999,
12441130Szelenkov@nginx.com        ]
12451130Szelenkov@nginx.com
12461130Szelenkov@nginx.com        invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999]
12471130Szelenkov@nginx.com
12481130Szelenkov@nginx.com        for code in valid_codes:
12491130Szelenkov@nginx.com            _, sock, _ = self.ws.upgrade()
12501130Szelenkov@nginx.com
12511150Szelenkov@nginx.com            payload = self.ws.serialize_close(code=code)
12521130Szelenkov@nginx.com
12531130Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12541130Szelenkov@nginx.com            self.check_close(sock)
12551130Szelenkov@nginx.com
12561130Szelenkov@nginx.com        for code in invalid_codes:
12571130Szelenkov@nginx.com            _, sock, _ = self.ws.upgrade()
12581130Szelenkov@nginx.com
12591150Szelenkov@nginx.com            payload = self.ws.serialize_close(code=code)
12601130Szelenkov@nginx.com
12611130Szelenkov@nginx.com            self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12621130Szelenkov@nginx.com            self.check_close(sock, 1002)
12631130Szelenkov@nginx.com
12641130Szelenkov@nginx.com    def test_node_websockets_7_13_1__7_13_2(self):
12651130Szelenkov@nginx.com        self.load('websockets/mirror')
12661130Szelenkov@nginx.com
12671130Szelenkov@nginx.com        # 7_13_1
12681130Szelenkov@nginx.com
12691130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
12701130Szelenkov@nginx.com
12711150Szelenkov@nginx.com        payload = self.ws.serialize_close(code=5000)
12721130Szelenkov@nginx.com
12731130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12741130Szelenkov@nginx.com        self.check_close(sock, 1002)
12751130Szelenkov@nginx.com
12761130Szelenkov@nginx.com        # 7_13_2
12771130Szelenkov@nginx.com
12781130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
12791130Szelenkov@nginx.com
12801130Szelenkov@nginx.com        payload = struct.pack('!I', 65536) + ''.encode('utf-8')
12811130Szelenkov@nginx.com
12821130Szelenkov@nginx.com        self.ws.frame_write(sock, self.ws.OP_CLOSE, payload)
12831130Szelenkov@nginx.com        self.check_close(sock, 1002)
12841130Szelenkov@nginx.com
12851130Szelenkov@nginx.com    def test_node_websockets_9_1_1__9_6_6(self):
12861130Szelenkov@nginx.com        if not self.unsafe:
12871130Szelenkov@nginx.com            self.skipTest("unsafe, long run")
12881130Szelenkov@nginx.com
12891130Szelenkov@nginx.com        self.load('websockets/mirror')
12901130Szelenkov@nginx.com
12911130Szelenkov@nginx.com        self.assertIn(
12921130Szelenkov@nginx.com            'success',
12931130Szelenkov@nginx.com            self.conf(
12941130Szelenkov@nginx.com                {
12951130Szelenkov@nginx.com                    'http': {
12961130Szelenkov@nginx.com                        'websocket': {
12971130Szelenkov@nginx.com                            'max_frame_size': 33554432,
12981130Szelenkov@nginx.com                            'keepalive_interval': 0,
12991130Szelenkov@nginx.com                        }
13001130Szelenkov@nginx.com                    }
13011130Szelenkov@nginx.com                },
13021130Szelenkov@nginx.com                'settings',
13031130Szelenkov@nginx.com            ),
13041130Szelenkov@nginx.com            'increase max_frame_size and keepalive_interval',
13051130Szelenkov@nginx.com        )
13061130Szelenkov@nginx.com
13071130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
13081130Szelenkov@nginx.com
13091130Szelenkov@nginx.com        op_text = self.ws.OP_TEXT
13101130Szelenkov@nginx.com        op_binary = self.ws.OP_BINARY
13111130Szelenkov@nginx.com
13121130Szelenkov@nginx.com        def check_payload(opcode, length, chopsize=None):
13131130Szelenkov@nginx.com            if opcode == self.ws.OP_TEXT:
13141130Szelenkov@nginx.com                payload = '*' * length
13151130Szelenkov@nginx.com            else:
13161130Szelenkov@nginx.com                payload = b'*' * length
13171130Szelenkov@nginx.com
13181130Szelenkov@nginx.com            self.ws.frame_write(sock, opcode, payload, chopsize=chopsize)
13191130Szelenkov@nginx.com            frame = self.ws.frame_read(sock, read_timeout=5)
13201130Szelenkov@nginx.com            self.check_frame(frame, True, opcode, payload)
13211130Szelenkov@nginx.com
13221130Szelenkov@nginx.com        def check_message(opcode, f_size):
13231130Szelenkov@nginx.com            if opcode == self.ws.OP_TEXT:
13241150Szelenkov@nginx.com                payload = '*' * 4 * 2 ** 20
13251130Szelenkov@nginx.com            else:
13261150Szelenkov@nginx.com                payload = b'*' * 4 * 2 ** 20
13271130Szelenkov@nginx.com
13281130Szelenkov@nginx.com            self.ws.message(sock, opcode, payload, fragmention_size=f_size)
13291130Szelenkov@nginx.com            frame = self.ws.frame_read(sock, read_timeout=5)
13301130Szelenkov@nginx.com            self.check_frame(frame, True, opcode, payload)
13311130Szelenkov@nginx.com
13321150Szelenkov@nginx.com        check_payload(op_text, 64 * 2 ** 10)              # 9_1_1
13331150Szelenkov@nginx.com        check_payload(op_text, 256 * 2 ** 10)             # 9_1_2
13341150Szelenkov@nginx.com        check_payload(op_text, 2 ** 20)                   # 9_1_3
13351150Szelenkov@nginx.com        check_payload(op_text, 4 * 2 ** 20)               # 9_1_4
13361150Szelenkov@nginx.com        check_payload(op_text, 8 * 2 ** 20)               # 9_1_5
13371150Szelenkov@nginx.com        check_payload(op_text, 16 * 2 ** 20)              # 9_1_6
13381130Szelenkov@nginx.com
13391150Szelenkov@nginx.com        check_payload(op_binary, 64 * 2 ** 10)            # 9_2_1
13401150Szelenkov@nginx.com        check_payload(op_binary, 256 * 2 ** 10)           # 9_2_2
13411150Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20)                 # 9_2_3
13421150Szelenkov@nginx.com        check_payload(op_binary, 4 * 2 ** 20)             # 9_2_4
13431150Szelenkov@nginx.com        check_payload(op_binary, 8 * 2 ** 20)             # 9_2_5
13441150Szelenkov@nginx.com        check_payload(op_binary, 16 * 2 ** 20)            # 9_2_6
13451130Szelenkov@nginx.com
13461130Szelenkov@nginx.com        if self.system != 'Darwin' and self.system != 'FreeBSD':
13471150Szelenkov@nginx.com            check_message(op_text, 64)                    # 9_3_1
13481150Szelenkov@nginx.com            check_message(op_text, 256)                   # 9_3_2
13491150Szelenkov@nginx.com            check_message(op_text, 2 ** 10)               # 9_3_3
13501150Szelenkov@nginx.com            check_message(op_text, 4 * 2 ** 10)           # 9_3_4
13511150Szelenkov@nginx.com            check_message(op_text, 16 * 2 ** 10)          # 9_3_5
13521150Szelenkov@nginx.com            check_message(op_text, 64 * 2 ** 10)          # 9_3_6
13531150Szelenkov@nginx.com            check_message(op_text, 256 * 2 ** 10)         # 9_3_7
13541150Szelenkov@nginx.com            check_message(op_text, 2 ** 20)               # 9_3_8
13551150Szelenkov@nginx.com            check_message(op_text, 4 * 2 ** 20)           # 9_3_9
13561130Szelenkov@nginx.com
13571150Szelenkov@nginx.com            check_message(op_binary, 64)                  # 9_4_1
13581150Szelenkov@nginx.com            check_message(op_binary, 256)                 # 9_4_2
13591150Szelenkov@nginx.com            check_message(op_binary, 2 ** 10)             # 9_4_3
13601150Szelenkov@nginx.com            check_message(op_binary, 4 * 2 ** 10)         # 9_4_4
13611150Szelenkov@nginx.com            check_message(op_binary, 16 * 2 ** 10)        # 9_4_5
13621150Szelenkov@nginx.com            check_message(op_binary, 64 * 2 ** 10)        # 9_4_6
13631150Szelenkov@nginx.com            check_message(op_binary, 256 * 2 ** 10)       # 9_4_7
13641150Szelenkov@nginx.com            check_message(op_binary, 2 ** 20)             # 9_4_8
13651150Szelenkov@nginx.com            check_message(op_binary, 4 * 2 ** 20)         # 9_4_9
13661130Szelenkov@nginx.com
13671150Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=64)      # 9_5_1
13681150Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=128)     # 9_5_2
13691150Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=256)     # 9_5_3
13701150Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=512)     # 9_5_4
13711150Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=1024)    # 9_5_5
13721150Szelenkov@nginx.com        check_payload(op_text, 2 ** 20, chopsize=2048)    # 9_5_6
13731130Szelenkov@nginx.com
13741150Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=64)    # 9_6_1
13751150Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=128)   # 9_6_2
13761150Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=256)   # 9_6_3
13771150Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=512)   # 9_6_4
13781150Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=1024)  # 9_6_5
13791150Szelenkov@nginx.com        check_payload(op_binary, 2 ** 20, chopsize=2048)  # 9_6_6
13801130Szelenkov@nginx.com
13811130Szelenkov@nginx.com        self.close_connection(sock)
13821130Szelenkov@nginx.com
13831130Szelenkov@nginx.com    def test_node_websockets_10_1_1(self):
13841130Szelenkov@nginx.com        self.load('websockets/mirror')
13851130Szelenkov@nginx.com
13861130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
13871130Szelenkov@nginx.com
13881130Szelenkov@nginx.com        payload = '*' * 65536
13891130Szelenkov@nginx.com
13901130Szelenkov@nginx.com        self.ws.message(sock, self.ws.OP_TEXT, payload, fragmention_size=1300)
13911130Szelenkov@nginx.com
13921130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
13931130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_TEXT, payload)
13941130Szelenkov@nginx.com
13951130Szelenkov@nginx.com        self.close_connection(sock)
13961130Szelenkov@nginx.com
13971130Szelenkov@nginx.com    # settings
13981130Szelenkov@nginx.com
13991130Szelenkov@nginx.com    def test_node_websockets_max_frame_size(self):
14001130Szelenkov@nginx.com        self.load('websockets/mirror')
14011130Szelenkov@nginx.com
14021130Szelenkov@nginx.com        self.assertIn(
14031130Szelenkov@nginx.com            'success',
14041130Szelenkov@nginx.com            self.conf(
14051130Szelenkov@nginx.com                {'http': {'websocket': {'max_frame_size': 100}}}, 'settings'
14061130Szelenkov@nginx.com            ),
14071130Szelenkov@nginx.com            'configure max_frame_size',
14081130Szelenkov@nginx.com        )
14091130Szelenkov@nginx.com
14101130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
14111130Szelenkov@nginx.com
14121130Szelenkov@nginx.com        payload = '*' * 94
14131130Szelenkov@nginx.com        opcode = self.ws.OP_TEXT
14141130Szelenkov@nginx.com
14151130Szelenkov@nginx.com        self.ws.frame_write(sock, opcode, payload)  # frame length is 100
14161130Szelenkov@nginx.com
14171130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
14181130Szelenkov@nginx.com        self.check_frame(frame, True, opcode, payload)
14191130Szelenkov@nginx.com
14201130Szelenkov@nginx.com        payload = '*' * 95
14211130Szelenkov@nginx.com
14221130Szelenkov@nginx.com        self.ws.frame_write(sock, opcode, payload)  # frame length is 101
14231150Szelenkov@nginx.com        self.check_close(sock, 1009)  # 1009 - CLOSE_TOO_LARGE
14241130Szelenkov@nginx.com
14251130Szelenkov@nginx.com    def test_node_websockets_read_timeout(self):
14261130Szelenkov@nginx.com        self.load('websockets/mirror')
14271130Szelenkov@nginx.com
14281130Szelenkov@nginx.com        self.assertIn(
14291130Szelenkov@nginx.com            'success',
14301130Szelenkov@nginx.com            self.conf(
14311138Szelenkov@nginx.com                {'http': {'websocket': {'read_timeout': 5}}}, 'settings'
14321130Szelenkov@nginx.com            ),
14331130Szelenkov@nginx.com            'configure read_timeout',
14341130Szelenkov@nginx.com        )
14351130Szelenkov@nginx.com
14361130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
14371130Szelenkov@nginx.com
14381130Szelenkov@nginx.com        frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah')
14391130Szelenkov@nginx.com        sock.sendall(frame[:2])
14401130Szelenkov@nginx.com
14411130Szelenkov@nginx.com        time.sleep(2)
14421130Szelenkov@nginx.com
14431150Szelenkov@nginx.com        self.check_close(sock, 1001)  # 1001 - CLOSE_GOING_AWAY
14441130Szelenkov@nginx.com
14451130Szelenkov@nginx.com    def test_node_websockets_keepalive_interval(self):
14461130Szelenkov@nginx.com        self.load('websockets/mirror')
14471130Szelenkov@nginx.com
14481130Szelenkov@nginx.com        self.assertIn(
14491130Szelenkov@nginx.com            'success',
14501130Szelenkov@nginx.com            self.conf(
14511138Szelenkov@nginx.com                {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings'
14521130Szelenkov@nginx.com            ),
14531130Szelenkov@nginx.com            'configure keepalive_interval',
14541130Szelenkov@nginx.com        )
14551130Szelenkov@nginx.com
14561130Szelenkov@nginx.com        _, sock, _ = self.ws.upgrade()
14571130Szelenkov@nginx.com
14581130Szelenkov@nginx.com        frame = self.ws.frame_to_send(self.ws.OP_TEXT, 'blah')
14591130Szelenkov@nginx.com        sock.sendall(frame[:2])
14601130Szelenkov@nginx.com
14611130Szelenkov@nginx.com        time.sleep(2)
14621130Szelenkov@nginx.com
14631130Szelenkov@nginx.com        frame = self.ws.frame_read(sock)
14641130Szelenkov@nginx.com        self.check_frame(frame, True, self.ws.OP_PING, '')  # PING frame
14651130Szelenkov@nginx.com
14661130Szelenkov@nginx.com        sock.close()
14671130Szelenkov@nginx.com
14681150Szelenkov@nginx.com
14691130Szelenkov@nginx.comif __name__ == '__main__':
14701130Szelenkov@nginx.com    TestNodeWebsockets.main()
1471