--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commonuisupport/uikon/test/tpackage/TPACKAGEStarter.CPP Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,200 @@
+// Copyright (c) 2005-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:
+// This test aims to test embedding feature of the application. The dll
+// launches tpackage application, all messages go via client-server
+// architecture. Server leaves on the Testpackage step side and is started
+// in the doTestStepL() function, client places on the tpackage application
+// side. Server's thread creates and run active scheduler in order to maintain
+// the active objects.\n
+// It is relevant that logger uses the same thread in which it was created,
+// therefore when server receives EMessageServSetFromString message from the
+// client it activates active object (CMessageActive) in order to output
+// log buffer into the file in the same thread as lives logger.
+// The CMessageActive class is activated by calling function
+// CMessageActive::RequestForTheMessageOutput(TInt aCode),
+// iStatus sets to aCode value.\n
+// When client completes its work, it sends message EMessageServStop and
+// server stops active sheduler so server's thread might be closed.\n
+//
+//
+
+/**
+ @file
+ @internalComponent - Internal Symbian test code
+*/
+
+
+
+#include <coecntrl.h>
+#include <coeccntx.h>
+#include <eikdoc.h>
+#include <apgcli.h>
+#include <apacmdln.h>
+#include <ecom/ecom.h>
+
+#include "TpackageStarter.h"
+#include "messageservserver.h"
+#include "messageservclient.h"
+
+#define FORCE_AUTO
+
+CTestPackageStep::CTestPackageStep()
+/**
+ Constructor
+ */
+ {
+ SetTestStepName(KTestPackageStep);
+ }
+
+CTestPackageStep::~CTestPackageStep()
+/**
+ Destructor
+ */
+ {
+ }
+
+/**
+ @SYMTestCaseID UIF-TPACKAGESTARTER-doTestStepL
+
+ @SYMPREQ
+
+ @SYMTestCaseDesc This test aims to test embedding feature of the application.
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions The dll creates a thread and starts a Message server. Once the
+ message server is up and ready it launches the test client application,
+ tpackage. The server installs and starts an active scheduler to service
+ request messages received from the client and to log the information gathered
+ from the request messages.When the server receives EMessageServSetFromString
+ message from the client, it activates CMessageActive active object in order
+ to output the log buffer. When client completes its work, it sends message
+ EMessageServStop and server stops active sheduler so that server's thread
+ might be closed.
+
+ @SYMTestExpectedResults All messages send by the client should be processed by
+ the server and outputted in the log file.
+
+ */
+TVerdict CTestPackageStep::doTestStepL() // main function called by E32
+ {
+ __UHEAP_MARK;
+ SetTestStepID(_L("UIF-TPACKAGESTARTER-doTestStepL"));
+ CActiveScheduler* theSheduler = new CActiveScheduler;
+ CActiveScheduler::Install(theSheduler);
+
+ iMessage = CMessageActive::NewL();
+ iMessage->iStep = this;
+
+ _LIT(KPackageAppFileName,"z:\\sys\\bin\\tpackage.exe");
+
+ CApaCommandLine* cmdLine=CApaCommandLine::NewLC();
+ cmdLine->SetCommandL(EApaCommandViewActivate);
+ cmdLine->SetExecutableNameL(KPackageAppFileName);
+
+ StartThread();
+
+ RApaLsSession ls;
+ User::LeaveIfError(ls.Connect());
+ CleanupClosePushL(ls);
+ TInt err = ls.StartApp(*cmdLine);
+ if (err != KErrNone)
+ {
+ TEST(EFalse);
+ INFO_PRINTF1(_L("Failed to start application"));
+ // If there is a problem starting the app we have to stop the
+ // message server
+ RMessageServ serv;
+ TInt theRes = serv.Connect();
+ if(theRes == KErrNone)
+ {
+ serv.Stop();
+ serv.Close();
+ // Now make sure we wait until the server has stopped
+ // Not sure this is necessary but safer
+ FOREVER
+ {
+ TFindServer findCountServer(KMessageServerName);
+ TFullName name;
+ if (findCountServer.Next(name)!=KErrNone)
+ {
+ break;
+ }
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy(&ls);
+
+ CleanupStack::PopAndDestroy(cmdLine);
+
+ CActiveScheduler::Start();
+
+
+ delete theSheduler;
+ delete iMessage;
+ iMessage = NULL;
+ REComSession::FinalClose();
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ __UHEAP_MARKEND;
+
+ return TestStepResult();
+ }
+
+
+/**
+ Auxiliary function for TestCaseID TPACKAGESTARTER-doTestStepL
+
+ This method creates the server thread by invoking RThread::Create() and calls
+ CMessageServServer::ThreadFunction() to start the Message Server.
+
+ */
+TInt CTestPackageStep::StartThread()
+ {
+ TInt res=KErrNone;
+ // create server - if one of this name does not already exist
+ TFindServer findCountServer(KMessageServerName);
+ TFullName name;
+ if (findCountServer.Next(name)!=KErrNone) // we don't exist already
+ {
+ RThread thread;
+ semaphore.CreateLocal(0); // create a semaphore so we know when thread finished
+ res=thread.Create(KMessageServerName, // create new server thread
+ CMessageServServer::ThreadFunction, // thread's main function
+ KDefaultStackSize,
+ KDefaultHeapSize,
+ KDefaultHeapSize,
+ this // passed as TAny* argument to thread function
+ );
+
+ if (res==KErrNone) // thread created ok - now start it going
+ {
+ thread.SetPriority(EPriorityNormal);
+ thread.Resume(); // start it going
+ semaphore.Wait(); // wait until it's initialized
+ thread.Close(); // we're no longer interested in the other thread
+ }
+ else // thread not created ok
+ {
+ thread.Close(); // therefore we've no further interest in it
+ }
+
+ semaphore.Close();
+ }
+
+ return res;
+ }
+