1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
#!/usr/bin/env python
import pytest
from circuits import Component
from circuits.net.sockets import BUFSIZE, close, write
from circuits.web.controllers import Controller
from circuits.web.websockets import WebSocketClient, WebSocketsDispatcher
from .helpers import urlopen
class Echo(Component):
channel = 'wsserver'
def init(self):
self.clients = []
def connect(self, sock, host, port):
self.clients.append(sock)
print('WebSocket Client Connected:', host, port)
self.fire(write(sock, f'Welcome {host:s}:{port:d}'))
def disconnect(self, sock):
self.clients.remove(sock)
def read(self, sock, data):
self.fire(write(sock, 'Received: ' + data))
class Root(Controller):
def index(self):
return 'Hello World!'
class Client(Component):
channel = 'ws'
def init(self, *args, **kwargs):
self.response = None
def read(self, data):
self.response = data
@pytest.mark.parametrize('chunksize', [BUFSIZE, BUFSIZE + 1, BUFSIZE * 2])
def test(manager, watcher, webapp, chunksize):
echo = Echo().register(webapp)
assert watcher.wait('registered', channel='wsserver')
f = urlopen(webapp.server.http.base)
s = f.read()
assert s == b'Hello World!'
watcher.clear()
WebSocketsDispatcher('/websocket').register(webapp)
assert watcher.wait('registered', channel='web')
uri = f'ws://{webapp.server.host:s}:{webapp.server.port:d}/websocket'
WebSocketClient(uri).register(manager)
client = Client().register(manager)
assert watcher.wait('registered', channel='wsclient')
assert watcher.wait('connected', channel='wsclient')
assert watcher.wait('connect', channel='wsserver')
assert len(echo.clients) == 1
assert watcher.wait('read', channel='ws')
assert client.response.startswith('Welcome')
watcher.clear()
client.fire(write('Hello!'), 'ws')
assert watcher.wait('read', channel='ws')
assert client.response == 'Received: Hello!'
watcher.clear()
client.fire(write('World!'), 'ws')
assert watcher.wait('read', channel='ws')
assert client.response == 'Received: World!'
watcher.clear()
data = 'A' * (chunksize + 1)
client.fire(write(data), 'ws')
assert watcher.wait('read', channel='ws')
assert client.response == f'Received: {data}'
f = urlopen(webapp.server.http.base)
s = f.read()
assert s == b'Hello World!'
assert len(echo.clients) == 1
client.fire(close(), 'ws')
assert watcher.wait('disconnect', channel='wsserver')
assert len(echo.clients) == 0
client.unregister()
assert watcher.wait('unregistered')
|