commonuisupport/uikon/test/tpackage/TPACKAGEStarter.CPP
changeset 0 2f259fa3e83a
--- /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;
+    }
+