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 | 129 | void testMqtt5DelayedWillAlwaysOnSessionEnd(); |
| 130 | 130 | |
| 131 | 131 | void testIncomingTopicAlias(); |
| 132 | + void testOutgoingTopicAlias(); | |
| 132 | 133 | |
| 133 | 134 | }; |
| 134 | 135 | |
| ... | ... | @@ -1615,6 +1616,57 @@ void MainTests::testIncomingTopicAlias() |
| 1615 | 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 | 1671 | int main(int argc, char *argv[]) |
| 1620 | 1672 | { | ... | ... |
flashmqtestclient.cpp
| ... | ... | @@ -81,11 +81,16 @@ void FlashMQTestClient::start() |
| 81 | 81 | |
| 82 | 82 | void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion) |
| 83 | 83 | { |
| 84 | - connectClient(protocolVersion, true, 0); | |
| 84 | + connectClient(protocolVersion, true, 0, [](Connect&){}); | |
| 85 | 85 | } |
| 86 | 86 | |
| 87 | 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 | 94 | int sockfd = check<std::runtime_error>(socket(AF_INET, SOCK_STREAM, 0)); |
| 90 | 95 | |
| 91 | 96 | struct sockaddr_in servaddr; |
| ... | ... | @@ -154,6 +159,9 @@ void FlashMQTestClient::connectClient(ProtocolVersion protocolVersion, bool clea |
| 154 | 159 | connect.clean_start = clean_start; |
| 155 | 160 | connect.constructPropertyBuilder(); |
| 156 | 161 | connect.propertyBuilder->writeSessionExpiry(session_expiry_interval); |
| 162 | + | |
| 163 | + manipulateConnect(connect); | |
| 164 | + | |
| 157 | 165 | MqttPacket connectPack(connect); |
| 158 | 166 | this->client->writeMqttPacketAndBlameThisClient(connectPack); |
| 159 | 167 | ... | ... |
flashmqtestclient.h
| ... | ... | @@ -35,6 +35,7 @@ public: |
| 35 | 35 | void start(); |
| 36 | 36 | void connectClient(ProtocolVersion protocolVersion); |
| 37 | 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 | 39 | void subscribe(const std::string topic, char qos); |
| 39 | 40 | void publish(const std::string &topic, const std::string &payload, char qos); |
| 40 | 41 | void publish(Publish &pub); | ... | ... |