feat(WebSocket): add open event (#6315)
This commit is contained in:
@@ -645,12 +645,19 @@ TEST_F(PluginTest, testTcpWebSocket)
|
||||
|
||||
RequestWaiter waiter;
|
||||
std::vector<std::pair<bool, QByteArray>> messages;
|
||||
bool open = false;
|
||||
lua->set("done", [&] {
|
||||
waiter.requestDone();
|
||||
});
|
||||
lua->set("add", [&](bool isText, QByteArray data) {
|
||||
EXPECT_TRUE(open);
|
||||
messages.emplace_back(isText, std::move(data));
|
||||
});
|
||||
// On GCC in release mode, using set() would cause the done function to be called instead.
|
||||
lua->set_function("open", [&] {
|
||||
EXPECT_FALSE(open);
|
||||
open = true;
|
||||
});
|
||||
|
||||
std::shared_ptr<lua::api::WebSocket> ws = lua->script(R"lua(
|
||||
local ws = c2.WebSocket.new("ws://127.0.0.1:9052/echo")
|
||||
@@ -671,6 +678,9 @@ TEST_F(PluginTest, testTcpWebSocket)
|
||||
ws.on_close = function()
|
||||
done()
|
||||
end
|
||||
ws.on_open = function()
|
||||
open()
|
||||
end
|
||||
ws:send_text("message1")
|
||||
ws:send_text("message2")
|
||||
ws:send_text("message3")
|
||||
@@ -682,6 +692,7 @@ TEST_F(PluginTest, testTcpWebSocket)
|
||||
ws.reset();
|
||||
|
||||
waiter.waitForRequest();
|
||||
ASSERT_TRUE(open);
|
||||
|
||||
ASSERT_EQ(messages.size(), 7);
|
||||
ASSERT_EQ(messages[0].first, true);
|
||||
@@ -709,13 +720,20 @@ TEST_F(PluginTest, testTlsWebSocket)
|
||||
configure({PluginPermission{{{"type", "Network"}}}});
|
||||
|
||||
RequestWaiter waiter;
|
||||
bool open = false;
|
||||
std::vector<std::pair<bool, QByteArray>> messages;
|
||||
lua->set("done", [&] {
|
||||
waiter.requestDone();
|
||||
});
|
||||
lua->set("add", [&](bool isText, QByteArray data) {
|
||||
EXPECT_TRUE(open);
|
||||
messages.emplace_back(isText, std::move(data));
|
||||
});
|
||||
// On GCC in release mode, using set() would cause the done function to be called instead.
|
||||
lua->set_function("open", [&] {
|
||||
EXPECT_FALSE(open);
|
||||
open = true;
|
||||
});
|
||||
|
||||
std::shared_ptr<lua::api::WebSocket> ws = lua->script(R"lua(
|
||||
local ws = c2.WebSocket.new("wss://127.0.0.1:9050/echo", {
|
||||
@@ -744,6 +762,9 @@ TEST_F(PluginTest, testTlsWebSocket)
|
||||
ws.on_close = function()
|
||||
done()
|
||||
end
|
||||
ws.on_open = function()
|
||||
open()
|
||||
end
|
||||
ws:send_text("message1")
|
||||
ws:send_text("message2")
|
||||
ws:send_text("message3")
|
||||
@@ -755,6 +776,7 @@ TEST_F(PluginTest, testTlsWebSocket)
|
||||
ws.reset();
|
||||
|
||||
waiter.waitForRequest();
|
||||
ASSERT_TRUE(open);
|
||||
|
||||
ASSERT_EQ(messages.size(), 9);
|
||||
ASSERT_EQ(messages[0].first, true);
|
||||
|
||||
@@ -11,10 +11,11 @@ namespace {
|
||||
|
||||
struct Listener : public WebSocketListener {
|
||||
Listener(std::vector<std::pair<bool, QByteArray>> &messages,
|
||||
OnceFlag &messageFlag, OnceFlag &closeFlag)
|
||||
OnceFlag &messageFlag, OnceFlag &closeFlag, OnceFlag &openFlag)
|
||||
: messages(messages)
|
||||
, messageFlag(messageFlag)
|
||||
, closeFlag(closeFlag)
|
||||
, openFlag(openFlag)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -35,9 +36,15 @@ struct Listener : public WebSocketListener {
|
||||
messages.emplace_back(false, std::move(data));
|
||||
}
|
||||
|
||||
void onOpen() override
|
||||
{
|
||||
this->openFlag.set();
|
||||
}
|
||||
|
||||
std::vector<std::pair<bool, QByteArray>> &messages;
|
||||
OnceFlag &messageFlag;
|
||||
OnceFlag &closeFlag;
|
||||
OnceFlag &openFlag;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
@@ -50,6 +57,7 @@ TEST(WebSocketPool, tcpEcho)
|
||||
std::vector<std::pair<bool, QByteArray>> messages;
|
||||
OnceFlag messageFlag;
|
||||
OnceFlag closeFlag;
|
||||
OnceFlag openFlag;
|
||||
|
||||
auto handle = pool.createSocket(
|
||||
{
|
||||
@@ -62,13 +70,14 @@ TEST(WebSocketPool, tcpEcho)
|
||||
{"User-Agent", "MyUserAgent"},
|
||||
},
|
||||
},
|
||||
std::make_unique<Listener>(messages, messageFlag, closeFlag));
|
||||
std::make_unique<Listener>(messages, messageFlag, closeFlag, openFlag));
|
||||
handle.sendBinary("message1");
|
||||
handle.sendBinary("message2");
|
||||
handle.sendBinary("message3");
|
||||
handle.sendText("message4");
|
||||
|
||||
ASSERT_TRUE(messageFlag.waitFor(1s));
|
||||
ASSERT_TRUE(openFlag.isSet());
|
||||
QByteArray bigMsg(1 << 15, 'A');
|
||||
handle.sendBinary(bigMsg);
|
||||
handle.sendText("foo");
|
||||
@@ -111,6 +120,7 @@ TEST(WebSocketPool, tlsEcho)
|
||||
std::vector<std::pair<bool, QByteArray>> messages;
|
||||
OnceFlag messageFlag;
|
||||
OnceFlag closeFlag;
|
||||
OnceFlag openFlag;
|
||||
|
||||
auto handle = pool.createSocket(
|
||||
{
|
||||
@@ -121,13 +131,14 @@ TEST(WebSocketPool, tlsEcho)
|
||||
{"Cookie", "xd"}, // "known" header
|
||||
},
|
||||
},
|
||||
std::make_unique<Listener>(messages, messageFlag, closeFlag));
|
||||
std::make_unique<Listener>(messages, messageFlag, closeFlag, openFlag));
|
||||
handle.sendBinary("message1");
|
||||
handle.sendBinary("message2");
|
||||
handle.sendBinary("message3");
|
||||
handle.sendText("message4");
|
||||
|
||||
ASSERT_TRUE(messageFlag.waitFor(1s));
|
||||
ASSERT_TRUE(openFlag.isSet());
|
||||
QByteArray bigMsg(1 << 15, 'A');
|
||||
handle.sendBinary(bigMsg);
|
||||
handle.sendText("foo");
|
||||
|
||||
Reference in New Issue
Block a user