From 4526f0bd00458ef446e43c581a699b37b9bc41aa Mon Sep 17 00:00:00 2001 From: Wiebe Cazemier Date: Sun, 24 Jul 2022 21:40:11 +0200 Subject: [PATCH] Add test for outgoing topic aliases --- FlashMQTests/tst_maintests.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ flashmqtestclient.cpp | 10 +++++++++- flashmqtestclient.h | 1 + 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/FlashMQTests/tst_maintests.cpp b/FlashMQTests/tst_maintests.cpp index 39c0b5d..9a9909c 100644 --- a/FlashMQTests/tst_maintests.cpp +++ b/FlashMQTests/tst_maintests.cpp @@ -129,6 +129,7 @@ private slots: void testMqtt5DelayedWillAlwaysOnSessionEnd(); void testIncomingTopicAlias(); + void testOutgoingTopicAlias(); }; @@ -1615,6 +1616,57 @@ void MainTests::testIncomingTopicAlias() QCOMPARE(pack2.getPayloadCopy(), "BBBBB"); } +void MainTests::testOutgoingTopicAlias() +{ + FlashMQTestClient receiver1; + receiver1.start(); + receiver1.connectClient(ProtocolVersion::Mqtt5, true, 300, [](Connect &connect){ + connect.propertyBuilder->writeMaxTopicAliases(10); + }); + receiver1.subscribe("don't/be/a/laywer", 0); + + FlashMQTestClient receiver2; + receiver2.start(); + receiver2.connectClient(ProtocolVersion::Mqtt5); + receiver2.subscribe("don't/be/a/laywer", 0); + + FlashMQTestClient sender; + sender.start(); + sender.connectClient(ProtocolVersion::Mqtt311); + + sender.publish("don't/be/a/laywer", "ABCDEF", 0); + sender.publish("don't/be/a/laywer", "ABCDEF", 0); + + receiver1.waitForMessageCount(2); + receiver2.waitForMessageCount(2); + + { + const MqttPacket &fullPacket = receiver1.receivedPublishes.at(0); + QCOMPARE(fullPacket.getTopic(), "don't/be/a/laywer"); + QCOMPARE(fullPacket.getPayloadCopy(), "ABCDEF"); + MYCASTCOMPARE(fullPacket.bites.size(), 31); + std::string arrayContent(fullPacket.bites.data(), fullPacket.bites.size()); + QVERIFY(strContains(arrayContent, "don't/be/a/laywer")); + } + + { + const MqttPacket &shorterPacket = receiver1.receivedPublishes.at(1); + QCOMPARE(shorterPacket.getTopic(), "don't/be/a/laywer"); + QCOMPARE(shorterPacket.getPayloadCopy(), "ABCDEF"); + MYCASTCOMPARE(shorterPacket.bites.size(), 14); + std::string arrayContent(shorterPacket.bites.data(), shorterPacket.bites.size()); + QVERIFY(!strContains(arrayContent, "don't/be/a/laywer")); + } + + MYCASTCOMPARE(receiver2.receivedPublishes.size(), 2); + + std::for_each(receiver2.receivedPublishes.begin(), receiver2.receivedPublishes.end(), [](MqttPacket &packet) { + QCOMPARE(packet.getTopic(), "don't/be/a/laywer"); + QCOMPARE(packet.getPayloadCopy(), "ABCDEF"); + MYCASTCOMPARE(packet.bites.size(), 28); // That's 3 less than the other one, because the alias id is not there. + }); +} + int main(int argc, char *argv[]) { diff --git a/flashmqtestclient.cpp b/flashmqtestclient.cpp index 3f56610..6f5b449 100644 --- a/flashmqtestclient.cpp +++ b/flashmqtestclient.cpp @@ -81,11 +81,16 @@ void FlashMQTestClient::start() void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion) { - connectClient(protocolVersion, true, 0); + connectClient(protocolVersion, true, 0, [](Connect&){}); } void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion, bool clean_start, uint32_t session_expiry_interval) { + connectClient(protocolVersion, clean_start, session_expiry_interval, [](Connect&){}); +} + +void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion, bool clean_start, uint32_t session_expiry_interval, std::function manipulateConnect) +{ int sockfd = check(socket(AF_INET, SOCK_STREAM, 0)); struct sockaddr_in servaddr; @@ -154,6 +159,9 @@ void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion, bool clea connect.clean_start = clean_start; connect.constructPropertyBuilder(); connect.propertyBuilder->writeSessionExpiry(session_expiry_interval); + + manipulateConnect(connect); + MqttPacket connectPack(connect); this->client->writeMqttPacketAndBlameThisClient(connectPack); diff --git a/flashmqtestclient.h b/flashmqtestclient.h index d5c7bfd..42778b0 100644 --- a/flashmqtestclient.h +++ b/flashmqtestclient.h @@ -35,6 +35,7 @@ public: void start(); void connectClient(ProtocolVersion protocolVersion); void connectClient(ProtocolVersion protocolVersion, bool clean_start, uint32_t session_expiry_interval); + void connectClient(ProtocolVersion protocolVersion, bool clean_start, uint32_t session_expiry_interval, std::function manipulateConnect); void subscribe(const std::string topic, char qos); void publish(const std::string &topic, const std::string &payload, char qos); void publish(Publish &pub); -- libgit2 0.21.4