diff --git a/FlashMQTests/tst_maintests.cpp b/FlashMQTests/tst_maintests.cpp index 826ab2f..55c0fdf 100644 --- a/FlashMQTests/tst_maintests.cpp +++ b/FlashMQTests/tst_maintests.cpp @@ -1296,63 +1296,67 @@ void MainTests::testDowngradeQoSOnSubscribeQos0to0() */ void MainTests::testNotMessingUpQosLevels() { - const QString topic = "HK7c1MFu6kdT69fWY"; - const QByteArray payload = "M4XK2LZ2Smaazba8RobZOgoe6CENxCll"; - - TwoClientTestContext testContextSender; - TwoClientTestContext testContextReceiver1(1); - TwoClientTestContext testContextReceiver2(2); - TwoClientTestContext testContextReceiver3(3); - TwoClientTestContext testContextReceiver4(4); - TwoClientTestContext testContextReceiver5(5); - - testContextReceiver1.connectReceiver(); - testContextReceiver1.subscribeReceiver(topic, 0); - - testContextReceiver2.connectReceiver(); - testContextReceiver2.subscribeReceiver(topic, 1); - - testContextReceiver3.connectReceiver(); - testContextReceiver3.subscribeReceiver(topic, 2); - - testContextReceiver4.connectReceiver(); - testContextReceiver4.subscribeReceiver(topic, 1); - - testContextReceiver5.connectReceiver(); - testContextReceiver5.subscribeReceiver(topic, 0); - - testContextSender.connectSender(); - testContextSender.publish(topic, payload, 2, false); - - testContextReceiver1.waitReceiverReceived(1); - testContextReceiver2.waitReceiverReceived(1); - testContextReceiver3.waitReceiverReceived(1); - testContextReceiver4.waitReceiverReceived(1); - testContextReceiver5.waitReceiverReceived(1); - - QCOMPARE(testContextReceiver1.receivedMessages.count(), 1); - QCOMPARE(testContextReceiver2.receivedMessages.count(), 1); - QCOMPARE(testContextReceiver3.receivedMessages.count(), 1); - QCOMPARE(testContextReceiver4.receivedMessages.count(), 1); - QCOMPARE(testContextReceiver5.receivedMessages.count(), 1); - - QCOMPARE(testContextReceiver1.receivedMessages.first().qos(), 0); - QCOMPARE(testContextReceiver2.receivedMessages.first().qos(), 1); - QCOMPARE(testContextReceiver3.receivedMessages.first().qos(), 2); - QCOMPARE(testContextReceiver4.receivedMessages.first().qos(), 1); - QCOMPARE(testContextReceiver5.receivedMessages.first().qos(), 0); - - QCOMPARE(testContextReceiver1.receivedMessages.first().payload(), payload); - QCOMPARE(testContextReceiver2.receivedMessages.first().payload(), payload); - QCOMPARE(testContextReceiver3.receivedMessages.first().payload(), payload); - QCOMPARE(testContextReceiver4.receivedMessages.first().payload(), payload); - QCOMPARE(testContextReceiver5.receivedMessages.first().payload(), payload); - - QCOMPARE(testContextReceiver1.receivedMessages.first().id(), 0); - QCOMPARE(testContextReceiver2.receivedMessages.first().id(), 1); - QCOMPARE(testContextReceiver3.receivedMessages.first().id(), 1); - QCOMPARE(testContextReceiver4.receivedMessages.first().id(), 1); - QCOMPARE(testContextReceiver5.receivedMessages.first().id(), 0); + const std::string topic = "HK7c1MFu6kdT69fWY"; + const std::string payload = "M4XK2LZ2Smaazba8RobZOgoe6CENxCll"; + + FlashMQTestClient testContextSender; + FlashMQTestClient testContextReceiver1; + FlashMQTestClient testContextReceiver2; + FlashMQTestClient testContextReceiver3; + FlashMQTestClient testContextReceiver4; + FlashMQTestClient testContextReceiver5; + + testContextReceiver1.start(); + testContextReceiver1.connectClient(ProtocolVersion::Mqtt311); + testContextReceiver1.subscribe(topic, 0); + + testContextReceiver2.start(); + testContextReceiver2.connectClient(ProtocolVersion::Mqtt311); + testContextReceiver2.subscribe(topic, 1); + + testContextReceiver3.start(); + testContextReceiver3.connectClient(ProtocolVersion::Mqtt311); + testContextReceiver3.subscribe(topic, 2); + + testContextReceiver4.start(); + testContextReceiver4.connectClient(ProtocolVersion::Mqtt311); + testContextReceiver4.subscribe(topic, 1); + + testContextReceiver5.start(); + testContextReceiver5.connectClient(ProtocolVersion::Mqtt311); + testContextReceiver5.subscribe(topic, 0); + + testContextSender.start(); + testContextSender.connectClient(ProtocolVersion::Mqtt311); + testContextSender.publish(topic, payload, 2); + + testContextReceiver1.waitForMessageCount(1); + testContextReceiver2.waitForMessageCount(1); + testContextReceiver3.waitForMessageCount(1); + testContextReceiver4.waitForMessageCount(1); + testContextReceiver5.waitForMessageCount(1); + + MYCASTCOMPARE(testContextReceiver1.receivedPublishes.size(), 1); + MYCASTCOMPARE(testContextReceiver2.receivedPublishes.size(), 1); + MYCASTCOMPARE(testContextReceiver3.receivedPublishes.size(), 1); + MYCASTCOMPARE(testContextReceiver4.receivedPublishes.size(), 1); + MYCASTCOMPARE(testContextReceiver5.receivedPublishes.size(), 1); + + QCOMPARE(testContextReceiver1.receivedPublishes.front().getQos(), 0); + QCOMPARE(testContextReceiver2.receivedPublishes.front().getQos(), 1); + QCOMPARE(testContextReceiver3.receivedPublishes.front().getQos(), 2); + QCOMPARE(testContextReceiver4.receivedPublishes.front().getQos(), 1); + QCOMPARE(testContextReceiver5.receivedPublishes.front().getQos(), 0); + + QCOMPARE(testContextReceiver1.receivedPublishes.front().getPayloadCopy(), payload); + QCOMPARE(testContextReceiver2.receivedPublishes.front().getPayloadCopy(), payload); + QCOMPARE(testContextReceiver3.receivedPublishes.front().getPayloadCopy(), payload); + QCOMPARE(testContextReceiver4.receivedPublishes.front().getPayloadCopy(), payload); + QCOMPARE(testContextReceiver5.receivedPublishes.front().getPayloadCopy(), payload); + + QCOMPARE(testContextReceiver2.receivedPublishes.front().getPacketId(), 1); + QCOMPARE(testContextReceiver3.receivedPublishes.front().getPacketId(), 1); + QCOMPARE(testContextReceiver4.receivedPublishes.front().getPacketId(), 1); } void MainTests::testUnSubscribe() diff --git a/mqttpacket.cpp b/mqttpacket.cpp index 6fc731d..a1d4fa0 100644 --- a/mqttpacket.cpp +++ b/mqttpacket.cpp @@ -1257,6 +1257,7 @@ void MqttPacket::handlePublish() // Working with a local copy because the subscribing action will modify this->packet_id. See the PublishCopyFactory. const uint16_t _packet_id = this->packet_id; + const char _qos = this->publishData.qos; if (publishData.qos == 2 && sender->getSession()->incomingQoS2MessageIdInTransit(_packet_id)) { @@ -1291,13 +1292,14 @@ void MqttPacket::handlePublish() } #ifndef NDEBUG - // Protection against using the altered packet id. + // Protection against using the altered packet id (because we change the incoming byte array for each subscriber). this->packet_id = 0; + this->publishData.qos = 0; #endif - if (publishData.qos > 0) + if (_qos > 0) { - const PacketType responseType = publishData.qos == 1 ? PacketType::PUBACK : PacketType::PUBREC; + const PacketType responseType = _qos == 1 ? PacketType::PUBACK : PacketType::PUBREC; PubResponse pubAck(this->protocolVersion, responseType, ackCode, _packet_id); MqttPacket response(pubAck); sender->writeMqttPacket(response);