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