mirror of
https://github.com/crystalidea/qt6windows7.git
synced 2025-07-02 23:35:28 +08:00
6.5.3 clean
This commit is contained in:
@ -6,6 +6,7 @@ add_subdirectory(qdbusconnection)
|
||||
add_subdirectory(qdbusconnection_no_app)
|
||||
add_subdirectory(qdbusconnection_no_bus)
|
||||
add_subdirectory(qdbusconnection_no_libdbus)
|
||||
add_subdirectory(qdbusconnection_signalorder)
|
||||
add_subdirectory(qdbusconnection_spyhook)
|
||||
add_subdirectory(qdbuscontext)
|
||||
add_subdirectory(qdbuslocalcalls)
|
||||
|
@ -1842,8 +1842,7 @@ void tst_QDBusAbstractAdaptor::typeMatching()
|
||||
QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
|
||||
QCOMPARE(reply.arguments().size(), 1);
|
||||
|
||||
const QVariant &retval = reply.arguments().at(0);
|
||||
QVERIFY(compare(retval, value));
|
||||
QVERIFY(compare(reply.arguments().at(0), value));
|
||||
}
|
||||
|
||||
void tst_QDBusAbstractAdaptor::methodWithMoreThanOneReturnValue()
|
||||
|
@ -1412,6 +1412,39 @@ void tst_QDBusConnection::pendingCallWhenDisconnected()
|
||||
#endif
|
||||
}
|
||||
|
||||
void tst_QDBusConnection::emptyServerAddress()
|
||||
{
|
||||
QDBusServer server({}, nullptr);
|
||||
}
|
||||
|
||||
void tst_QDBusConnection::parentClassSignal()
|
||||
{
|
||||
if (!QCoreApplication::instance())
|
||||
QSKIP("Test requires a QCoreApplication");
|
||||
|
||||
const QString path = "/path";
|
||||
|
||||
QDBusConnection con = QDBusConnection::sessionBus();
|
||||
QVERIFY(con.isConnected());
|
||||
|
||||
// register one object at root:
|
||||
MyObject obj;
|
||||
QVERIFY(con.registerObject(path, &obj, QDBusConnection::ExportAllContents));
|
||||
QCOMPARE(con.objectRegisteredAt(path), static_cast<QObject *>(&obj));
|
||||
|
||||
SignalReceiver recv;
|
||||
QVERIFY(con.connect(con.baseService(), path, "local.BaseObject", "baseObjectSignal", &recv,
|
||||
SLOT(oneSlot())));
|
||||
QVERIFY(con.connect(con.baseService(), path, "local.MyObject", "myObjectSignal", &recv,
|
||||
SLOT(oneSlot())));
|
||||
|
||||
emit obj.baseObjectSignal();
|
||||
QTRY_COMPARE(recv.signalsReceived, 1);
|
||||
|
||||
emit obj.myObjectSignal();
|
||||
QTRY_COMPARE(recv.signalsReceived, 2);
|
||||
}
|
||||
|
||||
QString MyObject::path;
|
||||
QString MyObjectWithoutInterface::path;
|
||||
QString MyObjectWithoutInterface::interface;
|
||||
|
@ -21,11 +21,14 @@ public:
|
||||
BaseObject(QObject *parent = nullptr) : QObject(parent) { }
|
||||
public slots:
|
||||
void anotherMethod() { }
|
||||
signals:
|
||||
void baseObjectSignal();
|
||||
};
|
||||
|
||||
class MyObject: public BaseObject
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_CLASSINFO("D-Bus Interface", "local.MyObject")
|
||||
public slots:
|
||||
void method(const QDBusMessage &msg);
|
||||
|
||||
@ -33,6 +36,9 @@ public:
|
||||
static QString path;
|
||||
int callCount;
|
||||
MyObject(QObject *parent = nullptr) : BaseObject(parent), callCount(0) {}
|
||||
|
||||
signals:
|
||||
void myObjectSignal();
|
||||
};
|
||||
|
||||
class MyObjectWithoutInterface: public QObject
|
||||
@ -115,6 +121,10 @@ private slots:
|
||||
void callVirtualObjectLocal();
|
||||
void pendingCallWhenDisconnected();
|
||||
|
||||
void emptyServerAddress();
|
||||
|
||||
void parentClassSignal();
|
||||
|
||||
public:
|
||||
QString serviceName() const { return "org.qtproject.Qt.Autotests.QDBusConnection"; }
|
||||
bool callMethod(const QDBusConnection &conn, const QString &path);
|
||||
|
13
tests/auto/dbus/qdbusconnection_signalorder/CMakeLists.txt
Normal file
13
tests/auto/dbus/qdbusconnection_signalorder/CMakeLists.txt
Normal file
@ -0,0 +1,13 @@
|
||||
# Copyright (C) 2023 The Qt Company Ltd.
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
#####################################################################
|
||||
## tst_qdbusconnection_signalorder Test:
|
||||
#####################################################################
|
||||
|
||||
qt_internal_add_test(tst_qdbusconnection_signalorder
|
||||
SOURCES
|
||||
tst_qdbusconnection_signalorder.cpp
|
||||
LIBRARIES
|
||||
Qt::DBus
|
||||
)
|
@ -0,0 +1,103 @@
|
||||
// Copyright (C) 2023 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QDBusConnection>
|
||||
#include <QDBusMessage>
|
||||
#include <QObject>
|
||||
#include <QTest>
|
||||
#include <QTimer>
|
||||
|
||||
using namespace Qt::StringLiterals;
|
||||
|
||||
static constexpr int MAX_TEST_DURATION_MS = 10000;
|
||||
static constexpr int NUM_MESSAGES = 20;
|
||||
|
||||
class SignalReceiver : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SignalReceiver(QDBusConnection &connection, const QString &serviceName);
|
||||
|
||||
int nextValue() const { return m_nextValue; }
|
||||
bool inOrder() const { return m_inOrder; }
|
||||
|
||||
Q_SIGNALS:
|
||||
void testSignal(int);
|
||||
void done();
|
||||
|
||||
private Q_SLOTS:
|
||||
void testSlot(int number);
|
||||
|
||||
private:
|
||||
int m_nextValue = 0;
|
||||
bool m_inOrder = true;
|
||||
};
|
||||
|
||||
SignalReceiver::SignalReceiver(QDBusConnection &connection, const QString &serviceName)
|
||||
{
|
||||
connection.connect(serviceName, "/", {}, "testSignal", this, SLOT(testSlot(int)));
|
||||
}
|
||||
|
||||
void SignalReceiver::testSlot(int number)
|
||||
{
|
||||
if (m_nextValue != number) {
|
||||
m_inOrder = false;
|
||||
qWarning("Message out of sequence, expected: %d, received: %d", m_nextValue, number);
|
||||
}
|
||||
|
||||
m_nextValue++;
|
||||
|
||||
if (m_nextValue == NUM_MESSAGES) {
|
||||
Q_EMIT done();
|
||||
}
|
||||
}
|
||||
|
||||
class tst_QDBusConnection_SignalOrder : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
private Q_SLOTS:
|
||||
void signalOrder();
|
||||
};
|
||||
|
||||
// This is a regression test for QTBUG-105457. The bug is a race condition,
|
||||
// so it cannot be reliably triggered at each test execution.
|
||||
void tst_QDBusConnection_SignalOrder::signalOrder()
|
||||
{
|
||||
int argc = 1;
|
||||
static char appName[] = "tst_qdbusconnection_signalorder";
|
||||
char *argv[] = { appName, 0 };
|
||||
QCoreApplication app(argc, argv);
|
||||
|
||||
const QString serviceName =
|
||||
u"org.qtproject.tst_dbusconnection_signalorder_%1"_s.arg(app.applicationPid());
|
||||
|
||||
auto connection = QDBusConnection::sessionBus();
|
||||
|
||||
QVERIFY(connection.isConnected());
|
||||
QVERIFY(connection.registerService(serviceName));
|
||||
|
||||
// Limit the test execution time in case if something goes wrong inside
|
||||
// the signal receiver.
|
||||
QTimer::singleShot(MAX_TEST_DURATION_MS, &app, &QCoreApplication::quit);
|
||||
|
||||
SignalReceiver signalReceiver(connection, serviceName);
|
||||
connect(&signalReceiver, &SignalReceiver::done, &app, &QCoreApplication::quit);
|
||||
|
||||
QVERIFY(connection.registerObject("/", &signalReceiver, QDBusConnection::ExportAllSlots));
|
||||
|
||||
for (int i = 0; i < NUM_MESSAGES; i++) {
|
||||
auto testSignal = QDBusMessage::createSignal("/", serviceName, "testSignal");
|
||||
testSignal << i;
|
||||
QVERIFY(connection.send(testSignal));
|
||||
}
|
||||
|
||||
app.exec();
|
||||
|
||||
QVERIFY(signalReceiver.inOrder());
|
||||
QCOMPARE(signalReceiver.nextValue(), NUM_MESSAGES);
|
||||
}
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_QDBusConnection_SignalOrder)
|
||||
|
||||
#include "tst_qdbusconnection_signalorder.moc"
|
Reference in New Issue
Block a user