Commit 4526f0bd00458ef446e43c581a699b37b9bc41aa
1 parent
c6c22b16
Add test for outgoing topic aliases
Showing
3 changed files
with
62 additions
and
1 deletions
FlashMQTests/tst_maintests.cpp
| @@ -129,6 +129,7 @@ private slots: | @@ -129,6 +129,7 @@ private slots: | ||
| 129 | void testMqtt5DelayedWillAlwaysOnSessionEnd(); | 129 | void testMqtt5DelayedWillAlwaysOnSessionEnd(); |
| 130 | 130 | ||
| 131 | void testIncomingTopicAlias(); | 131 | void testIncomingTopicAlias(); |
| 132 | + void testOutgoingTopicAlias(); | ||
| 132 | 133 | ||
| 133 | }; | 134 | }; |
| 134 | 135 | ||
| @@ -1615,6 +1616,57 @@ void MainTests::testIncomingTopicAlias() | @@ -1615,6 +1616,57 @@ void MainTests::testIncomingTopicAlias() | ||
| 1615 | QCOMPARE(pack2.getPayloadCopy(), "BBBBB"); | 1616 | QCOMPARE(pack2.getPayloadCopy(), "BBBBB"); |
| 1616 | } | 1617 | } |
| 1617 | 1618 | ||
| 1619 | +void MainTests::testOutgoingTopicAlias() | ||
| 1620 | +{ | ||
| 1621 | + FlashMQTestClient receiver1; | ||
| 1622 | + receiver1.start(); | ||
| 1623 | + receiver1.connectClient(ProtocolVersion::Mqtt5, true, 300, [](Connect &connect){ | ||
| 1624 | + connect.propertyBuilder->writeMaxTopicAliases(10); | ||
| 1625 | + }); | ||
| 1626 | + receiver1.subscribe("don't/be/a/laywer", 0); | ||
| 1627 | + | ||
| 1628 | + FlashMQTestClient receiver2; | ||
| 1629 | + receiver2.start(); | ||
| 1630 | + receiver2.connectClient(ProtocolVersion::Mqtt5); | ||
| 1631 | + receiver2.subscribe("don't/be/a/laywer", 0); | ||
| 1632 | + | ||
| 1633 | + FlashMQTestClient sender; | ||
| 1634 | + sender.start(); | ||
| 1635 | + sender.connectClient(ProtocolVersion::Mqtt311); | ||
| 1636 | + | ||
| 1637 | + sender.publish("don't/be/a/laywer", "ABCDEF", 0); | ||
| 1638 | + sender.publish("don't/be/a/laywer", "ABCDEF", 0); | ||
| 1639 | + | ||
| 1640 | + receiver1.waitForMessageCount(2); | ||
| 1641 | + receiver2.waitForMessageCount(2); | ||
| 1642 | + | ||
| 1643 | + { | ||
| 1644 | + const MqttPacket &fullPacket = receiver1.receivedPublishes.at(0); | ||
| 1645 | + QCOMPARE(fullPacket.getTopic(), "don't/be/a/laywer"); | ||
| 1646 | + QCOMPARE(fullPacket.getPayloadCopy(), "ABCDEF"); | ||
| 1647 | + MYCASTCOMPARE(fullPacket.bites.size(), 31); | ||
| 1648 | + std::string arrayContent(fullPacket.bites.data(), fullPacket.bites.size()); | ||
| 1649 | + QVERIFY(strContains(arrayContent, "don't/be/a/laywer")); | ||
| 1650 | + } | ||
| 1651 | + | ||
| 1652 | + { | ||
| 1653 | + const MqttPacket &shorterPacket = receiver1.receivedPublishes.at(1); | ||
| 1654 | + QCOMPARE(shorterPacket.getTopic(), "don't/be/a/laywer"); | ||
| 1655 | + QCOMPARE(shorterPacket.getPayloadCopy(), "ABCDEF"); | ||
| 1656 | + MYCASTCOMPARE(shorterPacket.bites.size(), 14); | ||
| 1657 | + std::string arrayContent(shorterPacket.bites.data(), shorterPacket.bites.size()); | ||
| 1658 | + QVERIFY(!strContains(arrayContent, "don't/be/a/laywer")); | ||
| 1659 | + } | ||
| 1660 | + | ||
| 1661 | + MYCASTCOMPARE(receiver2.receivedPublishes.size(), 2); | ||
| 1662 | + | ||
| 1663 | + std::for_each(receiver2.receivedPublishes.begin(), receiver2.receivedPublishes.end(), [](MqttPacket &packet) { | ||
| 1664 | + QCOMPARE(packet.getTopic(), "don't/be/a/laywer"); | ||
| 1665 | + QCOMPARE(packet.getPayloadCopy(), "ABCDEF"); | ||
| 1666 | + MYCASTCOMPARE(packet.bites.size(), 28); // That's 3 less than the other one, because the alias id is not there. | ||
| 1667 | + }); | ||
| 1668 | +} | ||
| 1669 | + | ||
| 1618 | 1670 | ||
| 1619 | int main(int argc, char *argv[]) | 1671 | int main(int argc, char *argv[]) |
| 1620 | { | 1672 | { |
flashmqtestclient.cpp
| @@ -81,11 +81,16 @@ void FlashMQTestClient::start() | @@ -81,11 +81,16 @@ void FlashMQTestClient::start() | ||
| 81 | 81 | ||
| 82 | void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion) | 82 | void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion) |
| 83 | { | 83 | { |
| 84 | - connectClient(protocolVersion, true, 0); | 84 | + connectClient(protocolVersion, true, 0, [](Connect&){}); |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion, bool clean_start, uint32_t session_expiry_interval) | 87 | void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion, bool clean_start, uint32_t session_expiry_interval) |
| 88 | { | 88 | { |
| 89 | + connectClient(protocolVersion, clean_start, session_expiry_interval, [](Connect&){}); | ||
| 90 | +} | ||
| 91 | + | ||
| 92 | +void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion, bool clean_start, uint32_t session_expiry_interval, std::function<void(Connect&)> manipulateConnect) | ||
| 93 | +{ | ||
| 89 | int sockfd = check<std::runtime_error>(socket(AF_INET, SOCK_STREAM, 0)); | 94 | int sockfd = check<std::runtime_error>(socket(AF_INET, SOCK_STREAM, 0)); |
| 90 | 95 | ||
| 91 | struct sockaddr_in servaddr; | 96 | struct sockaddr_in servaddr; |
| @@ -154,6 +159,9 @@ void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion, bool clea | @@ -154,6 +159,9 @@ void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion, bool clea | ||
| 154 | connect.clean_start = clean_start; | 159 | connect.clean_start = clean_start; |
| 155 | connect.constructPropertyBuilder(); | 160 | connect.constructPropertyBuilder(); |
| 156 | connect.propertyBuilder->writeSessionExpiry(session_expiry_interval); | 161 | connect.propertyBuilder->writeSessionExpiry(session_expiry_interval); |
| 162 | + | ||
| 163 | + manipulateConnect(connect); | ||
| 164 | + | ||
| 157 | MqttPacket connectPack(connect); | 165 | MqttPacket connectPack(connect); |
| 158 | this->client->writeMqttPacketAndBlameThisClient(connectPack); | 166 | this->client->writeMqttPacketAndBlameThisClient(connectPack); |
| 159 | 167 |
flashmqtestclient.h
| @@ -35,6 +35,7 @@ public: | @@ -35,6 +35,7 @@ public: | ||
| 35 | void start(); | 35 | void start(); |
| 36 | void connectClient(ProtocolVersion protocolVersion); | 36 | void connectClient(ProtocolVersion protocolVersion); |
| 37 | void connectClient(ProtocolVersion protocolVersion, bool clean_start, uint32_t session_expiry_interval); | 37 | void connectClient(ProtocolVersion protocolVersion, bool clean_start, uint32_t session_expiry_interval); |
| 38 | + void connectClient(ProtocolVersion protocolVersion, bool clean_start, uint32_t session_expiry_interval, std::function<void(Connect&)> manipulateConnect); | ||
| 38 | void subscribe(const std::string topic, char qos); | 39 | void subscribe(const std::string topic, char qos); |
| 39 | void publish(const std::string &topic, const std::string &payload, char qos); | 40 | void publish(const std::string &topic, const std::string &payload, char qos); |
| 40 | void publish(Publish &pub); | 41 | void publish(Publish &pub); |