Commit 0765167b77c0ab11011e06e6e27dfd540a5da3dd

Authored by Wiebe Cazemier
1 parent 8cabbca0

Make test_retained test cross-protocol and fix retain flag bug

Cross-protocol, received messages on existing subscriptions would get
retain=1, which is wrong.
FlashMQTests/tst_maintests.cpp
... ... @@ -408,48 +408,56 @@ void MainTests::test_validSubscribePath()
408 408  
409 409 void MainTests::test_retained()
410 410 {
411   - FlashMQTestClient sender;
412   - FlashMQTestClient receiver;
  411 + std::vector<ProtocolVersion> protocols {ProtocolVersion::Mqtt311, ProtocolVersion::Mqtt5};
413 412  
414   - sender.start();
415   - receiver.start();
  413 + for (const ProtocolVersion senderVersion : protocols)
  414 + {
  415 + for (const ProtocolVersion receiverVersion : protocols)
  416 + {
  417 + FlashMQTestClient sender;
  418 + FlashMQTestClient receiver;
416 419  
417   - const std::string payload = "We are testing";
418   - const std::string topic = "retaintopic";
  420 + sender.start();
  421 + receiver.start();
419 422  
420   - sender.connectClient(ProtocolVersion::Mqtt311);
  423 + const std::string payload = "We are testing";
  424 + const std::string topic = "retaintopic";
421 425  
422   - Publish pub1(topic, payload, 0);
423   - pub1.retain = true;
424   - sender.publish(pub1);
  426 + sender.connectClient(senderVersion);
425 427  
426   - Publish pub2("dummy2", "Nobody sees this", 0);
427   - pub2.retain = true;
428   - sender.publish(pub2);
  428 + Publish pub1(topic, payload, 0);
  429 + pub1.retain = true;
  430 + sender.publish(pub1);
429 431  
430   - receiver.connectClient(ProtocolVersion::Mqtt311);
431   - receiver.subscribe("dummy", 0);
432   - receiver.subscribe(topic, 0);
  432 + Publish pub2("dummy2", "Nobody sees this", 0);
  433 + pub2.retain = true;
  434 + sender.publish(pub2);
433 435  
434   - receiver.waitForMessageCount(1);
  436 + receiver.connectClient(receiverVersion);
  437 + receiver.subscribe("dummy", 0);
  438 + receiver.subscribe(topic, 0);
435 439  
436   - MYCASTCOMPARE(receiver.receivedPublishes.size(), 1);
  440 + receiver.waitForMessageCount(1);
437 441  
438   - MqttPacket &msg = receiver.receivedPublishes.front();
439   - QCOMPARE(msg.getPayloadCopy(), payload);
440   - QCOMPARE(msg.getTopic(), topic);
441   - QVERIFY(msg.getRetain());
  442 + MYCASTCOMPARE(receiver.receivedPublishes.size(), 1);
442 443  
443   - receiver.clearReceivedLists();
  444 + MqttPacket &msg = receiver.receivedPublishes.front();
  445 + QCOMPARE(msg.getPayloadCopy(), payload);
  446 + QCOMPARE(msg.getTopic(), topic);
  447 + QVERIFY(msg.getRetain());
444 448  
445   - sender.publish(pub1);
446   - receiver.waitForMessageCount(1);
  449 + receiver.clearReceivedLists();
447 450  
448   - QVERIFY2(receiver.receivedPublishes.size() == 1, "There must be one message in the received list");
449   - MqttPacket &msg2 = receiver.receivedPublishes.front();
450   - QCOMPARE(msg2.getPayloadCopy(), payload);
451   - QCOMPARE(msg2.getTopic(), topic);
452   - QVERIFY2(!msg2.getRetain(), "Getting a retained message while already being subscribed must be marked as normal, not retain.");
  451 + sender.publish(pub1);
  452 + receiver.waitForMessageCount(1);
  453 +
  454 + QVERIFY2(receiver.receivedPublishes.size() == 1, "There must be one message in the received list");
  455 + MqttPacket &msg2 = receiver.receivedPublishes.front();
  456 + QCOMPARE(msg2.getPayloadCopy(), payload);
  457 + QCOMPARE(msg2.getTopic(), topic);
  458 + QVERIFY2(!msg2.getRetain(), "Getting a retained message while already being subscribed must be marked as normal, not retain.");
  459 + }
  460 + }
453 461 }
454 462  
455 463 void MainTests::test_retained_changed()
... ...
mqttpacket.cpp
... ... @@ -1281,6 +1281,7 @@ void MqttPacket::handlePublish()
1281 1281 // Existing subscribers don't get retain=1. [MQTT-3.3.1-9]
1282 1282 bites[0] &= 0b11110110;
1283 1283 first_byte = bites[0];
  1284 + publishData.retain = false;
1284 1285  
1285 1286 PublishCopyFactory factory(this);
1286 1287 MainApp::getMainApp()->getSubscriptionStore()->queuePacketAtSubscribers(factory);
... ...