messagingfw/msgtest/tools/autorun/src/AUTORUN.CPP
changeset 22 bde600d88860
parent 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgtest/tools/autorun/src/AUTORUN.CPP	Fri Jun 04 10:32:16 2010 +0100
@@ -0,0 +1,148 @@
+// Copyright (c) 2000-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 <e32test.h>
+#include <f32file.h>
+
+#include <msvapi.h>
+
+_LIT(KMsvServerPattern, "!MsvServer*");
+RTest test(_L("AutoRun"));
+
+//
+
+
+LOCAL_C void WaitForServerClose()
+	{
+	// Wait 10 seconds for server to exit
+	TInt count = 10;
+	while(count--)
+		{
+		TFullName name;
+		TFindProcess find(KMsvServerPattern);
+		if (find.Next(name) != KErrNone)
+			return;
+		else if (count <= 0)
+			{
+			RProcess process;
+			process.Open(find);
+			process.Terminate(KErrGeneral);
+			process.Close();
+			}
+		User::After(1000000);
+		}
+	}
+
+LOCAL_C void LaunchAndWaitL(const TDesC& file)
+	{
+	RProcess p;
+	test(p.Create(file, KNullDesC) == KErrNone);
+
+	TRequestStatus status = KRequestPending;
+	p.Logon(status);
+	p.Resume();
+	User::WaitForRequest(status);
+	p.Close();
+
+	WaitForServerClose();	
+	}
+
+LOCAL_C void ScanDirL(RFs& aFs, const TDesC& aDir)
+	{
+	User::After(1000000);
+
+	TParse parse;
+	parse.Set(_L("t_*.exe"), &aDir, NULL);
+	TPtrC spec(parse.FullName());
+
+	test.Start(parse.DriveAndPath());
+	TFindFile find(aFs);
+	CDir* dir;
+	
+	if (!find.FindWildByPath(parse.FullName(), NULL, dir))
+		{
+		CleanupStack::PushL(dir);
+
+		for(int i = 0; i < dir->Count(); i++)
+			{
+			parse.Set((*dir)[i].iName, &spec, NULL);
+
+			if (i == 0)
+				test.Start(parse.FullName());
+			else
+				test.Next(parse.FullName());
+
+			LaunchAndWaitL(parse.FullName());
+			}
+
+		CleanupStack::PopAndDestroy(); // dir
+		}
+	test.End();
+	}
+
+LOCAL_C void ScanStartL(RFs aFs, const TDesC& aPath)
+	{
+	// Scan the top-level directory for test executables
+	ScanDirL(aFs, aPath);
+
+	// Setup directory scan
+	CDirScan* scan = CDirScan::NewLC(aFs);
+	scan->SetScanDataL(aPath, KEntryAttDir|KEntryAttMatchExclusive, ESortNone, CDirScan::EScanUpTree);
+
+	// Iterate through all the directories
+	FOREVER
+		{
+		// Get next directory list
+		CDir* dir = NULL;
+		TRAPD(error, scan->NextL(dir));
+		if (error || !dir)
+			break;
+		
+		delete dir;
+		ScanDirL(aFs, scan->FullPath());
+		};
+	CleanupStack::PopAndDestroy(); // scan
+	}
+
+LOCAL_C void doMainL()
+	{
+	CActiveScheduler::Install(new(ELeave)CActiveScheduler);
+
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+
+	ScanStartL(fs, RProcess().FileName());
+	CleanupStack::PopAndDestroy(); // fs
+
+	delete CActiveScheduler::Current();
+	}
+
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+	__ASSERT_ALWAYS(cleanup, User::Invariant());
+	TRAPD(ret,doMainL());		
+	test(ret == KErrNone);
+	test.Close();
+	delete cleanup;	
+	__UHEAP_MARKEND;
+	return(KErrNone);
+	}
+
+
+