activityfw/activityserviceplugin/tsrc/unittest_applicationluncher/src/unittest_applicationluncher.cpp
changeset 117 c63ee96dbe5f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/activityfw/activityserviceplugin/tsrc/unittest_applicationluncher/src/unittest_applicationluncher.cpp	Thu Sep 16 12:11:40 2010 +0100
@@ -0,0 +1,199 @@
+/** 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)