/* * 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()"; QTest::newRow("Lock") << "Lock" << "LockRequested()"; QTest::newRow("LockLightDM") << "Lock" << "Locked()"; // happens when we lock LightDM, only for Lock() } 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); QTRY_COMPARE(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 testUnlockFromLogind() { DBusUnitySessionService dbusUnitySessionService; QCoreApplication::processEvents(); // to let the service register on DBus QDBusInterface iface("org.freedesktop.login1", "/logindsession", "org.freedesktop.login1.Session"); QVERIFY(iface.isValid()); QSignalSpy spy(&dbusUnitySessionService, SIGNAL(Unlocked())); QCOMPARE(iface.call("MockEmitUnlock").errorMessage(), QString()); QTRY_COMPARE(spy.count(), 1); } void testUserName() { DBusUnitySessionService dbusUnitySessionService; QCoreApplication::processEvents(); // to let the service register on DBus QProcess * proc = new QProcess(this); proc->start("id -un", QProcess::ReadOnly); proc->waitForFinished(); const QByteArray out = proc->readAll().trimmed(); QCOMPARE(dbusUnitySessionService.UserName(), QString::fromUtf8(out)); } 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()); if (accIface.isValid()) { QDBusReply userPath = accIface.asyncCall("FindUserById", static_cast(geteuid())); if (userPath.isValid()) { QDBusInterface userAccIface("org.freedesktop.Accounts", userPath.value().path(), "org.freedesktop.Accounts.User", QDBusConnection::systemBus()); QCOMPARE(dbusUnitySessionService.RealName(), userAccIface.property("RealName").toString()); } } } private: QDBusInterface *dbusUnitySession; }; QTEST_GUILESS_MAIN(SessionBackendTest) #include "sessionbackendtest.moc"