diff -r 000000000000 -r bde4ae8d615e os/mm/imagingandcamerafws/cameraunittest/src/tsu_ecm_ram/rampluginload.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/mm/imagingandcamerafws/cameraunittest/src/tsu_ecm_ram/rampluginload.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,187 @@ +// 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 "rampluginload.h" +#include <ecam.h> +#include <ecam/ecamplugin.h> +#include <ecamuids.hrh> + +#include <ecom/ecomresolverparams.h> + +#ifndef __WINSCW__ +const TInt KMaxProcessNameLength = 50; // Max process name length. +_LIT(KProcessFileManCopyFile, "copyfile.exe"); +_LIT(KSeparator, "|"); // Invalid filepath char used to separate filenames + +_LIT(KOriginalDllOnZ, "Z:\\testplugins\\ecamramplugin.dll"); +_LIT(KMovedDllOnC, "C:\\Sys\\Bin\\ecamramplugin.dll"); +_LIT(KOriginalRscFileOnZ, "Z:\\testplugins\\ecamramplugin.rsc"); +_LIT(KMovedRscFileOnC, "C:\\Resource\\Plugins\\ecamramplugin.rsc"); + +const TInt KWaitThreeSeconds = 3000000; +#endif + + +void LaunchProcessL(const TDesC& aProcessName, const TDesC& aCmdLine) + { + TRequestStatus stat; + RProcess p; + User::LeaveIfError(p.Create(aProcessName, aCmdLine)); + + // Asynchronous logon: completes when process terminates with process + // exit code + p.Logon(stat); + p.Resume(); + User::WaitForRequest(stat); + + TExitType exitType = p.ExitType(); + TInt exitReason = p.ExitReason(); + + p.Close(); + User::LeaveIfError(exitReason); + } + +TInt VersionLinearOrderFunction(const CImplementationInformation& pluginA, + const CImplementationInformation& pluginB) + { + if (pluginA.Version() == pluginB.Version()) + { + return 0; + } + + return (pluginA.Version() < pluginB.Version())? 1: -1; + } + +// +// RRamPluginLoadTest +// + +RRamPluginLoadTest* RRamPluginLoadTest::NewL(TBool aAllocTest) + { + RRamPluginLoadTest* self = new (ELeave) RRamPluginLoadTest(aAllocTest); + return self; + } + +RRamPluginLoadTest::RRamPluginLoadTest(TBool /*aAllocTest*/) + { + iTestStepName = _L("MM-ECM-RAM-U-001"); + } + +TVerdict RRamPluginLoadTest::DoTestStepL() + { + TVerdict result = EPass; +#ifndef __WINSCW__ + TBuf<KMaxFileName*2> dllNames(KOriginalDllOnZ); + TBuf<KMaxFileName*2> rscNames(KOriginalRscFileOnZ); + + dllNames.Append(KSeparator); + dllNames.Append(KMovedDllOnC); + rscNames.Append(KSeparator); + rscNames.Append(KMovedRscFileOnC); + TBufC<KMaxProcessNameLength> copyProcess(KProcessFileManCopyFile); + + // launch copyfile.exe to copy plugin from z: to c: + TRAPD(ret, LaunchProcessL(copyProcess, dllNames)); + if(ret == KErrNone) + { + INFO_PRINTF1(_L("Succesfully copied dll")); + } + else + { + INFO_PRINTF2(_L("Copying dll failed with %d"), ret); + result = EFail; + return result; + } + TRAP(ret, LaunchProcessL(copyProcess, rscNames)); + if(ret == KErrNone) + { + INFO_PRINTF1(_L("Succesfully copied rsc file")); + } + else + { + INFO_PRINTF2(_L("Copying rsc file failed with %d"), ret); + result = EFail; + return result; + } + + User::After(KWaitThreeSeconds); // Wait for ECom to re-scan drives so it can pick up new plugin now on c: +#endif + _LIT(KRamPluginDisplayName, "Ram ECam Plugin"); + TBufC<15> expectedName(KRamPluginDisplayName); + + TBool pluginFound = EFalse; + TInt error = KErrNone; + + INFO_PRINTF1(_L("Listing available plugins using REComSession::ListImplementationsL()...")); + TUid interfaceUid = {KUidOnboardCameraPlugin}; + TEComResolverParams resolverParams; + resolverParams.SetDataType(KECamPluginMatchString); + RImplInfoPtrArray pluginArray; + + TRAP(error, REComSession::ListImplementationsL(interfaceUid, resolverParams, pluginArray)); + if (error != KErrNone) + { + INFO_PRINTF2(_L("ListImplementationsL() failed - %d"), error); + result = EFail; + return result; + } + else + { + pluginArray.Sort(VersionLinearOrderFunction); + for (TInt i = 0; i < pluginArray.Count(); ++i) + { + TBuf<2> drive; + drive = pluginArray[i]->Drive().Name(); + INFO_PRINTF3(_L("%S located on drive %S"), &(pluginArray[i]->DisplayName()), &(drive)); + if((pluginArray[i]->DisplayName() == expectedName) && (pluginArray[i]->Drive() == 2)) + { + pluginFound = ETrue; + } + } + pluginArray.Close(); + + if(!pluginFound) + { + INFO_PRINTF1(_L("REComSession::ListImplementationsL() could not find plugin in RAM")); + } + } + + INFO_PRINTF1(_L("Checking if CCamera::New2L() can successfully load plugin residing in RAM")); + MCameraObserver2* observer2 = NULL; + TRAP(error, CCamera* camera = CCamera::New2L(*observer2, 0, 0)); +#ifdef _DEBUG + if(error == KErrNone) + { + INFO_PRINTF1(_L("UDEB mode: Expected behaviour - successfully loaded plugin")); + } + else + { + INFO_PRINTF2(_L("UDEB mode: Unexpected behaviour - could not load plugin, error = %d"), error); + result = EFail; + } +#else + if (error == KErrNone) + { + INFO_PRINTF1(_L("UREL mode: Unexpected behaviour - successfully loaded plugin")); + result = EFail; + } + else + { + INFO_PRINTF2(_L("UREL mode: Expected behaviour - could not load plugin, error = %d"), error); + } +#endif + + return result; + }