/* * Copyright 2013-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Ying-Chun Liu (PaulLiu) * Lukáš Tinkl */ #include #include #include #include #include #include #include #include #include #include #include "dbusunitysessionservice.h" enum class Action : unsigned { LOGOUT = 0, SHUTDOWN, REBOOT, NONE }; class SessionBackendTest : public QObject { Q_OBJECT private Q_SLOTS: void initTestCase() { dbusUnitySession = new QDBusInterface ("com.canonical.Unity", "/com/canonical/Unity/Session", "com.canonical.Unity.Session", QDBusConnection::sessionBus()); } void testUnitySessionLogoutRequested_data() { QTest::addColumn("method"); QTest::addColumn("signal"); QTest::newRow("Logout") << "RequestLogout" << "LogoutRequested(bool)"; QTest::newRow("Reboot") << "RequestReboot" << "RebootRequested(bool)"; QTest::newRow("Shutdown") << "RequestShutdown" << "ShutdownRequested(bool)"; QTest::newRow("PromptLock") << "PromptLock" << "LockRequested()"; } void testUnitySessionLogoutRequested() { QFETCH(QString, method); QFETCH(QString, signal); DBusUnitySessionService dbusUnitySessionService; QCoreApplication::processEvents(); // to let the service register on DBus // .. because QSignalSpy checks the signal signature like this: "if (((aSignal[0] - '0') & 0x03) != QSIGNAL_CODE)" QSignalSpy spy(&dbusUnitySessionService, qPrintable(signal.prepend(QSIGNAL_CODE))); QDBusReply reply = dbusUnitySession->call(method); QCOMPARE(reply.isValid(), true); QCOMPARE(spy.count(), 1); } void testGnomeSessionWrapper_data() { QTest::addColumn("method"); QTest::addColumn("signal"); QTest::newRow("Logout") << (uint)Action::LOGOUT << "LogoutRequested(bool)"; QTest::newRow("Shutdown") << (uint)Action::SHUTDOWN << "ShutdownRequested(bool)"; QTest::newRow("Reboot") << (uint)Action::REBOOT << "RebootRequested(bool)"; } void testGnomeSessionWrapper() { QFETCH(uint, method); QFETCH(QString, signal); DBusUnitySessionService dbusUnitySessionService; QCoreApplication::processEvents(); // to let the service register on DBus // Spy on the given signal on the /com/canonical/Unity/Session object // as proof we are actually calling the actual method. // .. because QSignalSpy checks the signal signature like this: "if (((aSignal[0] - '0') & 0x03) != QSIGNAL_CODE)" QSignalSpy spy(&dbusUnitySessionService, qPrintable(signal.prepend(QSIGNAL_CODE))); DBusGnomeSessionManagerWrapper dbusGnomeSessionManagerWrapper; QCoreApplication::processEvents(); // to let the service register on DBus QDBusInterface dbusGnomeSessionWrapper("com.canonical.Unity", "/org/gnome/SessionManager/EndSessionDialog", "org.gnome.SessionManager.EndSessionDialog", QDBusConnection::sessionBus()); QCOMPARE(dbusGnomeSessionWrapper.isValid(), true); // Set the QVariant as a QList type QDbusList var; QVariant inhibitors; inhibitors.setValue(var); QDBusReply reply = dbusGnomeSessionWrapper.call("Open", method, (unsigned)0, (unsigned)0, inhibitors); QCOMPARE(reply.isValid(), true); // Make sure we see the signal being emitted. QCOMPARE(spy.count(), 1); } void testUserName() { DBusUnitySessionService dbusUnitySessionService; QCoreApplication::processEvents(); // to let the service register on DBus QCOMPARE(dbusUnitySessionService.UserName(), QString::fromUtf8(qgetenv("USER"))); } void testRealName() { DBusUnitySessionService dbusUnitySessionService; QCoreApplication::processEvents(); // to let the service register on DBus QDBusInterface accIface("org.freedesktop.Accounts", "/org/freedesktop/Accounts", "org.freedesktop.Accounts", QDBusConnection::systemBus()); QVERIFY(accIface.isValid()); QDBusReply userPath = accIface.asyncCall("FindUserById", static_cast(geteuid())); if (!userPath.isValid()) { QFAIL("Could not get user path in Account Service"); } QDBusInterface userAccIface("org.freedesktop.Accounts", userPath.value().path(), "org.freedesktop.Accounts.User", QDBusConnection::systemBus()); QCOMPARE(dbusUnitySessionService.RealName(), userAccIface.property("RealName").toString()); } void testLogin1Capabilities() { DBusUnitySessionService dbusUnitySessionService; QDBusInterface login1face("org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", QDBusConnection::systemBus()); QCoreApplication::processEvents(); // to let the services register on DBus QCOMPARE(dbusUnitySessionService.CanHibernate(), (login1face.call("CanHibernate").arguments().first().toString() != "no")); QCOMPARE(dbusUnitySessionService.CanSuspend(), (login1face.call("CanSuspend").arguments().first().toString() != "no")); QCOMPARE(dbusUnitySessionService.CanReboot(), (login1face.call("CanReboot").arguments().first().toString() != "no")); QCOMPARE(dbusUnitySessionService.CanShutdown(), (login1face.call("CanPowerOff").arguments().first().toString() != "no")); QCOMPARE(dbusUnitySessionService.CanHybridSleep(), (login1face.call("CanHybridSleep").arguments().first().toString() != "no")); } // void testLock() { // DBusUnitySessionService dbusUnitySessionService; // DBusScreensaverWrapper saverIface; // QDBusInterface saverCompatIface("org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver", QDBusConnection::sessionBus()); // QSignalSpy spy(&saverIface, &DBusScreensaverWrapper::ActiveChanged); // QCoreApplication::processEvents(); // to let the service register on DBus // QTRY_COMPARE(saverCompatIface.isValid(), true); // qDebug() << "Locking up..."; // dbusUnitySessionService.Lock(); // QTRY_COMPARE(spy.count(), 1); // QList arguments = spy.takeFirst(); // take the first signal // QVERIFY(arguments.at(0).toBool() == true); // verify the first argument // // verify the session is locked // QCOMPARE(saverIface.GetActive(), true); // sleep(5); // qDebug() << "Screensaver has been active for" << saverIface.GetActiveTime() << "seconds"; // qDebug() << "Session has been idle for" << saverIface.GetSessionIdleTime() << "seconds"; } private: QDBusInterface *dbusUnitySession; }; QTEST_GUILESS_MAIN(SessionBackendTest) #include "sessionbackendtest.moc"