You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
polkit-tqt/test/test.cpp

236 lines
8.7 KiB

#include "test.h"
#include "core/polkittqt1-authority.h"
#include "agent/polkittqt1-agent-session.h"
#include "core/polkittqt1-details.h"
#include <stdlib.h>
#include <unistd.h>
#include <pwd.h>
#include <TQtDBus/TQDBusMessage>
#include <TQtDBus/TQDBusConnection>
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<PolkitTQt1::Authority::Result> (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<PolkitTQt1::ActionDescription::List> (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<TQString> (reply.arguments()[0]);
msg = TQDBusMessage::createMethodCall("org.freedesktop.ConsoleKit",
"/org/freedesktop/ConsoleKit/Manager",
"org.freedesktop.ConsoleKit.Manager",
"CloseSession");
msg.setArguments(TQList<TQVariant> () << 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<TQString> list = details.keys();
TQVERIFY(list.contains("1"));
TQVERIFY(list.contains("2"));
TQVERIFY(list.contains("3"));
TQVERIFY(list.contains("4"));
}
TQTEST_MAIN(TestAuth)