69 lines
3.0 KiB
Python
69 lines
3.0 KiB
Python
"""Verify a deployed server with two isolated clients: python smoke_commands.py --url wss://host/ws."""
|
|
import argparse
|
|
import json
|
|
import ssl
|
|
import time
|
|
|
|
import certifi
|
|
from websockets.sync.client import connect
|
|
|
|
|
|
def verify_commands(url):
|
|
options = {'ssl': ssl.create_default_context(cafile=certifi.where())} if url.startswith('wss:') else {}
|
|
|
|
def send(ws, **message):
|
|
ws.send(json.dumps(message))
|
|
|
|
def receive(ws, kind):
|
|
deadline = time.monotonic() + 8
|
|
while True:
|
|
message = json.loads(ws.recv(timeout=max(.01, deadline - time.monotonic())))
|
|
if message['type'] in ('error', 'reaction_error'):
|
|
raise RuntimeError(message.get('message'))
|
|
if message['type'] == kind:
|
|
return message
|
|
|
|
with connect(url, **options) as host, connect(url, **options) as guest:
|
|
file_info = {'name': 'command-smoke-test.mkv', 'size': 1234, 'duration': 60}
|
|
send(host, type='create_room', username='CommandSmokeHost', fileInfo=file_info)
|
|
code = receive(host, 'room_created')['code']
|
|
send(guest, type='join_room', username='CommandSmokeGuest', code=code)
|
|
receive(guest, 'room_file_check')
|
|
send(guest, type='confirm_join', fileInfo=file_info)
|
|
receive(guest, 'room_joined')
|
|
receive(host, 'user_joined')
|
|
send(host, type='ready_check', action='begin')
|
|
check = receive(host, 'ready_check')
|
|
assert check['active'] and receive(guest, 'ready_check')['id'] == check['id']
|
|
for ws in (host, guest):
|
|
send(ws, type='ready_check', action='vote', id=check['id'], ready=True)
|
|
for peer in (host, guest):
|
|
receive(peer, 'ready_check')
|
|
send(host, type='ready_check', action='start', id=check['id'])
|
|
for peer in (host, guest):
|
|
assert receive(peer, 'sync')['action'] == 'play'
|
|
assert not receive(peer, 'ready_check')['active']
|
|
print('PASS /ready: shared panel state, votes, synchronized start', flush=True)
|
|
for i, kind in enumerate(('ko', 'bell', 'tap', 'robbery')):
|
|
if i:
|
|
time.sleep(3.2)
|
|
send(host, type='reaction', kind=kind)
|
|
for peer in (host, guest):
|
|
assert receive(peer, 'reaction')['kind'] == kind
|
|
assert receive(peer, 'chat')['message'] == '🥊 /' + kind
|
|
print(f'PASS /{kind}: delivered to both clients', flush=True)
|
|
poll = receive(host, 'fight_poll')
|
|
assert receive(guest, 'fight_poll')['id'] == poll['id']
|
|
send(guest, type='fight_poll_vote', id=poll['id'], choice='yes')
|
|
for peer in (host, guest):
|
|
assert receive(peer, 'fight_poll')['votes']['CommandSmokeGuest'] == 'yes'
|
|
send(host, type='request_state')
|
|
assert receive(host, 'state')['state']['playing']
|
|
print('PASS /robbery vote and uninterrupted playback', flush=True)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--url', required=True)
|
|
verify_commands(parser.parse_args().url)
|