activityfw/activityserviceplugin/tsrc/unittest_applicationluncher/src/unittest_applicationluncher.cpp
/** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
#include "unittest_applicationluncher.h"
#include <e32std.h>
#include <apgcli.h>
#include <apacmdln.h>
#include <apgtask.h>
#include <APGWGNAM.H>
#include <eikenv.h>
#include <AknDef.h>
#include <QtTest/QtTest>
#include <QString>
#include <QSystemSemaphore>
#include <qvaluespacesubscriber.h>
#include "tstestutils.h"
#include "afactivities_global.h"
#include "aflauncher.h"
const TUid KIconApplicationUid = {0xEd0b4e47};
const TUid KActivityApplicationUid = {0xEBADF00D};
const TUid KInvalidUid = {0xDEADBEEF};
const TUid KCorruptedApplicationUid = {0xE5C3B14E};
namespace {
const char KIconApplicationName[] = "appwithicon";
}
QTM_USE_NAMESPACE
// ---------------------------------------------------------------------------
// Test cases
// ---------------------------------------------------------------------------
//
void TestApplicationLuncher::initTestCase()
{
QCOMPARE(mWsSession.Connect(), KErrNone);
}
void TestApplicationLuncher::cleanupTestCase()
{
mWsSession.Close();
}
void TestApplicationLuncher::testIsRunning()
{
AfLauncher launcher;
QVERIFY(!launcher.isRunning(KIconApplicationUid.iUid));
quint64 iconAppId;
QVERIFY(TsTestUtils::startApplication(KIconApplicationName, iconAppId));
QVERIFY(launcher.isRunning(KIconApplicationUid.iUid));
QVERIFY(TsTestUtils::closeApplication(iconAppId));
QVERIFY(!launcher.isRunning(KIconApplicationUid.iUid));
}
void TestApplicationLuncher::testStartApp()
{
QSystemSemaphore semaphore("PublishActivityApp");
AfLauncher launcher;
QVERIFY(!launcher.isRunning(KActivityApplicationUid.iUid));
launcher.startApplication(KActivityApplicationUid.iUid, QString());
QVERIFY(semaphore.acquire());
QVERIFY(TsTestUtils::closeApplication(KActivityApplicationUid));
QVERIFY(!launcher.isRunning(KActivityApplicationUid.iUid));
}
void TestApplicationLuncher::testbringToForeground()
{
AfLauncher launcher;
quint64 iconAppId;
QVERIFY(TsTestUtils::startApplication(KIconApplicationName, iconAppId));
QVERIFY(launcher.isRunning(KIconApplicationUid.iUid));
QVERIFY(sendToBackground(KIconApplicationUid));
QVERIFY(getForegroundAppUid() != KIconApplicationUid);
QTest::qWait(3000); // for some reason if there is no timeout, the test application will restart itself after kill
launcher.bringToForeground(KIconApplicationUid.iUid);
QVERIFY(getForegroundAppUid() == KIconApplicationUid);
QTest::qWait(3000); // for some reason if there is no timeout, the test application will restart itself after kill
QVERIFY(TsTestUtils::closeApplication(iconAppId));
QVERIFY(!launcher.isRunning(KIconApplicationUid.iUid));
}
// ---------------------------------------------------------------
void TestApplicationLuncher::testLaunchActivity_data()
{
QTest::addColumn<QString>("activityName");
QTest::newRow("normal") << "blahblahblah";
QTest::newRow("special characters") << "asd $&+,/:;=?@ \"<>#%{}|\\^~[]`asd";
}
void TestApplicationLuncher::testLaunchActivity()
{
QSystemSemaphore semaphore("PublishActivityApp");
AfLauncher launcher;
QVERIFY(!launcher.isRunning(KActivityApplicationUid.iUid));
QFETCH(QString, activityName);
launcher.startApplication(KActivityApplicationUid.iUid, buildUri(KActivityApplicationUid, activityName));
semaphore.acquire();
QCOMPARE(QValueSpaceSubscriber("/PublishActivityApp/ActivityName").value().toString(), activityName);
QVERIFY(TsTestUtils::closeApplication(KActivityApplicationUid));
QVERIFY(!launcher.isRunning(KIconApplicationUid.iUid));
}
// ---------------------------------------------------------------
void TestApplicationLuncher::testGracefulHandlingOfInvalidUid()
{
AfLauncher launcher;
launcher.startApplication(KInvalidUid.iUid, QString());
}
void TestApplicationLuncher::testGracefulHandlingOfCorruptedApplication()
{
AfLauncher launcher;
// We're going to test Launcher behavior when someone tries to start
// application with missing executable file
launcher.startApplication(KCorruptedApplicationUid.iUid, QString());
}
// ---------------------------------------------------------------------------
// Helper methods
// ---------------------------------------------------------------------------
//
QUrl TestApplicationLuncher::buildUri(const TUid &uid, const QString &activityName)
{
QUrl uri;
uri.setScheme("appto");
uri.setHost(QString("%1").arg(static_cast<uint>(uid.iUid), 8, 16, QChar('0')));
uri.addQueryItem(Af::KActivityUriNameKey, activityName);
return uri;
}
bool TestApplicationLuncher::sendToBackground(const TUid &uid)
{
TApaTaskList taskList(mWsSession);
TApaTask task = taskList.FindApp(uid);
bool taskExists = task.Exists();
if (taskExists) {
task.SendToBackground();
}
return taskExists;
}
TUid TestApplicationLuncher::getForegroundAppUid()
{
RWsSession wsSession;
// get all window groups
RArray<RWsSession::TWindowGroupChainInfo> windowGroupList;
CleanupClosePushL(windowGroupList);
User::LeaveIfError(mWsSession.WindowGroupList(0, &windowGroupList));
if (windowGroupList.Count() == 0) {
User::Leave(KErrNotFound);
}
// get uid of first window group
CApaWindowGroupName* windowGroupName = CApaWindowGroupName::NewLC(mWsSession, windowGroupList[0].iId);
TUid foregroundAppUid = windowGroupName->AppUid();
CleanupStack::PopAndDestroy(windowGroupName);
CleanupStack::PopAndDestroy(&windowGroupList);
return foregroundAppUid;
}
QTEST_MAIN(TestApplicationLuncher)