mirror of
https://github.com/CrowCpp/Crow.git
synced 2024-06-07 21:10:44 +00:00
added websocket unit test
This commit is contained in:
parent
5c7ef21211
commit
76af416766
@ -1371,3 +1371,137 @@ TEST_CASE("stream_response")
|
|||||||
});
|
});
|
||||||
runTest.join();
|
runTest.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("websocket")
|
||||||
|
{
|
||||||
|
static std::string http_message = "GET /ws HTTP/1.1\r\nConnection: keep-alive, Upgrade\r\nupgrade: websocket\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\nSec-WebSocket-Version: 13\r\n\r\n";
|
||||||
|
|
||||||
|
static bool connected{false};
|
||||||
|
|
||||||
|
SimpleApp app;
|
||||||
|
|
||||||
|
CROW_ROUTE(app, "/ws").websocket()
|
||||||
|
.onopen([&](websocket::connection&){
|
||||||
|
connected = true;
|
||||||
|
CROW_LOG_INFO << "Connected websocket and value is " << connected;
|
||||||
|
})
|
||||||
|
.onmessage([&](websocket::connection& conn, const std::string& message, bool isbin){
|
||||||
|
CROW_LOG_INFO << "Message is \"" << message << '\"';
|
||||||
|
if (!isbin && message == "PINGME")
|
||||||
|
conn.send_ping("");
|
||||||
|
else if (!isbin && message == "Hello")
|
||||||
|
conn.send_text("Hello back");
|
||||||
|
else if (isbin && message == "Hello bin")
|
||||||
|
conn.send_binary("Hello back bin");
|
||||||
|
})
|
||||||
|
.onclose([&](websocket::connection&, const std::string&){
|
||||||
|
CROW_LOG_INFO << "Closing websocket";
|
||||||
|
});
|
||||||
|
|
||||||
|
app.validate();
|
||||||
|
|
||||||
|
auto _ = async(launch::async,
|
||||||
|
[&] { app.bindaddr(LOCALHOST_ADDRESS).port(45451).run(); });
|
||||||
|
app.wait_for_server_start();
|
||||||
|
asio::io_service is;
|
||||||
|
|
||||||
|
asio::ip::tcp::socket c(is);
|
||||||
|
c.connect(asio::ip::tcp::endpoint(
|
||||||
|
asio::ip::address::from_string(LOCALHOST_ADDRESS), 45451));
|
||||||
|
|
||||||
|
|
||||||
|
char buf[2048];
|
||||||
|
|
||||||
|
//----------Handshake----------
|
||||||
|
{
|
||||||
|
std::fill_n (buf, 2048, 0);
|
||||||
|
c.send(asio::buffer(http_message));
|
||||||
|
|
||||||
|
c.receive(asio::buffer(buf, 2048));
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
|
CHECK(connected);
|
||||||
|
}
|
||||||
|
//----------Pong----------
|
||||||
|
{
|
||||||
|
std::fill_n (buf, 2048, 0);
|
||||||
|
char ping_message[2]("\x89");
|
||||||
|
|
||||||
|
c.send(asio::buffer(ping_message, 2));
|
||||||
|
c.receive(asio::buffer(buf, 2048));
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
|
CHECK((int)(unsigned char)buf[0] == 0x8A);
|
||||||
|
}
|
||||||
|
//----------Ping----------
|
||||||
|
{
|
||||||
|
std::fill_n (buf, 2048, 0);
|
||||||
|
char not_ping_message[2+6+1]("\x81\x06"
|
||||||
|
"PINGME");
|
||||||
|
|
||||||
|
c.send(asio::buffer(not_ping_message, 8));
|
||||||
|
c.receive(asio::buffer(buf, 2048));
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
|
CHECK((int)(unsigned char)buf[0] == 0x89);
|
||||||
|
}
|
||||||
|
//----------Text----------
|
||||||
|
{
|
||||||
|
std::fill_n (buf, 2048, 0);
|
||||||
|
char text_message[2+5+1]("\x81\x05"
|
||||||
|
"Hello");
|
||||||
|
|
||||||
|
c.send(asio::buffer(text_message, 7));
|
||||||
|
c.receive(asio::buffer(buf, 2048));
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
|
std::string checkstring(std::string(buf).substr(0, 12));
|
||||||
|
CHECK(checkstring == "\x81\x0AHello back");
|
||||||
|
}
|
||||||
|
//----------Binary----------
|
||||||
|
{
|
||||||
|
std::fill_n (buf, 2048, 0);
|
||||||
|
char bin_message[2+9+1]("\x82\x09"
|
||||||
|
"Hello bin");
|
||||||
|
|
||||||
|
c.send(asio::buffer(bin_message, 11));
|
||||||
|
c.receive(asio::buffer(buf, 2048));
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
|
std::string checkstring2(std::string(buf).substr(0, 16));
|
||||||
|
CHECK(checkstring2 == "\x82\x0EHello back bin");
|
||||||
|
}
|
||||||
|
//----------Masked Text----------
|
||||||
|
{
|
||||||
|
std::fill_n (buf, 2048, 0);
|
||||||
|
char text_masked_message[2+4+5+1]("\x81\x85"
|
||||||
|
"\x67\xc6\x69\x73"
|
||||||
|
"\x2f\xa3\x05\x1f\x08");
|
||||||
|
|
||||||
|
c.send(asio::buffer(text_masked_message, 11));
|
||||||
|
c.receive(asio::buffer(buf, 2048));
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
|
std::string checkstring3(std::string(buf).substr(0, 12));
|
||||||
|
CHECK(checkstring3 == "\x81\x0AHello back");
|
||||||
|
}
|
||||||
|
//----------Masked Binary----------
|
||||||
|
{
|
||||||
|
std::fill_n (buf, 2048, 0);
|
||||||
|
char bin_masked_message[2+4+9+1]("\x82\x89"
|
||||||
|
"\x67\xc6\x69\x73"
|
||||||
|
"\x2f\xa3\x05\x1f\x08\xe6\x0b\x1a\x09");
|
||||||
|
|
||||||
|
c.send(asio::buffer(bin_masked_message, 15));
|
||||||
|
c.receive(asio::buffer(buf, 2048));
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
|
std::string checkstring4(std::string(buf).substr(0, 16));
|
||||||
|
CHECK(checkstring4 == "\x82\x0EHello back bin");
|
||||||
|
}
|
||||||
|
//----------Close----------
|
||||||
|
{
|
||||||
|
std::fill_n (buf, 2048, 0);
|
||||||
|
char close_message[10]("\x88"); //I do not know why, but the websocket code does not read this unless it's longer than 4 or so bytes
|
||||||
|
|
||||||
|
c.send(asio::buffer(close_message, 10));
|
||||||
|
c.receive(asio::buffer(buf, 2048));
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
|
CHECK((int)(unsigned char)buf[0] == 0x88);
|
||||||
|
}
|
||||||
|
|
||||||
|
app.stop();
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user