xref: /unit/test/test_java_websockets.py (revision 2616:ab2896c980ab)
11477Szelenkov@nginx.comimport struct
21158Szelenkov@nginx.comimport time
31477Szelenkov@nginx.com
41635Szelenkov@nginx.comimport pytest
5*2616Szelenkov@nginx.com
62491Szelenkov@nginx.comfrom unit.applications.lang.java import ApplicationJava
72491Szelenkov@nginx.comfrom unit.applications.websockets import ApplicationWebsocket
81158Szelenkov@nginx.com
92488Szelenkov@nginx.comprerequisites = {'modules': {'java': 'any'}}
102488Szelenkov@nginx.com
112491Szelenkov@nginx.comclient = ApplicationJava()
122491Szelenkov@nginx.comws = ApplicationWebsocket()
131158Szelenkov@nginx.com
141158Szelenkov@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'
201158Szelenkov@nginx.com
212491Szelenkov@nginx.com    skip_alert(r'socket close\(\d+\) failed')
221158Szelenkov@nginx.com
231158Szelenkov@nginx.com
242491Szelenkov@nginx.comdef close_connection(sock):
252491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
261158Szelenkov@nginx.com
272491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
281158Szelenkov@nginx.com
292491Szelenkov@nginx.com    check_close(sock)
301158Szelenkov@nginx.com
311158Szelenkov@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)
351158Szelenkov@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'
391158Szelenkov@nginx.com
402491Szelenkov@nginx.com    if not no_close:
411158Szelenkov@nginx.com        sock.close()
421158Szelenkov@nginx.com
431158Szelenkov@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')
491158Szelenkov@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_java_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()
601158Szelenkov@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'
651158Szelenkov@nginx.com
661158Szelenkov@nginx.com
672491Szelenkov@nginx.comdef test_java_websockets_mirror():
682491Szelenkov@nginx.com    client.load('websockets_mirror')
692491Szelenkov@nginx.com
702491Szelenkov@nginx.com    message = 'blah'
711158Szelenkov@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)
761158Szelenkov@nginx.com
772491Szelenkov@nginx.com    assert message == frame['data'].decode('utf-8'), 'mirror'
781158Szelenkov@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'
831158Szelenkov@nginx.com
842491Szelenkov@nginx.com    sock.close()
852491Szelenkov@nginx.com
861158Szelenkov@nginx.com
872491Szelenkov@nginx.comdef test_java_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()
931158Szelenkov@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)
971158Szelenkov@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'
1001158Szelenkov@nginx.com
1012491Szelenkov@nginx.com    sock.close()
1022491Szelenkov@nginx.com
1031158Szelenkov@nginx.com
1042491Szelenkov@nginx.comdef test_java_websockets_fragmentation():
1052491Szelenkov@nginx.com    client.load('websockets_mirror')
1062491Szelenkov@nginx.com
1072491Szelenkov@nginx.com    message = 'blah'
1081158Szelenkov@nginx.com
1092491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
1101158Szelenkov@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)
1141158Szelenkov@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'
1201158Szelenkov@nginx.com
1212491Szelenkov@nginx.com    sock.close()
1222491Szelenkov@nginx.com
1231158Szelenkov@nginx.com
1242491Szelenkov@nginx.comdef test_java_websockets_frame_fragmentation_invalid():
1252491Szelenkov@nginx.com    client.load('websockets_mirror')
1261158Szelenkov@nginx.com
1272491Szelenkov@nginx.com    message = 'blah'
1282491Szelenkov@nginx.com
1292491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
1301158Szelenkov@nginx.com
1312491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, message, fin=False)
1321158Szelenkov@nginx.com
1332491Szelenkov@nginx.com    frame = ws.frame_read(sock)
1341158Szelenkov@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'
1461158Szelenkov@nginx.com
1472491Szelenkov@nginx.com    sock.close()
1482491Szelenkov@nginx.com
1491158Szelenkov@nginx.com
1502491Szelenkov@nginx.comdef test_java_websockets_two_clients():
1512491Szelenkov@nginx.com    client.load('websockets_mirror')
1521158Szelenkov@nginx.com
1532491Szelenkov@nginx.com    message1 = 'blah1'
1542491Szelenkov@nginx.com    message2 = 'blah2'
1551158Szelenkov@nginx.com
1562491Szelenkov@nginx.com    _, sock1, _ = ws.upgrade()
1572491Szelenkov@nginx.com    _, sock2, _ = ws.upgrade()
1582491Szelenkov@nginx.com
1592491Szelenkov@nginx.com    ws.frame_write(sock1, ws.OP_TEXT, message1)
1602491Szelenkov@nginx.com    ws.frame_write(sock2, ws.OP_TEXT, message2)
1611158Szelenkov@nginx.com
1622491Szelenkov@nginx.com    frame1 = ws.frame_read(sock1)
1632491Szelenkov@nginx.com    frame2 = ws.frame_read(sock2)
1641158Szelenkov@nginx.com
1652491Szelenkov@nginx.com    assert message1 == frame1['data'].decode('utf-8'), 'client 1'
1662491Szelenkov@nginx.com    assert message2 == frame2['data'].decode('utf-8'), 'client 2'
1671158Szelenkov@nginx.com
1682491Szelenkov@nginx.com    sock1.close()
1692491Szelenkov@nginx.com    sock2.close()
1702491Szelenkov@nginx.com
1711158Szelenkov@nginx.com
1722491Szelenkov@nginx.com# FAIL https://tools.ietf.org/html/rfc6455#section-4.2.1
1732491Szelenkov@nginx.com@pytest.mark.skip('not yet')
1742491Szelenkov@nginx.comdef test_java_websockets_handshake_upgrade_absent():
1752491Szelenkov@nginx.com    client.load('websockets_mirror')
1761158Szelenkov@nginx.com
1772491Szelenkov@nginx.com    resp = client.get(
1782491Szelenkov@nginx.com        headers={
1792491Szelenkov@nginx.com            'Host': 'localhost',
1802491Szelenkov@nginx.com            'Connection': 'Upgrade',
1812491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
1822491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
1832491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
1842491Szelenkov@nginx.com        },
1852491Szelenkov@nginx.com    )
1861158Szelenkov@nginx.com
1872491Szelenkov@nginx.com    assert resp['status'] == 400, 'upgrade absent'
1881158Szelenkov@nginx.com
1891158Szelenkov@nginx.com
1902491Szelenkov@nginx.comdef test_java_websockets_handshake_case_insensitive():
1912491Szelenkov@nginx.com    client.load('websockets_mirror')
1921158Szelenkov@nginx.com
1932491Szelenkov@nginx.com    resp, sock, _ = ws.upgrade(
1942491Szelenkov@nginx.com        headers={
1952491Szelenkov@nginx.com            'Host': 'localhost',
1962491Szelenkov@nginx.com            'Upgrade': 'WEBSOCKET',
1972491Szelenkov@nginx.com            'Connection': 'UPGRADE',
1982491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
1992491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2002491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
2012491Szelenkov@nginx.com        }
2022491Szelenkov@nginx.com    )
2032491Szelenkov@nginx.com    sock.close()
2041158Szelenkov@nginx.com
2052491Szelenkov@nginx.com    assert resp['status'] == 101, 'status'
2062491Szelenkov@nginx.com
2071158Szelenkov@nginx.com
2082491Szelenkov@nginx.com@pytest.mark.skip('not yet')
2092491Szelenkov@nginx.comdef test_java_websockets_handshake_connection_absent():  # FAIL
2102491Szelenkov@nginx.com    client.load('websockets_mirror')
2111158Szelenkov@nginx.com
2122491Szelenkov@nginx.com    resp = client.get(
2132491Szelenkov@nginx.com        headers={
2142491Szelenkov@nginx.com            'Host': 'localhost',
2152491Szelenkov@nginx.com            'Upgrade': 'websocket',
2162491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
2172491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2182491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
2192491Szelenkov@nginx.com        },
2202491Szelenkov@nginx.com    )
2211158Szelenkov@nginx.com
2222491Szelenkov@nginx.com    assert resp['status'] == 400, 'status'
2232491Szelenkov@nginx.com
2241158Szelenkov@nginx.com
2252491Szelenkov@nginx.comdef test_java_websockets_handshake_version_absent():
2262491Szelenkov@nginx.com    client.load('websockets_mirror')
2271158Szelenkov@nginx.com
2282491Szelenkov@nginx.com    resp = client.get(
2292491Szelenkov@nginx.com        headers={
2302491Szelenkov@nginx.com            'Host': 'localhost',
2312491Szelenkov@nginx.com            'Upgrade': 'websocket',
2322491Szelenkov@nginx.com            'Connection': 'Upgrade',
2332491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
2342491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2352491Szelenkov@nginx.com        },
2362491Szelenkov@nginx.com    )
2371158Szelenkov@nginx.com
2382491Szelenkov@nginx.com    assert resp['status'] == 426, 'status'
2392491Szelenkov@nginx.com
2401158Szelenkov@nginx.com
2412491Szelenkov@nginx.com@pytest.mark.skip('not yet')
2422491Szelenkov@nginx.comdef test_java_websockets_handshake_key_invalid():
2432491Szelenkov@nginx.com    client.load('websockets_mirror')
2441158Szelenkov@nginx.com
2452491Szelenkov@nginx.com    resp = client.get(
2462491Szelenkov@nginx.com        headers={
2472491Szelenkov@nginx.com            'Host': 'localhost',
2482491Szelenkov@nginx.com            'Upgrade': 'websocket',
2492491Szelenkov@nginx.com            'Connection': 'Upgrade',
2502491Szelenkov@nginx.com            'Sec-WebSocket-Key': '!',
2512491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2522491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
2532491Szelenkov@nginx.com        },
2542491Szelenkov@nginx.com    )
2551158Szelenkov@nginx.com
2562491Szelenkov@nginx.com    assert resp['status'] == 400, 'key length'
2571158Szelenkov@nginx.com
2582491Szelenkov@nginx.com    key = ws.key()
2592491Szelenkov@nginx.com    resp = client.get(
2602491Szelenkov@nginx.com        headers={
2612491Szelenkov@nginx.com            'Host': 'localhost',
2622491Szelenkov@nginx.com            'Upgrade': 'websocket',
2632491Szelenkov@nginx.com            'Connection': 'Upgrade',
2642491Szelenkov@nginx.com            'Sec-WebSocket-Key': [key, key],
2652491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2662491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
2672491Szelenkov@nginx.com        },
2682491Szelenkov@nginx.com    )
2691158Szelenkov@nginx.com
2702491Szelenkov@nginx.com    assert (
2712491Szelenkov@nginx.com        resp['status'] == 400
2722491Szelenkov@nginx.com    ), 'key double'  # FAIL https://tools.ietf.org/html/rfc6455#section-11.3.1
2731158Szelenkov@nginx.com
2742491Szelenkov@nginx.com
2752491Szelenkov@nginx.comdef test_java_websockets_handshake_method_invalid():
2762491Szelenkov@nginx.com    client.load('websockets_mirror')
2771158Szelenkov@nginx.com
2782491Szelenkov@nginx.com    resp = client.post(
2792491Szelenkov@nginx.com        headers={
2802491Szelenkov@nginx.com            'Host': 'localhost',
2812491Szelenkov@nginx.com            'Upgrade': 'websocket',
2822491Szelenkov@nginx.com            'Connection': 'Upgrade',
2832491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
2842491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
2852491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
2862491Szelenkov@nginx.com        },
2872491Szelenkov@nginx.com    )
2881158Szelenkov@nginx.com
2892491Szelenkov@nginx.com    assert resp['status'] == 400, 'status'
2902491Szelenkov@nginx.com
2911158Szelenkov@nginx.com
2922491Szelenkov@nginx.comdef test_java_websockets_handshake_http_10():
2932491Szelenkov@nginx.com    client.load('websockets_mirror')
2941158Szelenkov@nginx.com
2952491Szelenkov@nginx.com    resp = client.get(
2962491Szelenkov@nginx.com        headers={
2972491Szelenkov@nginx.com            'Host': 'localhost',
2982491Szelenkov@nginx.com            'Upgrade': 'websocket',
2992491Szelenkov@nginx.com            'Connection': 'Upgrade',
3002491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
3012491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
3022491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
3032491Szelenkov@nginx.com        },
3042491Szelenkov@nginx.com        http_10=True,
3052491Szelenkov@nginx.com    )
3061158Szelenkov@nginx.com
3072491Szelenkov@nginx.com    assert resp['status'] == 400, 'status'
3082491Szelenkov@nginx.com
3091158Szelenkov@nginx.com
3102491Szelenkov@nginx.comdef test_java_websockets_handshake_uri_invalid():
3112491Szelenkov@nginx.com    client.load('websockets_mirror')
3121158Szelenkov@nginx.com
3132491Szelenkov@nginx.com    resp = client.get(
3142491Szelenkov@nginx.com        headers={
3152491Szelenkov@nginx.com            'Host': 'localhost',
3162491Szelenkov@nginx.com            'Upgrade': 'websocket',
3172491Szelenkov@nginx.com            'Connection': 'Upgrade',
3182491Szelenkov@nginx.com            'Sec-WebSocket-Key': ws.key(),
3192491Szelenkov@nginx.com            'Sec-WebSocket-Protocol': 'chat',
3202491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
3212491Szelenkov@nginx.com        },
3222491Szelenkov@nginx.com        url='!',
3232491Szelenkov@nginx.com    )
3241158Szelenkov@nginx.com
3252491Szelenkov@nginx.com    assert resp['status'] == 400, 'status'
3262491Szelenkov@nginx.com
3271158Szelenkov@nginx.com
3282491Szelenkov@nginx.comdef test_java_websockets_protocol_absent():
3292491Szelenkov@nginx.com    client.load('websockets_mirror')
3301158Szelenkov@nginx.com
3312491Szelenkov@nginx.com    key = ws.key()
3322491Szelenkov@nginx.com    resp, sock, _ = ws.upgrade(
3332491Szelenkov@nginx.com        headers={
3342491Szelenkov@nginx.com            'Host': 'localhost',
3352491Szelenkov@nginx.com            'Upgrade': 'websocket',
3362491Szelenkov@nginx.com            'Connection': 'Upgrade',
3372491Szelenkov@nginx.com            'Sec-WebSocket-Key': key,
3382491Szelenkov@nginx.com            'Sec-WebSocket-Version': 13,
3392491Szelenkov@nginx.com        }
3402491Szelenkov@nginx.com    )
3412491Szelenkov@nginx.com    sock.close()
3421158Szelenkov@nginx.com
3432491Szelenkov@nginx.com    assert resp['status'] == 101, 'status'
3442491Szelenkov@nginx.com    assert resp['headers']['Upgrade'] == 'websocket', 'upgrade'
3452491Szelenkov@nginx.com    assert resp['headers']['Connection'] == 'Upgrade', 'connection'
3462491Szelenkov@nginx.com    assert resp['headers']['Sec-WebSocket-Accept'] == ws.accept(key), 'key'
3472491Szelenkov@nginx.com
3481158Szelenkov@nginx.com
3492491Szelenkov@nginx.com# autobahn-testsuite
3502491Szelenkov@nginx.com#
3512491Szelenkov@nginx.com# Some following tests fail because of Unit does not support UTF-8
3522491Szelenkov@nginx.com# validation for websocket frames.  It should be implemented
3532491Szelenkov@nginx.com# by application, if necessary.
3542491Szelenkov@nginx.com
3551158Szelenkov@nginx.com
3562491Szelenkov@nginx.comdef test_java_websockets_1_1_1__1_1_8():
3572491Szelenkov@nginx.com    client.load('websockets_mirror')
3581158Szelenkov@nginx.com
3592491Szelenkov@nginx.com    opcode = ws.OP_TEXT
3601158Szelenkov@nginx.com
3612491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
3622491Szelenkov@nginx.com
3632491Szelenkov@nginx.com    def check_length(length, chopsize=None):
3642491Szelenkov@nginx.com        payload = '*' * length
3652491Szelenkov@nginx.com
3662491Szelenkov@nginx.com        ws.frame_write(sock, opcode, payload, chopsize=chopsize)
3671158Szelenkov@nginx.com
3682491Szelenkov@nginx.com        frame = ws.message_read(sock)
3692491Szelenkov@nginx.com        check_frame(frame, True, opcode, payload)
3701158Szelenkov@nginx.com
3712491Szelenkov@nginx.com    check_length(0)  # 1_1_1
3722491Szelenkov@nginx.com    check_length(125)  # 1_1_2
3732491Szelenkov@nginx.com    check_length(126)  # 1_1_3
3742491Szelenkov@nginx.com    check_length(127)  # 1_1_4
3752491Szelenkov@nginx.com    check_length(128)  # 1_1_5
3762491Szelenkov@nginx.com    check_length(65535)  # 1_1_6
3772491Szelenkov@nginx.com    check_length(65536)  # 1_1_7
3782491Szelenkov@nginx.com    check_length(65536, chopsize=997)  # 1_1_8
3791158Szelenkov@nginx.com
3802491Szelenkov@nginx.com    close_connection(sock)
3812491Szelenkov@nginx.com
3821158Szelenkov@nginx.com
3832491Szelenkov@nginx.comdef test_java_websockets_1_2_1__1_2_8():
3842491Szelenkov@nginx.com    client.load('websockets_mirror')
3852491Szelenkov@nginx.com
3862491Szelenkov@nginx.com    opcode = ws.OP_BINARY
3872491Szelenkov@nginx.com
3882491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
3891158Szelenkov@nginx.com
3902491Szelenkov@nginx.com    def check_length(length, chopsize=None):
3912491Szelenkov@nginx.com        payload = b'\xfe' * length
3921158Szelenkov@nginx.com
3932491Szelenkov@nginx.com        ws.frame_write(sock, opcode, payload, chopsize=chopsize)
3942491Szelenkov@nginx.com
3952491Szelenkov@nginx.com        frame = ws.message_read(sock)
3962491Szelenkov@nginx.com        check_frame(frame, True, opcode, payload)
3971158Szelenkov@nginx.com
3982491Szelenkov@nginx.com    check_length(0)  # 1_2_1
3992491Szelenkov@nginx.com    check_length(125)  # 1_2_2
4002491Szelenkov@nginx.com    check_length(126)  # 1_2_3
4012491Szelenkov@nginx.com    check_length(127)  # 1_2_4
4022491Szelenkov@nginx.com    check_length(128)  # 1_2_5
4032491Szelenkov@nginx.com    check_length(65535)  # 1_2_6
4042491Szelenkov@nginx.com    check_length(65536)  # 1_2_7
4052491Szelenkov@nginx.com    check_length(65536, chopsize=997)  # 1_2_8
4061158Szelenkov@nginx.com
4072491Szelenkov@nginx.com    close_connection(sock)
4082491Szelenkov@nginx.com
4091158Szelenkov@nginx.com
4102491Szelenkov@nginx.comdef test_java_websockets_2_1__2_6():
4112491Szelenkov@nginx.com    client.load('websockets_mirror')
4122491Szelenkov@nginx.com
4132491Szelenkov@nginx.com    op_ping = ws.OP_PING
4142491Szelenkov@nginx.com    op_pong = ws.OP_PONG
4151158Szelenkov@nginx.com
4162491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
4171158Szelenkov@nginx.com
4182491Szelenkov@nginx.com    def check_ping(payload, chopsize=None, decode=True):
4192491Szelenkov@nginx.com        ws.frame_write(sock, op_ping, payload, chopsize=chopsize)
4202491Szelenkov@nginx.com        frame = ws.frame_read(sock)
4212491Szelenkov@nginx.com
4222491Szelenkov@nginx.com        check_frame(frame, True, op_pong, payload, decode=decode)
4231158Szelenkov@nginx.com
4242491Szelenkov@nginx.com    check_ping('')  # 2_1
4252491Szelenkov@nginx.com    check_ping('Hello, world!')  # 2_2
4262491Szelenkov@nginx.com    check_ping(b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff', decode=False)  # 2_3
4272491Szelenkov@nginx.com    check_ping(b'\xfe' * 125, decode=False)  # 2_4
4282491Szelenkov@nginx.com    check_ping(b'\xfe' * 125, chopsize=1, decode=False)  # 2_6
4292491Szelenkov@nginx.com
4302491Szelenkov@nginx.com    close_connection(sock)
4312491Szelenkov@nginx.com
4322491Szelenkov@nginx.com    # 2_5
4331158Szelenkov@nginx.com
4342491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
4352491Szelenkov@nginx.com
4362491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, b'\xfe' * 126)
4372491Szelenkov@nginx.com    check_close(sock, 1002)
4381158Szelenkov@nginx.com
4391158Szelenkov@nginx.com
4402491Szelenkov@nginx.comdef test_java_websockets_2_7__2_9():
4412491Szelenkov@nginx.com    client.load('websockets_mirror')
4422491Szelenkov@nginx.com
4432491Szelenkov@nginx.com    # 2_7
4441158Szelenkov@nginx.com
4452491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
4462491Szelenkov@nginx.com
4472491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PONG, '')
4482491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', '2_7'
4491158Szelenkov@nginx.com
4502491Szelenkov@nginx.com    # 2_8
4512491Szelenkov@nginx.com
4522491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PONG, 'unsolicited pong payload')
4532491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', '2_8'
4541158Szelenkov@nginx.com
4552491Szelenkov@nginx.com    # 2_9
4562491Szelenkov@nginx.com
4572491Szelenkov@nginx.com    payload = 'ping payload'
4581158Szelenkov@nginx.com
4592491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PONG, 'unsolicited pong payload')
4602491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, payload)
4611158Szelenkov@nginx.com
4622491Szelenkov@nginx.com    frame = ws.frame_read(sock)
4632491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, payload)
4642491Szelenkov@nginx.com
4652491Szelenkov@nginx.com    close_connection(sock)
4662491Szelenkov@nginx.com
4671158Szelenkov@nginx.com
4682491Szelenkov@nginx.comdef test_java_websockets_2_10__2_11():
4692491Szelenkov@nginx.com    client.load('websockets_mirror')
4702491Szelenkov@nginx.com
4712491Szelenkov@nginx.com    # 2_10
4722491Szelenkov@nginx.com
4732491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
4742491Szelenkov@nginx.com
4752491Szelenkov@nginx.com    for i in range(0, 10):
4762491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_PING, f'payload-{i}')
4772491Szelenkov@nginx.com
4782491Szelenkov@nginx.com    for i in range(0, 10):
4792491Szelenkov@nginx.com        frame = ws.frame_read(sock)
4802491Szelenkov@nginx.com        check_frame(frame, True, ws.OP_PONG, f'payload-{i}')
4812491Szelenkov@nginx.com
4822491Szelenkov@nginx.com    # 2_11
4832491Szelenkov@nginx.com
4842491Szelenkov@nginx.com    for i in range(0, 10):
4852491Szelenkov@nginx.com        opcode = ws.OP_PING
4862491Szelenkov@nginx.com        ws.frame_write(sock, opcode, f'payload-{i}', chopsize=1)
4871158Szelenkov@nginx.com
4882491Szelenkov@nginx.com    for i in range(0, 10):
4892491Szelenkov@nginx.com        frame = ws.frame_read(sock)
4902491Szelenkov@nginx.com        check_frame(frame, True, ws.OP_PONG, f'payload-{i}')
4912491Szelenkov@nginx.com
4922491Szelenkov@nginx.com    close_connection(sock)
4932491Szelenkov@nginx.com
4942491Szelenkov@nginx.com
4952491Szelenkov@nginx.com@pytest.mark.skip('not yet')
4962491Szelenkov@nginx.comdef test_java_websockets_3_1__3_7():
4972491Szelenkov@nginx.com    client.load('websockets_mirror')
4981158Szelenkov@nginx.com
4992491Szelenkov@nginx.com    payload = 'Hello, world!'
5001158Szelenkov@nginx.com
5012491Szelenkov@nginx.com    # 3_1
5021158Szelenkov@nginx.com
5032491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5041158Szelenkov@nginx.com
5052491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, rsv1=True)
5062491Szelenkov@nginx.com    check_close(sock, 1002)
5072491Szelenkov@nginx.com
5082491Szelenkov@nginx.com    # 3_2
5091158Szelenkov@nginx.com
5102491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5112491Szelenkov@nginx.com
5122491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
5132491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, rsv2=True)
5142491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
5152491Szelenkov@nginx.com
5162491Szelenkov@nginx.com    frame = ws.frame_read(sock)
5172491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
5181158Szelenkov@nginx.com
5192491Szelenkov@nginx.com    check_close(sock, 1002, no_close=True)
5202491Szelenkov@nginx.com
5212491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_2'
5222491Szelenkov@nginx.com    sock.close()
5231158Szelenkov@nginx.com
5242491Szelenkov@nginx.com    # 3_3
5251158Szelenkov@nginx.com
5262491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5272491Szelenkov@nginx.com
5282491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
5291158Szelenkov@nginx.com
5302491Szelenkov@nginx.com    frame = ws.frame_read(sock)
5312491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
5322491Szelenkov@nginx.com
5332491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, rsv1=True, rsv2=True)
5342491Szelenkov@nginx.com
5352491Szelenkov@nginx.com    check_close(sock, 1002, no_close=True)
5362491Szelenkov@nginx.com
5372491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_3'
5382491Szelenkov@nginx.com    sock.close()
5391158Szelenkov@nginx.com
5402491Szelenkov@nginx.com    # 3_4
5412491Szelenkov@nginx.com
5422491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5431158Szelenkov@nginx.com
5442491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1)
5452491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, rsv3=True, chopsize=1)
5462491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
5472491Szelenkov@nginx.com
5482491Szelenkov@nginx.com    frame = ws.frame_read(sock)
5492491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
5502491Szelenkov@nginx.com
5512491Szelenkov@nginx.com    check_close(sock, 1002, no_close=True)
5521158Szelenkov@nginx.com
5532491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty 3_4'
5542491Szelenkov@nginx.com    sock.close()
5552491Szelenkov@nginx.com
5562491Szelenkov@nginx.com    # 3_5
5572491Szelenkov@nginx.com
5582491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5591819Smax.romanov@nginx.com
5602491Szelenkov@nginx.com    ws.frame_write(
5612491Szelenkov@nginx.com        sock,
5622491Szelenkov@nginx.com        ws.OP_BINARY,
5632491Szelenkov@nginx.com        b'\x00\xff\xfe\xfd\xfc\xfb\x00\xff',
5642491Szelenkov@nginx.com        rsv1=True,
5652491Szelenkov@nginx.com        rsv3=True,
5662491Szelenkov@nginx.com    )
5671819Smax.romanov@nginx.com
5682491Szelenkov@nginx.com    check_close(sock, 1002)
5692491Szelenkov@nginx.com
5702491Szelenkov@nginx.com    # 3_6
5712491Szelenkov@nginx.com
5722491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5731819Smax.romanov@nginx.com
5742491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, payload, rsv2=True, rsv3=True)
5752491Szelenkov@nginx.com
5762491Szelenkov@nginx.com    check_close(sock, 1002)
5771158Szelenkov@nginx.com
5782491Szelenkov@nginx.com    # 3_7
5791158Szelenkov@nginx.com
5802491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5812491Szelenkov@nginx.com
5822491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload, rsv1=True, rsv2=True, rsv3=True)
5831158Szelenkov@nginx.com
5842491Szelenkov@nginx.com    check_close(sock, 1002)
5852491Szelenkov@nginx.com
5862491Szelenkov@nginx.com
5872491Szelenkov@nginx.comdef test_java_websockets_4_1_1__4_2_5():
5882491Szelenkov@nginx.com    client.load('websockets_mirror')
5891158Szelenkov@nginx.com
5902491Szelenkov@nginx.com    payload = 'Hello, world!'
5912491Szelenkov@nginx.com
5922491Szelenkov@nginx.com    # 4_1_1
5932491Szelenkov@nginx.com
5942491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
5951158Szelenkov@nginx.com
5962491Szelenkov@nginx.com    ws.frame_write(sock, 0x03, '')
5972491Szelenkov@nginx.com    check_close(sock, 1002)
5982491Szelenkov@nginx.com
5992491Szelenkov@nginx.com    # 4_1_2
6002491Szelenkov@nginx.com
6012491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6022491Szelenkov@nginx.com
6032491Szelenkov@nginx.com    ws.frame_write(sock, 0x04, 'reserved opcode payload')
6042491Szelenkov@nginx.com    check_close(sock, 1002)
6051158Szelenkov@nginx.com
6062491Szelenkov@nginx.com    # 4_1_3
6072491Szelenkov@nginx.com
6082491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6092491Szelenkov@nginx.com
6102491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
6111158Szelenkov@nginx.com
6122491Szelenkov@nginx.com    frame = ws.frame_read(sock)
6132491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
6141158Szelenkov@nginx.com
6152491Szelenkov@nginx.com    ws.frame_write(sock, 0x05, '')
6162491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
6171158Szelenkov@nginx.com
6182491Szelenkov@nginx.com    check_close(sock, 1002)
6192491Szelenkov@nginx.com
6202491Szelenkov@nginx.com    # 4_1_4
6211158Szelenkov@nginx.com
6222491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6232491Szelenkov@nginx.com
6242491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
6252491Szelenkov@nginx.com
6262491Szelenkov@nginx.com    frame = ws.frame_read(sock)
6272491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
6281158Szelenkov@nginx.com
6292491Szelenkov@nginx.com    ws.frame_write(sock, 0x06, payload)
6302491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
6312491Szelenkov@nginx.com
6322491Szelenkov@nginx.com    check_close(sock, 1002)
6331158Szelenkov@nginx.com
6342491Szelenkov@nginx.com    # 4_1_5
6351158Szelenkov@nginx.com
6362491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6372491Szelenkov@nginx.com
6382491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1)
6391158Szelenkov@nginx.com
6402491Szelenkov@nginx.com    frame = ws.frame_read(sock)
6412491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
6422491Szelenkov@nginx.com
6432491Szelenkov@nginx.com    ws.frame_write(sock, 0x07, payload, chopsize=1)
6442491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
6452491Szelenkov@nginx.com
6462491Szelenkov@nginx.com    check_close(sock, 1002)
6471158Szelenkov@nginx.com
6482491Szelenkov@nginx.com    # 4_2_1
6492491Szelenkov@nginx.com
6502491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6511158Szelenkov@nginx.com
6522491Szelenkov@nginx.com    ws.frame_write(sock, 0x0B, '')
6532491Szelenkov@nginx.com    check_close(sock, 1002)
6542491Szelenkov@nginx.com
6552491Szelenkov@nginx.com    # 4_2_2
6562491Szelenkov@nginx.com
6572491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6581158Szelenkov@nginx.com
6592491Szelenkov@nginx.com    ws.frame_write(sock, 0x0C, 'reserved opcode payload')
6602491Szelenkov@nginx.com    check_close(sock, 1002)
6611158Szelenkov@nginx.com
6622491Szelenkov@nginx.com    # 4_2_3
6632491Szelenkov@nginx.com
6642491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6652491Szelenkov@nginx.com
6662491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
6671158Szelenkov@nginx.com
6682491Szelenkov@nginx.com    frame = ws.frame_read(sock)
6692491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
6702491Szelenkov@nginx.com
6712491Szelenkov@nginx.com    ws.frame_write(sock, 0x0D, '')
6722491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
6731158Szelenkov@nginx.com
6742491Szelenkov@nginx.com    check_close(sock, 1002)
6752491Szelenkov@nginx.com
6762491Szelenkov@nginx.com    # 4_2_4
6771158Szelenkov@nginx.com
6782491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6792491Szelenkov@nginx.com
6802491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
6811158Szelenkov@nginx.com
6822491Szelenkov@nginx.com    frame = ws.frame_read(sock)
6832491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
6842491Szelenkov@nginx.com
6852491Szelenkov@nginx.com    ws.frame_write(sock, 0x0E, payload)
6862491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
6872491Szelenkov@nginx.com
6882491Szelenkov@nginx.com    check_close(sock, 1002)
6892491Szelenkov@nginx.com
6902491Szelenkov@nginx.com    # 4_2_5
6911158Szelenkov@nginx.com
6922491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
6932491Szelenkov@nginx.com
6942491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload, chopsize=1)
6951158Szelenkov@nginx.com
6962491Szelenkov@nginx.com    frame = ws.frame_read(sock)
6972491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
6982491Szelenkov@nginx.com
6992491Szelenkov@nginx.com    ws.frame_write(sock, 0x0F, payload, chopsize=1)
7002491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
7012491Szelenkov@nginx.com
7022491Szelenkov@nginx.com    check_close(sock, 1002)
7032491Szelenkov@nginx.com
7041158Szelenkov@nginx.com
7052491Szelenkov@nginx.comdef test_java_websockets_5_1__5_20():
7062491Szelenkov@nginx.com    client.load('websockets_mirror')
7072491Szelenkov@nginx.com
7082491Szelenkov@nginx.com    # 5_1
7091158Szelenkov@nginx.com
7102491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
7112491Szelenkov@nginx.com
7122491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, 'fragment1', fin=False)
7132491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7142491Szelenkov@nginx.com    check_close(sock, 1002)
7151158Szelenkov@nginx.com
7162491Szelenkov@nginx.com    # 5_2
7171158Szelenkov@nginx.com
7182491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
7191158Szelenkov@nginx.com
7202491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PONG, 'fragment1', fin=False)
7212491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7222491Szelenkov@nginx.com    check_close(sock, 1002)
7231158Szelenkov@nginx.com
7242491Szelenkov@nginx.com    # 5_3
7252491Szelenkov@nginx.com
7262491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
7271158Szelenkov@nginx.com
7282491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
7292491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7301158Szelenkov@nginx.com
7312491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7322491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
7332491Szelenkov@nginx.com
7342491Szelenkov@nginx.com    # 5_4
7351158Szelenkov@nginx.com
7362491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
7372491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', '5_4'
7382491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7391158Szelenkov@nginx.com
7402491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7412491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
7421158Szelenkov@nginx.com
7432491Szelenkov@nginx.com    # 5_5
7442491Szelenkov@nginx.com
7452491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False, chopsize=1)
7462491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True, chopsize=1)
7471158Szelenkov@nginx.com
7482491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7492491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
7502491Szelenkov@nginx.com
7512491Szelenkov@nginx.com    # 5_6
7522491Szelenkov@nginx.com
7532491Szelenkov@nginx.com    ping_payload = 'ping payload'
7541158Szelenkov@nginx.com
7552491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
7562491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, ping_payload)
7572491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7582491Szelenkov@nginx.com
7592491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7602491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, ping_payload)
7611158Szelenkov@nginx.com
7622491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7632491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
7641158Szelenkov@nginx.com
7652491Szelenkov@nginx.com    # 5_7
7661158Szelenkov@nginx.com
7672491Szelenkov@nginx.com    ping_payload = 'ping payload'
7681158Szelenkov@nginx.com
7692491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
7702491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', '5_7'
7712491Szelenkov@nginx.com
7722491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, ping_payload)
7731158Szelenkov@nginx.com
7742491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7752491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, ping_payload)
7762491Szelenkov@nginx.com
7772491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
7781158Szelenkov@nginx.com
7792491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7802491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
7812491Szelenkov@nginx.com
7822491Szelenkov@nginx.com    # 5_8
7831158Szelenkov@nginx.com
7842491Szelenkov@nginx.com    ping_payload = 'ping payload'
7851158Szelenkov@nginx.com
7862491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False, chopsize=1)
7872491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, ping_payload, chopsize=1)
7882491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True, chopsize=1)
7891158Szelenkov@nginx.com
7902491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7912491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, ping_payload)
7921158Szelenkov@nginx.com
7932491Szelenkov@nginx.com    frame = ws.frame_read(sock)
7942491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
7951158Szelenkov@nginx.com
7962491Szelenkov@nginx.com    # 5_9
7971158Szelenkov@nginx.com
7982491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=True)
7992491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True)
8002491Szelenkov@nginx.com    check_close(sock, 1002)
8012491Szelenkov@nginx.com
8022491Szelenkov@nginx.com    # 5_10
8031158Szelenkov@nginx.com
8042491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8051158Szelenkov@nginx.com
8062491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=True)
8072491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True)
8082491Szelenkov@nginx.com    check_close(sock, 1002)
8092491Szelenkov@nginx.com
8102491Szelenkov@nginx.com    # 5_11
8111158Szelenkov@nginx.com
8122491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8132491Szelenkov@nginx.com
8142491Szelenkov@nginx.com    ws.frame_write(
8152491Szelenkov@nginx.com        sock,
8162491Szelenkov@nginx.com        ws.OP_CONT,
8172491Szelenkov@nginx.com        'non-continuation payload',
8182491Szelenkov@nginx.com        fin=True,
8192491Szelenkov@nginx.com        chopsize=1,
8202491Szelenkov@nginx.com    )
8212491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1)
8222491Szelenkov@nginx.com    check_close(sock, 1002)
8232491Szelenkov@nginx.com
8242491Szelenkov@nginx.com    # 5_12
8252491Szelenkov@nginx.com
8262491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8272491Szelenkov@nginx.com
8282491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=False)
8292491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True)
8302491Szelenkov@nginx.com    check_close(sock, 1002)
8311158Szelenkov@nginx.com
8322491Szelenkov@nginx.com    # 5_13
8332491Szelenkov@nginx.com
8342491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8352491Szelenkov@nginx.com
8362491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'non-continuation payload', fin=False)
8372491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True)
8382491Szelenkov@nginx.com    check_close(sock, 1002)
8392491Szelenkov@nginx.com
8402491Szelenkov@nginx.com    # 5_14
8412491Szelenkov@nginx.com
8422491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8432491Szelenkov@nginx.com
8442491Szelenkov@nginx.com    ws.frame_write(
8452491Szelenkov@nginx.com        sock,
8462491Szelenkov@nginx.com        ws.OP_CONT,
8472491Szelenkov@nginx.com        'non-continuation payload',
8482491Szelenkov@nginx.com        fin=False,
8492491Szelenkov@nginx.com        chopsize=1,
8502491Szelenkov@nginx.com    )
8512491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'Hello, world!', fin=True, chopsize=1)
8522491Szelenkov@nginx.com    check_close(sock, 1002)
8531158Szelenkov@nginx.com
8542491Szelenkov@nginx.com    # 5_15
8552491Szelenkov@nginx.com
8562491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8571158Szelenkov@nginx.com
8582491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
8592491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=True)
8602491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False)
8612491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment4', fin=True)
8621158Szelenkov@nginx.com
8632491Szelenkov@nginx.com    frame = ws.frame_read(sock)
8642491Szelenkov@nginx.com
8652491Szelenkov@nginx.com    if frame['opcode'] == ws.OP_TEXT:
8662491Szelenkov@nginx.com        check_frame(frame, True, ws.OP_TEXT, 'fragment1fragment2')
8672491Szelenkov@nginx.com        frame = None
8681158Szelenkov@nginx.com
8692491Szelenkov@nginx.com    check_close(sock, 1002, frame=frame)
8701158Szelenkov@nginx.com
8712491Szelenkov@nginx.com    # 5_16
8722491Szelenkov@nginx.com
8732491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8741158Szelenkov@nginx.com
8752491Szelenkov@nginx.com    for _ in range(0, 2):
8762491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CONT, 'fragment1', fin=False)
8772491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_TEXT, 'fragment2', fin=False)
8782491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=True)
8792491Szelenkov@nginx.com    check_close(sock, 1002)
8801158Szelenkov@nginx.com
8812491Szelenkov@nginx.com    # 5_17
8821158Szelenkov@nginx.com
8832491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8841158Szelenkov@nginx.com
8852491Szelenkov@nginx.com    for _ in range(0, 2):
8862491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CONT, 'fragment1', fin=True)
8872491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_TEXT, 'fragment2', fin=False)
8882491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=True)
8892491Szelenkov@nginx.com    check_close(sock, 1002)
8901158Szelenkov@nginx.com
8912491Szelenkov@nginx.com    # 5_18
8922491Szelenkov@nginx.com
8932491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
8941158Szelenkov@nginx.com
8952491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
8962491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment2')
8972491Szelenkov@nginx.com    check_close(sock, 1002)
8981158Szelenkov@nginx.com
8992491Szelenkov@nginx.com    # 5_19
9002491Szelenkov@nginx.com
9012491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
9021158Szelenkov@nginx.com
9032491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
9042491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=False)
9052491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, 'pongme 1!')
9061158Szelenkov@nginx.com
9072491Szelenkov@nginx.com    time.sleep(1)
9081158Szelenkov@nginx.com
9092491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False)
9102491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment4', fin=False)
9112491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, 'pongme 2!')
9122491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment5')
9131158Szelenkov@nginx.com
9142491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9152491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, 'pongme 1!')
9161158Szelenkov@nginx.com
9172491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9182491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, 'pongme 2!')
9191158Szelenkov@nginx.com
9202491Szelenkov@nginx.com    check_frame(
9212491Szelenkov@nginx.com        ws.frame_read(sock),
9222491Szelenkov@nginx.com        True,
9232491Szelenkov@nginx.com        ws.OP_TEXT,
9242491Szelenkov@nginx.com        'fragment1fragment2fragment3fragment4fragment5',
9252491Szelenkov@nginx.com    )
9261158Szelenkov@nginx.com
9272491Szelenkov@nginx.com    # 5_20
9281158Szelenkov@nginx.com
9292491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
9302491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2', fin=False)
9312491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, 'pongme 1!')
9321158Szelenkov@nginx.com
9332491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9342491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, 'pongme 1!')
9352491Szelenkov@nginx.com
9362491Szelenkov@nginx.com    time.sleep(1)
9371158Szelenkov@nginx.com
9382491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment3', fin=False)
9392491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment4', fin=False)
9402491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, 'pongme 2!')
9412491Szelenkov@nginx.com
9422491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9432491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PONG, 'pongme 2!')
9442491Szelenkov@nginx.com
9452491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', '5_20'
9462491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment5')
9471158Szelenkov@nginx.com
9482491Szelenkov@nginx.com    check_frame(
9492491Szelenkov@nginx.com        ws.frame_read(sock),
9502491Szelenkov@nginx.com        True,
9512491Szelenkov@nginx.com        ws.OP_TEXT,
9522491Szelenkov@nginx.com        'fragment1fragment2fragment3fragment4fragment5',
9532491Szelenkov@nginx.com    )
9541158Szelenkov@nginx.com
9552491Szelenkov@nginx.com    close_connection(sock)
9561158Szelenkov@nginx.com
9571158Szelenkov@nginx.com
9582491Szelenkov@nginx.comdef test_java_websockets_6_1_1__6_4_4():
9592491Szelenkov@nginx.com    client.load('websockets_mirror')
9602491Szelenkov@nginx.com
9612491Szelenkov@nginx.com    # 6_1_1
9621158Szelenkov@nginx.com
9632491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
9642491Szelenkov@nginx.com
9652491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, '')
9662491Szelenkov@nginx.com    frame = ws.frame_read(sock, read_timeout=3)
9672491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, '')
9681158Szelenkov@nginx.com
9692491Szelenkov@nginx.com    # 6_1_2
9702491Szelenkov@nginx.com
9712491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, '', fin=False)
9722491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, '', fin=False)
9732491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, '')
9741158Szelenkov@nginx.com
9752491Szelenkov@nginx.com    frame = ws.frame_read(sock, read_timeout=3)
9762491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, '')
9771158Szelenkov@nginx.com
9782491Szelenkov@nginx.com    # 6_1_3
9791158Szelenkov@nginx.com
9802491Szelenkov@nginx.com    payload = 'middle frame payload'
9811158Szelenkov@nginx.com
9822491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, '', fin=False)
9832491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, payload, fin=False)
9842491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, '')
9851158Szelenkov@nginx.com
9862491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9872491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
9881158Szelenkov@nginx.com
9892491Szelenkov@nginx.com    # 6_2_1
9901158Szelenkov@nginx.com
9912491Szelenkov@nginx.com    payload = 'Hello-µ@ßöäüàá-UTF-8!!'
9922491Szelenkov@nginx.com
9932491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
9941158Szelenkov@nginx.com
9952491Szelenkov@nginx.com    frame = ws.frame_read(sock)
9962491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
9971158Szelenkov@nginx.com
9982491Szelenkov@nginx.com    # 6_2_2
9992491Szelenkov@nginx.com
10002491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload[:12], fin=False)
10012491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, payload[12:])
10021158Szelenkov@nginx.com
10032491Szelenkov@nginx.com    frame = ws.frame_read(sock)
10042491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
10052491Szelenkov@nginx.com
10062491Szelenkov@nginx.com    # 6_2_3
10071158Szelenkov@nginx.com
10082491Szelenkov@nginx.com    ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1)
10091158Szelenkov@nginx.com
10102491Szelenkov@nginx.com    frame = ws.frame_read(sock)
10112491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
10121158Szelenkov@nginx.com
10132491Szelenkov@nginx.com    # 6_2_4
10142491Szelenkov@nginx.com
10152491Szelenkov@nginx.com    payload = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5'
10162491Szelenkov@nginx.com
10172491Szelenkov@nginx.com    ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1)
10181158Szelenkov@nginx.com
10192491Szelenkov@nginx.com    frame = ws.frame_read(sock)
10202491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
10211158Szelenkov@nginx.com
10222491Szelenkov@nginx.com    close_connection(sock)
10232491Szelenkov@nginx.com
10241158Szelenkov@nginx.com
10252491Szelenkov@nginx.com#        Unit does not support UTF-8 validation
10262491Szelenkov@nginx.com#
10272491Szelenkov@nginx.com#        # 6_3_1 FAIL
10282491Szelenkov@nginx.com#
10292491Szelenkov@nginx.com#        payload_1 = '\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5'
10302491Szelenkov@nginx.com#        payload_2 = '\xed\xa0\x80'
10312491Szelenkov@nginx.com#        payload_3 = '\x65\x64\x69\x74\x65\x64'
10322491Szelenkov@nginx.com#
10332491Szelenkov@nginx.com#        payload = payload_1 + payload_2 + payload_3
10342491Szelenkov@nginx.com#
10352491Szelenkov@nginx.com#        ws.message(sock, ws.OP_TEXT, payload)
10362491Szelenkov@nginx.com#        check_close(sock, 1007)
10372491Szelenkov@nginx.com#
10382491Szelenkov@nginx.com#        # 6_3_2 FAIL
10392491Szelenkov@nginx.com#
10402491Szelenkov@nginx.com#        _, sock, _ = ws.upgrade()
10412491Szelenkov@nginx.com#
10422491Szelenkov@nginx.com#        ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1)
10432491Szelenkov@nginx.com#        check_close(sock, 1007)
10442491Szelenkov@nginx.com#
10452491Szelenkov@nginx.com#        # 6_4_1 ... 6_4_4 FAIL
10461158Szelenkov@nginx.com
10471158Szelenkov@nginx.com
10482491Szelenkov@nginx.comdef test_java_websockets_7_1_1__7_5_1():
10492491Szelenkov@nginx.com    client.load('websockets_mirror')
10502491Szelenkov@nginx.com
10512491Szelenkov@nginx.com    # 7_1_1
10522491Szelenkov@nginx.com
10532491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
10542491Szelenkov@nginx.com
10552491Szelenkov@nginx.com    payload = "Hello World!"
10562491Szelenkov@nginx.com
10572491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
10581158Szelenkov@nginx.com
10592491Szelenkov@nginx.com    frame = ws.frame_read(sock)
10602491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
10612491Szelenkov@nginx.com
10622491Szelenkov@nginx.com    close_connection(sock)
10631158Szelenkov@nginx.com
10642491Szelenkov@nginx.com    # 7_1_2
10652491Szelenkov@nginx.com
10662491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
10672491Szelenkov@nginx.com
10682491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
10692491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
10701158Szelenkov@nginx.com
10712491Szelenkov@nginx.com    check_close(sock)
10722491Szelenkov@nginx.com
10732491Szelenkov@nginx.com    # 7_1_3
10742491Szelenkov@nginx.com
10752491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
10762491Szelenkov@nginx.com
10772491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
10782491Szelenkov@nginx.com    check_close(sock, no_close=True)
10792491Szelenkov@nginx.com
10802491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
10812491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
10822491Szelenkov@nginx.com
10832491Szelenkov@nginx.com    sock.close()
10842491Szelenkov@nginx.com
10852491Szelenkov@nginx.com    # 7_1_4
10862491Szelenkov@nginx.com
10872491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
10882491Szelenkov@nginx.com
10892491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
10902491Szelenkov@nginx.com    check_close(sock, no_close=True)
10911158Szelenkov@nginx.com
10922491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
10932491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
10941158Szelenkov@nginx.com
10952491Szelenkov@nginx.com    sock.close()
10962491Szelenkov@nginx.com
10972491Szelenkov@nginx.com    # 7_1_5
10982491Szelenkov@nginx.com
10992491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11001158Szelenkov@nginx.com
11012491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'fragment1', fin=False)
11022491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
11032491Szelenkov@nginx.com    check_close(sock, no_close=True)
11041158Szelenkov@nginx.com
11052491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CONT, 'fragment2')
11062491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
11072491Szelenkov@nginx.com
11082491Szelenkov@nginx.com    sock.close()
11092491Szelenkov@nginx.com
11102491Szelenkov@nginx.com    # 7_1_6
11112491Szelenkov@nginx.com
11122491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11131158Szelenkov@nginx.com
11142491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, 'BAsd7&jh23' * 26 * 2**10)
11152491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_TEXT, payload)
11162491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
11171158Szelenkov@nginx.com
11182491Szelenkov@nginx.com    client.recvall(sock, read_timeout=1)
11192491Szelenkov@nginx.com
11202491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_PING, '')
11212491Szelenkov@nginx.com    assert client.recvall(sock, read_timeout=0.1) == b'', 'empty soc'
11221158Szelenkov@nginx.com
11232491Szelenkov@nginx.com    sock.close()
11242491Szelenkov@nginx.com
11252491Szelenkov@nginx.com    # 7_3_1
11261158Szelenkov@nginx.com
11272491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11281158Szelenkov@nginx.com
11292491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, '')
11302491Szelenkov@nginx.com    check_close(sock)
11312491Szelenkov@nginx.com
11322491Szelenkov@nginx.com    # 7_3_2
11331158Szelenkov@nginx.com
11342491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11351158Szelenkov@nginx.com
11362491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, 'a')
11372491Szelenkov@nginx.com    check_close(sock, 1002)
11382491Szelenkov@nginx.com
11392491Szelenkov@nginx.com    # 7_3_3
11402491Szelenkov@nginx.com
11412491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11421158Szelenkov@nginx.com
11432491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, ws.serialize_close())
11442491Szelenkov@nginx.com    check_close(sock)
11452491Szelenkov@nginx.com
11462491Szelenkov@nginx.com    # 7_3_4
11472491Szelenkov@nginx.com
11482491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11491158Szelenkov@nginx.com
11502491Szelenkov@nginx.com    payload = ws.serialize_close(reason='Hello World!')
11511158Szelenkov@nginx.com
11522491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload)
11532491Szelenkov@nginx.com    check_close(sock)
11541158Szelenkov@nginx.com
11552491Szelenkov@nginx.com    # 7_3_5
11561158Szelenkov@nginx.com
11572491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11582491Szelenkov@nginx.com
11592491Szelenkov@nginx.com    payload = ws.serialize_close(reason='*' * 123)
11601158Szelenkov@nginx.com
11612491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload)
11622491Szelenkov@nginx.com    check_close(sock)
11631158Szelenkov@nginx.com
11642491Szelenkov@nginx.com    # 7_3_6
11652491Szelenkov@nginx.com
11662491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
11672491Szelenkov@nginx.com
11682491Szelenkov@nginx.com    payload = ws.serialize_close(reason='*' * 124)
11691158Szelenkov@nginx.com
11702491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload)
11712491Szelenkov@nginx.com    check_close(sock, 1002)
11722491Szelenkov@nginx.com
11731158Szelenkov@nginx.com
11742491Szelenkov@nginx.com#        # 7_5_1 FAIL Unit does not support UTF-8 validation
11752491Szelenkov@nginx.com#
11762491Szelenkov@nginx.com#        _, sock, _ = ws.upgrade()
11772491Szelenkov@nginx.com#
11782491Szelenkov@nginx.com#        payload = ws.serialize_close(reason = '\xce\xba\xe1\xbd\xb9\xcf' \
11792491Szelenkov@nginx.com#            '\x83\xce\xbc\xce\xb5\xed\xa0\x80\x65\x64\x69\x74\x65\x64')
11802491Szelenkov@nginx.com#
11812491Szelenkov@nginx.com#        ws.frame_write(sock, ws.OP_CLOSE, payload)
11822491Szelenkov@nginx.com#        check_close(sock, 1007)
11831158Szelenkov@nginx.com
11842491Szelenkov@nginx.com
11852491Szelenkov@nginx.comdef test_java_websockets_7_7_X__7_9_X():
11862491Szelenkov@nginx.com    client.load('websockets_mirror')
11871158Szelenkov@nginx.com
11882491Szelenkov@nginx.com    valid_codes = [
11892491Szelenkov@nginx.com        1000,
11902491Szelenkov@nginx.com        1001,
11912491Szelenkov@nginx.com        1002,
11922491Szelenkov@nginx.com        1003,
11932491Szelenkov@nginx.com        1007,
11942491Szelenkov@nginx.com        1008,
11952491Szelenkov@nginx.com        1009,
11962491Szelenkov@nginx.com        1010,
11972491Szelenkov@nginx.com        1011,
11982491Szelenkov@nginx.com        3000,
11992491Szelenkov@nginx.com        3999,
12002491Szelenkov@nginx.com        4000,
12012491Szelenkov@nginx.com        4999,
12022491Szelenkov@nginx.com    ]
12031158Szelenkov@nginx.com
12042491Szelenkov@nginx.com    invalid_codes = [0, 999, 1004, 1005, 1006, 1016, 1100, 2000, 2999]
12052491Szelenkov@nginx.com
12062491Szelenkov@nginx.com    for code in valid_codes:
12072491Szelenkov@nginx.com        _, sock, _ = ws.upgrade()
12082491Szelenkov@nginx.com
12092491Szelenkov@nginx.com        payload = ws.serialize_close(code=code)
12102491Szelenkov@nginx.com
12112491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CLOSE, payload)
12122491Szelenkov@nginx.com        check_close(sock, code=code)
12131158Szelenkov@nginx.com
12142491Szelenkov@nginx.com    for code in invalid_codes:
12152491Szelenkov@nginx.com        _, sock, _ = ws.upgrade()
12162491Szelenkov@nginx.com
12172491Szelenkov@nginx.com        payload = ws.serialize_close(code=code)
12182491Szelenkov@nginx.com
12192491Szelenkov@nginx.com        ws.frame_write(sock, ws.OP_CLOSE, payload)
12202491Szelenkov@nginx.com        check_close(sock, 1002)
12212491Szelenkov@nginx.com
12222491Szelenkov@nginx.com
12232491Szelenkov@nginx.comdef test_java_websockets_7_13_1__7_13_2():
12242491Szelenkov@nginx.com    client.load('websockets_mirror')
12252491Szelenkov@nginx.com
12262491Szelenkov@nginx.com    # 7_13_1
12271158Szelenkov@nginx.com
12282491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
12292491Szelenkov@nginx.com
12302491Szelenkov@nginx.com    payload = ws.serialize_close(code=5000)
12312491Szelenkov@nginx.com
12322491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload)
12332491Szelenkov@nginx.com    check_close(sock, 1002)
12341158Szelenkov@nginx.com
12352491Szelenkov@nginx.com    # 7_13_2
12362491Szelenkov@nginx.com
12372491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
12382491Szelenkov@nginx.com
12392491Szelenkov@nginx.com    payload = struct.pack('!I', 65536) + ''.encode('utf-8')
12402491Szelenkov@nginx.com
12412491Szelenkov@nginx.com    ws.frame_write(sock, ws.OP_CLOSE, payload)
12422491Szelenkov@nginx.com    check_close(sock, 1002)
12431158Szelenkov@nginx.com
12442491Szelenkov@nginx.com
12452491Szelenkov@nginx.comdef test_java_websockets_9_1_1__9_6_6(is_unsafe, system):
12462491Szelenkov@nginx.com    if not is_unsafe:
12472491Szelenkov@nginx.com        pytest.skip('unsafe, long run')
12482491Szelenkov@nginx.com
12492491Szelenkov@nginx.com    client.load('websockets_mirror')
12502491Szelenkov@nginx.com
12512491Szelenkov@nginx.com    assert 'success' in client.conf(
12522491Szelenkov@nginx.com        {
12532491Szelenkov@nginx.com            'http': {
12542491Szelenkov@nginx.com                'websocket': {
12552491Szelenkov@nginx.com                    'max_frame_size': 33554432,
12562491Szelenkov@nginx.com                    'keepalive_interval': 0,
12572491Szelenkov@nginx.com                }
12582491Szelenkov@nginx.com            }
12592491Szelenkov@nginx.com        },
12602491Szelenkov@nginx.com        'settings',
12612491Szelenkov@nginx.com    ), 'increase max_frame_size and keepalive_interval'
12621158Szelenkov@nginx.com
12632491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
12642491Szelenkov@nginx.com
12652491Szelenkov@nginx.com    op_text = ws.OP_TEXT
12662491Szelenkov@nginx.com    op_binary = ws.OP_BINARY
12671158Szelenkov@nginx.com
12682491Szelenkov@nginx.com    def check_payload(opcode, length, chopsize=None):
12692491Szelenkov@nginx.com        if opcode == ws.OP_TEXT:
12702491Szelenkov@nginx.com            payload = '*' * length
12712491Szelenkov@nginx.com        else:
12722491Szelenkov@nginx.com            payload = b'*' * length
12732491Szelenkov@nginx.com
12742491Szelenkov@nginx.com        ws.frame_write(sock, opcode, payload, chopsize=chopsize)
12752491Szelenkov@nginx.com        frame = ws.frame_read(sock)
12762491Szelenkov@nginx.com        check_frame(frame, True, opcode, payload)
12772491Szelenkov@nginx.com
12782491Szelenkov@nginx.com    def check_message(opcode, f_size):
12792491Szelenkov@nginx.com        if opcode == ws.OP_TEXT:
12802491Szelenkov@nginx.com            payload = '*' * 4 * 2**20
12812491Szelenkov@nginx.com        else:
12822491Szelenkov@nginx.com            payload = b'*' * 4 * 2**20
12831158Szelenkov@nginx.com
12842491Szelenkov@nginx.com        ws.message(sock, opcode, payload, fragmention_size=f_size)
12852491Szelenkov@nginx.com        frame = ws.frame_read(sock, read_timeout=5)
12862491Szelenkov@nginx.com        check_frame(frame, True, opcode, payload)
12871158Szelenkov@nginx.com
12882491Szelenkov@nginx.com    check_payload(op_text, 64 * 2**10)  # 9_1_1
12892491Szelenkov@nginx.com    check_payload(op_text, 256 * 2**10)  # 9_1_2
12902491Szelenkov@nginx.com    check_payload(op_text, 2**20)  # 9_1_3
12912491Szelenkov@nginx.com    check_payload(op_text, 4 * 2**20)  # 9_1_4
12922491Szelenkov@nginx.com    check_payload(op_text, 8 * 2**20)  # 9_1_5
12932491Szelenkov@nginx.com    check_payload(op_text, 16 * 2**20)  # 9_1_6
12942491Szelenkov@nginx.com
12952491Szelenkov@nginx.com    check_payload(op_binary, 64 * 2**10)  # 9_2_1
12962491Szelenkov@nginx.com    check_payload(op_binary, 256 * 2**10)  # 9_2_2
12972491Szelenkov@nginx.com    check_payload(op_binary, 2**20)  # 9_2_3
12982491Szelenkov@nginx.com    check_payload(op_binary, 4 * 2**20)  # 9_2_4
12992491Szelenkov@nginx.com    check_payload(op_binary, 8 * 2**20)  # 9_2_5
13002491Szelenkov@nginx.com    check_payload(op_binary, 16 * 2**20)  # 9_2_6
13011158Szelenkov@nginx.com
13022491Szelenkov@nginx.com    if system not in ['Darwin', 'FreeBSD']:
13032491Szelenkov@nginx.com        check_message(op_text, 64)  # 9_3_1
13042491Szelenkov@nginx.com        check_message(op_text, 256)  # 9_3_2
13052491Szelenkov@nginx.com        check_message(op_text, 2**10)  # 9_3_3
13062491Szelenkov@nginx.com        check_message(op_text, 4 * 2**10)  # 9_3_4
13072491Szelenkov@nginx.com        check_message(op_text, 16 * 2**10)  # 9_3_5
13082491Szelenkov@nginx.com        check_message(op_text, 64 * 2**10)  # 9_3_6
13092491Szelenkov@nginx.com        check_message(op_text, 256 * 2**10)  # 9_3_7
13102491Szelenkov@nginx.com        check_message(op_text, 2**20)  # 9_3_8
13112491Szelenkov@nginx.com        check_message(op_text, 4 * 2**20)  # 9_3_9
13121158Szelenkov@nginx.com
13132491Szelenkov@nginx.com        check_message(op_binary, 64)  # 9_4_1
13142491Szelenkov@nginx.com        check_message(op_binary, 256)  # 9_4_2
13152491Szelenkov@nginx.com        check_message(op_binary, 2**10)  # 9_4_3
13162491Szelenkov@nginx.com        check_message(op_binary, 4 * 2**10)  # 9_4_4
13172491Szelenkov@nginx.com        check_message(op_binary, 16 * 2**10)  # 9_4_5
13182491Szelenkov@nginx.com        check_message(op_binary, 64 * 2**10)  # 9_4_6
13192491Szelenkov@nginx.com        check_message(op_binary, 256 * 2**10)  # 9_4_7
13202491Szelenkov@nginx.com        check_message(op_binary, 2**20)  # 9_4_8
13212491Szelenkov@nginx.com        check_message(op_binary, 4 * 2**20)  # 9_4_9
13221158Szelenkov@nginx.com
13232491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=64)  # 9_5_1
13242491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=128)  # 9_5_2
13252491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=256)  # 9_5_3
13262491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=512)  # 9_5_4
13272491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=1024)  # 9_5_5
13282491Szelenkov@nginx.com    check_payload(op_text, 2**20, chopsize=2048)  # 9_5_6
13291158Szelenkov@nginx.com
13302491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=64)  # 9_6_1
13312491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=128)  # 9_6_2
13322491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=256)  # 9_6_3
13332491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=512)  # 9_6_4
13342491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=1024)  # 9_6_5
13352491Szelenkov@nginx.com    check_payload(op_binary, 2**20, chopsize=2048)  # 9_6_6
13361158Szelenkov@nginx.com
13372491Szelenkov@nginx.com    close_connection(sock)
13381158Szelenkov@nginx.com
13392491Szelenkov@nginx.com
13402491Szelenkov@nginx.comdef test_java_websockets_10_1_1():
13412491Szelenkov@nginx.com    client.load('websockets_mirror')
13421158Szelenkov@nginx.com
13432491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
13442491Szelenkov@nginx.com
13452491Szelenkov@nginx.com    payload = '*' * 65536
13462491Szelenkov@nginx.com
13472491Szelenkov@nginx.com    ws.message(sock, ws.OP_TEXT, payload, fragmention_size=1300)
13481158Szelenkov@nginx.com
13492491Szelenkov@nginx.com    frame = ws.message_read(sock)
13502491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_TEXT, payload)
13511158Szelenkov@nginx.com
13522491Szelenkov@nginx.com    close_connection(sock)
13532491Szelenkov@nginx.com
13541158Szelenkov@nginx.com
13552491Szelenkov@nginx.com# settings
13562491Szelenkov@nginx.com
13571158Szelenkov@nginx.com
13582491Szelenkov@nginx.comdef test_java_websockets_max_frame_size():
13592491Szelenkov@nginx.com    client.load('websockets_mirror')
13602491Szelenkov@nginx.com
13612491Szelenkov@nginx.com    assert 'success' in client.conf(
13622491Szelenkov@nginx.com        {'http': {'websocket': {'max_frame_size': 100}}}, 'settings'
13632491Szelenkov@nginx.com    ), 'configure max_frame_size'
13641158Szelenkov@nginx.com
13652491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
13661158Szelenkov@nginx.com
13672491Szelenkov@nginx.com    payload = '*' * 94
13682491Szelenkov@nginx.com    opcode = ws.OP_TEXT
13692491Szelenkov@nginx.com
13702491Szelenkov@nginx.com    ws.frame_write(sock, opcode, payload)  # frame length is 100
13711158Szelenkov@nginx.com
13722491Szelenkov@nginx.com    frame = ws.frame_read(sock)
13732491Szelenkov@nginx.com    check_frame(frame, True, opcode, payload)
13741158Szelenkov@nginx.com
13752491Szelenkov@nginx.com    payload = '*' * 95
13762491Szelenkov@nginx.com
13772491Szelenkov@nginx.com    ws.frame_write(sock, opcode, payload)  # frame length is 101
13782491Szelenkov@nginx.com    check_close(sock, 1009)  # 1009 - CLOSE_TOO_LARGE
13792491Szelenkov@nginx.com
13801158Szelenkov@nginx.com
13812491Szelenkov@nginx.comdef test_java_websockets_read_timeout():
13822491Szelenkov@nginx.com    client.load('websockets_mirror')
13831158Szelenkov@nginx.com
13842491Szelenkov@nginx.com    assert 'success' in client.conf(
13852491Szelenkov@nginx.com        {'http': {'websocket': {'read_timeout': 5}}}, 'settings'
13862491Szelenkov@nginx.com    ), 'configure read_timeout'
13871158Szelenkov@nginx.com
13882491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
13892491Szelenkov@nginx.com
13902491Szelenkov@nginx.com    frame = ws.frame_to_send(ws.OP_TEXT, 'blah')
13912491Szelenkov@nginx.com    sock.sendall(frame[:2])
13921158Szelenkov@nginx.com
13932491Szelenkov@nginx.com    time.sleep(2)
13942491Szelenkov@nginx.com
13952491Szelenkov@nginx.com    check_close(sock, 1001)  # 1001 - CLOSE_GOING_AWAY
13962491Szelenkov@nginx.com
13971158Szelenkov@nginx.com
13982491Szelenkov@nginx.comdef test_java_websockets_keepalive_interval():
13992491Szelenkov@nginx.com    client.load('websockets_mirror')
14002491Szelenkov@nginx.com
14012491Szelenkov@nginx.com    assert 'success' in client.conf(
14022491Szelenkov@nginx.com        {'http': {'websocket': {'keepalive_interval': 5}}}, 'settings'
14032491Szelenkov@nginx.com    ), 'configure keepalive_interval'
14041158Szelenkov@nginx.com
14052491Szelenkov@nginx.com    _, sock, _ = ws.upgrade()
14061158Szelenkov@nginx.com
14072491Szelenkov@nginx.com    frame = ws.frame_to_send(ws.OP_TEXT, 'blah')
14082491Szelenkov@nginx.com    sock.sendall(frame[:2])
14091158Szelenkov@nginx.com
14102491Szelenkov@nginx.com    time.sleep(2)
14111158Szelenkov@nginx.com
14122491Szelenkov@nginx.com    frame = ws.frame_read(sock)
14132491Szelenkov@nginx.com    check_frame(frame, True, ws.OP_PING, '')  # PING frame
14142491Szelenkov@nginx.com
14152491Szelenkov@nginx.com    sock.close()
1416