on xenial help sign in
better tests
commitf6cafe155b69416b0f9d4cde2af9d9d642ec1fbb authorNick Dedekind <nick.dedekind@canonical.com> dateFri 17 Apr 2015, 17:39 (11 years ago) parentea46e8e
8 files changed+291−28
tests/plugins/AccountsService/AccountsServer.cpp+23−7 tests/plugins/AccountsService/AccountsServer.h+11−1 tests/plugins/AccountsService/CMakeLists.txt+8 tests/plugins/AccountsService/PropertiesServer.cpp+43−6 tests/plugins/AccountsService/PropertiesServer.h+8−1 tests/plugins/AccountsService/client.cpp+166−7 tests/plugins/AccountsService/interfaces.xml+21 tests/plugins/AccountsService/server.cpp+11−6
tests/plugins/AccountsService/AccountsServer.cpp+23−7
@@ -18,18 +18,34 @@
1818 */
1919
2020#include "AccountsServer.h"
21+#include "PropertiesServer.h"
22+#include <QDBusConnection>
23+#include <QDebug>
2124
22−AccountsServer::AccountsServer(QObject *parent)
25+AccountsServer::AccountsServer(PropertiesServer* propServer, QObject *parent)
2326 : QObject(parent)
27+ , m_propServer(propServer)
2428{
2529}
2630
2731QDBusObjectPath AccountsServer::FindUserByName(const QString &user)
2832{
29− if (user == "testuser") {
30− return QDBusObjectPath("/user");
31− } else {
32− sendErrorReply(QDBusError::InvalidArgs, "Bad user");
33− return QDBusObjectPath("/");
34− }
33+ return QDBusObjectPath(QString("/%1").arg(user));
34+}
35+
36+bool AccountsServer::AddUser(const QString &user)
37+{
38+ QString path(QString("/%1").arg(user));
39+ if (QDBusConnection::sessionBus().objectRegisteredAt(path) == m_propServer)
40+ return true;
41+ return QDBusConnection::sessionBus().registerObject(path, m_propServer);
42+}
43+
44+bool AccountsServer::RemoveUser(const QString &user)
45+{
46+ QString path(QString("/%1").arg(user));
47+ if (QDBusConnection::sessionBus().objectRegisteredAt(path) != m_propServer)
48+ return false;
49+ QDBusConnection::sessionBus().unregisterObject(path);
50+ return true;
3551}
tests/plugins/AccountsService/AccountsServer.h+11−1
@@ -25,15 +25,25 @@
2525#include <QObject>
2626#include <QString>
2727
28+class PropertiesServer;
29+
2830class AccountsServer: public QObject, protected QDBusContext
2931{
3032 Q_OBJECT
3133
3234public:
33− explicit AccountsServer(QObject *parent = 0);
35+ explicit AccountsServer(PropertiesServer *propServer, QObject *parent = 0);
3436
3537public Q_SLOTS:
38+
3639 QDBusObjectPath FindUserByName(const QString &user);
40+
41+ // mock only.
42+ bool AddUser(const QString &user);
43+ bool RemoveUser(const QString &user);
44+
45+private:
46+ PropertiesServer* m_propServer;
3747};
3848
3949#endif
tests/plugins/AccountsService/CMakeLists.txt+8
@@ -11,6 +11,10 @@ endmacro(make_dbus_class)
1111
1212make_dbus_class(Accounts org.freedesktop.Accounts)
1313make_dbus_class(Properties org.freedesktop.DBus.Properties)
14+make_dbus_class(SecurityPrivacy com.ubuntu.touch.AccountsService.SecurityPrivacy)
15+make_dbus_class(Location com.ubuntu.location.providers.here.AccountsService)
16+make_dbus_class(AccountsUser org.freedesktop.Accounts.User)
17+make_dbus_class(AccountsPrivate com.canonical.unity.AccountsService.Private)
1418
1519include_directories(
1620 ${CMAKE_CURRENT_BINARY_DIR}
@@ -21,7 +25,11 @@ add_definitions(-DSM_BUSNAME=sessionBus)
2125
2226add_executable(mock-server
2327 ${CMAKE_CURRENT_BINARY_DIR}/AccountsAdaptor.cpp
28+ ${CMAKE_CURRENT_BINARY_DIR}/AccountsPrivateAdaptor.cpp
29+ ${CMAKE_CURRENT_BINARY_DIR}/AccountsUserAdaptor.cpp
2430 ${CMAKE_CURRENT_BINARY_DIR}/PropertiesAdaptor.cpp
31+ ${CMAKE_CURRENT_BINARY_DIR}/LocationAdaptor.cpp
32+ ${CMAKE_CURRENT_BINARY_DIR}/SecurityPrivacyAdaptor.cpp
2533 server.cpp
2634 AccountsServer.cpp
2735 PropertiesServer.cpp
tests/plugins/AccountsService/PropertiesServer.cpp+43−6
@@ -18,17 +18,22 @@
1818 */
1919
2020#include "PropertiesServer.h"
21+#include "AccountsService.h"
22+
23+// Qt
24+#include <QDebug>
25+#include <QDBusMessage>
2126
2227PropertiesServer::PropertiesServer(QObject *parent)
23− : QObject(parent),
24− edge_demo(true)
28+ : QObject(parent)
2529{
30+ Reset();
2631}
2732
2833QDBusVariant PropertiesServer::Get(const QString &interface, const QString &property)
2934{
30− if (interface == "com.canonical.unity.AccountsService" && property == "demo-edges") {
31− return QDBusVariant(QVariant(edge_demo));
35+ if (m_properties[interface].contains(property)) {
36+ return QDBusVariant(m_properties[interface][property]);
3237 } else {
3338 sendErrorReply(QDBusError::InvalidArgs, "Bad interface or property");
3439 return QDBusVariant(QVariant());
@@ -37,9 +42,41 @@ QDBusVariant PropertiesServer::Get(const QString &interface, const QString &prop
3742
3843void PropertiesServer::Set(const QString &interface, const QString &property, const QDBusVariant &variant)
3944{
40− if (interface == "com.canonical.unity.AccountsService" && property == "demo-edges") {
41− edge_demo = variant.variant().toBool();
45+ QVariant newValue = variant.variant();
46+
47+ if (m_properties[interface].contains(property)) {
48+ QVariant& oldValue = m_properties[interface][property];
49+ if (oldValue != newValue) {
50+ oldValue = newValue;
51+
52+ // Special case for Background file.
53+ if (interface == "org.freedesktop.Accounts.User" && property == "BackgroundFile") {
54+ Q_EMIT Changed();
55+ } else {
56+ QVariantMap propertyChanges;
57+ propertyChanges[property] = newValue;
58+ Q_EMIT PropertiesChanged(interface, propertyChanges, QStringList());
59+
60+ // FIXME: Here to replicate current behaviour
61+ // Not sure why accounts-service is triggering Changed when we're
62+ // emitting PropertyChanges from org.freedesktop.DBus.Properties as well.
63+ Q_EMIT Changed();
64+ }
65+ }
4266 } else {
4367 sendErrorReply(QDBusError::InvalidArgs, "Bad interface or property");
4468 }
4569}
70+
71+void PropertiesServer::Reset()
72+{
73+ m_properties["com.canonical.unity.AccountsService"]["demo-edges"] = false;
74+ m_properties["com.canonical.unity.AccountsService.Private"]["FailedLogins"] = 0;
75+ m_properties["com.ubuntu.touch.AccountsService.SecurityPrivacy"]["StatsWelcomeScreen"] = true;
76+ m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableLauncherWhileLocked"] = true;
77+ m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableIndicatorsWhileLocked"] = true;
78+ m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["PasswordDisplayHint"] = AccountsService::Keyboard;
79+ m_properties["com.ubuntu.location.providers.here.AccountsService"]["LicenseAccepted"] = false;
80+ m_properties["com.ubuntu.location.providers.here.AccountsService"]["LicenseBasePath"] = "";
81+ m_properties["org.freedesktop.Accounts.User"]["BackgroundFile"] = "";
82+}
tests/plugins/AccountsService/PropertiesServer.h+8−1
@@ -37,8 +37,15 @@ public Q_SLOTS:
3737 QDBusVariant Get(const QString &interface, const QString &property);
3838 void Set(const QString &interface, const QString &property, const QDBusVariant &variant);
3939
40+ // mock only.
41+ void Reset();
42+
43+Q_SIGNALS:
44+ void PropertiesChanged(const QString &interface, const QVariantMap &changed, const QStringList &invalid);
45+ void Changed();
46+
4047private:
41− bool edge_demo;
48+ QHash<QString, QVariantMap> m_properties;
4249};
4350
4451#endif
tests/plugins/AccountsService/client.cpp+166−7
@@ -21,39 +21,198 @@
2121#include "AccountsServiceDBusAdaptor.h"
2222#include <QSignalSpy>
2323#include <QTest>
24+#include <QDebug>
25+#include <QDBusReply>
26+
27+template <class T>
28+QVariant dbusVariant(const T& value) { return QVariant::fromValue(QDBusVariant(value)); }
29+
30+#define ASSERT_DBUS_CALL(call) \
31+ { \
32+ QDBusReply<void> reply = call; \
33+ if (!reply.isValid()) QFAIL(reply.error().message().toLatin1()); \
34+ }
2435
2536class AccountsServiceTest : public QObject
2637{
2738 Q_OBJECT
2839
40+public:
41+ AccountsServiceTest(QObject* parent = 0)
42+ : QObject(parent)
43+ , m_userInterface(nullptr)
44+ , m_spy(this, &AccountsServiceTest::propertiesChanged)
45+ {
46+ }
47+
2948private Q_SLOTS:
3049
50+ void init() {
51+ QDBusReply<bool> addReply = QDBusInterface("org.freedesktop.Accounts",
52+ "/org/freedesktop/Accounts",
53+ "org.freedesktop.Accounts").call("AddUser", QTest::currentTestFunction());
54+ QVERIFY(addReply.isValid());
55+ QCOMPARE(addReply.value(), true);
56+
57+ m_userInterface = new QDBusInterface("org.freedesktop.Accounts",
58+ QString("/%1").arg(QTest::currentTestFunction()),
59+ "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus(), this);
60+ QDBusReply<void> resetReply = m_userInterface->call("Reset");
61+ QVERIFY(resetReply.isValid());
62+
63+ QVERIFY(QObject::connect(m_userInterface, SIGNAL(PropertiesChanged(QString, QVariantMap, QStringList)),
64+ this, SIGNAL(propertiesChanged(QString, QVariantMap, QStringList))));
65+ }
66+
67+ void cleanup() {
68+ QDBusReply<bool> reply = QDBusInterface("org.freedesktop.Accounts",
69+ "/org/freedesktop/Accounts",
70+ "org.freedesktop.Accounts").call("RemoveUser", QTest::currentTestFunction());
71+ QVERIFY(reply.isValid());
72+ QCOMPARE(reply.value(), true);
73+
74+ delete m_userInterface;
75+ m_spy.clear();
76+ }
77+
3178 void testInvalids()
3279 {
3380 // Test various invalid calls
3481 AccountsServiceDBusAdaptor session;
3582 QCOMPARE(session.getUserProperty("NOPE", "com.canonical.unity.AccountsService", "demo-edges"), QVariant());
36− QCOMPARE(session.getUserProperty("testuser", "com.canonical.unity.AccountsService", "NOPE"), QVariant());
83+ QCOMPARE(session.getUserProperty(QTest::currentTestFunction(), "com.canonical.unity.AccountsService", "NOPE"), QVariant());
3784 }
3885
3986 void testGetSetServiceDBusAdaptor()
4087 {
4188 AccountsServiceDBusAdaptor session;
42− session.setUserProperty("testuser", "com.canonical.unity.AccountsService", "demo-edges", QVariant(true));
43− QCOMPARE(session.getUserProperty("testuser", "com.canonical.unity.AccountsService", "demo-edges"), QVariant(true));
44− session.setUserProperty("testuser", "com.canonical.unity.AccountsService", "demo-edges", QVariant(false));
45− QCOMPARE(session.getUserProperty("testuser", "com.canonical.unity.AccountsService", "demo-edges"), QVariant(false));
89+ session.setUserProperty(QTest::currentTestFunction(), "com.canonical.unity.AccountsService", "demo-edges", QVariant(true));
90+ QCOMPARE(session.getUserProperty(QTest::currentTestFunction(), "com.canonical.unity.AccountsService", "demo-edges"), QVariant(true));
91+ session.setUserProperty(QTest::currentTestFunction(), "com.canonical.unity.AccountsService", "demo-edges", QVariant(false));
92+ QCOMPARE(session.getUserProperty(QTest::currentTestFunction(), "com.canonical.unity.AccountsService", "demo-edges"), QVariant(false));
4693 }
4794
4895 void testGetSetService()
4996 {
5097 AccountsService session;
51− session.setUser("testuser");
98+ session.setUser(QTest::currentTestFunction());
99+
100+ QCOMPARE(session.demoEdges(), false);
52101 session.setDemoEdges(true);
53102 QCOMPARE(session.demoEdges(), true);
54− session.setDemoEdges(false);
103+
104+ QCOMPARE(session.failedLogins(), (uint)0);
105+ session.setFailedLogins(5);
106+ QCOMPARE(session.failedLogins(), (uint)5);
107+
108+ QCOMPARE(session.hereEnabled(), false);
109+ session.setHereEnabled(true);
110+ QCOMPARE(session.hereEnabled(), true);
111+ }
112+
113+ void testAsynchornousChangeForDemoEdges()
114+ {
115+ AccountsService session;
116+ session.setUser(QTest::currentTestFunction());
117+
55118 QCOMPARE(session.demoEdges(), false);
119+ ASSERT_DBUS_CALL(m_userInterface->call("Set", "com.canonical.unity.AccountsService", "demo-edges", dbusVariant(true)));
120+ QTRY_COMPARE(session.demoEdges(), true);
121+ }
122+
123+ void testAsynchornousChangeForFailedLogins()
124+ {
125+ AccountsService session;
126+ session.setUser(QTest::currentTestFunction());
127+
128+ QCOMPARE(session.failedLogins(), (uint)0);
129+ ASSERT_DBUS_CALL(m_userInterface->asyncCall("Set", "com.canonical.unity.AccountsService.Private", "FailedLogins", dbusVariant(5)));
130+ QTRY_COMPARE(session.failedLogins(), (uint)5);
131+ }
132+
133+ void testAsynchornousChangeForStatsWelcomeScreen()
134+ {
135+ AccountsService session;
136+ session.setUser(QTest::currentTestFunction());
137+
138+ QCOMPARE(session.statsWelcomeScreen(), true);
139+ ASSERT_DBUS_CALL(m_userInterface->asyncCall("Set", "com.ubuntu.touch.AccountsService.SecurityPrivacy", "StatsWelcomeScreen", dbusVariant(false)));
140+ QTRY_COMPARE(session.statsWelcomeScreen(), false);
56141 }
142+
143+ void testAsynchornousChangeForStatsEnableLauncherWhileLocked()
144+ {
145+ AccountsService session;
146+ session.setUser(QTest::currentTestFunction());
147+
148+ QCOMPARE(session.enableLauncherWhileLocked(), true);
149+ ASSERT_DBUS_CALL(m_userInterface->asyncCall("Set", "com.ubuntu.AccountsService.SecurityPrivacy", "EnableLauncherWhileLocked", dbusVariant(false)));
150+ QTRY_COMPARE(session.enableLauncherWhileLocked(), false);
151+ }
152+
153+ void testAsynchornousChangeForStatsEnableIndicatorsWhileLocked()
154+ {
155+ AccountsService session;
156+ session.setUser(QTest::currentTestFunction());
157+
158+ QCOMPARE(session.enableIndicatorsWhileLocked(), true);
159+ ASSERT_DBUS_CALL(m_userInterface->asyncCall("Set", "com.ubuntu.AccountsService.SecurityPrivacy", "EnableIndicatorsWhileLocked", dbusVariant(false)));
160+ QTRY_COMPARE(session.enableIndicatorsWhileLocked(), false);
161+ }
162+
163+ void testAsynchornousChangeForStatsPasswordDisplayHint()
164+ {
165+ AccountsService session;
166+ session.setUser(QTest::currentTestFunction());
167+
168+ QCOMPARE(session.passwordDisplayHint(), AccountsService::Keyboard);
169+ ASSERT_DBUS_CALL(m_userInterface->asyncCall("Set", "com.ubuntu.AccountsService.SecurityPrivacy", "PasswordDisplayHint", dbusVariant(AccountsService::Numeric)));
170+ QTRY_COMPARE(session.passwordDisplayHint(), AccountsService::Numeric);
171+ }
172+
173+ void testAsynchornousChangeForStatsLicenseAccepted()
174+ {
175+ AccountsService session;
176+ session.setUser(QTest::currentTestFunction());
177+
178+ QCOMPARE(session.hereEnabled(), false);
179+ ASSERT_DBUS_CALL(m_userInterface->asyncCall("Set", "com.ubuntu.location.providers.here.AccountsService", "LicenseAccepted", dbusVariant(true)));
180+ QTRY_COMPARE(session.hereEnabled(), true);
181+ }
182+
183+ void testAsynchornousChangeForLicenseBasePath()
184+ {
185+ AccountsService session;
186+ session.setUser(QTest::currentTestFunction());
187+
188+ QCOMPARE(session.hereLicensePath(), QString());
189+ ASSERT_DBUS_CALL(m_userInterface->asyncCall("Set", "com.ubuntu.location.providers.here.AccountsService", "LicenseBasePath", dbusVariant("/")));
190+ QTRY_COMPARE(session.hereLicensePath(), QString("/"));
191+ }
192+
193+ void testAsynchornousChangeForStatsBackgroundFile()
194+ {
195+ AccountsService session;
196+ session.setUser(QTest::currentTestFunction());
197+
198+ QCOMPARE(session.backgroundFile(), QString());
199+ ASSERT_DBUS_CALL(m_userInterface->asyncCall("Set", "org.freedesktop.Accounts.User", "BackgroundFile", dbusVariant("/test/BackgroundFile")));
200+ QTRY_COMPARE(session.backgroundFile(), QString("/test/BackgroundFile"));
201+ }
202+
203+Q_SIGNALS:
204+ void propertiesChanged(const QString &interface, const QVariantMap &changed, const QStringList &invalid);
205+
206+//public Q_SLOTS:
207+// void propertiesChangedSlot(const QString &interface, const QVariantMap &changed, const QStringList &invalid) {
208+// QDBusInterface* pInterface = qobject_cast<QDBusInterface*>(sender());
209+// qDebug() << "propertiesChangedSlot" << pInterface->path() << QTest::currentTestFunction() << changed;
210+// Q_EMIT propertiesChanged(interface, changed, invalid);
211+// }
212+
213+private:
214+ QDBusInterface* m_userInterface;
215+ QSignalSpy m_spy;
57216};
58217
59218QTEST_MAIN(AccountsServiceTest)
tests/plugins/AccountsService/interfaces.xml+21
@@ -10,11 +10,32 @@
1010 <arg name="property" type="s" direction="in" />
1111 <arg name="value" type="v" direction="in" />
1212 </method>
13+ <method name="Reset" />
14+ <signal name="PropertiesChanged">
15+ <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QVariantMap"/>
16+ <arg name="interface" type="s" direction="out" />
17+ <arg name="changed" type="a{sv}" direction="out" />
18+ <arg name="invalid" type="as" direction="out" />
19+ </signal>
1320 </interface>
1421 <interface name="org.freedesktop.Accounts">
1522 <method name="FindUserByName">
1623 <arg name="user" type="s" direction="in" />
1724 <arg name="path" type="o" direction="out" />
1825 </method>
26+ <method name="AddUser">
27+ <arg name="user" type="s" direction="in" />
28+ <arg name="success" type="b" direction="out" />
29+ </method>
30+ <method name="RemoveUser">
31+ <arg name="user" type="s" direction="in" />
32+ <arg name="success" type="b" direction="out" />
33+ </method>
34+ </interface>
35+ <interface name="com.ubuntu.touch.AccountsService.SecurityPrivacy" />
36+ <interface name="com.ubuntu.location.providers.here.AccountsService" />
37+ <interface name="org.freedesktop.Accounts.User">
38+ <signal name="Changed" />
1939 </interface>
40+ <interface name="com.canonical.unity.AccountsService.Private" />
2041</node>
tests/plugins/AccountsService/server.cpp+11−6
@@ -21,24 +21,29 @@
2121#include "AccountsServer.h"
2222#include "PropertiesAdaptor.h"
2323#include "PropertiesServer.h"
24+#include "SecurityPrivacyAdaptor.h"
25+#include "LocationAdaptor.h"
26+#include "AccountsUserAdaptor.h"
27+#include "AccountsPrivateAdaptor.h"
2428#include <QCoreApplication>
2529
2630int main(int argc, char *argv[])
2731{
2832 QCoreApplication a(argc, argv);
2933
30− auto accounts = new AccountsServer();
31− new AccountsAdaptor(accounts);
32−
33− auto props = new PropertiesServer();
34+ auto props = new PropertiesServer(&a);
3435 new PropertiesAdaptor(props);
36+ new AccountsUserAdaptor(props);
3537
38+ auto accounts = new AccountsServer(props, &a);
39+ new AccountsAdaptor(accounts);
40+ new SecurityPrivacyAdaptor(accounts);
41+ new LocationAdaptor(accounts);
42+ new AccountsPrivateAdaptor(accounts);
3643 // We use the session bus for testing. The real plugin uses the system bus
3744 auto connection = QDBusConnection::sessionBus();
3845 if (!connection.registerObject("/org/freedesktop/Accounts", accounts))
3946 return 1;
40− if (!connection.registerObject("/user", props))
41− return 1;
4247 if (!connection.registerService("org.freedesktop.Accounts"))
4348 return 1;
4449