[COMMIT seastar master] websocket: update websocket test

3 views
Skip to first unread message

Commit Bot

<bot@cloudius-systems.com>
unread,
Jun 23, 2022, 8:25:53 AM6/23/22
to seastar-dev@googlegroups.com, kozakusek
From: kozakusek <bk41...@students.mimuw.edu.pl>
Committer: Piotr Sarna <sa...@scylladb.com>
Branch: master

websocket: update websocket test

The test cases now cover:
- verifying the handshake
- verifying that the registered "echo" handler
works properly by returning the input it receives
via WebSocket protocol

---
diff --git a/tests/unit/websocket_test.cc b/tests/unit/websocket_test.cc
--- a/tests/unit/websocket_test.cc
+++ b/tests/unit/websocket_test.cc
@@ -33,14 +33,27 @@ SEASTAR_TEST_CASE(test_websocket_handshake) {

websocket::server dummy;
dummy.register_handler("echo", [] (input_stream<char>& in,
- output_stream<char>& out) {
- return make_ready_future<>();
- });
+ output_stream<char>& out) {
+ return repeat([&in, &out]() {
+ return in.read().then([&out](temporary_buffer<char> f) {
+ std::cerr << "f.size(): " << f.size() << "\n";
+ if (f.empty()) {
+ return make_ready_future<stop_iteration>(stop_iteration::yes);
+ } else {
+ return out.write(std::move(f)).then([&out]() {
+ return out.flush().then([] {
+ return make_ready_future<stop_iteration>(stop_iteration::no);
+ });
+ });
+ }
+ });
+ });
+ });
websocket::connection conn(dummy, acceptor.get0().connection);
future<> serve = conn.process();
-
auto close = defer([&conn, &input, &output, &serve] () noexcept {
conn.shutdown();
+ conn.close().get();
input.close().get();
output.close().get();
serve.get();
@@ -49,7 +62,6 @@ SEASTAR_TEST_CASE(test_websocket_handshake) {
// Send the handshake
output.write(request).get();
output.flush().get();
-
// Check that the server correctly computed the response
// according to WebSocket handshake specification
http_response_parser parser;
@@ -69,3 +81,76 @@ SEASTAR_TEST_CASE(test_websocket_handshake) {
}
});
}
+
+
+
+SEASTAR_TEST_CASE(test_websocket_handler_registration) {
+ return seastar::async([] {
+ loopback_connection_factory factory;
+ loopback_socket_impl lsi(factory);
+
+ auto acceptor = factory.get_server_socket().accept();
+ auto connector = lsi.connect(socket_address(), socket_address());
+ connected_socket sock = connector.get0();
+ auto input = sock.input();
+ auto output = sock.output();
+
+ // Setup server
+ websocket::server ws;
+ ws.register_handler("echo", [] (input_stream<char>& in,
+ output_stream<char>& out) {
+ return repeat([&in, &out]() {
+ return in.read().then([&out](temporary_buffer<char> f) {
+ std::cerr << "f.size(): " << f.size() << "\n";
+ if (f.empty()) {
+ return make_ready_future<stop_iteration>(stop_iteration::yes);
+ } else {
+ return out.write(std::move(f)).then([&out]() {
+ return out.flush().then([] {
+ return make_ready_future<stop_iteration>(stop_iteration::no);
+ });
+ });
+ }
+ });
+ });
+ });
+ websocket::connection conn(ws, acceptor.get0().connection);
+ future<> serve = conn.process();
+
+ auto close = defer([&conn, &input, &output, &serve] () noexcept {
+ conn.shutdown();
+ conn.close().get();
+ input.close().get();
+ output.close().get();
+ serve.get();
+ });
+
+ // handshake
+ const std::string request =
+ "GET / HTTP/1.1\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: Upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "Sec-WebSocket-Protocol: echo\r\n"
+ "\r\n";
+ output.write(request).get();
+ output.flush().get();
+ input.read_exactly(156).get();
+
+ // Sending and receiving a websocket frame
+ const auto ws_frame = std::string(
+ "\201\204" // 1000 0001 1000 0100
+ "TEST" // Masking Key
+ "\0\0\0\0", 10); // Masked Message - TEST
+ const auto rs_frame = std::string(
+ "\201\004" // 1000 0001 0000 0100
+ "TEST", 6); // Message - TEST
+ output.write(ws_frame).get();
+ output.flush().get();
+
+ auto response = input.read_exactly(6).get();
+ auto response_str = std::string(response.begin(), response.end());
+ BOOST_REQUIRE_EQUAL(rs_frame, response_str);
+ });
+}
Reply all
Reply to author
Forward
0 new messages