Skip to content

Commit f1f6b34

Browse files
authored
fix: In legacy protocol allow result to be an array (#77)
1 parent beb3409 commit f1f6b34

3 files changed

Lines changed: 57 additions & 3 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
## [Unreleased](https://github.com/rdkcentral/firebolt-cpp-transport/compare/v1.1.4...main)
1+
## [1.1.5](https://github.com/rdkcentral/firebolt-cpp-transport/compare/v1.1.4...v1.1.5)
22

33
### Changed
44
- Enable websocketpp logs by default only at `Debug` log level; they can also be controlled with
55
`Config.log.transportInclude` and `Config.log.transportExclude`
66

7+
### Fixed
8+
- In legacy protocol, allow `result` to be an object or an array
9+
710
## [1.1.4](https://github.com/rdkcentral/firebolt-cpp-transport/compare/v1.1.3...v1.1.4)
811

912
### Fixed

src/gateway.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,8 +586,8 @@ class GatewayImpl : public IGateway, private IClientTransport
586586
{
587587
if (legacyRPCv1)
588588
{
589-
if (message.contains("result") && !message["result"].empty() && message["result"].is_object() &&
590-
!message["result"].contains("listening"))
589+
if (message.contains("result") && !message["result"].empty() &&
590+
(!message["result"].is_object() || !message["result"].contains("listening")))
591591
{
592592
MessageID id = message["id"];
593593
std::string eventName;

test/unit/gatewayTest.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,57 @@ TEST_F(GatewayTest, LegacyRPCv1Event)
476476
gateway.unsubscribe("test.onEvent", &eventPromise);
477477
}
478478

479+
TEST_F(GatewayTest, LegacyRPCv1Event_array)
480+
{
481+
std::promise<nlohmann::json> eventPromise;
482+
auto eventFuture = eventPromise.get_future();
483+
484+
m_messageHandler = [this](connection_hdl hdl, server::message_ptr msg)
485+
{
486+
auto request = nlohmann::json::parse(msg->get_payload());
487+
if (request["method"].get<std::string>().find(".onEvent") != std::string::npos)
488+
{
489+
nlohmann::json response;
490+
response["jsonrpc"] = "2.0";
491+
response["id"] = request["id"];
492+
response["result"]["listening"] = true;
493+
m_server.send(hdl, response.dump(), msg->get_opcode());
494+
495+
nlohmann::json legacyEvent;
496+
legacyEvent["jsonrpc"] = "2.0";
497+
legacyEvent["id"] = request["id"];
498+
legacyEvent["result"] = {{{"fired", true}}};
499+
m_server.send(hdl, legacyEvent.dump(), msg->get_opcode());
500+
}
501+
};
502+
503+
startServer();
504+
IGateway& gateway = GetGatewayInstance();
505+
auto connectionFuture = m_connectionPromise.get_future();
506+
507+
Firebolt::Config cfg = getTestConfig();
508+
cfg.legacyRPCv1 = true;
509+
Firebolt::Error connectErr = gateway.connect(cfg, [this](bool connected, const Firebolt::Error& err)
510+
{ onConnectionChange(connected, err); });
511+
ASSERT_EQ(connectErr, Firebolt::Error::None);
512+
513+
ASSERT_EQ(connectionFuture.wait_for(std::chrono::seconds(2)), std::future_status::ready);
514+
515+
auto onEvent = [](void* usercb, const nlohmann::json& params)
516+
{ static_cast<std::promise<nlohmann::json>*>(usercb)->set_value(params); };
517+
518+
Firebolt::Error err = gateway.subscribe("test.onEvent", onEvent, &eventPromise);
519+
EXPECT_EQ(err, Firebolt::Error::None);
520+
521+
auto eventStatus = eventFuture.wait_for(std::chrono::seconds(2));
522+
ASSERT_EQ(eventStatus, std::future_status::ready) << "Legacy event was not received";
523+
524+
nlohmann::json eventParams = eventFuture.get();
525+
EXPECT_TRUE(eventParams[0]["fired"].get<bool>());
526+
527+
gateway.unsubscribe("test.onEvent", &eventPromise);
528+
}
529+
479530
TEST_F(GatewayTest, UnsubscribeFromCallbackDoesNotDeadlock)
480531
{
481532
m_messageHandler = [this](connection_hdl hdl, server::message_ptr msg)

0 commit comments

Comments
 (0)