Commit 958aeb620c223ccc3769b029d2d3571314164fcf

Authored by Wiebe Cazemier
1 parent 5a4b57de

Fix QoS reduction on retained messages

It was caught by an assert. In release mode, this simply meant
subscribing to 0 still gave you QoS messages.
FlashMQTests/tst_maintests.cpp
@@ -1710,32 +1710,45 @@ void MainTests::testOutgoingTopicAlias() @@ -1710,32 +1710,45 @@ void MainTests::testOutgoingTopicAlias()
1710 1710
1711 void MainTests::testReceivingRetainedMessageWithQoS() 1711 void MainTests::testReceivingRetainedMessageWithQoS()
1712 { 1712 {
1713 - FlashMQTestClient sender;  
1714 - sender.start(); 1713 + int testCount = 0;
1715 1714
1716 - const std::string payload = "We are testing"; 1715 + for (char sendQos = 0; sendQos < 3; sendQos++)
  1716 + {
  1717 + for (char subscribeQos = 0; subscribeQos < 3; subscribeQos++)
  1718 + {
  1719 + testCount++;
1717 1720
1718 - sender.connectClient(ProtocolVersion::Mqtt311); 1721 + FlashMQTestClient sender;
  1722 + sender.start();
1719 1723
1720 - Publish p1("topic1/FOOBAR", payload, 1);  
1721 - p1.retain = true;  
1722 - sender.publish(p1); 1724 + const std::string payload = "We are testing";
1723 1725
1724 - FlashMQTestClient receiver;  
1725 - receiver.start();  
1726 - receiver.connectClient(ProtocolVersion::Mqtt5); 1726 + sender.connectClient(ProtocolVersion::Mqtt311);
1727 1727
1728 - receiver.subscribe("+/+", 1); 1728 + Publish p1("topic1/FOOBAR", payload, sendQos);
  1729 + p1.retain = true;
  1730 + sender.publish(p1);
1729 1731
1730 - receiver.waitForMessageCount(1); 1732 + FlashMQTestClient receiver;
  1733 + receiver.start();
  1734 + receiver.connectClient(ProtocolVersion::Mqtt5);
1731 1735
1732 - MYCASTCOMPARE(receiver.receivedPublishes.size(), 1);  
1733 - MYCASTCOMPARE(receiver.receivedPublishes.front().getQos(), 1);  
1734 - MYCASTCOMPARE(receiver.receivedPublishes.front().getTopic(), "topic1/FOOBAR");  
1735 - MYCASTCOMPARE(receiver.receivedPublishes.front().getPayloadCopy(), payload);  
1736 - MYCASTCOMPARE(receiver.receivedPublishes.front().getRetain(), true);  
1737 -} 1736 + receiver.subscribe("+/+", subscribeQos);
  1737 +
  1738 + receiver.waitForMessageCount(1);
  1739 +
  1740 + const char expQos = std::min<char>(sendQos, subscribeQos);
1738 1741
  1742 + MYCASTCOMPARE(receiver.receivedPublishes.size(), 1);
  1743 + MYCASTCOMPARE(receiver.receivedPublishes.front().getQos(), expQos);
  1744 + MYCASTCOMPARE(receiver.receivedPublishes.front().getTopic(), "topic1/FOOBAR");
  1745 + MYCASTCOMPARE(receiver.receivedPublishes.front().getPayloadCopy(), payload);
  1746 + MYCASTCOMPARE(receiver.receivedPublishes.front().getRetain(), true);
  1747 + }
  1748 + }
  1749 +
  1750 + MYCASTCOMPARE(9, testCount);
  1751 +}
1739 1752
1740 int main(int argc, char *argv[]) 1753 int main(int argc, char *argv[])
1741 { 1754 {
publishcopyfactory.cpp
@@ -53,6 +53,8 @@ MqttPacket *PublishCopyFactory::getOptimumPacket(const char max_qos, const Proto @@ -53,6 +53,8 @@ MqttPacket *PublishCopyFactory::getOptimumPacket(const char max_qos, const Proto
53 // Getting an instance of a Publish object happens at least on retained messages, will messages and SYS topics. It's low traffic, anyway. 53 // Getting an instance of a Publish object happens at least on retained messages, will messages and SYS topics. It's low traffic, anyway.
54 assert(publish); 54 assert(publish);
55 55
  56 + publish->qos = getEffectiveQos(max_qos);
  57 +
56 this->oneShotPacket = std::make_unique<MqttPacket>(protocolVersion, *publish); 58 this->oneShotPacket = std::make_unique<MqttPacket>(protocolVersion, *publish);
57 return this->oneShotPacket.get(); 59 return this->oneShotPacket.get();
58 } 60 }