activityfw/activityserviceplugin/tsrc/unittest_applicationluncher/src/unittest_applicationluncher.cpp
author Jaakko Haukipuro (Nokia-MS/Oulu) <Jaakko.Haukipuro@nokia.com>
Thu, 16 Sep 2010 12:11:40 +0100
changeset 117 c63ee96dbe5f
permissions -rw-r--r--
Missing activityfw and taskswitcher components - fix for Bug 3670

/** 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)