diff --git a/FlashMQTests/tst_maintests.cpp b/FlashMQTests/tst_maintests.cpp index bae36df..43b8c00 100644 --- a/FlashMQTests/tst_maintests.cpp +++ b/FlashMQTests/tst_maintests.cpp @@ -115,6 +115,8 @@ private slots: void testNotMessingUpQosLevels(); + void testUnSubscribe(); + }; MainTests::MainTests() @@ -1291,6 +1293,58 @@ void MainTests::testNotMessingUpQosLevels() QCOMPARE(testContextReceiver5.receivedMessages.first().id(), 0); } +void MainTests::testUnSubscribe() +{ + TwoClientTestContext testContext; + + testContext.connectSender(); + testContext.connectReceiver(); + + testContext.subscribeReceiver("Rebecca/Bunch", 2); + testContext.subscribeReceiver("Josh/Chan", 1); + testContext.subscribeReceiver("White/Josh", 1); + + testContext.publish("Rebecca/Bunch", "Bunch here", 2); + testContext.publish("White/Josh", "Anteater", 2); + testContext.publish("Josh/Chan", "Human flip-flop", 2); + + testContext.waitReceiverReceived(3); + + QVERIFY(std::any_of(testContext.receivedMessages.begin(), testContext.receivedMessages.end(), [](const QMQTT::Message &msg) { + return msg.payload() == "Bunch here" && msg.topic() == "Rebecca/Bunch"; + })); + + QVERIFY(std::any_of(testContext.receivedMessages.begin(), testContext.receivedMessages.end(), [](const QMQTT::Message &msg) { + return msg.payload() == "Anteater" && msg.topic() == "White/Josh"; + })); + + QVERIFY(std::any_of(testContext.receivedMessages.begin(), testContext.receivedMessages.end(), [](const QMQTT::Message &msg) { + return msg.payload() == "Human flip-flop" && msg.topic() == "Josh/Chan"; + })); + + QCOMPARE(testContext.receivedMessages.count(), 3); + + testContext.receivedMessages.clear(); + + testContext.unsubscribeReceiver("Josh/Chan"); + + testContext.publish("Rebecca/Bunch", "Bunch here", 2); + testContext.publish("White/Josh", "Anteater", 2); + testContext.publish("Josh/Chan", "Human flip-flop", 2); + + testContext.waitReceiverReceived(2); + + QCOMPARE(testContext.receivedMessages.count(), 2); + + QVERIFY(std::any_of(testContext.receivedMessages.begin(), testContext.receivedMessages.end(), [](const QMQTT::Message &msg) { + return msg.payload() == "Bunch here" && msg.topic() == "Rebecca/Bunch"; + })); + + QVERIFY(std::any_of(testContext.receivedMessages.begin(), testContext.receivedMessages.end(), [](const QMQTT::Message &msg) { + return msg.payload() == "Anteater" && msg.topic() == "White/Josh"; + })); +} + int main(int argc, char *argv[]) { diff --git a/FlashMQTests/twoclienttestcontext.cpp b/FlashMQTests/twoclienttestcontext.cpp index b2eebb3..f780bcf 100644 --- a/FlashMQTests/twoclienttestcontext.cpp +++ b/FlashMQTests/twoclienttestcontext.cpp @@ -95,21 +95,39 @@ void TwoClientTestContext::subscribeReceiver(const QString &topic, const quint8 waiter.exec(); } -void TwoClientTestContext::waitReceiverReceived(int count) +void TwoClientTestContext::unsubscribeReceiver(const QString &topic) { - if (count > 0 && receivedMessages.count() == count) - return; + receiver->unsubscribe(topic); QEventLoop waiter; QTimer timeout; timeout.setSingleShot(true); - timeout.setInterval(3000); + timeout.setInterval(1000); connect(&timeout, &QTimer::timeout, &waiter, &QEventLoop::quit); - connect(receiver.data(), &QMQTT::Client::received, &waiter, &QEventLoop::quit); + connect(receiver.data(), &QMQTT::Client::unsubscribed, &waiter, &QEventLoop::quit); timeout.start(); waiter.exec(); } +void TwoClientTestContext::waitReceiverReceived(const int count) +{ + if (count > 0 && receivedMessages.count() == count) + return; + + int attempt = 0; + while(receivedMessages.count() != count && attempt++ < count) + { + QEventLoop waiter; + QTimer timeout; + timeout.setSingleShot(true); + timeout.setInterval(3000); + connect(&timeout, &QTimer::timeout, &waiter, &QEventLoop::quit); + connect(receiver.data(), &QMQTT::Client::received, &waiter, &QEventLoop::quit); + timeout.start(); + waiter.exec(); + } +} + void TwoClientTestContext::onClientError(const QMQTT::ClientError error) { const QMQTT::Client *_sender = sender.data(); diff --git a/FlashMQTests/twoclienttestcontext.h b/FlashMQTests/twoclienttestcontext.h index ef61da8..68ddbf2 100644 --- a/FlashMQTests/twoclienttestcontext.h +++ b/FlashMQTests/twoclienttestcontext.h @@ -41,7 +41,8 @@ public: void connectReceiver(); void disconnectReceiver(); void subscribeReceiver(const QString &topic, const quint8 qos = 0); - void waitReceiverReceived(int count); + void unsubscribeReceiver(const QString &topic); + void waitReceiverReceived(const int count); void onClientError(const QMQTT::ClientError error); QList receivedMessages;