xref: /unit/test/test_node_websockets.py (revision 2616:ab2896c980ab)
11477Szelenkov@nginx.comimport struct
21130Szelenkov@nginx.comimport time
31477Szelenkov@nginx.com
41635Szelenkov@nginx.comimport pytest
5*2616Szelenkov@nginx.com
62491Szelenkov@nginx.comfrom unit.applications.lang.node import ApplicationNode
72491Szelenkov@nginx.comfrom unit.applications.websockets import ApplicationWebsocket
81130Szelenkov@nginx.com
92488Szelenkov@nginx.comprerequisites = {'modules': {'node': 'any'}}
102488Szelenkov@nginx.com
112491Szelenkov@nginx.comclient = ApplicationNode()
122491Szelenkov@nginx.comws = ApplicationWebsocket()
131130Szelenkov@nginx.com
141130Szelenkov@nginx.com
152491Szelenkov@nginx.com@pytest.fixture(autouse=True)
162491Szelenkov@nginx.comdef setup_method_fixture(skip_alert):
172491Szelenkov@nginx.com    assert 'success' in client.conf(
182491Szelenkov@nginx.com        {'http': {'websocket': {'keepalive_interval': 0}}}, 'settings'
192491Szelenkov@nginx.com    ), 'clear keepalive_interval'
201130Szelenkov@nginx.com
212491Szelenkov@nginx.com    skip_alert(r'socket close\(\d+\) failed')
221130Szelenkov@nginx.com
231130Szelenkov@nginx.com
242491Szelenkov@nginx.comdef close_connection(sock):
252491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
261130Szelenkov@nginx.com
272491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
281130Szelenkov@nginx.com
292491Szelenkov@nginx.com    check_close(sock)
301130Szelenkov@nginx.com
311130Szelenkov@nginx.com
322491Szelenkov@nginx.comdef check_close(sock, code=1000, no_close=False, frame=None):
332491Szelenkov@nginx.com    if frame is None:
342491Szelenkov@nginx.com        frame = ws.frame_read(sock)
351130Szelenkov@nginx.com
362491Szelenkov@nginx.com    assert frame['fin'], 'close fin'
372491Szelenkov@nginx.com    assert frame['opcode'] == ws.OP_CLOSE, 'close opcode'
382491Szelenkov@nginx.com    assert frame['code'] == code, 'close code'
391130Szelenkov@nginx.com
402491Szelenkov@nginx.com    if not no_close:
411130Szelenkov@nginx.com        sock.close()
421130Szelenkov@nginx.com
431130Szelenkov@nginx.com
442491Szelenkov@nginx.comdef check_frame(frame, fin, opcode, payload, decode=True):
452491Szelenkov@nginx.com    if opcode == ws.OP_BINARY or not decode:
462491Szelenkov@nginx.com        data = frame['data']
472491Szelenkov@nginx.com    else:
482491Szelenkov@nginx.com        data = frame['data'].decode('utf-8')
491130Szelenkov@nginx.com
502491Szelenkov@nginx.com    assert frame['fin'] == fin, 'fin'
512491Szelenkov@nginx.com    assert frame['opcode'] == opcode, 'opcode'
522491Szelenkov@nginx.com    assert data == payload, 'payload'
532491Szelenkov@nginx.com
542491Szelenkov@nginx.com
552491Szelenkov@nginx.comdef test_node_websockets_handshake():
562491Szelenkov@nginx.com    client.load('websockets/mirror')
572491Szelenkov@nginx.com
582491Szelenkov@nginx.com    resp, sock, key = ws.upgrade()
592491Szelenkov@nginx.com    sock.close()
601130Szelenkov@nginx.com
612491Szelenkov@nginx.com    assert resp['status'] == 101, 'status'
622491Szelenkov@nginx.com    assert resp['headers']['Upgrade'] == 'websocket', 'upgrade'
632491Szelenkov@nginx.com    assert resp['headers']['Connection'] == 'Upgrade', 'connection'
642491Szelenkov@nginx.com    assert resp['headers']['Sec-WebSocket-Accept'] == ws.accept(key), 'key'
651130Szelenkov@nginx.com
661130Szelenkov@nginx.com
672491Szelenkov@nginx.comdef test_node_websockets_mirror():
682491Szelenkov@nginx.com    client.load('websockets/mirror')
692491Szelenkov@nginx.com
702491Szelenkov@nginx.com    message = 'blah'
711130Szelenkov@nginx.com
722491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
732491Szelenkov@nginx.com
742491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, message)
752491Szelenkov@nginx.com    frame = ws.frame_read(sock)
761130Szelenkov@nginx.com
772491Szelenkov@nginx.com    assert message == frame['data'].decode('utf-8'), 'mirror'
781130Szelenkov@nginx.com
792491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, message)
802491Szelenkov@nginx.com    frame = ws.frame_read(sock)
812491Szelenkov@nginx.com
822491Szelenkov@nginx.com    assert message == frame['data'].decode('utf-8'), 'mirror 2'
831130Szelenkov@nginx.com
842491Szelenkov@nginx.com    sock.close()
852491Szelenkov@nginx.com
861130Szelenkov@nginx.com
872491Szelenkov@nginx.comdef test_node_websockets_no_mask():
882491Szelenkov@nginx.com    client.load('websockets/mirror')
892491Szelenkov@nginx.com
902491Szelenkov@nginx.com    message = 'blah'
912491Szelenkov@nginx.com
922491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
931130Szelenkov@nginx.com
942491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, message, mask=False)
952491Szelenkov@nginx.com
962491Szelenkov@nginx.com    frame = ws.frame_read(sock)
971130Szelenkov@nginx.com
982491Szelenkov@nginx.com    assert frame['opcode'] == ws.OP_CLOSE, 'no mask opcode'
992491Szelenkov@nginx.com    assert frame['code'] == 1002, 'no mask close code'
1001130Szelenkov@nginx.com
1012491Szelenkov@nginx.com    sock.close()
1022491Szelenkov@nginx.com
1031130Szelenkov@nginx.com
1042491Szelenkov@nginx.comdef test_node_websockets_fragmentation():
1052491Szelenkov@nginx.com    client.load('websockets/mirror')
1062491Szelenkov@nginx.com
1072491Szelenkov@nginx.com    message = 'blah'
1081130Szelenkov@nginx.com
1092491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
1101130Szelenkov@nginx.com
1112491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, message, fin=False)
1122491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, ' ', fin=False)
1132491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, message)
1141130Szelenkov@nginx.com
1152491Szelenkov@nginx.com    frame = ws.frame_read(sock)
1162491Szelenkov@nginx.com
1172491Szelenkov@nginx.com    assert f'{message} {message}' == frame['data'].decode(
1182491Szelenkov@nginx.com        'utf-8'
1192491Szelenkov@nginx.com    ), 'mirror framing'
1201130Szelenkov@nginx.com
1212491Szelenkov@nginx.com    sock.close()
1222491Szelenkov@nginx.com
1231130Szelenkov@nginx.com
1242491Szelenkov@nginx.comdef test_node_websockets_frame_fragmentation_invalid():
1252491Szelenkov@nginx.com    client.load('websockets/mirror')
1261130Szelenkov@nginx.com
1272491Szelenkov@nginx.com    message = 'blah'
1282491Szelenkov@nginx.com
1292491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
1301130Szelenkov@nginx.com
1312491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, message, fin=False)
1321130Szelenkov@nginx.com
1332491Szelenkov@nginx.com    frame = ws.frame_read(sock)
1341130Szelenkov@nginx.com
1352491Szelenkov@nginx.com    frame.pop('data')
1362491Szelenkov@nginx.com    assert frame == {
1372491Szelenkov@nginx.com        'fin': True,
1382491Szelenkov@nginx.com        'rsv1': False,
1392491Szelenkov@nginx.com        'rsv2': False,
1402491Szelenkov@nginx.com        'rsv3': False,
1412491Szelenkov@nginx.com        'opcode': ws.OP_CLOSE,
1422491Szelenkov@nginx.com        'mask': 0,
1432491Szelenkov@nginx.com        'code': 1002,
1442491Szelenkov@nginx.com        'reason': 'Fragmented control frame',
1452491Szelenkov@nginx.com    }, 'close frame'
1461130Szelenkov@nginx.com
1472491Szelenkov@nginx.com    sock.close()
1482491Szelenkov@nginx.com
1491130Szelenkov@nginx.com
1502491Szelenkov@nginx.comdef test_node_websockets_large():
1512491Szelenkov@nginx.com    client.load('websockets/mirror_fragmentation')
1521130Szelenkov@nginx.com
1532491Szelenkov@nginx.com    message = '0123456789' * 3000
1542491Szelenkov@nginx.com
1552491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
1561130Szelenkov@nginx.com
1572491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, message)
1582491Szelenkov@nginx.com
1592491Szelenkov@nginx.com    frame = ws.frame_read(sock)
1602491Szelenkov@nginx.com    data = frame['data'].decode('utf-8')
1611130Szelenkov@nginx.com
1622491Szelenkov@nginx.com    frame = ws.frame_read(sock)
1632491Szelenkov@nginx.com    data += frame['data'].decode('utf-8')
1641130Szelenkov@nginx.com
1652491Szelenkov@nginx.com    assert message == data, 'large'
1662491Szelenkov@nginx.com
1672491Szelenkov@nginx.com    sock.close()
1682491Szelenkov@nginx.com
1691130Szelenkov@nginx.com
1702491Szelenkov@nginx.comdef test_node_websockets_two_clients():
1712491Szelenkov@nginx.com    client.load('websockets/mirror')
1721130Szelenkov@nginx.com
1732491Szelenkov@nginx.com    message1 = 'blah1'
1742491Szelenkov@nginx.com    message2 = 'blah2'
1752491Szelenkov@nginx.com
1762491Szelenkov@nginx.com    _, sock1, _ = ws.upgrade()
1772491Szelenkov@nginx.com    _, sock2, _ = ws.upgrade()
1781130Szelenkov@nginx.com
1792491Szelenkov@nginx.com    ws.frame_write(sock1, ws.OP_TEXT, message1)
1802491Szelenkov@nginx.com    ws.frame_write(sock2, ws.OP_TEXT, message2)
1812491Szelenkov@nginx.com
1822491Szelenkov@nginx.com    frame1 = ws.frame_read(sock1)
1832491Szelenkov@nginx.com    frame2 = ws.frame_read(sock2)
1841130Szelenkov@nginx.com
1852491Szelenkov@nginx.com    assert message1 == frame1['data'].decode('utf-8'), 'client 1'
1862491Szelenkov@nginx.com    assert message2 == frame2['data'].decode('utf-8'), 'client 2'
1871130Szelenkov@nginx.com
1882491Szelenkov@nginx.com    sock1.close()
1892491Szelenkov@nginx.com    sock2.close()
1901130Szelenkov@nginx.com
1911130Szelenkov@nginx.com
1922491Szelenkov@nginx.com# FAIL https://tools.ietf.org/html/rfc6455#section-4.2.1
1932491Szelenkov@nginx.com@pytest.mark.skip('not yet')
1942491Szelenkov@nginx.comdef test_node_websockets_handshake_upgrade_absent():
1952491Szelenkov@nginx.com    client.load('websockets/mirror')
1961130Szelenkov@nginx.com
1972491Szelenkov@nginx.com    resp = client.get(
1982491Szelenkov@nginx.com        headers={
1992491Szelenkov@nginx.com            'Host': 'localhost',
2002491Szelenkov@nginx.com            'Connection': 'Upgrade',
2012491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
2022491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2032491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
2042491Szelenkov@nginx.com        },
2052491Szelenkov@nginx.com    )
2061130Szelenkov@nginx.com
2072491Szelenkov@nginx.com    assert resp['status'] == 400, 'upgrade absent'
2082491Szelenkov@nginx.com
2091130Szelenkov@nginx.com
2102491Szelenkov@nginx.comdef test_node_websockets_handshake_case_insensitive():
2112491Szelenkov@nginx.com    client.load('websockets/mirror')
2121130Szelenkov@nginx.com
2132491Szelenkov@nginx.com    resp, sock, _ = ws.upgrade(
2142491Szelenkov@nginx.com        headers={
2152491Szelenkov@nginx.com            'Host': 'localhost',
2162491Szelenkov@nginx.com            'Upgrade': 'WEBSOCKET',
2172491Szelenkov@nginx.com            'Connection': 'UPGRADE',
2182491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
2192491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2202491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
2212491Szelenkov@nginx.com        }
2222491Szelenkov@nginx.com    )
2232491Szelenkov@nginx.com    sock.close()
2241130Szelenkov@nginx.com
2252491Szelenkov@nginx.com    assert resp['status'] == 101, 'status'
2261130Szelenkov@nginx.com
2271130Szelenkov@nginx.com
2282491Szelenkov@nginx.com@pytest.mark.skip('not yet')
2292491Szelenkov@nginx.comdef test_node_websockets_handshake_connection_absent():  # FAIL
2302491Szelenkov@nginx.com    client.load('websockets/mirror')
2311130Szelenkov@nginx.com
2322491Szelenkov@nginx.com    resp = client.get(
2332491Szelenkov@nginx.com        headers={
2342491Szelenkov@nginx.com            'Host': 'localhost',
2352491Szelenkov@nginx.com            'Upgrade': 'websocket',
2362491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
2372491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2382491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
2392491Szelenkov@nginx.com        },
2402491Szelenkov@nginx.com    )
2411130Szelenkov@nginx.com
2422491Szelenkov@nginx.com    assert resp['status'] == 400, 'status'
2432491Szelenkov@nginx.com
2441130Szelenkov@nginx.com
2452491Szelenkov@nginx.comdef test_node_websockets_handshake_version_absent():
2462491Szelenkov@nginx.com    client.load('websockets/mirror')
2471130Szelenkov@nginx.com
2482491Szelenkov@nginx.com    resp = client.get(
2492491Szelenkov@nginx.com        headers={
2502491Szelenkov@nginx.com            'Host': 'localhost',
2512491Szelenkov@nginx.com            'Upgrade': 'websocket',
2522491Szelenkov@nginx.com            'Connection': 'Upgrade',
2532491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
2542491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2552491Szelenkov@nginx.com        },
2562491Szelenkov@nginx.com    )
2571130Szelenkov@nginx.com
2582491Szelenkov@nginx.com    assert resp['status'] == 426, 'status'
2592491Szelenkov@nginx.com
2601130Szelenkov@nginx.com
2612491Szelenkov@nginx.com@pytest.mark.skip('not yet')
2622491Szelenkov@nginx.comdef test_node_websockets_handshake_key_invalid():
2632491Szelenkov@nginx.com    client.load('websockets/mirror')
2641130Szelenkov@nginx.com
2652491Szelenkov@nginx.com    resp = client.get(
2662491Szelenkov@nginx.com        headers={
2672491Szelenkov@nginx.com            'Host': 'localhost',
2682491Szelenkov@nginx.com            'Upgrade': 'websocket',
2692491Szelenkov@nginx.com            'Connection': 'Upgrade',
2702491Szelenkov@nginx.com            'Sec-WebSocket-Key': '!',
2712491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2722491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
2732491Szelenkov@nginx.com        },
2742491Szelenkov@nginx.com    )
2751130Szelenkov@nginx.com
2762491Szelenkov@nginx.com    assert resp['status'] == 400, 'key length'
2771130Szelenkov@nginx.com
2782491Szelenkov@nginx.com    key = ws.key()
2792491Szelenkov@nginx.com    resp = client.get(
2802491Szelenkov@nginx.com        headers={
2812491Szelenkov@nginx.com            'Host': 'localhost',
2822491Szelenkov@nginx.com            'Upgrade': 'websocket',
2832491Szelenkov@nginx.com            'Connection': 'Upgrade',
2842491Szelenkov@nginx.com            'Sec-WebSocket-Key': [key, key],
2852491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2862491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
2872491Szelenkov@nginx.com        },
2882491Szelenkov@nginx.com    )
2891130Szelenkov@nginx.com
2902491Szelenkov@nginx.com    assert (
2912491Szelenkov@nginx.com        resp['status'] == 400
2922491Szelenkov@nginx.com    ), 'key double'  # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1
2931130Szelenkov@nginx.com
2941130Szelenkov@nginx.com
2952491Szelenkov@nginx.comdef test_node_websockets_handshake_method_invalid():
2962491Szelenkov@nginx.com    client.load('websockets/mirror')
2971130Szelenkov@nginx.com
2982491Szelenkov@nginx.com    resp = client.post(
2992491Szelenkov@nginx.com        headers={
3002491Szelenkov@nginx.com            'Host': 'localhost',
3012491Szelenkov@nginx.com            'Upgrade': 'websocket',
3022491Szelenkov@nginx.com            'Connection': 'Upgrade',
3032491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
3042491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
3052491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
3062491Szelenkov@nginx.com        },
3072491Szelenkov@nginx.com    )
3081130Szelenkov@nginx.com
3092491Szelenkov@nginx.com    assert resp['status'] == 400, 'status'
3102491Szelenkov@nginx.com
3111130Szelenkov@nginx.com
3122491Szelenkov@nginx.comdef test_node_websockets_handshake_http_10():
3132491Szelenkov@nginx.com    client.load('websockets/mirror')
3141130Szelenkov@nginx.com
3152491Szelenkov@nginx.com    resp = client.get(
3162491Szelenkov@nginx.com        headers={
3172491Szelenkov@nginx.com            'Host': 'localhost',
3182491Szelenkov@nginx.com            'Upgrade': 'websocket',
3192491Szelenkov@nginx.com            'Connection': 'Upgrade',
3202491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
3212491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
3222491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
3232491Szelenkov@nginx.com        },
3242491Szelenkov@nginx.com        http_10=True,
3252491Szelenkov@nginx.com    )
3261130Szelenkov@nginx.com
3272491Szelenkov@nginx.com    assert resp['status'] == 400, 'status'
3282491Szelenkov@nginx.com
3291130Szelenkov@nginx.com
3302491Szelenkov@nginx.comdef test_node_websockets_handshake_uri_invalid():
3312491Szelenkov@nginx.com    client.load('websockets/mirror')
3321130Szelenkov@nginx.com
3332491Szelenkov@nginx.com    resp = client.get(
3342491Szelenkov@nginx.com        headers={
3352491Szelenkov@nginx.com            'Host': 'localhost',
3362491Szelenkov@nginx.com            'Upgrade': 'websocket',
3372491Szelenkov@nginx.com            'Connection': 'Upgrade',
3382491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
3392491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
3402491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
3412491Szelenkov@nginx.com        },
3422491Szelenkov@nginx.com        url='!',
3432491Szelenkov@nginx.com    )
3441130Szelenkov@nginx.com
3452491Szelenkov@nginx.com    assert resp['status'] == 400, 'status'
3462491Szelenkov@nginx.com
3471130Szelenkov@nginx.com
3482491Szelenkov@nginx.comdef test_node_websockets_protocol_absent():
3492491Szelenkov@nginx.com    client.load('websockets/mirror')
3501130Szelenkov@nginx.com
3512491Szelenkov@nginx.com    key = ws.key()
3522491Szelenkov@nginx.com    resp, sock, _ = ws.upgrade(
3532491Szelenkov@nginx.com        headers={
3542491Szelenkov@nginx.com            'Host': 'localhost',
3552491Szelenkov@nginx.com            'Upgrade': 'websocket',
3562491Szelenkov@nginx.com            'Connection': 'Upgrade',
3572491Szelenkov@nginx.com            'Sec-WebSocket-Key': key,
3582491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
3592491Szelenkov@nginx.com        }
3602491Szelenkov@nginx.com    )
3612491Szelenkov@nginx.com    sock.close()
3621130Szelenkov@nginx.com
3632491Szelenkov@nginx.com    assert resp['status'] == 101, 'status'
3642491Szelenkov@nginx.com    assert resp['headers']['Upgrade'] == 'websocket', 'upgrade'
3652491Szelenkov@nginx.com    assert resp['headers']['Connection'] == 'Upgrade', 'connection'
3662491Szelenkov@nginx.com    assert resp['headers']['Sec-WebSocket-Accept'] == ws.accept(key), 'key'
3672491Szelenkov@nginx.com
3681130Szelenkov@nginx.com
3692491Szelenkov@nginx.com# autobahn-testsuite
3702491Szelenkov@nginx.com#
3712491Szelenkov@nginx.com# Some following tests fail because of Unit does not support UTF-8
3722491Szelenkov@nginx.com# validation for websocket frames.  It should be implemented
3732491Szelenkov@nginx.com# by application, if necessary.
3742491Szelenkov@nginx.com
3752491Szelenkov@nginx.com
3762491Szelenkov@nginx.comdef test_node_websockets_1_1_1__1_1_8():
3772491Szelenkov@nginx.com    client.load('websockets/mirror')
3781130Szelenkov@nginx.com
3792491Szelenkov@nginx.com    opcode = ws.OP_TEXT
3802491Szelenkov@nginx.com
3812491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
3821130Szelenkov@nginx.com
3832491Szelenkov@nginx.com    def check_length(length, chopsize=None):
3842491Szelenkov@nginx.com        payload = '*' * length
3852491Szelenkov@nginx.com
3862491Szelenkov@nginx.com        ws.frame_write(sock, opcode, payload, chopsize=chopsize)
3872491Szelenkov@nginx.com
3882491Szelenkov@nginx.com        frame = ws.frame_read(sock)
3892491Szelenkov@nginx.com        check_frame(frame, True, opcode, payload)
3901130Szelenkov@nginx.com
3912491Szelenkov@nginx.com    check_length(0)  # 1_1_1
3922491Szelenkov@nginx.com    check_length(125)  # 1_1_2
3932491Szelenkov@nginx.com    check_length(126)  # 1_1_3
3942491Szelenkov@nginx.com    check_length(127)  # 1_1_4
3952491Szelenkov@nginx.com    check_length(128)  # 1_1_5
3962491Szelenkov@nginx.com    check_length(65535)  # 1_1_6
3972491Szelenkov@nginx.com    check_length(65536)  # 1_1_7
3982491Szelenkov@nginx.com    check_length(65536, chopsize=997)  # 1_1_8
3991130Szelenkov@nginx.com
4002491Szelenkov@nginx.com    close_connection(sock)
4012491Szelenkov@nginx.com
4021130Szelenkov@nginx.com
4032491Szelenkov@nginx.comdef test_node_websockets_1_2_1__1_2_8():
4042491Szelenkov@nginx.com    client.load('websockets/mirror')
4052491Szelenkov@nginx.com
4062491Szelenkov@nginx.com    opcode = ws.OP_BINARY
4072491Szelenkov@nginx.com
4082491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
4091130Szelenkov@nginx.com
4102491Szelenkov@nginx.com    def check_length(length, chopsize=None):
4112491Szelenkov@nginx.com        payload = b'\xfe' * length
4121130Szelenkov@nginx.com
4132491Szelenkov@nginx.com        ws.frame_write(sock, opcode, payload, chopsize=chopsize)
4142491Szelenkov@nginx.com        frame = ws.frame_read(sock)
4152491Szelenkov@nginx.com
4162491Szelenkov@nginx.com        check_frame(frame, True, opcode, payload)
4171130Szelenkov@nginx.com
4182491Szelenkov@nginx.com    check_length(0)  # 1_2_1
4192491Szelenkov@nginx.com    check_length(125)  # 1_2_2
4202491Szelenkov@nginx.com    check_length(126)  # 1_2_3
4212491Szelenkov@nginx.com    check_length(127)  # 1_2_4
4222491Szelenkov@nginx.com    check_length(128)  # 1_2_5
4232491Szelenkov@nginx.com    check_length(65535)  # 1_2_6
4242491Szelenkov@nginx.com    check_length(65536)  # 1_2_7
4252491Szelenkov@nginx.com    check_length(65536, chopsize=997)  # 1_2_8
4261130Szelenkov@nginx.com
4272491Szelenkov@nginx.com    close_connection(sock)
4282491Szelenkov@nginx.com
4291130Szelenkov@nginx.com
4302491Szelenkov@nginx.comdef test_node_websockets_2_1__2_6():
4312491Szelenkov@nginx.com    client.load('websockets/mirror')
4321130Szelenkov@nginx.com
4332491Szelenkov@nginx.com    op_ping = ws.OP_PING
4342491Szelenkov@nginx.com    op_pong = ws.OP_PONG
4352491Szelenkov@nginx.com
4362491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
4372491Szelenkov@nginx.com
4382491Szelenkov@nginx.com    def check_ping(payload, chopsize=None, decode=True):
4392491Szelenkov@nginx.com        ws.frame_write(sock, op_ping, payload, chopsize=chopsize)
4402491Szelenkov@nginx.com        frame = ws.frame_read(sock)
4411130Szelenkov@nginx.com
4422491Szelenkov@nginx.com        check_frame(frame, True, op_pong, payload, decode=decode)
4431130Szelenkov@nginx.com
4442491Szelenkov@nginx.com    check_ping('')  # 2_1
4452491Szelenkov@nginx.com    check_ping('Hello, world!')  # 2_2
4462491Szelenkov@nginx.com    check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False)  # 2_3
4472491Szelenkov@nginx.com    check_ping(b'\xfe' * 125, decode=False)  # 2_4
4482491Szelenkov@nginx.com    check_ping(b'\xfe' * 125, chopsize=1, decode=False)  # 2_6
4491130Szelenkov@nginx.com
4502491Szelenkov@nginx.com    close_connection(sock)
4512491Szelenkov@nginx.com
4522491Szelenkov@nginx.com    # 2_5
4531130Szelenkov@nginx.com
4542491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
4552491Szelenkov@nginx.com
4562491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, b'\xfe' * 126)
4572491Szelenkov@nginx.com    check_close(sock, 1002)
4581130Szelenkov@nginx.com
4592491Szelenkov@nginx.com
4602491Szelenkov@nginx.comdef test_node_websockets_2_7__2_9():
4612491Szelenkov@nginx.com    client.load('websockets/mirror')
4622491Szelenkov@nginx.com
4632491Szelenkov@nginx.com    # 2_7
4641130Szelenkov@nginx.com
4652491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
4662491Szelenkov@nginx.com
4672491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PONG, '')
4682491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', '2_7'
4691130Szelenkov@nginx.com
4702491Szelenkov@nginx.com    # 2_8
4711130Szelenkov@nginx.com
4722491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PONG, 'unsolicited pong payload')
4732491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', '2_8'
4742491Szelenkov@nginx.com
4752491Szelenkov@nginx.com    # 2_9
4761130Szelenkov@nginx.com
4772491Szelenkov@nginx.com    payload = 'ping payload'
4782491Szelenkov@nginx.com
4792491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PONG, 'unsolicited pong payload')
4802491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, payload)
4812491Szelenkov@nginx.com
4822491Szelenkov@nginx.com    frame = ws.frame_read(sock)
4832491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, payload)
4842491Szelenkov@nginx.com
4852491Szelenkov@nginx.com    close_connection(sock)
4862491Szelenkov@nginx.com
4872491Szelenkov@nginx.com
4882491Szelenkov@nginx.comdef test_node_websockets_2_10__2_11():
4892491Szelenkov@nginx.com    client.load('websockets/mirror')
4902491Szelenkov@nginx.com
4912491Szelenkov@nginx.com    # 2_10
4922491Szelenkov@nginx.com
4932491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
4942491Szelenkov@nginx.com
4952491Szelenkov@nginx.com    for i in range(0, 10):
4962491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_PING, f'payload-{i}')
4971130Szelenkov@nginx.com
4982491Szelenkov@nginx.com    for i in range(0, 10):
4992491Szelenkov@nginx.com        frame = ws.frame_read(sock)
5002491Szelenkov@nginx.com        check_frame(frame, True, ws.OP_PONG, f'payload-{i}')
5012491Szelenkov@nginx.com
5022491Szelenkov@nginx.com    # 2_11
5032491Szelenkov@nginx.com
5042491Szelenkov@nginx.com    for i in range(0, 10):
5052491Szelenkov@nginx.com        opcode = ws.OP_PING
5062491Szelenkov@nginx.com        ws.frame_write(sock, opcode, f'payload-{i}', chopsize=1)
5071130Szelenkov@nginx.com
5082491Szelenkov@nginx.com    for i in range(0, 10):
5092491Szelenkov@nginx.com        frame = ws.frame_read(sock)
5102491Szelenkov@nginx.com        check_frame(frame, True, ws.OP_PONG, f'payload-{i}')
5111130Szelenkov@nginx.com
5122491Szelenkov@nginx.com    close_connection(sock)
5132491Szelenkov@nginx.com
5141130Szelenkov@nginx.com
5152491Szelenkov@nginx.com@pytest.mark.skip('not yet')
5162491Szelenkov@nginx.comdef test_node_websockets_3_1__3_7():
5172491Szelenkov@nginx.com    client.load('websockets/mirror')
5181130Szelenkov@nginx.com
5192491Szelenkov@nginx.com    payload = 'Hello, world!'
5202491Szelenkov@nginx.com
5212491Szelenkov@nginx.com    # 3_1
5222491Szelenkov@nginx.com
5232491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5242491Szelenkov@nginx.com
5252491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, rsv1=True)
5262491Szelenkov@nginx.com    check_close(sock, 1002)
5272491Szelenkov@nginx.com
5282491Szelenkov@nginx.com    # 3_2
5291130Szelenkov@nginx.com
5302491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5311130Szelenkov@nginx.com
5322491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
5332491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, rsv2=True)
5342491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
5351130Szelenkov@nginx.com
5362491Szelenkov@nginx.com    frame = ws.frame_read(sock)
5372491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
5382491Szelenkov@nginx.com
5392491Szelenkov@nginx.com    check_close(sock, 1002, no_close=True)
5401130Szelenkov@nginx.com
5412491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_2'
5422491Szelenkov@nginx.com    sock.close()
5432491Szelenkov@nginx.com
5442491Szelenkov@nginx.com    # 3_3
5452491Szelenkov@nginx.com
5462491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5472491Szelenkov@nginx.com
5482491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
5491130Szelenkov@nginx.com
5502491Szelenkov@nginx.com    frame = ws.frame_read(sock)
5512491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
5522491Szelenkov@nginx.com
5532491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, rsv1=True, rsv2=True)
5542491Szelenkov@nginx.com
5552491Szelenkov@nginx.com    check_close(sock, 1002, no_close=True)
5561130Szelenkov@nginx.com
5572491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_3'
5582491Szelenkov@nginx.com    sock.close()
5592491Szelenkov@nginx.com
5602491Szelenkov@nginx.com    # 3_4
5612491Szelenkov@nginx.com
5622491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5631130Szelenkov@nginx.com
5642491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1)
5652491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, rsv3=True, chopsize=1)
5662491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
5672491Szelenkov@nginx.com
5682491Szelenkov@nginx.com    frame = ws.frame_read(sock)
5692491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
5701819Smax.romanov@nginx.com
5712491Szelenkov@nginx.com    check_close(sock, 1002, no_close=True)
5721819Smax.romanov@nginx.com
5732491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_4'
5742491Szelenkov@nginx.com    sock.close()
5752491Szelenkov@nginx.com
5762491Szelenkov@nginx.com    # 3_5
5772491Szelenkov@nginx.com
5782491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5791819Smax.romanov@nginx.com
5802491Szelenkov@nginx.com    ws.frame_write(
5812491Szelenkov@nginx.com        sock,
5822491Szelenkov@nginx.com        ws.OP_BINARY,
5832491Szelenkov@nginx.com        b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff',
5842491Szelenkov@nginx.com        rsv1=True,
5852491Szelenkov@nginx.com        rsv3=True,
5862491Szelenkov@nginx.com    )
5871130Szelenkov@nginx.com
5882491Szelenkov@nginx.com    check_close(sock, 1002)
5891130Szelenkov@nginx.com
5902491Szelenkov@nginx.com    # 3_6
5911130Szelenkov@nginx.com
5922491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5932491Szelenkov@nginx.com
5942491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, payload, rsv2=True, rsv3=True)
5952491Szelenkov@nginx.com
5962491Szelenkov@nginx.com    check_close(sock, 1002)
5971130Szelenkov@nginx.com
5982491Szelenkov@nginx.com    # 3_7
5992491Szelenkov@nginx.com
6002491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6012491Szelenkov@nginx.com
6022491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True)
6032491Szelenkov@nginx.com
6042491Szelenkov@nginx.com    check_close(sock, 1002)
6052491Szelenkov@nginx.com
6061130Szelenkov@nginx.com
6072491Szelenkov@nginx.comdef test_node_websockets_4_1_1__4_2_5():
6082491Szelenkov@nginx.com    client.load('websockets/mirror')
6092491Szelenkov@nginx.com
6102491Szelenkov@nginx.com    payload = 'Hello, world!'
6112491Szelenkov@nginx.com
6122491Szelenkov@nginx.com    # 4_1_1
6132491Szelenkov@nginx.com
6142491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6151130Szelenkov@nginx.com
6162491Szelenkov@nginx.com    ws.frame_write(sock, 0x03, '')
6172491Szelenkov@nginx.com    check_close(sock, 1002)
6182491Szelenkov@nginx.com
6192491Szelenkov@nginx.com    # 4_1_2
6201130Szelenkov@nginx.com
6212491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6221130Szelenkov@nginx.com
6232491Szelenkov@nginx.com    ws.frame_write(sock, 0x04, 'reserved opcode payload')
6242491Szelenkov@nginx.com    check_close(sock, 1002)
6252491Szelenkov@nginx.com
6262491Szelenkov@nginx.com    # 4_1_3
6271130Szelenkov@nginx.com
6282491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6292491Szelenkov@nginx.com
6302491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
6311130Szelenkov@nginx.com
6322491Szelenkov@nginx.com    frame = ws.frame_read(sock)
6332491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
6342491Szelenkov@nginx.com
6352491Szelenkov@nginx.com    ws.frame_write(sock, 0x05, '')
6362491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
6372491Szelenkov@nginx.com
6382491Szelenkov@nginx.com    check_close(sock, 1002)
6391130Szelenkov@nginx.com
6402491Szelenkov@nginx.com    # 4_1_4
6412491Szelenkov@nginx.com
6422491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6432491Szelenkov@nginx.com
6442491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
6451130Szelenkov@nginx.com
6462491Szelenkov@nginx.com    frame = ws.frame_read(sock)
6472491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
6481130Szelenkov@nginx.com
6492491Szelenkov@nginx.com    ws.frame_write(sock, 0x06, payload)
6502491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
6511130Szelenkov@nginx.com
6522491Szelenkov@nginx.com    check_close(sock, 1002)
6532491Szelenkov@nginx.com
6542491Szelenkov@nginx.com    # 4_1_5
6552491Szelenkov@nginx.com
6562491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6572491Szelenkov@nginx.com
6582491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1)
6591130Szelenkov@nginx.com
6602491Szelenkov@nginx.com    frame = ws.frame_read(sock)
6612491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
6622491Szelenkov@nginx.com
6632491Szelenkov@nginx.com    ws.frame_write(sock, 0x07, payload, chopsize=1)
6642491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
6651130Szelenkov@nginx.com
6662491Szelenkov@nginx.com    check_close(sock, 1002)
6672491Szelenkov@nginx.com
6682491Szelenkov@nginx.com    # 4_2_1
6692491Szelenkov@nginx.com
6702491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6711130Szelenkov@nginx.com
6722491Szelenkov@nginx.com    ws.frame_write(sock, 0x0B, '')
6732491Szelenkov@nginx.com    check_close(sock, 1002)
6742491Szelenkov@nginx.com
6752491Szelenkov@nginx.com    # 4_2_2
6761130Szelenkov@nginx.com
6772491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6782491Szelenkov@nginx.com
6792491Szelenkov@nginx.com    ws.frame_write(sock, 0x0C, 'reserved opcode payload')
6802491Szelenkov@nginx.com    check_close(sock, 1002)
6812491Szelenkov@nginx.com
6822491Szelenkov@nginx.com    # 4_2_3
6831130Szelenkov@nginx.com
6842491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6852491Szelenkov@nginx.com
6862491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
6871130Szelenkov@nginx.com
6882491Szelenkov@nginx.com    frame = ws.frame_read(sock)
6892491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
6901130Szelenkov@nginx.com
6912491Szelenkov@nginx.com    ws.frame_write(sock, 0x0D, '')
6922491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
6932491Szelenkov@nginx.com
6942491Szelenkov@nginx.com    check_close(sock, 1002)
6951130Szelenkov@nginx.com
6962491Szelenkov@nginx.com    # 4_2_4
6972491Szelenkov@nginx.com
6982491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6992491Szelenkov@nginx.com
7002491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
7012491Szelenkov@nginx.com
7022491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7032491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
7041130Szelenkov@nginx.com
7052491Szelenkov@nginx.com    ws.frame_write(sock, 0x0E, payload)
7062491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
7072491Szelenkov@nginx.com
7082491Szelenkov@nginx.com    check_close(sock, 1002)
7091130Szelenkov@nginx.com
7102491Szelenkov@nginx.com    # 4_2_5
7112491Szelenkov@nginx.com
7122491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
7132491Szelenkov@nginx.com
7142491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1)
7151130Szelenkov@nginx.com
7162491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7172491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
7182491Szelenkov@nginx.com
7192491Szelenkov@nginx.com    ws.frame_write(sock, 0x0F, payload, chopsize=1)
7202491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
7211130Szelenkov@nginx.com
7222491Szelenkov@nginx.com    check_close(sock, 1002)
7232491Szelenkov@nginx.com
7242491Szelenkov@nginx.com
7252491Szelenkov@nginx.comdef test_node_websockets_5_1__5_20():
7262491Szelenkov@nginx.com    client.load('websockets/mirror')
7271130Szelenkov@nginx.com
7282491Szelenkov@nginx.com    # 5_1
7291130Szelenkov@nginx.com
7302491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
7311130Szelenkov@nginx.com
7322491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, 'fragment1', fin=False)
7332491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7342491Szelenkov@nginx.com    check_close(sock, 1002)
7351130Szelenkov@nginx.com
7362491Szelenkov@nginx.com    # 5_2
7372491Szelenkov@nginx.com
7382491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
7391130Szelenkov@nginx.com
7402491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PONG, 'fragment1', fin=False)
7412491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7422491Szelenkov@nginx.com    check_close(sock, 1002)
7431130Szelenkov@nginx.com
7442491Szelenkov@nginx.com    # 5_3
7452491Szelenkov@nginx.com
7462491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
7471130Szelenkov@nginx.com
7482491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
7492491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7502491Szelenkov@nginx.com
7512491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7522491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
7531130Szelenkov@nginx.com
7542491Szelenkov@nginx.com    # 5_4
7551130Szelenkov@nginx.com
7562491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
7572491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', '5_4'
7582491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7591130Szelenkov@nginx.com
7602491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7612491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
7622491Szelenkov@nginx.com
7632491Szelenkov@nginx.com    # 5_5
7642491Szelenkov@nginx.com
7652491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False, chopsize=1)
7662491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True, chopsize=1)
7672491Szelenkov@nginx.com
7682491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7692491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
7701130Szelenkov@nginx.com
7712491Szelenkov@nginx.com    # 5_6
7722491Szelenkov@nginx.com
7732491Szelenkov@nginx.com    ping_payload = 'ping payload'
7741130Szelenkov@nginx.com
7752491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
7762491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, ping_payload)
7772491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7781130Szelenkov@nginx.com
7792491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7802491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, ping_payload)
7811130Szelenkov@nginx.com
7822491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7832491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
7842491Szelenkov@nginx.com
7852491Szelenkov@nginx.com    # 5_7
7861130Szelenkov@nginx.com
7872491Szelenkov@nginx.com    ping_payload = 'ping payload'
7882491Szelenkov@nginx.com
7892491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
7902491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', '5_7'
7911130Szelenkov@nginx.com
7922491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, ping_payload)
7932491Szelenkov@nginx.com
7942491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7952491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, ping_payload)
7961130Szelenkov@nginx.com
7972491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7981130Szelenkov@nginx.com
7992491Szelenkov@nginx.com    frame = ws.frame_read(sock)
8002491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
8012491Szelenkov@nginx.com
8022491Szelenkov@nginx.com    # 5_8
8031130Szelenkov@nginx.com
8042491Szelenkov@nginx.com    ping_payload = 'ping payload'
8051130Szelenkov@nginx.com
8062491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False, chopsize=1)
8072491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, ping_payload, chopsize=1)
8082491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True, chopsize=1)
8091130Szelenkov@nginx.com
8102491Szelenkov@nginx.com    frame = ws.frame_read(sock)
8112491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, ping_payload)
8121130Szelenkov@nginx.com
8132491Szelenkov@nginx.com    frame = ws.frame_read(sock)
8142491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
8152491Szelenkov@nginx.com
8162491Szelenkov@nginx.com    # 5_9
8171130Szelenkov@nginx.com
8182491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=True)
8192491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True)
8202491Szelenkov@nginx.com    check_close(sock, 1002)
8211130Szelenkov@nginx.com
8222491Szelenkov@nginx.com    # 5_10
8232491Szelenkov@nginx.com
8242491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8251130Szelenkov@nginx.com
8262491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=True)
8272491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True)
8282491Szelenkov@nginx.com    check_close(sock, 1002)
8292491Szelenkov@nginx.com
8302491Szelenkov@nginx.com    # 5_11
8312491Szelenkov@nginx.com
8322491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8332491Szelenkov@nginx.com
8342491Szelenkov@nginx.com    ws.frame_write(
8352491Szelenkov@nginx.com        sock,
8362491Szelenkov@nginx.com        ws.OP_CONT,
8372491Szelenkov@nginx.com        'non-continuation payload',
8382491Szelenkov@nginx.com        fin=True,
8392491Szelenkov@nginx.com        chopsize=1,
8402491Szelenkov@nginx.com    )
8412491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1)
8422491Szelenkov@nginx.com    check_close(sock, 1002)
8431130Szelenkov@nginx.com
8442491Szelenkov@nginx.com    # 5_12
8452491Szelenkov@nginx.com
8462491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8472491Szelenkov@nginx.com
8482491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=False)
8492491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True)
8502491Szelenkov@nginx.com    check_close(sock, 1002)
8512491Szelenkov@nginx.com
8522491Szelenkov@nginx.com    # 5_13
8532491Szelenkov@nginx.com
8542491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8552491Szelenkov@nginx.com
8562491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=False)
8572491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True)
8582491Szelenkov@nginx.com    check_close(sock, 1002)
8592491Szelenkov@nginx.com
8602491Szelenkov@nginx.com    # 5_14
8612491Szelenkov@nginx.com
8622491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8631130Szelenkov@nginx.com
8642491Szelenkov@nginx.com    ws.frame_write(
8652491Szelenkov@nginx.com        sock,
8662491Szelenkov@nginx.com        ws.OP_CONT,
8672491Szelenkov@nginx.com        'non-continuation payload',
8682491Szelenkov@nginx.com        fin=False,
8692491Szelenkov@nginx.com        chopsize=1,
8702491Szelenkov@nginx.com    )
8712491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1)
8722491Szelenkov@nginx.com    check_close(sock, 1002)
8731130Szelenkov@nginx.com
8742491Szelenkov@nginx.com    # 5_15
8752491Szelenkov@nginx.com
8762491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8771130Szelenkov@nginx.com
8782491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
8792491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
8802491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False)
8812491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment4', fin=True)
8821130Szelenkov@nginx.com
8832491Szelenkov@nginx.com    frame = ws.frame_read(sock)
8841130Szelenkov@nginx.com
8852491Szelenkov@nginx.com    if frame['opcode'] == ws.OP_TEXT:
8862491Szelenkov@nginx.com        check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
8872491Szelenkov@nginx.com        frame = None
8881130Szelenkov@nginx.com
8892491Szelenkov@nginx.com    check_close(sock, 1002, frame=frame)
8901130Szelenkov@nginx.com
8912491Szelenkov@nginx.com    # 5_16
8922491Szelenkov@nginx.com
8932491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8941130Szelenkov@nginx.com
8952491Szelenkov@nginx.com    for _ in range(0, 2):
8962491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CONT, 'fragment1', fin=False)
8972491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_TEXT, 'fragment2', fin=False)
8982491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=True)
8992491Szelenkov@nginx.com    check_close(sock, 1002)
9002491Szelenkov@nginx.com
9012491Szelenkov@nginx.com    # 5_17
9021130Szelenkov@nginx.com
9032491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
9041130Szelenkov@nginx.com
9052491Szelenkov@nginx.com    for _ in range(0, 2):
9062491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CONT, 'fragment1', fin=True)
9072491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_TEXT, 'fragment2', fin=False)
9082491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=True)
9092491Szelenkov@nginx.com    check_close(sock, 1002)
9101130Szelenkov@nginx.com
9112491Szelenkov@nginx.com    # 5_18
9121130Szelenkov@nginx.com
9132491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
9141130Szelenkov@nginx.com
9152491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
9162491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment2')
9172491Szelenkov@nginx.com    check_close(sock, 1002)
9182491Szelenkov@nginx.com
9192491Szelenkov@nginx.com    # 5_19
9202491Szelenkov@nginx.com
9212491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
9221130Szelenkov@nginx.com
9232491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
9242491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=False)
9252491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, 'pongme 1!')
9261130Szelenkov@nginx.com
9272491Szelenkov@nginx.com    time.sleep(1)
9281130Szelenkov@nginx.com
9292491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False)
9302491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment4', fin=False)
9312491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, 'pongme 2!')
9322491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment5')
9331130Szelenkov@nginx.com
9342491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9352491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, 'pongme 1!')
9361130Szelenkov@nginx.com
9372491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9382491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, 'pongme 2!')
9391130Szelenkov@nginx.com
9402491Szelenkov@nginx.com    check_frame(
9412491Szelenkov@nginx.com        ws.frame_read(sock),
9422491Szelenkov@nginx.com        True,
9432491Szelenkov@nginx.com        ws.OP_TEXT,
9442491Szelenkov@nginx.com        'fragment1fragment2fragment3fragment4fragment5',
9452491Szelenkov@nginx.com    )
9461130Szelenkov@nginx.com
9472491Szelenkov@nginx.com    # 5_20
9481130Szelenkov@nginx.com
9492491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
9502491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=False)
9512491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, 'pongme 1!')
9522491Szelenkov@nginx.com
9532491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9542491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, 'pongme 1!')
9551130Szelenkov@nginx.com
9562491Szelenkov@nginx.com    time.sleep(1)
9572491Szelenkov@nginx.com
9582491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False)
9592491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment4', fin=False)
9602491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, 'pongme 2!')
9612491Szelenkov@nginx.com
9622491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9632491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, 'pongme 2!')
9641130Szelenkov@nginx.com
9652491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', '5_20'
9662491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment5')
9671130Szelenkov@nginx.com
9682491Szelenkov@nginx.com    check_frame(
9692491Szelenkov@nginx.com        ws.frame_read(sock),
9702491Szelenkov@nginx.com        True,
9712491Szelenkov@nginx.com        ws.OP_TEXT,
9722491Szelenkov@nginx.com        'fragment1fragment2fragment3fragment4fragment5',
9732491Szelenkov@nginx.com    )
9741130Szelenkov@nginx.com
9752491Szelenkov@nginx.com    close_connection(sock)
9761130Szelenkov@nginx.com
9771130Szelenkov@nginx.com
9782491Szelenkov@nginx.comdef test_node_websockets_6_1_1__6_4_4():
9792491Szelenkov@nginx.com    client.load('websockets/mirror')
9802491Szelenkov@nginx.com
9812491Szelenkov@nginx.com    # 6_1_1
9821130Szelenkov@nginx.com
9832491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
9842491Szelenkov@nginx.com
9852491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, '')
9862491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9872491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, '')
9881130Szelenkov@nginx.com
9892491Szelenkov@nginx.com    # 6_1_2
9901130Szelenkov@nginx.com
9912491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, '', fin=False)
9922491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, '', fin=False)
9932491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, '')
9941130Szelenkov@nginx.com
9952491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9962491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, '')
9971130Szelenkov@nginx.com
9982491Szelenkov@nginx.com    # 6_1_3
9991130Szelenkov@nginx.com
10002491Szelenkov@nginx.com    payload = 'middle frame payload'
10011130Szelenkov@nginx.com
10022491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, '', fin=False)
10032491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, payload, fin=False)
10042491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, '')
10051130Szelenkov@nginx.com
10062491Szelenkov@nginx.com    frame = ws.frame_read(sock)
10072491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
10081130Szelenkov@nginx.com
10092491Szelenkov@nginx.com    # 6_2_1
10102491Szelenkov@nginx.com
10112491Szelenkov@nginx.com    payload = 'Hello-µ@ßöäüàá-UTF-8!!'
10121130Szelenkov@nginx.com
10132491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
10141130Szelenkov@nginx.com
10152491Szelenkov@nginx.com    frame = ws.frame_read(sock)
10162491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
10172491Szelenkov@nginx.com
10182491Szelenkov@nginx.com    # 6_2_2
10191130Szelenkov@nginx.com
10202491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload[:12], fin=False)
10212491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, payload[12:])
10221130Szelenkov@nginx.com
10232491Szelenkov@nginx.com    frame = ws.frame_read(sock)
10242491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
10251130Szelenkov@nginx.com
10262491Szelenkov@nginx.com    # 6_2_3
10272491Szelenkov@nginx.com
10282491Szelenkov@nginx.com    ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1)
10291130Szelenkov@nginx.com
10302491Szelenkov@nginx.com    frame = ws.frame_read(sock)
10312491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
10322491Szelenkov@nginx.com
10332491Szelenkov@nginx.com    # 6_2_4
10342491Szelenkov@nginx.com
10352491Szelenkov@nginx.com    payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5'
10361130Szelenkov@nginx.com
10372491Szelenkov@nginx.com    ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1)
10381130Szelenkov@nginx.com
10392491Szelenkov@nginx.com    frame = ws.frame_read(sock)
10402491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
10412491Szelenkov@nginx.com
10422491Szelenkov@nginx.com    close_connection(sock)
10431130Szelenkov@nginx.com
10441130Szelenkov@nginx.com
10452491Szelenkov@nginx.com#        Unit does not support UTF-8 validation
10462491Szelenkov@nginx.com#
10472491Szelenkov@nginx.com#        # 6_3_1 FAIL
10482491Szelenkov@nginx.com#
10492491Szelenkov@nginx.com#        payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5'
10502491Szelenkov@nginx.com#        payload_2 = '\xed\xa0\x80'
10512491Szelenkov@nginx.com#        payload_3 = '\x65\x64\x69\x74\x65\x64'
10522491Szelenkov@nginx.com#
10532491Szelenkov@nginx.com#        payload = payload_1 + payload_2 + payload_3
10542491Szelenkov@nginx.com#
10552491Szelenkov@nginx.com#        ws.message(sock, ws.OP_TEXT, payload)
10562491Szelenkov@nginx.com#        check_close(sock, 1007)
10572491Szelenkov@nginx.com#
10582491Szelenkov@nginx.com#        # 6_3_2 FAIL
10592491Szelenkov@nginx.com#
10602491Szelenkov@nginx.com#        _, sock, _ = ws.upgrade()
10612491Szelenkov@nginx.com#
10622491Szelenkov@nginx.com#        ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1)
10632491Szelenkov@nginx.com#        check_close(sock, 1007)
10642491Szelenkov@nginx.com#
10652491Szelenkov@nginx.com#        # 6_4_1 ... 6_4_4 FAIL
10661130Szelenkov@nginx.com
10672491Szelenkov@nginx.com
10682491Szelenkov@nginx.comdef test_node_websockets_7_1_1__7_5_1():
10692491Szelenkov@nginx.com    client.load('websockets/mirror')
10702491Szelenkov@nginx.com
10712491Szelenkov@nginx.com    # 7_1_1
10722491Szelenkov@nginx.com
10732491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
10742491Szelenkov@nginx.com
10752491Szelenkov@nginx.com    payload = "Hello World!"
10761130Szelenkov@nginx.com
10772491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
10782491Szelenkov@nginx.com
10792491Szelenkov@nginx.com    frame = ws.frame_read(sock)
10802491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
10812491Szelenkov@nginx.com
10822491Szelenkov@nginx.com    close_connection(sock)
10832491Szelenkov@nginx.com
10842491Szelenkov@nginx.com    # 7_1_2
10852491Szelenkov@nginx.com
10862491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
10871130Szelenkov@nginx.com
10882491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
10892491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
10902491Szelenkov@nginx.com
10912491Szelenkov@nginx.com    check_close(sock)
10922491Szelenkov@nginx.com
10932491Szelenkov@nginx.com    # 7_1_3
10942491Szelenkov@nginx.com
10952491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
10962491Szelenkov@nginx.com
10972491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
10982491Szelenkov@nginx.com    check_close(sock, no_close=True)
10992491Szelenkov@nginx.com
11002491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
11012491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
11022491Szelenkov@nginx.com
11032491Szelenkov@nginx.com    sock.close()
11042491Szelenkov@nginx.com
11052491Szelenkov@nginx.com    # 7_1_4
11062491Szelenkov@nginx.com
11072491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11081130Szelenkov@nginx.com
11092491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
11102491Szelenkov@nginx.com    check_close(sock, no_close=True)
11111130Szelenkov@nginx.com
11122491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
11132491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
11142491Szelenkov@nginx.com
11152491Szelenkov@nginx.com    sock.close()
11162491Szelenkov@nginx.com
11172491Szelenkov@nginx.com    # 7_1_5
11181130Szelenkov@nginx.com
11192491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11201130Szelenkov@nginx.com
11212491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
11222491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
11232491Szelenkov@nginx.com    check_close(sock, no_close=True)
11242491Szelenkov@nginx.com
11252491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2')
11262491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
11272491Szelenkov@nginx.com
11282491Szelenkov@nginx.com    sock.close()
11291130Szelenkov@nginx.com
11302491Szelenkov@nginx.com    # 7_1_6
11312491Szelenkov@nginx.com
11322491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11331130Szelenkov@nginx.com
11342491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2**10)
11352491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
11362491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
11371130Szelenkov@nginx.com
11382491Szelenkov@nginx.com    client.recvall(sock, read_timeout=1)
11392491Szelenkov@nginx.com
11402491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
11412491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
11421130Szelenkov@nginx.com
11432491Szelenkov@nginx.com    sock.close()
11441130Szelenkov@nginx.com
11452491Szelenkov@nginx.com    # 7_3_1
11462491Szelenkov@nginx.com
11472491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11481130Szelenkov@nginx.com
11492491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, '')
11502491Szelenkov@nginx.com    check_close(sock)
11512491Szelenkov@nginx.com
11522491Szelenkov@nginx.com    # 7_3_2
11531130Szelenkov@nginx.com
11542491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11552491Szelenkov@nginx.com
11562491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, 'a')
11572491Szelenkov@nginx.com    check_close(sock, 1002)
11581130Szelenkov@nginx.com
11592491Szelenkov@nginx.com    # 7_3_3
11602491Szelenkov@nginx.com
11612491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11621130Szelenkov@nginx.com
11632491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
11642491Szelenkov@nginx.com    check_close(sock)
11651130Szelenkov@nginx.com
11662491Szelenkov@nginx.com    # 7_3_4
11671130Szelenkov@nginx.com
11682491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11692491Szelenkov@nginx.com
11702491Szelenkov@nginx.com    payload = ws.serialize_close(reason='Hello World!')
11711130Szelenkov@nginx.com
11722491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload)
11732491Szelenkov@nginx.com    check_close(sock)
11742491Szelenkov@nginx.com
11752491Szelenkov@nginx.com    # 7_3_5
11762491Szelenkov@nginx.com
11772491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11782491Szelenkov@nginx.com
11792491Szelenkov@nginx.com    payload = ws.serialize_close(reason='*' * 123)
11801130Szelenkov@nginx.com
11812491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload)
11822491Szelenkov@nginx.com    check_close(sock)
11831130Szelenkov@nginx.com
11842491Szelenkov@nginx.com    # 7_3_6
11852491Szelenkov@nginx.com
11862491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11872491Szelenkov@nginx.com
11882491Szelenkov@nginx.com    payload = ws.serialize_close(reason='*' * 124)
11891130Szelenkov@nginx.com
11902491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload)
11912491Szelenkov@nginx.com    check_close(sock, 1002)
11922491Szelenkov@nginx.com
11931130Szelenkov@nginx.com
11942491Szelenkov@nginx.com#        # 7_5_1 FAIL Unit does not support UTF-8 validation
11952491Szelenkov@nginx.com#
11962491Szelenkov@nginx.com#        _, sock, _ = ws.upgrade()
11972491Szelenkov@nginx.com#
11982491Szelenkov@nginx.com#        payload = ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \
11992491Szelenkov@nginx.com#            '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64')
12002491Szelenkov@nginx.com#
12012491Szelenkov@nginx.com#        ws.frame_write(sock, ws.OP_CLOSE, payload)
12022491Szelenkov@nginx.com#        check_close(sock, 1007)
12031130Szelenkov@nginx.com
12042491Szelenkov@nginx.com
12052491Szelenkov@nginx.comdef test_node_websockets_7_7_X__7_9_X():
12062491Szelenkov@nginx.com    client.load('websockets/mirror')
12071130Szelenkov@nginx.com
12082491Szelenkov@nginx.com    valid_codes = [
12092491Szelenkov@nginx.com        1000,
12102491Szelenkov@nginx.com        1001,
12112491Szelenkov@nginx.com        1002,
12122491Szelenkov@nginx.com        1003,
12132491Szelenkov@nginx.com        1007,
12142491Szelenkov@nginx.com        1008,
12152491Szelenkov@nginx.com        1009,
12162491Szelenkov@nginx.com        1010,
12172491Szelenkov@nginx.com        1011,
12182491Szelenkov@nginx.com        3000,
12192491Szelenkov@nginx.com        3999,
12202491Szelenkov@nginx.com        4000,
12212491Szelenkov@nginx.com        4999,
12222491Szelenkov@nginx.com    ]
12231130Szelenkov@nginx.com
12242491Szelenkov@nginx.com    invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999]
12252491Szelenkov@nginx.com
12262491Szelenkov@nginx.com    for code in valid_codes:
12272491Szelenkov@nginx.com        _, sock, _ = ws.upgrade()
12282491Szelenkov@nginx.com
12292491Szelenkov@nginx.com        payload = ws.serialize_close(code=code)
12302491Szelenkov@nginx.com
12312491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CLOSE, payload)
12322491Szelenkov@nginx.com        check_close(sock)
12331130Szelenkov@nginx.com
12342491Szelenkov@nginx.com    for code in invalid_codes:
12352491Szelenkov@nginx.com        _, sock, _ = ws.upgrade()
12362491Szelenkov@nginx.com
12372491Szelenkov@nginx.com        payload = ws.serialize_close(code=code)
12382491Szelenkov@nginx.com
12392491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CLOSE, payload)
12402491Szelenkov@nginx.com        check_close(sock, 1002)
12412491Szelenkov@nginx.com
12422491Szelenkov@nginx.com
12432491Szelenkov@nginx.comdef test_node_websockets_7_13_1__7_13_2():
12442491Szelenkov@nginx.com    client.load('websockets/mirror')
12451130Szelenkov@nginx.com
12462491Szelenkov@nginx.com    # 7_13_1
12472491Szelenkov@nginx.com
12482491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
12492491Szelenkov@nginx.com
12502491Szelenkov@nginx.com    payload = ws.serialize_close(code=5000)
12511130Szelenkov@nginx.com
12522491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload)
12532491Szelenkov@nginx.com    check_close(sock, 1002)
12542491Szelenkov@nginx.com
12552491Szelenkov@nginx.com    # 7_13_2
12562491Szelenkov@nginx.com
12572491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
12582491Szelenkov@nginx.com
12592491Szelenkov@nginx.com    payload = struct.pack('!I', 65536) + ''.encode('utf-8')
12601130Szelenkov@nginx.com
12612491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload)
12622491Szelenkov@nginx.com    check_close(sock, 1002)
12632491Szelenkov@nginx.com
12642491Szelenkov@nginx.com
12652491Szelenkov@nginx.comdef test_node_websockets_9_1_1__9_6_6(is_unsafe, system):
12662491Szelenkov@nginx.com    if not is_unsafe:
12672491Szelenkov@nginx.com        pytest.skip('unsafe, long run')
12682491Szelenkov@nginx.com
12692491Szelenkov@nginx.com    client.load('websockets/mirror')
12701130Szelenkov@nginx.com
12712491Szelenkov@nginx.com    assert 'success' in client.conf(
12722491Szelenkov@nginx.com        {
12732491Szelenkov@nginx.com            'http': {
12742491Szelenkov@nginx.com                'websocket': {
12752491Szelenkov@nginx.com                    'max_frame_size': 33554432,
12762491Szelenkov@nginx.com                    'keepalive_interval': 0,
12772491Szelenkov@nginx.com                }
12782491Szelenkov@nginx.com            }
12792491Szelenkov@nginx.com        },
12802491Szelenkov@nginx.com        'settings',
12812491Szelenkov@nginx.com    ), 'increase max_frame_size and keepalive_interval'
12821130Szelenkov@nginx.com
12832491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
12842491Szelenkov@nginx.com
12852491Szelenkov@nginx.com    op_text = ws.OP_TEXT
12862491Szelenkov@nginx.com    op_binary = ws.OP_BINARY
12872491Szelenkov@nginx.com
12882491Szelenkov@nginx.com    def check_payload(opcode, length, chopsize=None):
12892491Szelenkov@nginx.com        if opcode == ws.OP_TEXT:
12902491Szelenkov@nginx.com            payload = '*' * length
12912491Szelenkov@nginx.com        else:
12922491Szelenkov@nginx.com            payload = b'*' * length
12932491Szelenkov@nginx.com
12942491Szelenkov@nginx.com        ws.frame_write(sock, opcode, payload, chopsize=chopsize)
12952491Szelenkov@nginx.com        frame = ws.frame_read(sock, read_timeout=5)
12962491Szelenkov@nginx.com        check_frame(frame, True, opcode, payload)
12971130Szelenkov@nginx.com
12982491Szelenkov@nginx.com    def check_message(opcode, f_size):
12992491Szelenkov@nginx.com        if opcode == ws.OP_TEXT:
13002491Szelenkov@nginx.com            payload = '*' * 4 * 2**20
13012491Szelenkov@nginx.com        else:
13022491Szelenkov@nginx.com            payload = b'*' * 4 * 2**20
13031130Szelenkov@nginx.com
13042491Szelenkov@nginx.com        ws.message(sock, opcode, payload, fragmention_size=f_size)
13052491Szelenkov@nginx.com        frame = ws.frame_read(sock, read_timeout=5)
13062491Szelenkov@nginx.com        check_frame(frame, True, opcode, payload)
13072491Szelenkov@nginx.com
13082491Szelenkov@nginx.com    check_payload(op_text, 64 * 2**10)  # 9_1_1
13092491Szelenkov@nginx.com    check_payload(op_text, 256 * 2**10)  # 9_1_2
13102491Szelenkov@nginx.com    check_payload(op_text, 2**20)  # 9_1_3
13112491Szelenkov@nginx.com    check_payload(op_text, 4 * 2**20)  # 9_1_4
13122491Szelenkov@nginx.com    check_payload(op_text, 8 * 2**20)  # 9_1_5
13132491Szelenkov@nginx.com    check_payload(op_text, 16 * 2**20)  # 9_1_6
13141130Szelenkov@nginx.com
13152491Szelenkov@nginx.com    check_payload(op_binary, 64 * 2**10)  # 9_2_1
13162491Szelenkov@nginx.com    check_payload(op_binary, 256 * 2**10)  # 9_2_2
13172491Szelenkov@nginx.com    check_payload(op_binary, 2**20)  # 9_2_3
13182491Szelenkov@nginx.com    check_payload(op_binary, 4 * 2**20)  # 9_2_4
13192491Szelenkov@nginx.com    check_payload(op_binary, 8 * 2**20)  # 9_2_5
13202491Szelenkov@nginx.com    check_payload(op_binary, 16 * 2**20)  # 9_2_6
13211130Szelenkov@nginx.com
13222491Szelenkov@nginx.com    if system not in ['Darwin', 'FreeBSD']:
13232491Szelenkov@nginx.com        check_message(op_text, 64)  # 9_3_1
13242491Szelenkov@nginx.com        check_message(op_text, 256)  # 9_3_2
13252491Szelenkov@nginx.com        check_message(op_text, 2**10)  # 9_3_3
13262491Szelenkov@nginx.com        check_message(op_text, 4 * 2**10)  # 9_3_4
13272491Szelenkov@nginx.com        check_message(op_text, 16 * 2**10)  # 9_3_5
13282491Szelenkov@nginx.com        check_message(op_text, 64 * 2**10)  # 9_3_6
13292491Szelenkov@nginx.com        check_message(op_text, 256 * 2**10)  # 9_3_7
13302491Szelenkov@nginx.com        check_message(op_text, 2**20)  # 9_3_8
13312491Szelenkov@nginx.com        check_message(op_text, 4 * 2**20)  # 9_3_9
13321130Szelenkov@nginx.com
13332491Szelenkov@nginx.com        check_message(op_binary, 64)  # 9_4_1
13342491Szelenkov@nginx.com        check_message(op_binary, 256)  # 9_4_2
13352491Szelenkov@nginx.com        check_message(op_binary, 2**10)  # 9_4_3
13362491Szelenkov@nginx.com        check_message(op_binary, 4 * 2**10)  # 9_4_4
13372491Szelenkov@nginx.com        check_message(op_binary, 16 * 2**10)  # 9_4_5
13382491Szelenkov@nginx.com        check_message(op_binary, 64 * 2**10)  # 9_4_6
13392491Szelenkov@nginx.com        check_message(op_binary, 256 * 2**10)  # 9_4_7
13402491Szelenkov@nginx.com        check_message(op_binary, 2**20)  # 9_4_8
13412491Szelenkov@nginx.com        check_message(op_binary, 4 * 2**20)  # 9_4_9
13421130Szelenkov@nginx.com
13432491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=64)  # 9_5_1
13442491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=128)  # 9_5_2
13452491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=256)  # 9_5_3
13462491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=512)  # 9_5_4
13472491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=1024)  # 9_5_5
13482491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=2048)  # 9_5_6
13491130Szelenkov@nginx.com
13502491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=64)  # 9_6_1
13512491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=128)  # 9_6_2
13522491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=256)  # 9_6_3
13532491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=512)  # 9_6_4
13542491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=1024)  # 9_6_5
13552491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=2048)  # 9_6_6
13561130Szelenkov@nginx.com
13572491Szelenkov@nginx.com    close_connection(sock)
13582491Szelenkov@nginx.com
13592491Szelenkov@nginx.com
13602491Szelenkov@nginx.comdef test_node_websockets_10_1_1():
13612491Szelenkov@nginx.com    client.load('websockets/mirror')
13622491Szelenkov@nginx.com
13632491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
13641130Szelenkov@nginx.com
13652491Szelenkov@nginx.com    payload = '*' * 65536
13662491Szelenkov@nginx.com
13672491Szelenkov@nginx.com    ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1300)
13681130Szelenkov@nginx.com
13692491Szelenkov@nginx.com    frame = ws.frame_read(sock)
13702491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
13711130Szelenkov@nginx.com
13722491Szelenkov@nginx.com    close_connection(sock)
13732491Szelenkov@nginx.com
13742491Szelenkov@nginx.com
13752491Szelenkov@nginx.com# settings
13761130Szelenkov@nginx.com
13772491Szelenkov@nginx.com
13782491Szelenkov@nginx.comdef test_node_websockets_max_frame_size():
13792491Szelenkov@nginx.com    client.load('websockets/mirror')
13801130Szelenkov@nginx.com
13812491Szelenkov@nginx.com    assert 'success' in client.conf(
13822491Szelenkov@nginx.com        {'http': {'websocket': {'max_frame_size': 100}}}, 'settings'
13832491Szelenkov@nginx.com    ), 'configure max_frame_size'
13841130Szelenkov@nginx.com
13852491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
13862491Szelenkov@nginx.com
13872491Szelenkov@nginx.com    payload = '*' * 94
13882491Szelenkov@nginx.com    opcode = ws.OP_TEXT
13891130Szelenkov@nginx.com
13902491Szelenkov@nginx.com    ws.frame_write(sock, opcode, payload)  # frame length is 100
13912491Szelenkov@nginx.com
13922491Szelenkov@nginx.com    frame = ws.frame_read(sock)
13932491Szelenkov@nginx.com    check_frame(frame, True, opcode, payload)
13941130Szelenkov@nginx.com
13952491Szelenkov@nginx.com    payload = '*' * 95
13962491Szelenkov@nginx.com
13972491Szelenkov@nginx.com    ws.frame_write(sock, opcode, payload)  # frame length is 101
13982491Szelenkov@nginx.com    check_close(sock, 1009)  # 1009 - CLOSE_TOO_LARGE
13992491Szelenkov@nginx.com
14001130Szelenkov@nginx.com
14012491Szelenkov@nginx.comdef test_node_websockets_read_timeout():
14022491Szelenkov@nginx.com    client.load('websockets/mirror')
14031130Szelenkov@nginx.com
14042491Szelenkov@nginx.com    assert 'success' in client.conf(
14052491Szelenkov@nginx.com        {'http': {'websocket': {'read_timeout': 5}}}, 'settings'
14062491Szelenkov@nginx.com    ), 'configure read_timeout'
14071130Szelenkov@nginx.com
14082491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
14092491Szelenkov@nginx.com
14102491Szelenkov@nginx.com    frame = ws.frame_to_send(ws.OP_TEXT, 'blah')
14112491Szelenkov@nginx.com    sock.sendall(frame[:2])
14121130Szelenkov@nginx.com
14132491Szelenkov@nginx.com    time.sleep(2)
14142491Szelenkov@nginx.com
14152491Szelenkov@nginx.com    check_close(sock, 1001)  # 1001 - CLOSE_GOING_AWAY
14162491Szelenkov@nginx.com
14171130Szelenkov@nginx.com
14182491Szelenkov@nginx.comdef test_node_websockets_keepalive_interval():
14192491Szelenkov@nginx.com    client.load('websockets/mirror')
14202491Szelenkov@nginx.com
14212491Szelenkov@nginx.com    assert 'success' in client.conf(
14222491Szelenkov@nginx.com        {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings'
14232491Szelenkov@nginx.com    ), 'configure keepalive_interval'
14241130Szelenkov@nginx.com
14252491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
14261130Szelenkov@nginx.com
14272491Szelenkov@nginx.com    frame = ws.frame_to_send(ws.OP_TEXT, 'blah')
14282491Szelenkov@nginx.com    sock.sendall(frame[:2])
14291130Szelenkov@nginx.com
14302491Szelenkov@nginx.com    time.sleep(2)
14311130Szelenkov@nginx.com
14322491Szelenkov@nginx.com    frame = ws.frame_read(sock)
14332491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PING, '')  # PING frame
14342491Szelenkov@nginx.com
14352491Szelenkov@nginx.com    sock.close()
1436