Commit 4526f0bd00458ef446e43c581a699b37b9bc41aa

Authored by Wiebe Cazemier
1 parent c6c22b16

Add test for outgoing topic aliases

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);