#include "test.h" #include "core/polkittqt1-authority.h" #include "agent/polkittqt1-agent-session.h" #include "core/polkittqt1-details.h" #include #include #include #include #include using namespace PolkitTQt1; using namespace PolkitTQt1::Agent; void wait() { for (int i = 0; i < 100; i++) { usleep(100); TQCoreApplication::processEvents(); } } void TestAuth::test_Auth_checkAuthorization() { // This needs the file org.tqt.policykit.examples.policy from examples to be installed UnixProcessSubject process(TQCoreApplication::applicationPid()); Authority::Result result; // Check if this method returns good authorization results Authority *authority = Authority::instance(); result = authority->checkAuthorizationSync("org.tqt.policykit.examples.kick", process, Authority::None); TQCOMPARE(result, Authority::No); TQVERIFY(!authority->hasError()); result = authority->checkAuthorizationSync("org.tqt.policykit.examples.cry", process, Authority::None); TQCOMPARE(result, Authority::Yes); TQVERIFY(!authority->hasError()); result = authority->checkAuthorizationSync("org.tqt.policykit.examples.bleed", process, Authority::None); TQCOMPARE(result, Authority::Challenge); TQVERIFY(!authority->hasError()); // Now we try async methods TQSignalSpy spy(authority, SIGNAL(checkAuthorizationFinished(PolkitTQt1::Authority::Result))); // Call asynchronous checkAuthorization authority->checkAuthorization("org.tqt.policykit.examples.kick", process, Authority::None); // Give the polkit time to obtain the result and emit the signal with it wait(); // Test if the signal was emitted TQCOMPARE(spy.count(), 1); // Test the result result = qVariantValue (spy.takeFirst()[0]); TQCOMPARE(result, Authority::No); TQVERIFY(!authority->hasError()); spy.clear(); // Let's test the cancellability authority->checkAuthorization("org.tqt.policykit.examples.kick", process, Authority::None); authority->checkAuthorizationCancel(); // Wait and check if the signal arrieved wait(); TQCOMPARE(spy.count(), 0); // Check if it can cancel user authentication dialog authority->checkAuthorization("org.tqt.policykit.examples.bleed", process, Authority::AllowUserInteraction); // Show it for second sleep(1); // And now kill it authority->checkAuthorizationCancel(); TQVERIFY(!authority->hasError()); // But how to test if it was successful? tqWarning() << "You should see an authentication dialog for a short period."; } void TestAuth::test_Auth_enumerateActions() { // This needs the file org.tqt.policykit.examples.policy from examples to be installed ActionDescription::List list = Authority::instance()->enumerateActionsSync(); TQVERIFY(!Authority::instance()->hasError()); // Check whether enumerateAction returns at least example actions int count = 0; Q_FOREACH(const ActionDescription &ad, list) { if ((ad.actionId() == "org.tqt.policykit.examples.kick") || (ad.actionId() == "org.tqt.policykit.examples.cry") || (ad.actionId() == "org.tqt.policykit.examples.bleed")) count++; } TQCOMPARE(count, 3); // Test asynchronous version as well list.clear(); count = 0; TQSignalSpy spy(Authority::instance(), SIGNAL(enumerateActionsFinished(PolkitTQt1::ActionDescription::List))); Authority::instance()->enumerateActions(); wait(); TQCOMPARE(spy.count(), 1); list = qVariantValue (spy.takeFirst()[0]); TQVERIFY(!Authority::instance()->hasError()); Q_FOREACH(const ActionDescription &ad, list) { if ((ad.actionId() == "org.tqt.policykit.examples.kick") || (ad.actionId() == "org.tqt.policykit.examples.cry") || (ad.actionId() == "org.tqt.policykit.examples.bleed")) count++; } TQCOMPARE(count, 3); // Test cancelling the enumeration spy.clear(); Authority::instance()->enumerateActions(); Authority::instance()->enumerateActionsCancel(); wait(); TQCOMPARE(spy.count(), 0); TQVERIFY(!Authority::instance()->hasError()); } void TestAuth::test_Identity() { // Get real name and id of current user and group struct passwd *userinfo = getpwuid(getuid()); TQString userName = userinfo->pw_name; unsigned int userId = userinfo->pw_uid; unsigned int groupId = userinfo->pw_gid; // Try to create UnixUser from username UnixUserIdentity user(userName); TQVERIFY(user.identity()); // Create generic Identity from UnixUser via string representation Identity id = Identity::fromString(user.toString()); // Compare obtained uid with real uid TQCOMPARE(id.toUnixUserIdentity().uid(), userId); // Create generic Identity from UnixGroup via string representation UnixGroupIdentity group(groupId); TQVERIFY(group.identity()); id = Identity::fromString(group.toString()); TQCOMPARE(id.toUnixGroupIdentity().gid(), groupId); // Test setting gid to another value group.setGid(9999U); id = Identity::fromString(group.toString()); TQCOMPARE(id.toUnixGroupIdentity().gid(), 9999U); } void TestAuth::test_Authority() { Authority *authority = Authority::instance(); TQVERIFY(authority); TQVERIFY(!authority->hasError()); // Verify emiting of the signals TQSignalSpy spy(authority, SIGNAL(consoleKitDBChanged())); TQDBusMessage msg = TQDBusMessage::createMethodCall("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", "OpenSession"); TQDBusMessage reply = TQDBusConnection::systemBus().call(msg); TQString cookie; cookie = qVariantValue (reply.arguments()[0]); msg = TQDBusMessage::createMethodCall("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", "CloseSession"); msg.setArguments(TQList () << cookie); TQDBusConnection::systemBus().call(msg); // FIXME: Emitting consoleKitDBChanged is not working now tqWarning() << "Emitting consoleKitDBChanged is not working now, test will be skipped"; //TQVERIFY(spy.count() > 0); TQVERIFY(!authority->hasError()); // configChanged signal from authority requires changing some policy files // and it would require user interaction (typing the password) // so this is not covered by this test } void TestAuth::test_Subject() { // Get pid of this appication tqint64 pid = TQCoreApplication::applicationPid(); // Create unix process for it UnixProcessSubject *process = new UnixProcessSubject(pid); // Test if pid doesn't differ TQCOMPARE(process->pid(), pid); // Serialize and deserialize subject //Subject *subject = Subject::fromString(process->toString()); // and try it //TQCOMPARE(((UnixProcess *) subject)->pid(), pid); delete process; } void TestAuth::test_Session() { /* UnixUser user(getuid()); Session *session = new Session(&user, "/org/freedesktop/ConsoleKit/Session2"); TQSignalSpy spy_completed(session, SIGNAL(completed(bool))); TQSignalSpy spy_request(session, SIGNAL(request(TQString,bool))); TQSignalSpy spy_error(session, SIGNAL(showError(TQString))); TQSignalSpy spy_info(session, SIGNAL(showInfo(TQString))); session->initiate(); session->response("aaa"); // Canceling should emit the "completed" signal session->cancel(); TQCOMPARE(spy_completed.count(), 1); //UnixProcess *process = new UnixProcess(TQCoreApplication::applicationPid()); //Authority::instance()->checkAuthorization("org.tqt.policykit.examples.kick", process, Authority::None); tqDebug() << "COMPLETED:" << spy_completed.count(); tqDebug() << "REQUEST:" << spy_request.count(); tqDebug() << "ERROR:" << spy_error.count(); tqDebug() << "INFO:" << spy_info.count(); */ } void TestAuth::test_Details() { Details details; details.insert("1", "aaa"); details.insert("2", "bbb"); details.insert("3", "ccc"); details.insert("4", "ddd"); TQCOMPARE(details.lookup("1"), TQString("aaa")); TQCOMPARE(details.lookup("2"), TQString("bbb")); TQCOMPARE(details.lookup("3"), TQString("ccc")); TQCOMPARE(details.lookup("4"), TQString("ddd")); TQList list = details.keys(); TQVERIFY(list.contains("1")); TQVERIFY(list.contains("2")); TQVERIFY(list.contains("3")); TQVERIFY(list.contains("4")); } TQTEST_MAIN(TestAuth)