1
0
mirror of https://github.com/qt/qtmqtt.git synced 2026-10-25 16:16:26 +00:00

Add test for subscription overlap

Furthermore also verifies subscription IDs are handled
properly.

Change-Id: I7bad65d6cbbe60fb005056dc0e31ef4e7a0a8ffa
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Maurice Kalinowski 2018-08-10 12:41:22 +02:00
parent 4bae427962
commit b3ee3a0fe1

View File

@ -73,6 +73,7 @@ private Q_SLOTS:
void messageStatus();
void messageStatusReceive_data();
void messageStatusReceive();
void subscriptionIdsOverlap();
private:
QProcess m_brokerProcess;
QString m_testBroker;
@ -725,6 +726,91 @@ void Tst_QMqttClient::messageStatusReceive()
QTRY_VERIFY2(expectedStatus.isEmpty(), "Did not receive all status updates.");
}
void Tst_QMqttClient::subscriptionIdsOverlap()
{
// If the Server sends a single copy of the message it MUST include in the
// PUBLISH packet the Subscription Identifiers for all matching
// subscriptions which have a Subscription Identifiers, their order is not
// significant [MQTT-3.3.4-4].
// If the Server sends multiple PUBLISH packets it MUST send, in each of
// them, the Subscription Identifier of the matching subscription if it has
// a Subscription Identifier [MQTT-3.3.4-5].
const QString topic = QLatin1String("Qt/client/idcheck");
// Connect publisher
QMqttClient pub;
pub.setProtocolVersion(QMqttClient::MQTT_5_0);
pub.setHostname(m_testBroker);
pub.setPort(m_port);
pub.connectToHost();
QTRY_VERIFY2(pub.state() == QMqttClient::Connected, "Could not connect publisher.");
// Connect subA
QMqttClient subClientA;
subClientA.setProtocolVersion(QMqttClient::MQTT_5_0);
subClientA.setHostname(m_testBroker);
subClientA.setPort(m_port);
subClientA.connectToHost();
QTRY_VERIFY2(subClientA.state() == QMqttClient::Connected, "Could not connect subscriber A.");
QMqttSubscriptionProperties subAProp;
subAProp.setSubscriptionIdentifier(8);
auto subA = subClientA.subscribe(topic, subAProp, 1);
QTRY_VERIFY2(subA->state() == QMqttSubscription::Subscribed, "Could not subscibe A.");
int receiveACounter = 0;
connect(subA, &QMqttSubscription::messageReceived, [&receiveACounter](QMqttMessage msg) {
qDebug() << "Sub A received:" << msg.publishProperties().subscriptionIdentifiers();
// ### TODO: Wait for fix at https://github.com/eclipse/paho.mqtt.testing/issues/56
//QVERIFY(msg.publishProperties().subscriptionIdentifiers().size() == 1);
//QVERIFY(msg.publishProperties().subscriptionIdentifiers().at(0) == 8); // Use sub->id();
receiveACounter++;
});
// Connect subB
QMqttClient subClientB;
subClientB.setProtocolVersion(QMqttClient::MQTT_5_0);
subClientB.setHostname(m_testBroker);
subClientB.setPort(m_port);
subClientB.connectToHost();
QTRY_VERIFY2(subClientB.state() == QMqttClient::Connected, "Could not connect subscriber A.");
QMqttSubscriptionProperties subBProp;
subBProp.setSubscriptionIdentifier(9);
auto subB = subClientB.subscribe(topic, subBProp, 1);
QTRY_VERIFY2(subB->state() == QMqttSubscription::Subscribed, "Could not subscibe A.");
int receiveBCounter = 2;
connect(subB, &QMqttSubscription::messageReceived, [&receiveBCounter](QMqttMessage msg) {
qDebug() << "Sub B received:" << msg.publishProperties().subscriptionIdentifiers();
QVERIFY(msg.publishProperties().subscriptionIdentifiers().size() > 0);
receiveBCounter -= msg.publishProperties().subscriptionIdentifiers().size();
});
QMqttSubscriptionProperties subB2Prop;
subB2Prop.setSubscriptionIdentifier(14);
auto subB2 = subClientB.subscribe(topic + "/#", subB2Prop, 1);
QTRY_VERIFY2(subB2->state() == QMqttSubscription::Subscribed, "Could not subscibe A.");
int receiveB2Counter = 2;
connect(subB2, &QMqttSubscription::messageReceived, [&receiveB2Counter](QMqttMessage msg) {
qDebug() << "Sub B2 received:" << msg.publishProperties().subscriptionIdentifiers();
QVERIFY(msg.publishProperties().subscriptionIdentifiers().size() > 0);
receiveB2Counter -= msg.publishProperties().subscriptionIdentifiers().size();
});
QSignalSpy publishSpy(&pub, &QMqttClient::messageSent);
pub.publish(topic, "SomeData", 1);
QTRY_VERIFY2(publishSpy.count() == 1, "Could not finalize publication.");
QTRY_VERIFY2(receiveBCounter == 0, "Did not receive both messages.");
QTRY_VERIFY2(receiveB2Counter == 0, "Did not receive both messages.");
QTRY_VERIFY2(receiveACounter == 1, "Did not receive non-overlapping message.");
}
QTEST_MAIN(Tst_QMqttClient)
#include "tst_qmqttclient.moc"