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