lowlevellibsandfws/pluginfw/Framework/RomOnlyTest/t_romonly.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 02:01:42 +0200
changeset 0 e4d67989cc36
permissions -rw-r--r--
Revision: 201002 Kit: 201005

// Copyright (c) 2003-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 assumes the following setup:
// EComRomOnlyExampleOnC/10009DB6 on C:
// EComRomOnlyExampleOnZ/10009DB5 on Z:
// The tests work by checking that the correct implementations are chosen from two plug-ins, one on C:, one on Z:
// Implementation:		On C:					On Z:								Expected result:
// 10009DCA			version 2				version 1, not ROM-only				ECom selects version 2 on C:
// 10009DCB			version 2, ROM-only	f	version 1, not ROM-only				ECom selects version 1 on Z:
// 10009DCC			version 1				version 2, not ROM-only				ECom selects version 2 on Z:
// 10009DCD			version 2				version 1, ROM-only					ECom selects version 1 on Z:
// 10009DCE			version 1				version 2, ROM-only					ECom selects version 2 on Z:
// 10009DCF			version 3				version 1 & version 2, ROM-only		ECom selects version 2 on Z:
// 
//


#include <e32test.h>
#include <f32file.h>
#include <bautils.h>

#include <ecom/ecom.h>
#include "EComUidCodes.h"
#include "Interface.h" // interface to Plugins
#include "../EcomTestUtils/EcomTestUtils.h"

const TUid KUidInterface = {0x10009DC9};
const TInt KUidImplementationAValue = 0x10009DCA;
const TInt KUidImplementationBValue = 0x10009DCB;
const TInt KUidImplementationCValue = 0x10009DCC;
const TInt KUidImplementationDValue = 0x10009DCD;
const TInt KUidImplementationEValue = 0x10009DCE;
const TInt KUidImplementationFValue = 0x10009DCF;
const TInt KOneSecond = 1000000;

LOCAL_D RTest test(_L("t_romonly.exe"));

_LIT(KEComPluginOnZ, "z:\\RAMOnly\\EComRomOnlyExampleOnC.dll");

_LIT(KEComPluginOnC, "c:\\sys\\bin\\EComRomOnlyExampleOnC.dll");
_LIT(KEComPluginRscOnZ, "z:\\RAMOnly\\EComRomOnlyExampleOnC.rsc");
_LIT(KEComPluginRscOnC, "c:\\resource\\plugins\\EComRomOnlyExampleOnC.rsc");

class TheTest
	{
public:
	void StartTestL();
	};

void CopyFiles()
	{
	TRAPD(err, EComTestUtils::FileManCopyFileL(KEComPluginOnZ, KEComPluginOnC));
	test(err==KErrNone);

	TRAP(err, EComTestUtils::FileManCopyFileL(KEComPluginRscOnZ, KEComPluginRscOnC));
	test(err==KErrNone);
	}

void CleanupFiles()
	{
	TRAPD(err, EComTestUtils::FileManDeleteFileL(KEComPluginOnC));
	TRAP(err, EComTestUtils::FileManDeleteFileL(KEComPluginRscOnC));
	}

/**
@SYMTestCaseID          SYSLIB-ECOM-CT-0665
@SYMTestCaseDesc	    Tests for REComSession::ListImplementationsL() function
@SYMTestPriority 	    High
@SYMTestActions  	    Checks that the correct implementations are chosen from two plug-ins, one on C:, one on Z:
@SYMTestExpectedResults The test must not fail.
@SYMREQ                 REQ0000
*/
LOCAL_C void TestImplementationsL()
	{
	test.Next(_L(" @SYMTestCaseID:SYSLIB-ECOM-CT-0665 TestImplementationsL "));

	// Set up for heap leak checking
	__UHEAP_MARK;

	// and leaking thread handles
	TInt startProcessHandleCount;
	TInt startThreadHandleCount;
	TInt endProcessHandleCount;
	TInt endThreadHandleCount;
	// Test Starts...

	RThread thisThread;
	thisThread.HandleCount(startProcessHandleCount, startThreadHandleCount);

	RImplInfoPtrArray ifArray;

	TEComResolverParams ResolverParams;
	_LIT8(KImplementationTest,"text/wml");
	ResolverParams.SetDataType(KImplementationTest());
	ResolverParams.SetWildcardMatch(ETrue);	// Allow wildcard matching

	REComSession::ListImplementationsL(
			KUidInterface,
			ResolverParams,
			KDefaultResolverUid,
			ifArray);

	const TInt availCount = ifArray.Count();
	test.Printf(_L("Found %d implementations.\n"),availCount);
	test(availCount == 6);

	for (TInt count=0;count<availCount;++count)
		{
		const CImplementationInformation* info = ifArray[count];

		TDriveName driveName = info->Drive().Name();
		test.Printf(_L("%d. uid={%x} version=%d on drive %S\n"), count+1, info->ImplementationUid(), info->Version(), &driveName);

		switch(info->ImplementationUid().iUid)
			{
			case KUidImplementationAValue:
				test(info->Version()==1);
				test(info->Drive()==EDriveZ);
				break;

			case KUidImplementationBValue:
				test(info->Version()==1);
				test(info->Drive()==EDriveZ);
				break;

			case KUidImplementationCValue:
				test(info->Version()==2);
				test(info->Drive()==EDriveZ);
				break;

			case KUidImplementationDValue:
				test(info->Version()==1);
				test(info->Drive()==EDriveZ);
				break;

			case KUidImplementationEValue:
				test(info->Version()==2);
				test(info->Drive()==EDriveZ);
				break;

			case KUidImplementationFValue:
				test(info->Version()==2);
				test(info->Drive()==EDriveZ);
				break;
			}
		}

	// Empty the array of implementations
	test.Printf(_L("Destroying List..."));
	ifArray.ResetAndDestroy();

	REComSession::FinalClose(); // Don't want leaks outside the test

	// Check for open handles
	thisThread.HandleCount(endProcessHandleCount, endThreadHandleCount);

	test(startThreadHandleCount == endThreadHandleCount);
	test.Printf(_L("Great ! No handle mismatch."));

	// Test Ends...

	__UHEAP_MARKEND;
	}

void TheTest::StartTestL()
	{
	TestImplementationsL();
	}

TInt DoTestsL()
	{
	// Should any tests leave past the lowest level???
	TheTest theT;
	theT.StartTestL();
	return KErrNone;
	}

GLDEF_C TInt E32Main()
	{
	__UHEAP_MARK;
	test.Title();
	test.Start(_L("Rom resolver tests"));

	// get clean-up stack
	CTrapCleanup* cleanup = CTrapCleanup::New();

	CopyFiles();
	//The reason for the folowing delay is:
	//ECOM server could be already started. It means that when we copy some
	//ECOM plugins from Z: to C: drive - ECOM server should look for and
	//find the new ECOM plugins. The ECOM server uses for that CDiscoverer::CIdleScanningTimer
	//which is an active object. So the discovering service is asynchronous. We have to
	//wait some time until it finishes. Otherwise ListImplementationsL could fail to find
	//requested implementations.
	User::After(KOneSecond * 3);

	TRAPD(err,DoTestsL());
	delete cleanup;

	test(err==KErrNone);

	CleanupFiles();

	test.Next(_L("/n"));
	test.End();
	test.Close();
	__UHEAP_MARKEND;
	return(0);
	}