13 #include <QDBusConnection>
24 using namespace QTest;
55 void CTestSharedState::initTestCase()
58 CTestFilter::registerMetadata();
61 void CTestSharedState::testPromise()
65 doAfter(promise.
future(),
nullptr, [&](QFuture<int> future) { result = future.result(); });
67 bool ok = qWaitFor([&] {
return result == 42; });
68 QVERIFY2(ok,
"future contains expected result");
71 void CTestSharedState::localScalar()
74 CTestScalarMutator mutator(
this);
75 CTestScalarJournal journal(
this);
76 CTestScalarObserver observer(
this);
77 mutator.initialize(&dataLink);
78 journal.initialize(&dataLink);
79 observer.initialize(&dataLink);
82 bool ok = qWaitFor([&] {
return observer.value() == 42; });
83 QVERIFY2(ok,
"expected value received");
85 QVERIFY2(observer.value() == 42,
"still has expected value");
87 CTestScalarObserver observer2(
this);
88 observer2.initialize(&dataLink);
90 ok = qWaitFor([&] {
return observer2.value() == 42; });
91 QVERIFY2(ok,
"new observer got existing value");
93 QVERIFY2(observer2.value() == 42,
"still has correct value");
96 void CTestSharedState::localList()
99 CTestListMutator mutator(
this);
100 CTestListJournal journal(
this);
101 CTestListObserver observer(
this);
102 mutator.initialize(&dataLink);
103 journal.initialize(&dataLink);
104 observer.initialize(&dataLink);
106 observer.setFilter({});
107 mutator.addElement(1);
108 bool ok = qWaitFor([&] {
return observer.allValues() == QList<int> { 1 }; });
109 QVERIFY2(ok,
"expected value received");
111 QVERIFY2(observer.allValues() == QList<int> { 1 },
"still has expected value");
113 for (
int e = 2; e <= 6; ++e) { mutator.addElement(e); }
114 ok = qWaitFor([&] {
return observer.allValues() == QList<int> { 1, 2, 3, 4, 5, 6 }; });
115 QVERIFY2(ok,
"expected value received");
117 observer.allValues() = {};
118 observer.setFilter({ 1 });
119 ok = qWaitFor([&] {
return observer.allValues() == QList<int> { 1, 3, 5 }; });
120 QVERIFY2(ok,
"expected value received");
130 QObject::connect(&m_process, qOverload<int, QProcess::ExitStatus>(&QProcess::finished),
131 [](
int code, QProcess::ExitStatus status) {
132 qDebug() <<
"Server process exited" << (status ?
"abnormally" :
"normally")
133 <<
"with exit code" << code;
135 m_process.start(QCoreApplication::applicationDirPath() +
"/tests_sharedstatetestserver", QStringList());
136 if (!m_process.waitForStarted()) { qDebug() <<
"Server failed to start"; }
141 m_process.disconnect();
143 m_process.waitForFinished();
150 void CTestSharedState::dbusScalar()
152 QDBusConnection connection = QDBusConnection::sessionBus();
153 if (!connection.isConnected()) { QSKIP(
"No session bus"); }
158 bool ok = qWaitFor([&] {
return dataLink.
watcher()->isConnected(); });
159 QVERIFY2(ok,
"Connection failed");
161 CTestScalarObserver observer(
this);
162 CTestScalarMutator mutator(
this);
163 observer.initialize(&dataLink);
164 mutator.initialize(&dataLink);
166 ok = qWaitFor([&] {
return observer.value() == 42; });
167 QVERIFY2(ok,
"expected value received");
169 QVERIFY2(observer.value() == 42,
"still has expected value");
171 mutator.setValue(69);
172 ok = qWaitFor([&] {
return observer.value() == 69; });
173 QVERIFY2(ok,
"expected value received");
175 QVERIFY2(observer.value() == 69,
"still has expected value");
178 void CTestSharedState::dbusList()
180 QDBusConnection connection = QDBusConnection::sessionBus();
181 if (!connection.isConnected()) { QSKIP(
"No session bus"); }
186 bool ok = qWaitFor([&] {
return dataLink.
watcher()->isConnected(); });
187 QVERIFY2(ok,
"Connection failed");
189 CTestListObserver observer(
this);
190 CTestListMutator mutator(
this);
191 observer.initialize(&dataLink);
192 mutator.initialize(&dataLink);
194 observer.setFilter({});
195 ok = qWaitFor([&] {
return observer.allValues() == QList<int> { 1, 2, 3, 4, 5, 6 }; });
196 QVERIFY2(ok,
"expected value received");
198 QVERIFY2(observer.allValues() == QList<int>({ 1, 2, 3, 4, 5, 6 }),
"still has expected value");
200 observer.allValues() = {};
201 observer.setFilter({ 1 });
202 ok = qWaitFor([&] {
return observer.allValues() == QList<int> { 1, 3, 5 }; });
203 QVERIFY2(ok,
"expected value received");
205 mutator.addElement(7);
206 ok = qWaitFor([&] {
return observer.allValues() == QList<int> { 1, 3, 5, 7 }; });
207 QVERIFY2(ok,
"expected value received");
209 QVERIFY2(observer.allValues() == QList<int>({ 1, 3, 5, 7 }),
"still has expected value");
216 #include "testsharedstate.moc"
DBus implementation classes tests.
A promise-based interface to QFuture, similar to std::promise for std::future.
QFuture< T > future()
Return a future that can be used to access the result.
void setResult(const T &value)
Set the result value that will be made available through the future.
A transport mechanism using signals and slots distributed by DBus.
void initializeRemote(const QDBusConnection &connection, const QString &service)
Initialize on client side.
A transport mechanism using signals and slots in the local process.
CDataLinkConnectionWatcher * watcher()
Get a connection status watcher.
@ Server
What server are you on?
#define SWIFT_SERVICENAME
Service name of DBus service.
Utilities for sharing state between multiple objects.
Free functions in swift::misc.
void registerMetadata()
Register all relevant metadata in Misc.
SWIFTTEST_MAIN(MiscTest::CTestSharedState)
main