Roxen.git
/
server
/
etc
/
test
/
tests
/
http
/
RoxenTest_websockets_2.pike
version
»
Context lines:
10
20
40
80
file
none
3
Roxen.git/server/etc/test/tests/http/RoxenTest_websockets_2.pike:1:
+
inherit "../pike_test_common";
-
+
class Connection {
+
inherit Protocols.WebSocket.Connection;
+
+
Concurrent.Promise p;
+
array(string) tosend = ({});
+
array received = ({});
+
+
void send_next()
+
{
+
if (sizeof(tosend)) {
+
send_text(tosend[0]);
+
tosend = tosend[1..];
+
return;
+
}
+
close();
+
}
+
+
void got_open(mixed id)
+
{
+
received += ({ -1 });
+
send_next();
+
}
+
+
void got_close(int reason, mixed id)
+
{
+
received += ({ reason });
+
p->success(received);
+
}
+
+
void got_message(Protocols.WebSocket.Frame frame, mixed id)
+
{
+
if (frame->opcode == Protocols.WebSocket.FRAME_TEXT) {
+
received += ({ frame->text });
+
send_next();
+
}
+
}
+
+
protected void create(Concurrent.Promise p)
+
{
+
this::p = p;
+
onclose = got_close;
+
onopen = got_open;
+
onmessage = got_message;
+
+
::create();
+
}
+
}
+
+
void run_tests(Configuration c)
+
{
+
foreach(c->query("URLs"), string url) {
+
if (!has_prefix(url, "http://") && !has_prefix(url, "https://")) {
+
continue;
+
}
+
url = (url/"#")[0];
+
+
Standards.URI uri = Standards.URI("websocket_example/", url);
+
if (uri->host == "*") uri->host = "127.0.0.1";
+
+
Concurrent.Promise p = Concurrent.Promise();
+
Connection ws = Connection(p);
+
+
array expect = ({ -1 });
+
for (int i = 0; i < 5; i++) {
+
ws->tosend += ({ sprintf("%d %d", 17, i+1) });
+
expect += ({ sprintf("%d %d", i+1, 17) });
+
}
+
expect += ({ Protocols.WebSocket.CLOSE_NORMAL });
+
if (test_true(ws->connect, uri)) {
+
test_equal(expect, p->future()->get);
+
}
+
+
p = Concurrent.Promise();
+
ws = Connection(p);
+
+
expect = ({ -1 });
+
for (int i = 0; i < 5; i++) {
+
ws->tosend += ({ sprintf("%d %d", 18, i+1) });
+
expect += ({ sprintf("%d %d", i+1, 18) });
+
}
+
// Sending a message with the wrong id should trigger
+
// a remote close.
+
ws->tosend += ({ sprintf("%d %d", 19, 7) });
+
expect += ({ Protocols.WebSocket.CLOSE_NORMAL });
+
// NB: The following two should not generate any messages
+
// (or even be sent).
+
ws->tosend += ({ sprintf("%d %d", 18, 8) });
+
ws->tosend += ({ sprintf("%d %d", 18, 9) });
+
array expected_trailers = ws->tosend[sizeof(ws->tosend)-2..];
+
if (test_true(ws->connect, uri)) {
+
test_equal(expect, p->future()->get);
+
test_equal(expected_trailers, `->, ws, "tosend");
+
}
+
}
+
}
Newline at end of file added.