mirror of
https://github.com/qt/qtmqtt.git
synced 2026-10-25 16:16:26 +00:00
This is a semantic patch using ClangTidyTransformator as in
qtbase/df9d882d41b741fef7c5beeddb0abe9d904443d8:
auto QtContainerClass = anyOf(
expr(hasType(cxxRecordDecl(isSameOrDerivedFrom(hasAnyName(classes))))).bind(o),
expr(hasType(namedDecl(hasAnyName(<classes>)))).bind(o));
makeRule(cxxMemberCallExpr(on(QtContainerClass),
callee(cxxMethodDecl(hasAnyName({"count", "length"),
parameterCountIs(0))))),
changeTo(cat(access(o, cat("size"), "()"))),
cat("use 'size()' instead of 'count()/length()'"))
a.k.a qt-port-to-std-compatible-api with config Scope: 'Container',
with the extended set of container classes recognized.
Change-Id: Ieb49171212fd72c685ba27cb39aaec9cbaf3a701
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
194 lines
7.2 KiB
C++
194 lines
7.2 KiB
C++
// Copyright (C) 2018 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
|
|
|
#include "broker_connection.h"
|
|
|
|
#include <QtCore/QString>
|
|
#include <QtTest/QtTest>
|
|
#include <QtMqtt/QMqttClient>
|
|
#include <QtMqtt/QMqttPublishProperties>
|
|
#include <QtMqtt/QMqttSubscription>
|
|
|
|
class tst_QMqttPublishProperties : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
tst_QMqttPublishProperties();
|
|
|
|
private Q_SLOTS:
|
|
void initTestCase();
|
|
void cleanupTestCase();
|
|
void getSet();
|
|
void propertyConsistency();
|
|
void topicAlias();
|
|
|
|
private:
|
|
QProcess m_brokerProcess;
|
|
QString m_testBroker;
|
|
quint16 m_port{1883};
|
|
};
|
|
|
|
tst_QMqttPublishProperties::tst_QMqttPublishProperties()
|
|
{
|
|
}
|
|
|
|
void tst_QMqttPublishProperties::initTestCase()
|
|
{
|
|
m_testBroker = invokeOrInitializeBroker(&m_brokerProcess);
|
|
if (m_testBroker.isEmpty())
|
|
qFatal("No MQTT broker present to test against.");
|
|
}
|
|
|
|
void tst_QMqttPublishProperties::cleanupTestCase()
|
|
{
|
|
}
|
|
|
|
void tst_QMqttPublishProperties::getSet()
|
|
{
|
|
QMqttPublishProperties p;
|
|
|
|
QCOMPARE(p.availableProperties(), 0);
|
|
|
|
QVERIFY(!(p.availableProperties() & QMqttPublishProperties::PayloadFormatIndicator));
|
|
QCOMPARE(p.payloadFormatIndicator(), QMqtt::PayloadFormatIndicator::Unspecified);
|
|
p.setPayloadFormatIndicator(QMqtt::PayloadFormatIndicator::UTF8Encoded);
|
|
QCOMPARE(p.payloadFormatIndicator(), QMqtt::PayloadFormatIndicator::UTF8Encoded);
|
|
QVERIFY(p.availableProperties() & QMqttPublishProperties::PayloadFormatIndicator);
|
|
|
|
QVERIFY(!(p.availableProperties() & QMqttPublishProperties::MessageExpiryInterval));
|
|
p.setMessageExpiryInterval(200);
|
|
QVERIFY(p.availableProperties() & QMqttPublishProperties::MessageExpiryInterval);
|
|
QCOMPARE(p.messageExpiryInterval(), 200u);
|
|
|
|
QVERIFY(!(p.availableProperties() & QMqttPublishProperties::TopicAlias));
|
|
p.setTopicAlias(1);
|
|
QCOMPARE(p.topicAlias(), 1);
|
|
QVERIFY(p.availableProperties() & QMqttPublishProperties::TopicAlias);
|
|
p.setTopicAlias(0); // Zero is not allowed
|
|
QCOMPARE(p.topicAlias(), 1);
|
|
|
|
const QString responseTopic = QLatin1String("reply/to/this");
|
|
QVERIFY(!(p.availableProperties() & QMqttPublishProperties::ResponseTopic));
|
|
QCOMPARE(p.responseTopic(), QString());
|
|
p.setResponseTopic(responseTopic);
|
|
QVERIFY(p.availableProperties() & QMqttPublishProperties::ResponseTopic);
|
|
QCOMPARE(p.responseTopic(), responseTopic);
|
|
|
|
const QByteArray data = QByteArray(1, char('c'));
|
|
QVERIFY(!(p.availableProperties() & QMqttPublishProperties::CorrelationData));
|
|
QCOMPARE(p.correlationData(), QByteArray());
|
|
p.setCorrelationData(data);
|
|
QVERIFY(p.availableProperties() & QMqttPublishProperties::CorrelationData);
|
|
QCOMPARE(p.correlationData(), data);
|
|
|
|
const QString userKey = QLatin1String("UserName");
|
|
const QString userValue = QLatin1String("SomeValue");
|
|
QMqttUserProperties userProperty;
|
|
QVERIFY(!(p.availableProperties() & QMqttPublishProperties::UserProperty));
|
|
QCOMPARE(p.userProperties(), userProperty);
|
|
userProperty.append(QMqttStringPair(userKey, userValue));
|
|
p.setUserProperties(userProperty);
|
|
QVERIFY(p.availableProperties() & QMqttPublishProperties::UserProperty);
|
|
QCOMPARE(p.userProperties(), userProperty);
|
|
|
|
QVERIFY(!(p.availableProperties() & QMqttPublishProperties::SubscriptionIdentifier));
|
|
const QList<quint32> one{1};
|
|
p.setSubscriptionIdentifiers(one);
|
|
QCOMPARE(p.subscriptionIdentifiers(), one);
|
|
|
|
const QList<quint32> invalidZero{1, 0};
|
|
p.setSubscriptionIdentifiers(invalidZero);
|
|
QVERIFY(p.availableProperties() & QMqttPublishProperties::SubscriptionIdentifier);
|
|
QCOMPARE(p.subscriptionIdentifiers(), one);
|
|
|
|
const QString contentType = QLatin1String("MultimediaContent123");
|
|
QVERIFY(!(p.availableProperties() & QMqttPublishProperties::ContentType));
|
|
QCOMPARE(p.contentType(), QString());
|
|
p.setContentType(contentType);
|
|
QVERIFY(p.availableProperties() & QMqttPublishProperties::ContentType);
|
|
QCOMPARE(p.contentType(), contentType);
|
|
}
|
|
|
|
void tst_QMqttPublishProperties::propertyConsistency()
|
|
{
|
|
|
|
QMqttClient client;
|
|
client.setProtocolVersion(QMqttClient::MQTT_5_0);
|
|
client.setHostname(m_testBroker);
|
|
client.setPort(m_port);
|
|
|
|
client.connectToHost();
|
|
QTRY_VERIFY2(client.state() == QMqttClient::Connected, "Could not connect to broker.");
|
|
|
|
QMqttClient client2;
|
|
client2.setProtocolVersion(QMqttClient::MQTT_5_0);
|
|
client2.setHostname(m_testBroker);
|
|
client2.setPort(m_port);
|
|
|
|
client2.connectToHost();
|
|
QTRY_VERIFY2(client2.state() == QMqttClient::Connected, "Could not connect to broker.");
|
|
|
|
|
|
const QByteArray correlation(10, 'c');
|
|
const QString responseTopic = QLatin1String("topic/to/reply");
|
|
const QString userKey1 = QLatin1String("UserName1");
|
|
const QString userValue1 = QLatin1String("SomeValue");
|
|
const QString userKey2 = QLatin1String("UserName2");
|
|
const QString userValue2 = QLatin1String("OtherValue");
|
|
QMqttUserProperties userProperty;
|
|
userProperty.append(QMqttStringPair(userKey1, userValue1));
|
|
userProperty.append(QMqttStringPair(userKey2, userValue2));
|
|
const QString content = QLatin1String("ContentType");
|
|
|
|
const QString testTopic = QLatin1String("Qt/PublishProperties/publish/consistent");
|
|
|
|
auto sub = client2.subscribe(testTopic, 1);
|
|
QTRY_COMPARE(sub->state(), QMqttSubscription::Subscribed);
|
|
|
|
QMqttPublishProperties pubProp;
|
|
pubProp.setPayloadFormatIndicator(QMqtt::PayloadFormatIndicator::UTF8Encoded);
|
|
pubProp.setMessageExpiryInterval(60);
|
|
//pubProp.setTopicAlias(1);
|
|
pubProp.setResponseTopic(responseTopic);
|
|
pubProp.setCorrelationData(correlation);
|
|
pubProp.setUserProperties(userProperty);
|
|
pubProp.setContentType(content);
|
|
|
|
QSignalSpy publishSpy(&client, SIGNAL(messageSent(qint32)));
|
|
QSignalSpy subscribeSpy(sub, SIGNAL(messageReceived(QMqttMessage)));
|
|
client.publish(testTopic, pubProp, QByteArray("Some Content"), 1);
|
|
|
|
QTRY_COMPARE(publishSpy.size(), 1);
|
|
QTRY_COMPARE(subscribeSpy.size(), 1);
|
|
|
|
auto msg = subscribeSpy.at(0).at(0).value<QMqttMessage>();
|
|
|
|
QCOMPARE(msg.payload(), QByteArray("Some Content"));
|
|
QMqttPublishProperties receivalProp = msg.publishProperties();
|
|
QCOMPARE(pubProp.payloadFormatIndicator(), receivalProp.payloadFormatIndicator());
|
|
QVERIFY(pubProp.messageExpiryInterval() >= receivalProp.messageExpiryInterval()); // The broker MIGHT reduce
|
|
QCOMPARE(pubProp.responseTopic(), receivalProp.responseTopic());
|
|
QCOMPARE(pubProp.correlationData(), receivalProp.correlationData());
|
|
|
|
// Paho test server sends identical userProperties, Flespi adds additional properties (ie timestamp)
|
|
const auto userSend = pubProp.userProperties();
|
|
const auto userReceive = receivalProp.userProperties();
|
|
QVERIFY(userSend.size() <= userReceive.size());
|
|
for (auto it = userSend.constBegin(); it != userSend.constEnd(); ++it)
|
|
QVERIFY(userReceive.contains(*it));
|
|
|
|
QCOMPARE(pubProp.contentType(), receivalProp.contentType());
|
|
}
|
|
|
|
void tst_QMqttPublishProperties::topicAlias()
|
|
{
|
|
// Get serverproperties
|
|
// Send data with higher alias than available
|
|
// Connection gets killed
|
|
}
|
|
|
|
QTEST_MAIN(tst_QMqttPublishProperties)
|
|
|
|
#include "tst_qmqttpublishproperties.moc"
|