# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1266618835 -7200 # Node ID 5ffdb8f2067fd9273e36747c26eee224d89bb8b6 # Parent 6862383cf5559e0de95d8a47879d7f1c0c52757f Revision: 201007 Kit: 201007 diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/src/inc/featmgrclientserver.h --- a/featuremgmt/featuremgr/src/inc/featmgrclientserver.h Wed Feb 03 12:02:34 2010 +0000 +++ b/featuremgmt/featuremgr/src/inc/featmgrclientserver.h Sat Feb 20 00:33:55 2010 +0200 @@ -28,6 +28,9 @@ // DATA TYPES // Opcodes used in message passing between client and server +// Important: Make sure IsWriteOperation function of CFeatMgrSession +// is updated if a new enum for function that will modify +// feature (write operation) is added. enum TFeatMgrServRequest { /** diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/src/serverexe/featmgrserver.cpp --- a/featuremgmt/featuremgr/src/serverexe/featmgrserver.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/featuremgmt/featuremgr/src/serverexe/featmgrserver.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -1,4 +1,4 @@ -// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2007-2010 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" @@ -49,6 +49,7 @@ CFeatMgrServer::CFeatMgrServer( const TInt aPriority, const TServerType aType ) : CPolicyServer( aPriority, KFeatMgrPlatSecPolicy, aType ), iBurState(this), + iBackupInProgress(EFalse), iPluginsReady(EFalse), iPluginsDeleted( EFalse ), iPendingRequests( ETrue ), @@ -439,6 +440,15 @@ FUNC_LOG return(iPluginsReady); } + +// ----------------------------------------------------------------------------- +// CFeatMgrServer::BackupIsInProgress() +// ----------------------------------------------------------------------------- +TBool CFeatMgrServer::BackupIsInProgress() const + { + FUNC_LOG + return(iBackupInProgress); + } // ----------------------------------------------------------------------------- // CFeatMgrServer::ServicePendingRequests() @@ -671,7 +681,7 @@ switch( aCurrent ) { case( EFeatMgrBURState_BackupStarted ) : - iPluginsReady = ETrue; + iBackupInProgress = EFalse; ServicePendingRequests(); break; case( EFeatMgrBURState_RestoreStarted ) : @@ -701,7 +711,7 @@ BURStatus CFeatMgrServer::Goto_StartBackupState( BURStatus /* aCurrent */ ) { BURStatus aNewState = EFeatMgrBURState_BackupStarted; // state++ - iPluginsReady = EFalse; + iBackupInProgress = ETrue; return aNewState; } @@ -709,7 +719,7 @@ { BURStatus aNewState = EFeatMgrBURState_BackupEnded; // state++ - iPluginsReady = ETrue; + iBackupInProgress = EFalse; ServicePendingRequests(); // no error from ServicePendingRequests() is possible @@ -728,8 +738,7 @@ { BURStatus aNewState = EFeatMgrBURState_Error; // fail safe TInt err( KErrNone ); - - iPluginsReady = EFalse; + iPluginsReady = EFalse; iPluginsDeleted = EFalse; iPendingRequests = ETrue; iFeaturesReady = EFalse; diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/src/serverexe/featmgrserver.h --- a/featuremgmt/featuremgr/src/serverexe/featmgrserver.h Wed Feb 03 12:02:34 2010 +0000 +++ b/featuremgmt/featuremgr/src/serverexe/featmgrserver.h Sat Feb 20 00:33:55 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2010 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" @@ -107,9 +107,16 @@ Feature info received. Else returns EFalse. - @return feature support status + @return plugins loading status */ TBool PluginsReady() const; + + /** + Returns ETrue if backup is in progress + Else returns EFalse. + @return backup status + */ + TBool BackupIsInProgress() const; #ifdef EXTENDED_FEATURE_MANAGER_TEST /** @@ -269,6 +276,10 @@ CFeatMgrTimer* iTimer; CBurState iBurState; + + // ETrue when backup in progress + TBool iBackupInProgress; + // ETrue when feature info received from all plugins TBool iPluginsReady; diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/src/serverexe/featmgrsession.cpp --- a/featuremgmt/featuremgr/src/serverexe/featmgrsession.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/featuremgmt/featuremgr/src/serverexe/featmgrsession.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -1,4 +1,4 @@ -// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2007-2010 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" @@ -102,6 +102,24 @@ aMessage.Panic( KPanicCategory, aPanic ); } +TBool CFeatMgrSession::IsWriteOperation( const TInt aFunction ) const + { + switch ( aFunction ) + { + case EFeatMgrEnableFeature: + case EFeatMgrDisableFeature: + case EFeatMgrAddFeature: + case EFeatMgrSetFeatureAndData: + case EFeatMgrSetFeatureData: + case EFeatMgrDeleteFeature: + case EFeatMgrSWIStart: + case EFeatMgrSWIEnd: + return ETrue; + default: + return EFalse; + } + } + // ----------------------------------------------------------------------------- // CFeatMgrSession::ServiceL // Calls request handling functions. Also traps any leaves and signals client if @@ -111,10 +129,12 @@ void CFeatMgrSession::ServiceL( const RMessage2& aMessage ) { FUNC_LOG - - if ( !iFeatMgrServer.PluginsReady() ) + // If plugins are not ready all request will be queued. + // During backup operation, all write request e.g. EnableFeature will be queued + TInt msgCmd = aMessage.Function(); + if ( !iFeatMgrServer.PluginsReady() || ( iFeatMgrServer.BackupIsInProgress() && IsWriteOperation( msgCmd ) ) ) { - INFO_LOG( "CFeatMgrSession::ServiceL() - plugins not ready" ); + INFO_LOG( "CFeatMgrSession::ServiceL() - plugins not ready or backup is in progress" ); iList.AddLast( *CFeatMgrPendingRequest::NewL( aMessage ) ); } else diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/src/serverexe/featmgrsession.h --- a/featuremgmt/featuremgr/src/serverexe/featmgrsession.h Wed Feb 03 12:02:34 2010 +0000 +++ b/featuremgmt/featuremgr/src/serverexe/featmgrsession.h Sat Feb 20 00:33:55 2010 +0200 @@ -159,6 +159,8 @@ */ void DispatchMessageL( const RMessage2& aMessage ); + TBool IsWriteOperation( const TInt aFunction ) const; + private: // Data /** diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/test/group/bld.inf --- a/featuremgmt/featuremgr/test/group/bld.inf Wed Feb 03 12:02:34 2010 +0000 +++ b/featuremgmt/featuremgr/test/group/bld.inf Sat Feb 20 00:33:55 2010 +0200 @@ -1,4 +1,4 @@ -// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2007-2010 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" @@ -21,6 +21,10 @@ #include "../helper/helping_exe/group/bld.inf" PRJ_TESTMMPFILES +//RTest project files +//../rtest/group/t_fmgrbackupmod.mmp +//../rtest/group/t_fmgrbackupquery.mmp + //TEF project files ../tef/tef_feature_generator/group/tef_feature_generator.mmp manual ../tef/tef_efm_normal/group/efm_normal_testserver.mmp manual @@ -66,6 +70,7 @@ //iby files for the test components featmgr_test.iby /epoc32/rom/include/featmgr_test.iby +../rtest/group/featmgr_rtest.iby /epoc32/rom/include/featmgr_rtest.iby ../tef/tef_efm_configured/group/efm_configured_testserver.iby /epoc32/rom/include/efm_configured_testserver.iby ../tef/tef_efm_normal/group/efm_normal_testserver.iby /epoc32/rom/include/efm_normal_testserver.iby ../tef/tef_efm_unit/group/efm_unit_testserver.iby /epoc32/rom/include/efm_unit_testserver.iby diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/test/group/featmgr_test.iby --- a/featuremgmt/featuremgr/test/group/featmgr_test.iby Wed Feb 03 12:02:34 2010 +0000 +++ b/featuremgmt/featuremgr/test/group/featmgr_test.iby Sat Feb 20 00:33:55 2010 +0200 @@ -22,6 +22,9 @@ //main efm test script data=DATAZ_\test\efm\scripts\tef_featmgr.script test\efm\scripts\tef_featmgr.script +//rtest tests .iby files +//#include "featmgr_rtest.iby" + //tef tests .iby files #include "efm_configured_testserver.iby" #include "efm_normal_testserver.iby" diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/test/rtest/group/featmgr_rtest.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/featuremgmt/featuremgr/test/rtest/group/featmgr_rtest.iby Sat Feb 20 00:33:55 2010 +0200 @@ -0,0 +1,22 @@ +// Copyright (c) 2008-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: +// + +#ifndef __FEATMGR_RTEST_IBY__ +#define __FEATMGR_RTEST_IBY__ + +file=ABI_DIR\BUILD_DIR\t_fmgrbackupquery.exe test\t_fmgrbackupquery.exe +file=ABI_DIR\BUILD_DIR\t_fmgrbackupmod.exe test\t_fmgrbackupmod.exe + +#endif // __FEATMGR_RTEST_IBY__ diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/test/rtest/group/t_fmgrbackupmod.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/featuremgmt/featuremgr/test/rtest/group/t_fmgrbackupmod.mmp Sat Feb 20 00:33:55 2010 +0200 @@ -0,0 +1,37 @@ +// Copyright (c) 2010 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: +// + +TARGET t_fmgrbackupmod.exe +TARGETTYPE EXE +CAPABILITY ReadDeviceData WriteDeviceData AllFiles + +USERINCLUDE ../inc + +OS_LAYER_SYSTEMINCLUDE + +SOURCEPATH ../src +SOURCE t_fmgrbursim.cpp +SOURCE t_fmgrbackupmod.cpp + +LIBRARY euser.lib +LIBRARY bafl.lib +LIBRARY efsrv.lib +LIBRARY featmgr.lib + + +UID 0 0x10281e17 +VENDORID 0x70000001 + +SMPSAFE \ No newline at end of file diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/test/rtest/group/t_fmgrbackupquery.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/featuremgmt/featuremgr/test/rtest/group/t_fmgrbackupquery.mmp Sat Feb 20 00:33:55 2010 +0200 @@ -0,0 +1,36 @@ +// Copyright (c) 2010 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: +// + +TARGET t_fmgrbackupquery.exe +TARGETTYPE EXE +CAPABILITY ReadDeviceData WriteDeviceData AllFiles + +USERINCLUDE ../inc + +OS_LAYER_SYSTEMINCLUDE + +SOURCEPATH ../src +SOURCE t_fmgrbursim.cpp +SOURCE t_fmgrbackupquery.cpp + +LIBRARY euser.lib +LIBRARY bafl.lib +LIBRARY efsrv.lib +LIBRARY featdiscovery.lib + +UID 0 0x10281e17 +VENDORID 0x70000001 + +SMPSAFE \ No newline at end of file diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/test/rtest/inc/t_fmgrburdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/featuremgmt/featuremgr/test/rtest/inc/t_fmgrburdefs.h Sat Feb 20 00:33:55 2010 +0200 @@ -0,0 +1,42 @@ +// Copyright (c) 2010 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: +// + +/** + @file + @test + @internalComponent +*/ + + +#if (!defined __T_FMGRBURDEFS_H__) +#define __T_FMGRBURDEFS_H__ + +#include + +const TUid KTestUid = TUid::Uid( 0x10283709 ); + +#ifndef EXTENDED_FEATURE_MANAGER_TEST + // for UID 0x10205054 + _LIT( KEfmBackupFileName, "C:\\Private\\10205054\\features.dat" ); + _LIT( KEfmApplicationDir, "C:\\Private\\10205054\\" ); + _LIT( KRegistrationFile, "Z:\\private\\10205054\\backup_registration.xml" ); +#else + // for UID 0x102836E5 0x102836E5 + _LIT( KEfmBackupFileName, "C:\\Private\\102836E5\\runtime\\features.dat" ); + _LIT( KEfmApplicationDir, "C:\\Private\\102836E5\\" ); + _LIT( KRegistrationFile, "Z:\\private\\102836E5\\backup_registration.xml" ); +#endif + +#endif diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/test/rtest/inc/t_fmgrbursim.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/featuremgmt/featuremgr/test/rtest/inc/t_fmgrbursim.h Sat Feb 20 00:33:55 2010 +0200 @@ -0,0 +1,68 @@ +// Copyright (c) 2010 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: +// + +/** + @file + @test + @internalComponent +*/ + +#if (!defined __T_FMGRBURSIM__) +#define __T_FMGRBURSIM__ + +#include "t_fmgrburdefs.h" +#include +#include + +/** + * Simulation base class for simulating a backup and restore operation. + * The functionality allows copying and restoring a feature.dat file, and + * checking that the registration file exists. + */ +class CFeatMgrBURSim: public CBase + { +public: + virtual ~CFeatMgrBURSim(); + + static CFeatMgrBURSim* NewLC(); +public: + + /** Use external API to start a backup. */ + void Simulate_StartBackupL(); + /** Use external API to stop a backup. */ + void Simulate_EndBackupL( TBool aNormal = ETrue ); + /** Use external API to start a restore. */ + void Simulate_StartRestoreL(); + /** Use external API to stop a restore. */ + void Simulate_EndRestoreL( TBool aNormal = ETrue ); + + + void Simulate_StartUndefinedL(); + void Simulate_EndUndefinedL( TBool aNormal = ETrue ); + + /** + * Confirm that the registration.xml file is present. + * @leave KErrNotFound if file not present. + */ + void Simulate_CheckRegFileL(); + +private: + CFeatMgrBURSim(); + void ConstructL(); +private: + CBaBackupSessionWrapper* iBackupClient; + }; + +#endif diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/test/rtest/src/t_fmgrbackupmod.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/featuremgmt/featuremgr/test/rtest/src/t_fmgrbackupmod.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -0,0 +1,181 @@ +// Copyright (c) 2010 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 +#include +#include +#include +#include "t_fmgrbursim.h" + +/////////////////////////////////////////////////////////////////////////////////////// + +RTest TheTest(_L("t_fmgrbur test")); + +const TUint threadTimeout = 1500000; // thread timeout = 1.5 second + +static RSemaphore MainThreadCrS; +static TInt featMgrIsResponsive = 0; + +/////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////// +//Test macros and functions +void Check1(TInt aValue, TInt aLine, TBool aPrintThreadName = EFalse) + { + if(!aValue) + { + //DeleteTestFiles(); + if(aPrintThreadName) + { + RThread th; + TName name = th.Name(); + RDebug::Print(_L("*** Thread %S, Line %d\r\n"), &name, aLine); + } + else + { + RDebug::Print(_L("*** Line %d\r\n"), aLine); + } + TheTest(EFalse, aLine); + } + } + +void Check2(TInt aValue, TInt aExpected, TInt aLine, TBool aPrintThreadName = EFalse) + { + if(aValue != aExpected) + { + //DeleteTestFiles(); + if(aPrintThreadName) + { + RThread th; + TName name = th.Name(); + RDebug::Print(_L("*** Thread %S, Line %d Expected error: %d, got: %d\r\n"), &name, aLine, aExpected, aValue); + } + else + { + RDebug::Print(_L("*** Line %d, Expected error: %d, got: %d\r\n"), aLine, aExpected, aValue); + } + TheTest(EFalse, aLine); + } + } +#define TEST(arg) ::Check1((arg), __LINE__) +#define TEST2(aValue, aExpected) ::Check2(aValue, aExpected, __LINE__) +#define TTEST(arg) ::Check1((arg), __LINE__, ETrue) +#define TTEST2(aValue, aExpected) ::Check2(aValue, aExpected, __LINE__, ETrue) + +// ------------------------- ------------------------- +// setup and cleanup functions + +TInt TestModifyThreadL(void*) + { + __UHEAP_MARK; + + CTrapCleanup* tc = CTrapCleanup::New(); + // Modify a feature. We don't care about its result. + // It is fine as long as it returns. + RFeatureControl rfc; + TEST2( rfc.Connect(), KErrNone ); + rfc.EnableFeature( TUid::Uid(0x00000001) ); + rfc.Close(); + featMgrIsResponsive = 1; + RDebug::Print(_L("+++:TestModifyThread: Modification completed\r\n")); + MainThreadCrS.Signal(); + delete tc; + + __UHEAP_MARKEND; + + return KErrNone; + } +/** +@SYMTestCaseID PDS-FEATMGR-CT-XXXX +@SYMTestCaseDesc Querying a feature during backup operation. Verify that a + response is returned from the server during backup. +@SYMTestPriority High +@SYMTestActions Start simulating backup operation + Create a thread that will query a feature + Verify that a response is received in not more than 1.5 second. + Otherwise the test fail. +@SYMTestExpectedResults Test must not fail +@SYMREQ +*/ +void TestBackupModificationResponseL() + { + _LIT(KThreadName, "MdfTh"); + featMgrIsResponsive = 0; + + CFeatMgrBURSim* simulate = CFeatMgrBURSim::NewLC(); + RThread modifyThread; + TRequestStatus modifyStatus; + + CleanupClosePushL( modifyThread ); + + + // Simulate a backup + RDebug::Print(_L("Simulating Backup of BUR\r\n")); + simulate->Simulate_StartBackupL(); + + TEST2( modifyThread.Create(KThreadName, &TestModifyThreadL, 0x2000, 0x1000, 0x10000, NULL, EOwnerProcess), KErrNone ); + modifyThread.Logon(modifyStatus); + TEST2( modifyStatus.Int(), KRequestPending ); + modifyThread.Resume(); + // Wait for 1.5 second for the query thread to finish. + RDebug::Print(_L("+++:MainThread: Wait for modification completion...\r\n")); + MainThreadCrS.Wait(threadTimeout); + // The modification request should NOT be responsive within the 1.5 second frame. + // It should only be responsive after back up ended. + TEST2 (featMgrIsResponsive, 0); + simulate->Simulate_EndBackupL(); + + MainThreadCrS.Wait(threadTimeout); + + // The modification request now must be responsive within the 1.5 second frame. + TEST2 (featMgrIsResponsive, 1); + + CleanupStack::PopAndDestroy(&modifyThread); + CleanupStack::PopAndDestroy(simulate); + } + +/////////////////////////////////////////////////////////////////////////////////////// + +void DoTestsL() + { + MainThreadCrS.CreateLocal(0); + + TheTest.Start(_L(" @SYMTestCaseID:PDS-FEATMGR-CT-XXXX Backup Modification Response")); + TestBackupModificationResponseL(); + + MainThreadCrS.Close(); + + } + +TInt E32Main() + { + TheTest.Title(); + + CTrapCleanup* tc = CTrapCleanup::New(); + + __UHEAP_MARK; + + TRAPD(err, DoTestsL()); + TEST2(err, KErrNone); + + __UHEAP_MARKEND; + + TheTest.End(); + TheTest.Close(); + + delete tc; + + User::Heap().Check(); + return KErrNone; + } diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/test/rtest/src/t_fmgrbackupquery.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/featuremgmt/featuremgr/test/rtest/src/t_fmgrbackupquery.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -0,0 +1,194 @@ +// Copyright (c) 2010 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 +#include +#include +#include +#include "t_fmgrbursim.h" + +/////////////////////////////////////////////////////////////////////////////////////// + +RTest TheTest(_L("t_fmgrbur test")); + +const TUint threadTimeout = 1500000; // thread timeout = 1.5 second + +static RSemaphore MainThreadCrS; +static TInt featMgrIsResponsive = 0; + +/////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////// +//Test macros and functions +void Check1(TInt aValue, TInt aLine, TBool aPrintThreadName = EFalse) + { + if(!aValue) + { + //DeleteTestFiles(); + if(aPrintThreadName) + { + RThread th; + TName name = th.Name(); + RDebug::Print(_L("*** Thread %S, Line %d\r\n"), &name, aLine); + } + else + { + RDebug::Print(_L("*** Line %d\r\n"), aLine); + } + TheTest(EFalse, aLine); + } + } + +void Check2(TInt aValue, TInt aExpected, TInt aLine, TBool aPrintThreadName = EFalse) + { + if(aValue != aExpected) + { + //DeleteTestFiles(); + if(aPrintThreadName) + { + RThread th; + TName name = th.Name(); + RDebug::Print(_L("*** Thread %S, Line %d Expected error: %d, got: %d\r\n"), &name, aLine, aExpected, aValue); + } + else + { + RDebug::Print(_L("*** Line %d, Expected error: %d, got: %d\r\n"), aLine, aExpected, aValue); + } + TheTest(EFalse, aLine); + } + } +#define TEST(arg) ::Check1((arg), __LINE__) +#define TEST2(aValue, aExpected) ::Check2(aValue, aExpected, __LINE__) +#define TTEST(arg) ::Check1((arg), __LINE__, ETrue) +#define TTEST2(aValue, aExpected) ::Check2(aValue, aExpected, __LINE__, ETrue) + +// ------------------------- ------------------------- +// setup and cleanup functions + +/** + * Creates the direcory structure required for the backup to take place. + * Will leave if an error occurs other then KErrNone or KErrAlreadyExists as this + * indicates the directory structure has not been created. + */ + +TInt TestQueryThreadL(void*) + { + __UHEAP_MARK; + + CTrapCleanup* tc = CTrapCleanup::New(); + // Query a feature. We don't care about its result. + // It is fine as long as it returns. + CFeatureDiscovery::IsFeatureSupportedL( TUid::Uid(0x00000001) ); + featMgrIsResponsive = 1; + RDebug::Print(_L("+++:TestQueryThread: Query completed\r\n")); + MainThreadCrS.Signal(); + delete tc; + + __UHEAP_MARKEND; + + return KErrNone; + } + +/////////////////////////////////////////////////////////////////////////////////////// + +/** +@SYMTestCaseID PDS-FEATMGR-CT-XXXX +@SYMTestCaseDesc Querying a feature during backup operation. Verify that a + response is returned from the server during backup. +@SYMTestPriority High +@SYMTestActions Start simulating backup operation + Create a thread that will query a feature + Verify that a response is received in not more than 1.5 second. + Otherwise the test fail. +@SYMTestExpectedResults Test must not fail +@SYMREQ +*/ +void TestBackupQueryResponseL() + { + _LIT(KThreadName, "QryTh"); + featMgrIsResponsive = 0; + + CFeatMgrBURSim* simulate = CFeatMgrBURSim::NewLC(); + RThread queryThread; + TRequestStatus queryStatus; + + CleanupClosePushL( queryThread ); + + // Simulate a backup + RDebug::Print(_L("Simulating Backup of BUR\r\n")); + simulate->Simulate_StartBackupL(); + + TEST2( queryThread.Create(KThreadName, &TestQueryThreadL, 0x2000, 0x1000, 0x10000, NULL, EOwnerProcess), KErrNone ); + queryThread.Logon(queryStatus); + TEST2( queryStatus.Int(), KRequestPending ); + queryThread.Resume(); + // Wait for 1.5 second for the query thread to finish. + RDebug::Print(_L("+++:MainThread: Wait for query completion...\r\n")); + MainThreadCrS.Wait(threadTimeout); + // If query is responsive within the 1.5 second frame the following check should pass. + TEST2 (featMgrIsResponsive, 1); + + simulate->Simulate_EndBackupL(); + + CleanupStack::PopAndDestroy(&queryThread); + CleanupStack::PopAndDestroy(simulate); + } + +/** +@SYMTestCaseID PDS-FEATMGR-CT-XXXX +@SYMTestCaseDesc Querying a feature during backup operation. Verify that a + response is returned from the server during backup. +@SYMTestPriority High +@SYMTestActions Start simulating backup operation + Create a thread that will query a feature + Verify that a response is received in not more than 1.5 second. + Otherwise the test fail. +@SYMTestExpectedResults Test must not fail +@SYMREQ +*/ + +/////////////////////////////////////////////////////////////////////////////////////// + +void DoTestsL() + { + MainThreadCrS.CreateLocal(0); + + TheTest.Start(_L(" @SYMTestCaseID:PDS-FEATMGR-CT-XXXX Backup Query Response")); + TestBackupQueryResponseL(); + + MainThreadCrS.Close(); + + } + +TInt E32Main() + { + TheTest.Title(); + + CTrapCleanup* tc = CTrapCleanup::New(); + + __UHEAP_MARK; + + TRAPD(err, DoTestsL()); + TEST2(err, KErrNone); + + __UHEAP_MARKEND; + + TheTest.End(); + TheTest.Close(); + + delete tc; + + User::Heap().Check(); + return KErrNone; + } diff -r 6862383cf555 -r 5ffdb8f2067f featuremgmt/featuremgr/test/rtest/src/t_fmgrbursim.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/featuremgmt/featuremgr/test/rtest/src/t_fmgrbursim.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -0,0 +1,164 @@ +// Copyright (c) 2010 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: +// + +/** + @file + @test + @internalComponent +*/ + +#include "t_fmgrbursim.h" +#include "t_fmgrburdefs.h" + +CFeatMgrBURSim* CFeatMgrBURSim::NewLC() + { + CFeatMgrBURSim* newInstance = new (ELeave) CFeatMgrBURSim(); + CleanupStack::PushL( newInstance ); + newInstance->ConstructL(); + return newInstance; + } + +void CFeatMgrBURSim::ConstructL() + { + iBackupClient = CBaBackupSessionWrapper::NewL(); + } + +CFeatMgrBURSim::CFeatMgrBURSim() + { + } + +CFeatMgrBURSim::~CFeatMgrBURSim() + { + delete iBackupClient; + } + +// BUR simulation functions + +/** + * Use the babackup API to "start" a backup. + * Ultimate effect is to cause the correct case statement inside + * ChangeFileLockL to be called. + */ +void CFeatMgrBURSim::Simulate_StartBackupL() + { + iBackupClient->CloseFileL( KEfmBackupFileName, MBackupObserver::EReleaseLockReadOnly ); + + // Set BUR property to trigger + TInt ret = RProperty::Set(KTestUid , conn::KUidBackupRestoreKey, conn::EBackupBase|conn::EBURBackupPartial); + if (ret != KErrNone && ret != KErrNotFound) + { + User::Leave(ret); + } + + // allow observers to be notified + User::After(100000); + } + + +/** + * Use the babackup API to "end" a backup. + * Ultimate effect is to cause the correct case statement inside + * ChangeFileLockL to be called. + */ +void CFeatMgrBURSim::Simulate_EndBackupL( TBool /* aNormal */ ) + { + iBackupClient->CloseFileL( KEfmBackupFileName, MBackupObserver::ETakeLock ); + + // allow observers to be notified + User::After(100000); + } + +// Restore type + +/** + * Use the babackup API to "start" a restore. + * Ultimate effect is to cause the correct case statement inside + * ChangeFileLockL to be called. + */ +void CFeatMgrBURSim::Simulate_StartRestoreL() + { + iBackupClient->CloseFileL( KEfmBackupFileName, MBackupObserver::EReleaseLockNoAccess ); + + // Set BUR property to trigger + TInt ret = RProperty::Set(KTestUid , conn::KUidBackupRestoreKey, conn::EBackupBase|conn::EBURRestorePartial); + if (ret != KErrNone && ret != KErrNotFound) + { + User::Leave(ret); + } + + // allow observers to be notified + User::After(100000); + } + + +/** + * Use the babackup API to "end" a restore. + * Ultimate effect is to cause the correct case statement inside + * ChangeFileLockL to be called. + */ +void CFeatMgrBURSim::Simulate_EndRestoreL( TBool /* aNormal */ ) + { + iBackupClient->CloseFileL( KEfmBackupFileName, MBackupObserver::ETakeLock ); + + // allow observers to be notified + User::After(100000); + } + + +// Undefined type + + +// Edge cases + +void CFeatMgrBURSim::Simulate_StartUndefinedL() + { + // Use the babackup API to "start" (neither a backup or restore explicitly). + // Ultimate effect is to cause the correct case statement inside + // CFeatMgrFeatureRegistry::HandleBackupOperationEventL + // to be called. + User::Leave( KErrNotSupported ); + } + + +void CFeatMgrBURSim::Simulate_EndUndefinedL( TBool /* aNormal */ ) + { + // Use the babackup API to "end" (neither a backup or restore explicitly). + // Ultimate effect is to cause the correct case statement inside + // CFeatMgrFeatureRegistry::HandleBackupOperationEventL + // to be called. + User::Leave( KErrNotSupported ); + } + +/** + * CheckRegFileL + * Open the babackup file to confirm that the file is present + * this leaves if the KErrNotFound is returned + */ +void CFeatMgrBURSim::Simulate_CheckRegFileL() + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + RFile file; + TInt err = file.Open(fs, KRegistrationFile, EFileRead); + + if( err != KErrNone ) + { + User::Leave(err); + } + + file.Close(); + CleanupStack::PopAndDestroy(&fs); + } diff -r 6862383cf555 -r 5ffdb8f2067f loggingservices/eventlogger/LogServ/src/LOGADD.CPP --- a/loggingservices/eventlogger/LogServ/src/LOGADD.CPP Wed Feb 03 12:02:34 2010 +0000 +++ b/loggingservices/eventlogger/LogServ/src/LOGADD.CPP Sat Feb 20 00:33:55 2010 +0200 @@ -485,6 +485,10 @@ TRAPD(err,iContactPlugin->OpenContactsL()); if(KErrNone!=err) { + if(err == KErrServerTerminated) + { + RDebug::Print(_L("+++LogEng, LogAdd.cpp, Contacts server crashed!\r\n")); + } // If DB doesn't open delete plugin delete iContactPlugin; iContactPlugin = NULL; diff -r 6862383cf555 -r 5ffdb8f2067f loggingservices/eventlogger/test/src/t_logapi.cpp --- a/loggingservices/eventlogger/test/src/t_logapi.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/loggingservices/eventlogger/test/src/t_logapi.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -743,8 +743,9 @@ */ LOCAL_C void TestGetConfigSettingsFromRepositoryFileL(CLogClient& aClient) { - //Note: if this tests starts failing, then go and check the CentralRepository private data cage (c:\\private\\10202be9) , if this file - 101f401d.txt, is there. - //If it is - delete it and try the test again. + //Note: if this test starts failing, then go and check the CentralRepository private data cage + //(c:\\private\\10202be9 or z:\\private\\10202be9) if 101f401d.txt file is there. + //If it is then delete it and try the test again. test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-UT-4015 ")); //Get the contact match count and contact name format.This should be from resource file. TInt16 contactMatchCount; diff -r 6862383cf555 -r 5ffdb8f2067f loggingservices/eventlogger/test/src/t_logcntmatch.cpp --- a/loggingservices/eventlogger/test/src/t_logcntmatch.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/loggingservices/eventlogger/test/src/t_logcntmatch.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -11,9 +11,12 @@ // Contributors: // // Description: -// The "contacts matching" part of the test will work only if r_log_contact_match_count -// resource value is not 0. See LogServ.rss file. -// +// +// If this test starts failing, then go and check the CentralRepository private data cage +// (c:\\private\\10202be9 or z:\\private\\10202be9) if 101f401d.txt file is there. +// If it is then delete it and try the test again. +// (The problem is that if there is an existing 101f401d.txt file, then the contact match count value +// will be loaded from that file, not from the LogEng resource file) // #include @@ -370,6 +373,8 @@ CLogClient* client = CLogClient::NewL(theFs); CleanupStack::PushL(client); + //All tests bellow are likely to fail if 101f401d.txt file exists in CentralRepository private data cage + //and the contact mach count is set to 0 in that file. test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-1392: DEF068087: Chinese names don't display in Chinese name format")); ::DEF068087L(*client); test.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-1016: Contacts matching - test1")); diff -r 6862383cf555 -r 5ffdb8f2067f loggingservices/eventlogger/test/src/t_logservercrash.cpp --- a/loggingservices/eventlogger/test/src/t_logservercrash.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/loggingservices/eventlogger/test/src/t_logservercrash.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -14,6 +14,11 @@ // T_LOGSERVCRASH.CPP // This tests the fix implemented for DEF047320 // +// If this test starts failing, then go and check the CentralRepository private data cage +// (c:\\private\\10202be9 or z:\\private\\10202be9) if 101f401d.txt file is there. +// If it is then delete it and try the test again. +// (The problem is that if there is an existing 101f401d.txt file, then the contact match count value +// will be loaded from that file, not from the LogEng resource file) // #include @@ -135,6 +140,8 @@ aClient.ChangeEvent(*event, active->iStatus); CActiveScheduler::Start(); + //If the test fails on the next line with -1 or -12 error, it is possible that the contacts database is missing: + //c:\private\10003a73\SQLite__Contacts.cdb. Copy it to the specified location and rerun the test. TEST2(active->iStatus.Int(), KErrNone); TEST(event->EventType() == KLogCallEventTypeUid); TEST(event->RemoteParty() == KTestRemoteParty1); @@ -155,6 +162,9 @@ { eventFlags=KTestFlags1; } + //If the test fails on the next line, it is quite possible that there is a + //z:\private\10202be9a\101f401d.txt file that sets the contacts match count to 0. + //Delete the file and run the test again. TEST(event->Flags() == eventFlags); TEST(event->Contact()==(TLogContactItemId) count+1); diff -r 6862383cf555 -r 5ffdb8f2067f loggingservices/eventlogger/test/src/t_logview1.cpp --- a/loggingservices/eventlogger/test/src/t_logview1.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/loggingservices/eventlogger/test/src/t_logview1.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -12,6 +12,12 @@ // // Description: // +// If this test starts failing, then go and check the CentralRepository private data cage +// (c:\\private\\10202be9 or z:\\private\\10202be9) if 101f401d.txt file is there. +// If it is then delete it and try the test again. +// (The problem is that if there is an existing 101f401d.txt file, then the contact match count value +// will be loaded from that file, not from the LogEng resource file) +// #include #include diff -r 6862383cf555 -r 5ffdb8f2067f loggingservices/filelogger/SCLI/FLOGCLI.CPP --- a/loggingservices/filelogger/SCLI/FLOGCLI.CPP Wed Feb 03 12:02:34 2010 +0000 +++ b/loggingservices/filelogger/SCLI/FLOGCLI.CPP Sat Feb 20 00:33:55 2010 +0200 @@ -595,14 +595,8 @@ { TBuf n; n.Copy(aBuf); - if (iLogFile.Valid()) - { - TFileName logFileName = iLogFile.Name(); - RDebug::Print(_L("FLG %S %S"),&logFileName,&n); - } else - { - RDebug::Print(_L("FLG %S "),&n); - } + TFileName logFileName = iLogFile.Name(); + RDebug::Print(_L("FLG %S %S"),&logFileName,&n); } else { TPckg logFilePckg(iLogFile); @@ -628,15 +622,8 @@ { TBuf n; n.Copy(aBuf); - if (iLogFile.Valid()) - { - TFileName logFileName = iLogFile.Name(); - RDebug::Print(_L("FLG %S %S"),&logFileName,&n); - } else - { - RDebug::Print(_L("FLG %S "),&n); - } - + TFileName logFileName = iLogFile.Name(); + RDebug::Print(_L("FLG %S %S"),&logFileName,&n); } else { SendReceive(ECreateWriteAndCloseLog, TIpcArgs( &logFilePckg, &aBuf)); // ignore error diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/dbms/tdbms/t_dbstress.cpp --- a/persistentstorage/dbms/tdbms/t_dbstress.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/dbms/tdbms/t_dbstress.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -20,7 +20,7 @@ //#define _INSTALL_FILE_SYSTEM #endif -GLDEF_D RTest test(_L("t_dbstress: Stress testing DBMS")); +GLDEF_D RTest TheTest(_L("t_dbstress: Stress testing DBMS")); GLDEF_D TPtrC KTestDir=_S("\\DBMS-TST\\"); GLDEF_D TPtrC KLogFile=_L("T_STRESS.LOG"); @@ -61,7 +61,7 @@ void Timer::Print() { TInt64 milli=Stop(); - test.Printf(_L(" %u milliseconds\n"), I64LOW(milli) ); + TheTest.Printf(_L(" %u milliseconds\n"), I64LOW(milli) ); } class Set @@ -128,16 +128,41 @@ return (Math::Random()>>11)%aRange; } -#undef test -LOCAL_C void Test(TInt aValue,TInt anExpected,TInt aLine) - { - if (aValue==anExpected) - return; - test.Printf(_L("** Expected %d, was %d\n"),anExpected,aValue); - test(EFalse,aLine); - } -#define test1(aTest) test(aTest,__LINE__) -#define test2(aValue,anExpected) Test(aValue,anExpected,__LINE__) +/////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////// + +TPtrC FileName(const TText* aFile) + { + TPtrC p(aFile); + TInt ix=p.LocateReverse('\\'); + if (ix<0) + ix=p.LocateReverse('/'); + if (ix>=0) + p.Set(p.Mid(1+ix)); + return p; + } + +//Test macros and functions +void Check1(TInt aValue, const TText* aFile, TInt aLine) + { + if(!aValue) + { + TPtrC fname(FileName(aFile)); + TheTest.Printf(_L("*** Expression evaluated to false. %S-%d\r\n"), &fname, aLine); + TheTest(EFalse, aLine); + } + } +void Check2(TInt aValue, TInt aExpected, const TText* aFile, TInt aLine) + { + if(aValue != aExpected) + { + TPtrC fname(FileName(aFile)); + TheTest.Printf(_L("*** Expected %d, got %d. %S-%d\r\n"), aExpected, aValue, &fname, aLine); + TheTest(EFalse, aLine); + } + } + +/////////////////////////////////////////////////////////////////////////////////////// LOCAL_C void CreateIndexL(RDbDatabase& aDatabase,const TDesC& aTable,const TDesC& aColumn,TBool aUnique) { @@ -145,7 +170,7 @@ key->AddL(aColumn); if (aUnique) key->MakeUnique(); - test2(aDatabase.CreateIndex(aColumn,aTable,*key),KErrNone); + TEST2(aDatabase.CreateIndex(aColumn,aTable,*key),KErrNone); CleanupStack::PopAndDestroy(); } @@ -160,19 +185,19 @@ // create the tables TheDatabase.Begin(); CDbColSet* set=Set::CreateL(AccountsDef); - test2(TheDatabase.CreateTable(KAccounts,*set),KErrNone); + TEST2(TheDatabase.CreateTable(KAccounts,*set),KErrNone); delete set; CreateIndexL(TheDatabase,KAccounts,KAccountsID,ETrue); CreateIndexL(TheDatabase,KAccounts,KAccountsBalance,EFalse); set=Set::CreateL(TransactionsDef); - test2(TheDatabase.CreateTable(KTransactions,*set),KErrNone); + TEST2(TheDatabase.CreateTable(KTransactions,*set),KErrNone); delete set; CreateIndexL(TheDatabase,KTransactions,KTransactionDate,EFalse); - test2(TheDatabase.Commit(),KErrNone); + TEST2(TheDatabase.Commit(),KErrNone); OldCount=NewCount=0; // prepare Accs table TheDatabase.Begin(); - test2(Accs.Prepare(TheDatabase,_L("select * from accounts"),Accs.EInsertOnly),KErrNone); + TEST2(Accs.Prepare(TheDatabase,_L("select * from accounts"),Accs.EInsertOnly),KErrNone); Accs.InsertL(); Accs.SetColL(1,TInt32(ECash)); Accs.SetColL(2,KInitialCash); @@ -188,7 +213,7 @@ Accs.PutL(); TotalMonies+=KInitialBalance; } - test2(TheDatabase.Commit(),KErrNone); + TEST2(TheDatabase.Commit(),KErrNone); Accs.Close(); TheDatabase.Close(); CleanupStack::PopAndDestroy(); // store @@ -207,7 +232,7 @@ { Buf.Format(_L("id=%d"),id); Accs.FirstL(); - test1(Accs.FindL(Accs.EForwards,Buf)>=0); + TEST(Accs.FindL(Accs.EForwards,Buf)>=0); Accs.GetL(); TInt balance=Accs.ColInt(2); Buf.Format(_L("\nStatement for account %d: Previous balance %d\n"),id,balance); @@ -235,7 +260,7 @@ User::LeaveIfError(file.Write(Buf)); } CleanupStack::PopAndDestroy(2); - test1(0); + TEST(0); } #endif @@ -246,77 +271,77 @@ { TheDatabase.OpenL(&aStore,aStore.Root()); // check any indexes - test2(TheTable.Open(TheDatabase,KAccounts,TheTable.EReadOnly),KErrNone); - test2(TheTable.CountL(),KAccountIDs); + TEST2(TheTable.Open(TheDatabase,KAccounts,TheTable.EReadOnly),KErrNone); + TEST2(TheTable.CountL(),KAccountIDs); TInt r=TheTable.SetIndex(KAccountsID); if (r!=KErrCorrupt) { - test2(r,KErrNone); - test2(TheTable.CountL(),KAccountIDs); + TEST2(r,KErrNone); + TEST2(TheTable.CountL(),KAccountIDs); for (TInt id=ECash;id<=EPenny;++id) { - test1(TheTable.NextL()); + TEST(TheTable.NextL()); TheTable.GetL(); - test2(TheTable.ColInt(1),id); + TEST2(TheTable.ColInt(1),id); } - test1(!TheTable.NextL()); + TEST(!TheTable.NextL()); } r=TheTable.SetIndex(KAccountsBalance); if (r!=KErrCorrupt) { - test2(r,KErrNone); - test2(TheTable.CountL(),KAccountIDs); - test1(TheTable.FirstL()); + TEST2(r,KErrNone); + TEST2(TheTable.CountL(),KAccountIDs); + TEST(TheTable.FirstL()); TheTable.GetL(); TInt last=TheTable.ColInt(2); for (TInt ii=1;ii=last); + TEST(bal>=last); last=bal; } - test1(!TheTable.NextL()); + TEST(!TheTable.NextL()); } TheTable.Close(); - test2(TheTable.Open(TheDatabase,KTransactions,TheTable.EReadOnly),KErrNone); + TEST2(TheTable.Open(TheDatabase,KTransactions,TheTable.EReadOnly),KErrNone); TInt count=TheTable.CountL(); r=TheTable.SetIndex(KTransactionDate); if (r!=KErrCorrupt) { - test2(r,KErrNone); - test2(TheTable.CountL(),count); + TEST2(r,KErrNone); + TEST2(TheTable.CountL(),count); if (count) { - test1(TheTable.FirstL()); + TEST(TheTable.FirstL()); TheTable.GetL(); TInt last=TheTable.ColInt(1); while (--count!=0) { - test1(TheTable.NextL()); + TEST(TheTable.NextL()); TheTable.GetL(); TInt date=TheTable.ColInt(1); - test1(date>last); + TEST(date>last); last=date; } - test1(!TheTable.NextL()); + TEST(!TheTable.NextL()); } else - test1(!TheTable.FirstL()); + TEST(!TheTable.FirstL()); } TheTable.Close(); // verify database integrity TInt balance[KAccountIDs]; - test2(Accs.Prepare(TheDatabase,_L("select id,statement_balance,balance from accounts"),Accs.EReadOnly),KErrNone); - test2(Accs.CountL(),KAccountIDs); + TEST2(Accs.Prepare(TheDatabase,_L("select id,statement_balance,balance from accounts"),Accs.EReadOnly),KErrNone); + TEST2(Accs.CountL(),KAccountIDs); while (Accs.NextL()) { Accs.GetL(); TInt id=Accs.ColInt(1); balance[id]=Accs.ColInt(2); } - test2(Trans.Prepare(TheDatabase,_L("select t_date,from_id,to_id,amount from Transactions"),Trans.EReadOnly),KErrNone); + TEST2(Trans.Prepare(TheDatabase,_L("select t_date,from_id,to_id,amount from Transactions"),Trans.EReadOnly),KErrNone); TInt transact=0; while (Trans.NextL()) { @@ -328,10 +353,10 @@ balance[from]-=amount; balance[to]+=amount; } - test2(transact,Trans.CountL()); + TEST2(transact,Trans.CountL()); if (NewCount!=-1 && transact!=NewCount) { - test2(transact,OldCount); + TEST2(transact,OldCount); ++ShotDuringCommit; } OldCount=NewCount=transact; @@ -344,11 +369,11 @@ if (balance[id]!=Accs.ColInt(3)) DumpStateL(); #else - test(balance[id]==Accs.ColInt(3)); + TEST(balance[id]==Accs.ColInt(3)); #endif total+=balance[id]; } - test2(total,TotalMonies); + TEST2(total,TotalMonies); Trans.Close(); Accs.Close(); TheDatabase.Close(); @@ -376,7 +401,7 @@ TInt t=aStore.ReclaimL(); Stopwatch.Start(); t-=aStore.CompactL(); - test.Printf(_L(" compacted %d byte(s) in"),t); + TheTest.Printf(_L(" compacted %d byte(s) in"),t); Stopwatch.Print(); aStore.CommitL(); } @@ -408,7 +433,7 @@ __ASSERT_ALWAYS(aTestExecutionTime >= 0, User::Invariant()); RThread().SetPriority(EPriorityMore); - test.Start(_L("Create the database")); + TheTest.Start(_L("Create the database")); CreateDatabaseL(); TTimeIntervalMinutes timeInterval(aTestExecutionTime); @@ -420,9 +445,9 @@ for (TBool condition=ETrue; condition; condition = aTestExecutionTime > 0 ? (timeCurrent < timeEnd) : ETrue) { - test.Next(_L("Main loop")); - test.Start(_L("Kick off the thread")); - test2 (StartThread(TheThread,TheStatus),KErrNone); + TheTest.Next(_L("Main loop")); + TheTest.Start(_L("Kick off the thread")); + TEST2 (StartThread(TheThread,TheStatus),KErrNone); // random delay for (;;) { @@ -432,50 +457,50 @@ if (Random(1000)<30) break; } - test.Next(_L("End the thread")); + TheTest.Next(_L("End the thread")); TInt exit=EndThread(); if (exit!=1) - test.Printf(_L(" thread failed with error %d\n"),exit); + TheTest.Printf(_L(" thread failed with error %d\n"),exit); // ++Shot; CFileStore* store=NULL; for (TInt ii=0;;++ii) { - test.Printf(_L("Opening %d\r"),ii); + TheTest.Printf(_L("Opening %d\r"),ii); TRAPD(r,store=CFileStore::OpenL(TheFs,KTestDatabase,EFileRead|EFileWrite)); if (r==KErrNone) break; - test (r==KErrInUse); + TEST2(r, KErrInUse); User::After(100000); } - test.Next(_L("Verify & Recover")); - test2 (Verify(*store),KErrNone); + TheTest.Next(_L("Verify & Recover")); + TEST2 (Verify(*store),KErrNone); TInt64 tps(TransId); tps*=1000u; tps/=RunningTime; - test.Printf(_L(" Iteration %d, TPS %d, during commit %d%%\n"),Shot,I64LOW(tps),(100*ShotDuringCommit)/Shot); + TheTest.Printf(_L(" Iteration %d, TPS %d, during commit %d%%\n"),Shot,I64LOW(tps),(100*ShotDuringCommit)/Shot); TInt r=Recover(*store); if (r==KErrNoMemory || r==KErrDiskFull) { // need to compact before completing recovery - test.Next(_L("No space, compacting")); - test2 (Compact(*store),KErrNone); - test.Next(_L("Verify & Recover again")); - test2 (Verify(*store),KErrNone); + TheTest.Next(_L("No space, compacting")); + TEST2 (Compact(*store),KErrNone); + TheTest.Next(_L("Verify & Recover again")); + TEST2 (Verify(*store),KErrNone); r=Recover(*store); } - test2 (r,KErrNone); - test.Next(_L("Verify & Compact")); -// test2 (Verify(*store),KErrNone); - test2 (Compact(*store),KErrNone); - test.Next(_L("Verify")); - test2 (Verify(*store),KErrNone); + TEST2 (r,KErrNone); + TheTest.Next(_L("Verify & Compact")); +// TEST2 (Verify(*store),KErrNone); + TEST2 (Compact(*store),KErrNone); + TheTest.Next(_L("Verify")); + TEST2 (Verify(*store),KErrNone); // delete store; - test.End(); + TheTest.End(); timeCurrent.UniversalTime(); } - test.End(); + TheTest.End(); } /** @@ -488,20 +513,20 @@ */ static void RunVerify() { - test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0636 Open store ")); + TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0636 Open store ")); CFileStore* store=NULL; TRAPD(r,store=CFileStore::OpenL(TheFs,KTestDatabase,EFileRead|EFileWrite)); - test2 (r,KErrNone); - test.Next(_L("Verify")); + TEST2 (r,KErrNone); + TheTest.Next(_L("Verify")); NewCount=-1; TotalMonies=KInitialCash + (EPenny-EJohn+1)*KInitialBalance; - test2 (Verify(*store),KErrNone); - test.Next(_L("Recover")); - test2 (Recover(*store),KErrNone); - test.Next(_L("Verify")); - test2 (Verify(*store),KErrNone); + TEST2 (Verify(*store),KErrNone); + TheTest.Next(_L("Recover")); + TEST2 (Recover(*store),KErrNone); + TheTest.Next(_L("Verify")); + TEST2 (Verify(*store),KErrNone); delete store; - test.End(); + TheTest.End(); } // @@ -510,28 +535,28 @@ LOCAL_C void setupTestDirectory() { TInt r=TheFs.Connect(); - test2(r,KErrNone); + TEST2(r,KErrNone); // r=TheFs.MkDir(KTestDir); - test1(r==KErrNone || r==KErrAlreadyExists); + TEST(r==KErrNone || r==KErrAlreadyExists); r=TheFs.SetSessionPath(KTestDir); - test2(r,KErrNone); + TEST2(r,KErrNone); } -LOCAL_C CTrapCleanup* setupCleanup() // // Initialise the cleanup stack. // +LOCAL_C CTrapCleanup* setupCleanup() { CTrapCleanup* cleanup=CTrapCleanup::New(); - test1(cleanup!=NULL); + TEST(cleanup!=NULL); TRAPD(r,\ {\ for (TInt i=KTestCleanupStack;i>0;i--)\ CleanupStack::PushL((TAny*)0);\ CleanupStack::Pop(KTestCleanupStack);\ }); - test2(r,KErrNone); + TEST2(r,KErrNone); return cleanup; } @@ -548,7 +573,7 @@ // (KDefaultTestExecutionTime constant bellow). GLDEF_C TInt E32Main() { - test.Title(); + TheTest.Title(); setupTestDirectory(); CTrapCleanup* cleanup=setupCleanup(); __UHEAP_MARK; @@ -590,11 +615,11 @@ { RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err2, &KLogFile); } - test2(err, KErrNone); + TEST2(err, KErrNone); // __UHEAP_MARKEND; delete cleanup; TheFs.Close(); - test.Close(); + TheTest.Close(); return 0; } diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/dbms/tdbms/t_dbstress.h --- a/persistentstorage/dbms/tdbms/t_dbstress.h Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/dbms/tdbms/t_dbstress.h Sat Feb 20 00:33:55 2010 +0200 @@ -12,13 +12,8 @@ // // Description: // - -// MSVC++ up to 5.0 has problems with expanding inline functions -// This disables the mad warnings for the whole project -#if defined(NDEBUG) && defined(__VC32__) && _MSC_VER<=1100 -#pragma warning(disable : 4710) // function not expanded. MSVC 5.0 is stupid -#endif - +#ifndef T_DBSTRESS_H +#define T_DBSTRESS_H #include #include @@ -32,7 +27,7 @@ GLREF_C TInt Random(TInt aRange); GLREF_D TPtrC KTestDatabase,KTestDir,KLogFile; -GLREF_D RTest test; +GLREF_D RTest TheTest; GLREF_D TInt NewCount; GLREF_D TInt OldCount; GLREF_D TInt TransId; @@ -49,3 +44,13 @@ GLREF_D Timer RunTimer; +#undef TEST_STRING +#define TEST_STRING(s) _S(s) + +void Check1(TInt aValue, const TText* aFile, TInt aLine); +void Check2(TInt aValue, TInt aExpected, const TText* aFile, TInt aLine); + +#define TEST(arg) ::Check1((arg), TEST_STRING(__FILE__), __LINE__) +#define TEST2(aValue, aExpected) ::Check2(aValue, aExpected, TEST_STRING(__FILE__), __LINE__) + +#endif// T_DBSTRESS_H diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/dbms/tdbms/t_dbthrd.cpp --- a/persistentstorage/dbms/tdbms/t_dbthrd.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/dbms/tdbms/t_dbthrd.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -170,7 +170,7 @@ void CThread::Reset() { iLog.Write(_L8("\nReset")); - test(iOpen); + TEST(iOpen); iAccs.Reset(); iTrans.Reset(); } @@ -256,7 +256,7 @@ { Sql.Format(_L("id=%d"),anAccount); iAccs.FirstL(); - test(iAccs.FindL(iAccs.EForwards,Sql)>=0); + TEST(iAccs.FindL(iAccs.EForwards,Sql)>=0); } // @@ -274,7 +274,7 @@ TInt to=(Random(KAccountIDs-1)+from+1)%KAccountIDs; AccountL(from); iAccs.GetL(); - test(iAccs.ColInt(1)==from); + TEST(iAccs.ColInt(1)==from); TInt avail=iAccs.ColInt(2)+KOverdraftLimit; TInt amount; if (to==ECash) @@ -370,7 +370,7 @@ void CThread::VerifyL() { TInt balance[KAccountIDs]; - test(iAccs.CountL()==KAccountIDs); + TEST(iAccs.CountL()==KAccountIDs); for (iAccs.BeginningL();iAccs.NextL();) { iAccs.GetL(); @@ -388,7 +388,7 @@ balance[from]-=amount; balance[to]+=amount; } - test(transact==iTrans.CountL()); + TEST(transact==iTrans.CountL()); for (iAccs.BeginningL();iAccs.NextL();) { iAccs.GetL(); diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/sql/OsLayer/os_symbian.cpp --- a/persistentstorage/sql/OsLayer/os_symbian.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/sql/OsLayer/os_symbian.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -1,4 +1,4 @@ -// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2005-2010 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" @@ -819,7 +819,7 @@ static TInt DoGetDeviceCharacteristics(const TDriveInfo& aDriveInfo, const TVolumeIOParamInfo& aVolumeInfo); static TInt DoGetSectorSize(const TDriveInfo& aDriveInfo, const TVolumeIOParamInfo& aVolumeInfo); static TInt DoGetDeviceCharacteristicsAndSectorSize(TDbFile& aDbFile, TInt& aRecReadBufSize); - + static TInt DoFileSizeCorruptionCheck(TDbFile& aDbFile, const TDesC& aFname, TInt aFmode); }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -2107,6 +2107,64 @@ /** SQLite OS porting layer API. +The behaviour of the RFile/RFile64::SetSize operation is not atomic for non-rugged drives. +When RFile/RFile64::SetSize() is called 2 operations occurs:- + +1)The cluster chain of the file is updated. +2)The new file size is added to the file cache. + +If a power loss occurs after a SetSize there is a chance that the cluster chain was updated +but the new file size is not yet flushed to the file. This puts the file into an inconsistent state. +This is most likely to occur in the journal file where the time between a SetSize and Flush can +be long. + +For this reason this check is added when the file is opened to see if the end of the file can +be read straight away, if an error is returned then it is assumed that the SetSize has not be +completed previously. In this case the file is deleted and re-created. + +@param aDbFile A pointer to a TDbFile instance, that contains the file handle. +@param aFname A string of 16-bit wide characters containing name of the file to be checked. +@param aFmode The mode in which the file is opened. These mode are documented in TFileMode. + +@return KErrNone, The operation has completed succesfully; + Note that other system-wide error codes may also be returned. +@see TFileMode +@see TVfs::Open() +@see TDbFile +*/ +/* static */ TInt TVfs::DoFileSizeCorruptionCheck(TDbFile& aDbFile, const TDesC& aFname, TInt aFmode) + { + const TInt KMinSize = 16; + TInt64 size; + TInt err = KErrNone ; + TBuf8 buf; + + err = aDbFile.iFileBuf.Size(size); + if (err != KErrNone) + { + return err; + } + TBool IsMinFileSize = (size >= KMinSize); + + if (IsMinFileSize) + { + err = aDbFile.iFileBuf.Read(size - KMinSize, buf); + } + + if (err == KErrCorrupt || err == KErrEof || !IsMinFileSize) + { + COsLayerData& osLayerData = COsLayerData::Instance(); + + aDbFile.iFileBuf.Close(); + (void) osLayerData.iFs.Delete(aFname); + err = aDbFile.iFileBuf.Create(osLayerData.iFs, aFname, aFmode); + } + return err; + } + +/** +SQLite OS porting layer API. + Opens or creates a file which name is in the aFileName parameter. If the function succeeds, the file handle and other related information will be stored in the place pointed by the aDbFile parameter, a memory block of sizeof(TDbFile) size for which is allocated by the caller. @@ -2211,6 +2269,12 @@ { __FS_CALL(EFsOpFileOpen, 0); err = dbFile.iFileBuf.Open(osLayerData.iFs, fname, fmode); + + if(err == KErrNone && ((aFlags & SQLITE_OPEN_MAIN_JOURNAL) || (aFlags & SQLITE_OPEN_TEMP_JOURNAL) || + (aFlags & SQLITE_OPEN_SUBJOURNAL) || (aFlags & SQLITE_OPEN_MASTER_JOURNAL))) + { + err = TVfs::DoFileSizeCorruptionCheck(dbFile, fname, fmode); + } } if((err != KErrNone && err != KErrNoMemory && err != KErrDiskFull) && (aFlags & SQLITE_OPEN_READWRITE)) { @@ -2219,7 +2283,7 @@ fmode &= ~EFileWrite; __FS_CALL(EFsOpFileOpen, 0); err = dbFile.iFileBuf.Open(osLayerData.iFs, fname, fmode); - } + } if(err != KErrNone && prevErr == KErrAccessDenied) { err = KErrAccessDenied; diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/sql/SQLite/main.c --- a/persistentstorage/sql/SQLite/main.c Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/sql/SQLite/main.c Sat Feb 20 00:33:55 2010 +0200 @@ -1131,31 +1131,24 @@ ** error. */ const void *sqlite3_errmsg16(sqlite3 *db){ - /* Because all the characters in the string are in the unicode - ** range 0x00-0xFF, if we pad the big-endian string with a - ** zero byte, we can obtain the little-endian string with - ** &big_endian[1]. - */ - static const char outOfMemBe[] = { - 0, 'o', 0, 'u', 0, 't', 0, ' ', - 0, 'o', 0, 'f', 0, ' ', - 0, 'm', 0, 'e', 0, 'm', 0, 'o', 0, 'r', 0, 'y', 0, 0, 0 + static const u16 outOfMem[] = { + 'o', 'u', 't', ' ', 'o', 'f', ' ', 'm', 'e', 'm', 'o', 'r', 'y', 0 }; - static const char misuseBe [] = { - 0, 'l', 0, 'i', 0, 'b', 0, 'r', 0, 'a', 0, 'r', 0, 'y', 0, ' ', - 0, 'r', 0, 'o', 0, 'u', 0, 't', 0, 'i', 0, 'n', 0, 'e', 0, ' ', - 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, 'e', 0, 'd', 0, ' ', - 0, 'o', 0, 'u', 0, 't', 0, ' ', - 0, 'o', 0, 'f', 0, ' ', - 0, 's', 0, 'e', 0, 'q', 0, 'u', 0, 'e', 0, 'n', 0, 'c', 0, 'e', 0, 0, 0 + static const u16 misuse[] = { + 'l', 'i', 'b', 'r', 'a', 'r', 'y', ' ', + 'r', 'o', 'u', 't', 'i', 'n', 'e', ' ', + 'c', 'a', 'l', 'l', 'e', 'd', ' ', + 'o', 'u', 't', ' ', + 'o', 'f', ' ', + 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', 0 }; const void *z; if( !db ){ - return (void *)(&outOfMemBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]); + return (void *)outOfMem; } if( !sqlite3SafetyCheckSickOrOk(db) ){ - return (void *)(&misuseBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]); + return (void *)misuse; } sqlite3_mutex_enter(db->mutex); assert( !db->mallocFailed ); diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/sql/SQLite364/main.c --- a/persistentstorage/sql/SQLite364/main.c Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/sql/SQLite364/main.c Sat Feb 20 00:33:55 2010 +0200 @@ -1208,31 +1208,24 @@ ** error. */ const void *sqlite3_errmsg16(sqlite3 *db){ - /* Because all the characters in the string are in the unicode - ** range 0x00-0xFF, if we pad the big-endian string with a - ** zero byte, we can obtain the little-endian string with - ** &big_endian[1]. - */ - static const char outOfMemBe[] = { - 0, 'o', 0, 'u', 0, 't', 0, ' ', - 0, 'o', 0, 'f', 0, ' ', - 0, 'm', 0, 'e', 0, 'm', 0, 'o', 0, 'r', 0, 'y', 0, 0, 0 + static const u16 outOfMem[] = { + 'o', 'u', 't', ' ', 'o', 'f', ' ', 'm', 'e', 'm', 'o', 'r', 'y', 0 }; - static const char misuseBe [] = { - 0, 'l', 0, 'i', 0, 'b', 0, 'r', 0, 'a', 0, 'r', 0, 'y', 0, ' ', - 0, 'r', 0, 'o', 0, 'u', 0, 't', 0, 'i', 0, 'n', 0, 'e', 0, ' ', - 0, 'c', 0, 'a', 0, 'l', 0, 'l', 0, 'e', 0, 'd', 0, ' ', - 0, 'o', 0, 'u', 0, 't', 0, ' ', - 0, 'o', 0, 'f', 0, ' ', - 0, 's', 0, 'e', 0, 'q', 0, 'u', 0, 'e', 0, 'n', 0, 'c', 0, 'e', 0, 0, 0 + static const u16 misuse[] = { + 'l', 'i', 'b', 'r', 'a', 'r', 'y', ' ', + 'r', 'o', 'u', 't', 'i', 'n', 'e', ' ', + 'c', 'a', 'l', 'l', 'e', 'd', ' ', + 'o', 'u', 't', ' ', + 'o', 'f', ' ', + 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', 0 }; const void *z; if( !db ){ - return (void *)(&outOfMemBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]); + return (void *)outOfMem; } if( !sqlite3SafetyCheckSickOrOk(db) ){ - return (void *)(&misuseBe[SQLITE_UTF16NATIVE==SQLITE_UTF16LE?1:0]); + return (void *)misuse; } sqlite3_mutex_enter(db->mutex); assert( !db->mallocFailed ); diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/sql/SRC/Server/Compact/SqlCompact.cpp --- a/persistentstorage/sql/SRC/Server/Compact/SqlCompact.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/sql/SRC/Server/Compact/SqlCompact.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -173,7 +173,14 @@ { if(entry->Release() == 0) { - iEntries.Remove(idx); + iEntries.Remove(idx); +#ifdef _DEBUG +//This is used prevent the failure of the resource allocation checking for debug mode. + if(iEntries.Count() == 0) + { + iEntries.Reset(); + } +#endif } } } diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/sql/SRC/Server/SqlSrvGetFirstSqlStmt.cpp --- a/persistentstorage/sql/SRC/Server/SqlSrvGetFirstSqlStmt.cpp Wed Feb 03 12:02:34 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -// Copyright (c) 2006-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 -#include "sqlite3.h" - -//This function searches aString argument for ';' occurences. -//Every time when it finds a ';' character, the function places a 0 right after the ';' and -//tests the just created, zero-terminated substring if it is a comlpete SQL statement. -// -//If it is a SQL statement, the function replaces the found ';' character with 0 and returns the just created -//zero-terminated substring.Also the function modifies aString argument to point right after the found -//SQL string. If it is not SQL statement, the function will continue the searching. -// -//If there is no ';' inside aString argument, the function returns the same string as a return result and -//modifies aString argument - sets it to TPtr(NULL, 0, 0). -// -//The function expects aString argument to be zero-terminated. -TPtrC GetFirstSqlStmt(TPtr& aString) - { - const TChar KDelimitier(';'); - TPtr str(const_cast (aString.Ptr()), aString.Length(), aString.Length()); - TInt afterDelimitierPos = 0; - TInt pos; - while((pos = str.Locate(KDelimitier) + 1) > 0 && pos < str.Length()) - { - //There is a possibility that the string which terminates with the found ';' is SQL statement. - //Zero terminate the string placing a zero right after ';' character and test it using sqlite3_complete16() - //call. If it is not SQL string, restore the original character and continue searching. - afterDelimitierPos += pos; - TChar ch = aString[afterDelimitierPos]; - aString[afterDelimitierPos] = 0; - TInt res = sqlite3_complete16(aString.Ptr()); - aString[afterDelimitierPos] = ch; - if(res) - { - str.Set(const_cast (aString.Ptr()), afterDelimitierPos, afterDelimitierPos); - //Replace the found ';' character with 0. - str[afterDelimitierPos - 1] = 0; - aString.Set(const_cast (aString.Ptr()) + afterDelimitierPos, aString.Length() - afterDelimitierPos, aString.Length() - afterDelimitierPos); - return str; - } - str.Set(const_cast (str.Ptr()) + pos, str.Length() - pos, str.Length() - pos); - } - //aString argument does not contain valid SQL statement or there is no ';' character inside aString. - //Set aString to TPtr(NULL, 0, 0) and return the original string. - aString.Set(NULL, 0, 0); - return str; - } diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/sql/TEST/t_sqldefect.cpp --- a/persistentstorage/sql/TEST/t_sqldefect.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/sql/TEST/t_sqldefect.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2006-2010 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" @@ -733,8 +733,8 @@ of the available memory and the amount of free disk space - factors which cannot be easily resolved on target hardware. The test creates a database with a table: T(Id INTEGER, Data BLOB). - One record with a BLOB (0.9Mb size) is inserted using RSqlDatabase::Exec(). - Another record with a BLOB (1.8Mb size) is inserted using RSqlStatement and BLOB parameter. + One record with a BLOB (either 0.79Mb or 0.9Mb) is inserted using RSqlDatabase::Exec(). + Another record with a BLOB (either 1.58 or 1.8Mb) is inserted using RSqlStatement and BLOB parameter. If the defect is not fixed, after the first INSERT the SQL server will not free occupied by the statement memory. The available heap memory won't be enough for the execution of the second INSERT statement. The second INSERT will fail with KErrNoMemory. @@ -746,7 +746,12 @@ void DEF106391() { #if defined __WINS__ || defined __WINSCW__ - const TInt KBlobSize = 900 * 1024; +#ifndef SYMBIAN_USE_SQLITE_VERSION_3_6_4 + const TInt KBlobSize = 900 * 1024; +#else + const TInt KBlobSize = 790 * 1024; +#endif + _LIT8(KConfigStr, "encoding=UTF-8"); HBufC8* sqlBuf = HBufC8::New(KBlobSize * 2 + 200);//"+ 200" - for the SQL INSERT statement @@ -1504,6 +1509,79 @@ (void)RSqlDatabase::Delete(KTestDatabase1); } +/** +@SYMTestCaseID PDS-SQL-UT-4157 +@SYMTestCaseDesc Test for PDEF143461 Calling CSqlSrvDatabase::LastErrorMessage() does not panic with the descriptor alignment error +@SYMTestPriority Normal +@SYMTestActions Test for PDEF143461 - CSqlSrvDatabase::LastErrorMessage() alignment problem. + This tests the following SQLite Error messages to make sure it doesn't panic: + 1)library routine called out of sequence + 2)out of memory +@SYMTestExpectedResults Test must not fail +@SYMDEF PDEF143461 +*/ +void PDEF143461L() + { + (void) RSqlDatabase::Delete(KTestDatabase6); + + //Create and setup the database file + RSqlDatabase db; + TInt err =0; + err = db.Create(KTestDatabase6); + TEST2(err, KErrNone); + err = db.Exec(_L("CREATE TABLE t(num INTEGER)")); + TEST2(err, 1); + err = db.Exec(_L("INSERT INTO t VALUES(1)")); + TEST2(err, 1); + err = db.Exec(_L("INSERT INTO t VALUES(2)")); + TEST2(err, 1); + + + //Purposely commit an error so LastErrorMessage can be called + RSqlStatement stmt; + err = stmt.Prepare(db, _L("DELETE FROM t WHERE ROWID=?")); + TEST2(err, KErrNone); + err = stmt.BindInt(0, 1); + TEST2(err, KErrNone); + err = stmt.Exec(); + TEST2(err, 1); + + //Should have reset stmt here + err = stmt.BindInt(0, 2); + TEST2(err, KErrNone); + err = stmt.Exec(); + TEST2(err, KSqlErrMisuse); + + //Test "library routine called out of sequence" error message + //If the defect is not fixed then it will panic here + TPtrC errMsg = db.LastErrorMessage(); + RDebug::Print(_L("errMsg=%S\r\n"), &errMsg); + + stmt.Close(); + db.Close(); + + TInt allocationNo = 0; + //The mask allows the out of memory simulation of the SQL Server to be delayed until the database is opened + const TInt KDelayedDbHeapFailureMask = 0x1000; + + do + { + TSqlResourceTester::SetDbHeapFailure(RHeap::EDeterministic |KDelayedDbHeapFailureMask, ++allocationNo); + err = db.Open(KTestDatabase6); + TEST2(err, KErrNone); + err = db.Exec(_L("INSERT INTO t VALUES(3)")); + TSqlResourceTester::SetDbHeapFailure(RHeap::ENone, 0); + + TheTest.Printf(_L("%d \r"), allocationNo); + //Test "out of memory" error message, if the defect is not fixed then it will panic here + TPtrC errMsg = db.LastErrorMessage(); + RDebug::Print(_L("errMsg=%S\r\n"), &errMsg); + db.Close(); + } + while (err == KErrNoMemory); + TEST2(err, 1); + } + void DoTestsL() { @@ -1584,6 +1662,9 @@ TheTest.Next(_L(" @SYMTestCaseID:PDS-SQL-CT-4153 DEF143047: SQL, default \"max parameter count\" value, compatibility problem.")); DEF143047(); + + TheTest.Next(_L(" @SYMTestCaseID:PDS-SQL-CT-4157 PDEF143461 : CSqlSrvDatabase::LastErrorMessage() alignment problem")); + PDEF143461L(); } TInt E32Main() diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/sqlite3api/GROUP/SQLite3_stub.SIS Binary file persistentstorage/sqlite3api/GROUP/SQLite3_stub.SIS has changed diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/sqlite3api/GROUP/SQLite3_stub.pkg --- a/persistentstorage/sqlite3api/GROUP/SQLite3_stub.pkg Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/sqlite3api/GROUP/SQLite3_stub.pkg Sat Feb 20 00:33:55 2010 +0200 @@ -18,7 +18,7 @@ &EN ;Header -#{"sqlite3"}, (0x2002533B), 1,0,0, TYPE=SA +#{"sqlite3"}, (0x2002AF5F), 1,0,0, TYPE=SA ;Localised vendor name %{"Nokia"} diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/store/ROM/StoreTests.BAT --- a/persistentstorage/store/ROM/StoreTests.BAT Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/store/ROM/StoreTests.BAT Sat Feb 20 00:33:55 2010 +0200 @@ -31,7 +31,7 @@ t_stordictfs t_storembed t_storshape -t_stortdict +t_stordict t_storstrm t_storverify t_storconv diff -r 6862383cf555 -r 5ffdb8f2067f persistentstorage/store/TSTOR/t_stordict.cpp --- a/persistentstorage/store/TSTOR/t_stordict.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/persistentstorage/store/TSTOR/t_stordict.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -12,30 +12,37 @@ // // Description: // - -#if !defined(__E32TEST_H__) #include -#endif - #include // // CTestStreamDictionary +// The only reason this class to be used here is to +// get an access to CStreamDictionary::iArray (private data member). // - class CTestStreamDictionary : public CStreamDictionary { public: - struct TEntry {TUid uid;TStreamId id;}; + struct TEntry + { + TUid uid; + TStreamId id; + }; public: static CTestStreamDictionary* NewL(); CTestStreamDictionary(); -//* TUid Uid(TInt aInt) { return (*iEntryList)[aInt].iUid; } -//* TStreamId StreamId(TInt aInt) { return (*iEntryList)[aInt].iStreamId; } -//* TInt Count() { return iEntryList->Count(); } - TUid Uid(TInt aInt) { return (*iCheat)[aInt].uid; } - TStreamId StreamId(TInt aInt) { return (*iCheat)[aInt].id; } - TInt Count() { return iCheat->Count(); } + TUid Uid(TInt aInt) + { + return (*iCheat)[aInt].uid; + } + TStreamId StreamId(TInt aInt) + { + return (*iCheat)[aInt].id; + } + TInt Count() + { + return iCheat->Count(); + } private: CArrayFixSeg* iCheat; }; @@ -43,38 +50,65 @@ CTestStreamDictionary* CTestStreamDictionary::NewL() { CTestStreamDictionary* thing=new(ELeave) CTestStreamDictionary(); -//* CleanupStack::PushL(thing); -//* thing->ConstructL(); -//* CleanupStack::Pop(); return thing; } CTestStreamDictionary::CTestStreamDictionary() - : iCheat((CArrayFixSeg*)&iCheat-1) // modification to get to count etc - {} + : iCheat((CArrayFixSeg*)&iCheat-1) //Now iCheat points to the base class' private data member: + //CStreamDictionary::iArray. + //This way it is possible to call iArray's methods (even though it is private). + { + } // // Test code // -const TInt KTestCleanupStack=0x40; const TInt KTestExpandSize=0x20; -LOCAL_D RTest test(_L("t_stordict")); -LOCAL_D CTrapCleanup* TheTrapCleanup; +static RTest TheTest(_L("t_stordict")); // some uid-stream pairs to use for testing const TUid testUid1={1}; -LOCAL_D TStreamId testStreamId1=TStreamId(1); +static TStreamId testStreamId1=TStreamId(1); // const TUid testUid2={57}; -LOCAL_D TStreamId testStreamId2=TStreamId(57); +static TStreamId testStreamId2=TStreamId(57); // const TUid testUid3={99999}; -LOCAL_D TStreamId testStreamId3=TStreamId(425); +static TStreamId testStreamId3=TStreamId(425); // +//Put test data files to be deleted at the end here! +void DeleteDataFiles() + { + } + +//Tests macros and functions. +//If (!aValue) then the test will be panicked, the test data files will be deleted. +static void Check(TInt aValue, TInt aLine) + { + if(!aValue) + { + DeleteDataFiles(); + TheTest(EFalse, aLine); + } + } +//If (aValue != aExpected) then the test will be panicked, the test data files will be deleted. +static void Check(TInt aValue, TInt aExpected, TInt aLine) + { + if(aValue != aExpected) + { + RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue); + DeleteDataFiles(); + TheTest(EFalse, aLine); + } + } +//Use these to test conditions. +#define TEST(arg) ::Check((arg), __LINE__) +#define TEST2(aValue, aExpected) ::Check(aValue, aExpected, __LINE__) + /** @SYMTestCaseID SYSLIB-STORE-CT-1201 @SYMTestCaseDesc Tests for copy operations on dictionary files @@ -86,32 +120,30 @@ template void testCopyL(T1& aCopy,const T2& anOriginal) { - test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1201 ")); + TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1201 ")); CBufSeg* buf=0; TRAPD(r,buf=CBufSeg::NewL(KTestExpandSize)); - if (r!=KErrNone) - test.Panic(_L("Allocating buffer")); + TEST2(r, KErrNone); // // Write anOriginal out to the buffer. // RBufWriteStream out; out.Append(*buf); TRAP(r,out<>aCopy); - test(r==KErrNone); + TEST2(r, KErrNone); // // See if it's consumed the lot. // TUint8 b; - test(in.Source()->ReadL(&b,1)==0); + TEST2(in.Source()->ReadL(&b,1), 0); // delete buf; } @@ -126,14 +158,14 @@ */ void testIsEqual(CTestStreamDictionary* aCopy,CTestStreamDictionary* aOrig) { - test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1202 ")); + TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1202 ")); TInt origCount=aOrig->Count(); - test(origCount==aCopy->Count()); + TEST(origCount==aCopy->Count()); // for (TInt i=0 ; iUid(i)==aCopy->Uid(i)); - test(aOrig->StreamId(i)==aCopy->StreamId(i)); + TEST(aOrig->Uid(i)==aCopy->Uid(i)); + TEST(aOrig->StreamId(i)==aCopy->StreamId(i)); } } @@ -149,51 +181,51 @@ { CTestStreamDictionary* dic=CTestStreamDictionary::NewL(); // attempt finding and removing with an empty dictionary - test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1203 Manipulating an empty dictionary ")); - test(dic->Count()==0); - test(dic->At(testUid1)==KNullStreamId); + TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1203 Manipulating an empty dictionary ")); + TEST2(dic->Count(), 0); + TEST(dic->At(testUid1)==KNullStreamId); dic->Remove(testUid1); - test(dic->Count()==0); - test(dic->IsNull()); + TEST2(dic->Count(), 0); + TEST(dic->IsNull()); // // assign an entry - test.Next(_L("Assigning entries and manipulating them")); + TheTest.Next(_L("Assigning entries and manipulating them")); TRAPD(ret,dic->AssignL(testUid1,testStreamId1)); - test(ret==KErrNone); - test(dic->Count()==1); - test(!dic->IsNull()); - test(dic->At(testUid1)==testStreamId1); + TEST2(ret, KErrNone); + TEST2(dic->Count(), 1); + TEST(!dic->IsNull()); + TEST(dic->At(testUid1)==testStreamId1); // // assign another entry TRAP(ret,dic->AssignL(testUid2,testStreamId2)); - test(ret==KErrNone); - test(dic->Count()==2); - test(dic->At(testUid2)==testStreamId2); + TEST2(ret, KErrNone); + TEST2(dic->Count(), 2); + TEST(dic->At(testUid2)==testStreamId2); // // re-assign uid1 TRAP(ret,dic->AssignL(testUid1,testStreamId3)); - test(ret==KErrNone); - test(dic->Count()==2); - test(dic->At(testUid1)==testStreamId3); + TEST2(ret, KErrNone); + TEST2(dic->Count(), 2); + TEST(dic->At(testUid1)==testStreamId3); // // test finding and removing a non-existant entry from a non-empty dictionary - test(dic->At(testUid3)==KNullStreamId); + TEST(dic->At(testUid3)==KNullStreamId); dic->Remove(testUid3); - test(dic->Count()==2); + TEST2(dic->Count(), 2); // // test removing an entry dic->Remove(testUid1); - test(dic->Count()==1); - test(dic->At(testUid1)==KNullStreamId); - test(dic->At(testUid2)==testStreamId2); - test(!dic->IsNull()); + TEST2(dic->Count(), 1); + TEST(dic->At(testUid1)==KNullStreamId); + TEST(dic->At(testUid2)==testStreamId2); + TEST(!dic->IsNull()); // // test removing the other entry dic->Remove(testUid2); - test(dic->Count()==0); - test(dic->IsNull()); - test(dic->At(testUid1)==KNullStreamId); - test(dic->At(testUid2)==KNullStreamId); + TEST2(dic->Count(), 0); + TEST(dic->IsNull()); + TEST(dic->At(testUid1)==KNullStreamId); + TEST(dic->At(testUid2)==KNullStreamId); // delete dic; } @@ -213,63 +245,53 @@ CTestStreamDictionary* copy=CTestStreamDictionary::NewL(); // // copy an empty dictionary - test.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1204 Streaming an empty dictionary ")); - test(orig->IsNull()); + TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-STORE-CT-1204 Streaming an empty dictionary ")); + TEST(orig->IsNull()); testCopyL(*copy,*orig); - test(copy->IsNull()); + TEST(copy->IsNull()); // // copy a dictionary containing a range of entries - test.Next(_L("Streaming a dictionary containing entries")); + TheTest.Next(_L("Streaming a dictionary containing entries")); TRAPD(ret,orig->AssignL(testUid1,testStreamId1)); TRAP(ret,orig->AssignL(testUid2,testStreamId2)); TRAP(ret,orig->AssignL(testUid3,testStreamId3)); testCopyL(*copy,*orig); testIsEqual(copy,orig); - test(!copy->IsNull()); + TEST(!copy->IsNull()); // delete orig; delete copy; } - -// -// Initialise the cleanup stack. -// -LOCAL_C void setupCleanup() +void DoTestL() { - TheTrapCleanup=CTrapCleanup::New(); - TRAPD(r,\ - {\ - for (TInt i=KTestCleanupStack;i>0;i--)\ - CleanupStack::PushL((TAny*)1);\ - test(r==KErrNone);\ - CleanupStack::Pop(KTestCleanupStack);\ - }); - } + simpleTestsL(); + streamingTestsL(); + } - -GLDEF_C TInt E32Main() +TInt E32Main() { - setupCleanup(); - // - test.Title(); - test.Start(_L("Testing CStreamDictionary...")); - // - // run the testcode (inside an alloc heaven harness) - __UHEAP_MARK; + __UHEAP_MARK; + + TheTest.Title(); + + CTrapCleanup* trapCleanup = CTrapCleanup::New(); + TheTest(trapCleanup != NULL); - TRAPD(r,simpleTestsL()); - test(r==KErrNone); - - TRAP(r,streamingTestsL()); - test(r==KErrNone); + TheTest.Start(_L("Testing CStreamDictionary...")); + + TRAPD(err, DoTestL()); + TEST2(err, KErrNone); - __UHEAP_MARKEND; + DeleteDataFiles(); + + TheTest.End(); + TheTest.Close(); - test.End(); - test.Close(); - - delete TheTrapCleanup; + delete trapCleanup; + + __UHEAP_MARKEND; + return KErrNone; } diff -r 6862383cf555 -r 5ffdb8f2067f traceservices/tracefw/integ_test/ost/TEF/te_ostv2integsuite_functional/inc/te_ostv2tracetestwrapper.h --- a/traceservices/tracefw/integ_test/ost/TEF/te_ostv2integsuite_functional/inc/te_ostv2tracetestwrapper.h Wed Feb 03 12:02:34 2010 +0000 +++ b/traceservices/tracefw/integ_test/ost/TEF/te_ostv2integsuite_functional/inc/te_ostv2tracetestwrapper.h Sat Feb 20 00:33:55 2010 +0200 @@ -44,6 +44,9 @@ private: TInt CheckResults(const TDesC& aLogFilename); + void TestDuplicatesL(); + void TestOstDebugOnlyWrapL(); + TInt OpenUlogger(RULogger& aLogger); }; _LIT(KOstTraceTestWrapper, "OstTraceTestWrapper"); diff -r 6862383cf555 -r 5ffdb8f2067f traceservices/tracefw/integ_test/ost/TEF/te_ostv2integsuite_functional/src/te_ostv2tracetestwrapper.cpp --- a/traceservices/tracefw/integ_test/ost/TEF/te_ostv2integsuite_functional/src/te_ostv2tracetestwrapper.cpp Wed Feb 03 12:02:34 2010 +0000 +++ b/traceservices/tracefw/integ_test/ost/TEF/te_ostv2integsuite_functional/src/te_ostv2tracetestwrapper.cpp Sat Feb 20 00:33:55 2010 +0200 @@ -15,237 +15,422 @@ // - /** @file te_tracecontroldefaultconfig.cpp @internalTechnology -*/ + */ +#ifndef OST_TRACE_COMPILER_IN_USE +#define OST_TRACE_COMPILER_IN_USE +#endif //OST_TRACE_COMPILER_IN_USE +#include + + #include "te_ostv2tracetestwrapper.h" -#include "opensystemtrace_types.h" #include "te_ostv2tracetestwrapperTraces.h" -const TUint32 KTestTInt1 = 0x123; -const TUint32 KTestTInt2 = 0x456; - +const TUint32 KTestTInt1 = 0x123; +const TUint32 KTestTInt2 = 0x456; _LIT(KTestDuplicates, "TestDuplicates"); -using namespace Ulogger; -CTOstv2TraceTestWrapper::~CTOstv2TraceTestWrapper() +_LIT(KTestOstDebugOnlyWrap, "TestOstDebugOnlyWrap"); + +//macro wrapper that works only in _DEBUG mode +#ifndef OST_DEBUG_ONLY +#ifdef _DEBUG +#define OST_DEBUG_ONLY(x) x +#else +#define OST_DEBUG_ONLY(x) +#endif +#endif //ifndef OST_DEBUG_ONLY + +using namespace Ulogger; /** * Destructor */ - { - } +CTOstv2TraceTestWrapper::~CTOstv2TraceTestWrapper() + { + } -CTOstv2TraceTestWrapper::CTOstv2TraceTestWrapper() /** * Constructor */ - { - } +CTOstv2TraceTestWrapper::CTOstv2TraceTestWrapper() + { + } CTOstv2TraceTestWrapper* CTOstv2TraceTestWrapper::NewLC() - { - CTOstv2TraceTestWrapper* self = new (ELeave)CTOstv2TraceTestWrapper(); - CleanupStack::PushL(self); - self->ConstructL(); - return self; - } + { + CTOstv2TraceTestWrapper* self = new (ELeave) CTOstv2TraceTestWrapper(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } CTOstv2TraceTestWrapper* CTOstv2TraceTestWrapper::NewL() - { - CTOstv2TraceTestWrapper* self=CTOstv2TraceTestWrapper::NewLC(); - CleanupStack::Pop(); // self; - return self; - } + { + CTOstv2TraceTestWrapper* self = CTOstv2TraceTestWrapper::NewLC(); + CleanupStack::Pop(); // self; + return self; + } void CTOstv2TraceTestWrapper::ConstructL() - { - } + { + } TAny* CTOstv2TraceTestWrapper::GetObject() - { - return NULL; - } -TBool CTOstv2TraceTestWrapper::DoCommandL( const TTEFFunction& aCommand, - const TTEFSectionName& /*aSection*/, - const TInt /*aAsyncErrorIndex*/) - { - - if(aCommand == KTestDuplicates()) - { - - - INFO_PRINTF1(_L("CTOstv2TraceTestWrapper::DoCommandL Testing duplicates")); - - INFO_PRINTF1(_L("Opening Ulogger connection")); - RULogger logger; - TInt result=logger.Connect(); - INFO_PRINTF2(_L("Connection to Ulogger: %d, attempt: 1"), result); - if (result!=KErrNone) - { - INFO_PRINTF1(_L("Connection to Ulogger failed. Will try to connect max. 10 times")); - for (TInt i=2; i<12;i++) - { - User::After(1000); - result = logger.Connect(); - INFO_PRINTF3(_L("Connection to Ulogger: %d, attempt: %d"), result, i); - if (result==KErrNone) - { - break; - } - } - } - - - // clear the config file - CClearConfig configIni; - configIni.Clear(logger); + { + return NULL; + } +TBool CTOstv2TraceTestWrapper::DoCommandL(const TTEFFunction& aCommand, + const TTEFSectionName& /*aSection*/, const TInt /*aAsyncErrorIndex*/) + { + + TBool ret = ETrue; + + if (aCommand == KTestDuplicates()) + { + TestDuplicatesL(); + } + else if (aCommand == KTestOstDebugOnlyWrap()) + { + TestOstDebugOnlyWrapL(); + } + else + { + ret = EFalse; + } + + return ret; + } + + +TInt CTOstv2TraceTestWrapper::OpenUlogger(RULogger& aLogger) + { + + INFO_PRINTF1(_L("Opening Ulogger connection")); + TInt result = aLogger.Connect(); + INFO_PRINTF2(_L("Connection to Ulogger: %d, attempt: 1"), result); + if (result != KErrNone) + { + INFO_PRINTF1(_L("Connection to Ulogger failed. Will try to connect max. 10 times")); + for (TInt i = 2; i < 12; i++) + { + User::After(1000); + result = aLogger.Connect(); + INFO_PRINTF3(_L("Connection to Ulogger: %d, attempt: %d"), result, i); + if (result == KErrNone) + { + break; + } + } + } + + if(result != KErrNone) + { + ERR_PRINTF2(_L("Failed to open Ulogger: error (%d)"), result); + } + + return result; + } + +void CTOstv2TraceTestWrapper::TestDuplicatesL() + { + + INFO_PRINTF1(_L("CTOstv2TraceTestWrapper::TestDuplicates")); + + RULogger logger; + + + User::LeaveIfError(OpenUlogger(logger)); + // clear the config file + CClearConfig configIni; + configIni.Clear(logger); + + // extract the user ids from the values generated by tracecompiler + const TUint8 USER_DEFINED_GID_1 = TEST_OSTTRACEWRAPPER7 >> 16; + const TUint8 USER_DEFINED_GID_2 = TEST_OSTTRACEWRAPPER8 >> 16; - // extract the user ids from the values generated by tracecompiler - const TUint8 USER_DEFINED_GID_1 = TEST_OSTTRACEWRAPPER7 >> 16; - const TUint8 USER_DEFINED_GID_2 = TEST_OSTTRACEWRAPPER8 >> 16; - - // switch on primary filtering mechanism - CArrayFixFlat *setprimfilter = new (ELeave)CArrayFixFlat(22); - setprimfilter->AppendL(KGroupId); - setprimfilter->AppendL(TRACE_FATAL); - setprimfilter->AppendL(TRACE_DUMP); - setprimfilter->AppendL(TRACE_DEBUG); - setprimfilter->AppendL(USER_DEFINED_GID_1); - setprimfilter->AppendL(USER_DEFINED_GID_2); - - result = logger.SetPrimaryFiltersEnabled(*setprimfilter, ETrue); - - if(result != KErrNone) - { - ERR_PRINTF2(_L("Failed to set Ulogger primary filters result(%d"), result); - SetBlockResult(EFail); - } - - // switch off secondary filtering - result = logger.SetSecondaryFilteringEnabled(EFalse); - if(result != KErrNone) - { - ERR_PRINTF2(_L("Failed to set Ulogger secondary filters result(%d"), result); - SetBlockResult(EFail); - } - - delete setprimfilter; - setprimfilter = NULL; + // switch on primary filtering mechanism + CArrayFixFlat *setprimfilter = + new (ELeave) CArrayFixFlat (22); + setprimfilter->AppendL(KGroupId); + setprimfilter->AppendL(TRACE_FATAL); + setprimfilter->AppendL(TRACE_DUMP); + setprimfilter->AppendL(TRACE_DUMP); + setprimfilter->AppendL(USER_DEFINED_GID_1); + setprimfilter->AppendL(USER_DEFINED_GID_2); + + TInt result = logger.SetPrimaryFiltersEnabled(*setprimfilter, ETrue); + + if (result != KErrNone) + { + ERR_PRINTF2(_L("Failed to set Ulogger primary filters result(%d"), result); + SetBlockResult(EFail); + } + + // switch off secondary filtering + result = logger.SetSecondaryFilteringEnabled(EFalse); + if (result != KErrNone) + { + ERR_PRINTF2(_L("Failed to set Ulogger secondary filters result(%d"), result); + SetBlockResult(EFail); + } + + delete setprimfilter; + setprimfilter = NULL; + // setup output file + _LIT(KLogFilename, "C:\\logs\\duplicate_trace_test.utf"); + EmptyFile(KLogFilename); + // setup ulogger to write to the file using its output plugin + _LIT8(KTextmedia,"uloggerfileplugin"); + TPtrC8 mediaptr(KTextmedia); + result = logger.ActivateOutputPlugin(mediaptr); + if (result == KErrNone) + { + INFO_PRINTF1(_L("file set as active output plugin ok")); + TPluginConfiguration pluginConfig; + _LIT(KTextsetting, "output_path"); + pluginConfig.SetKey(KTextsetting); + pluginConfig.SetValue(KLogFilename()); + result = logger.SetPluginConfigurations(mediaptr, pluginConfig); + if (result == KErrNone) + { + INFO_PRINTF1(_L("output plugin settings set ok")); + + result = logger.Start(); + if (result == KErrNone) + { + // add some traces TRACE_DUMP & TRACE_DUMP equate to the same numeric value + + AddTraceHelper((TGroupId) TRACE_FATAL, + (TTraceId) TEST_OSTTRACEWRAPPER1, KTestTInt1); + OstTrace1(TRACE_FATAL, TEST_OSTTRACEWRAPPER1, "CTOstv2TraceTestWrapper TRACE_FATAL test 1 KTestTInt1 (%d)" , KTestTInt1); + + AddTraceHelper((TGroupId) TRACE_DUMP, + (TTraceId) TEST_OSTTRACEWRAPPER2, KTestTInt1); + OstTrace1(TRACE_DUMP, TEST_OSTTRACEWRAPPER2, "CTOstv2TraceTestWrapper TRACE_DUMP test 1 KTestTInt1 (%d)" , KTestTInt1); + + AddTraceHelper((TGroupId) TRACE_DUMP, + (TTraceId) TEST_OSTTRACEWRAPPER3, KTestTInt1); + OstTrace1(TRACE_DUMP, TEST_OSTTRACEWRAPPER3, "CTOstv2TraceTestWrapper TRACE_DUMP test 1 KTestTInt1 (%d)" , KTestTInt1); + + AddTraceHelper((TGroupId) TRACE_FATAL, + (TTraceId) TEST_OSTTRACEWRAPPER4, KTestTInt2); + OstTrace1(TRACE_FATAL, TEST_OSTTRACEWRAPPER4, "CTOstv2TraceTestWrapper TRACE_FATAL test 2 KTestTInt2 (%d)" , KTestTInt2); + + AddTraceHelper((TGroupId) TRACE_DUMP, + (TTraceId) TEST_OSTTRACEWRAPPER5, KTestTInt2); + OstTrace1(TRACE_DUMP, TEST_OSTTRACEWRAPPER5, "CTOstv2TraceTestWrapper TRACE_DUMP test 2 KTestTInt2 (%d)" , KTestTInt2); + + AddTraceHelper((TGroupId) TRACE_DUMP, + (TTraceId) TEST_OSTTRACEWRAPPER6, KTestTInt2); + OstTrace1(TRACE_DUMP, TEST_OSTTRACEWRAPPER6, "CTOstv2TraceTestWrapper TRACE_DUMP test 2 KTestTInt2 (%d)" , KTestTInt2); + + AddTraceHelper((TGroupId) USER_DEFINED_GID_1, + (TTraceId) TEST_OSTTRACEWRAPPER7, KTestTInt1); + OstTrace1(USER_DEFINED_GID_1, TEST_OSTTRACEWRAPPER7, "CTOstv2TraceTestWrapper USER_DEFINED_GID_1 test 2 KTestTInt2 (%d)" , KTestTInt1); - - // setup output file - _LIT(KLogFilename, "C:\\logs\\duplicate_trace_test.utf"); - EmptyFile(KLogFilename); - // setup ulogger to write to the file using its output plugin - _LIT8(KTextmedia,"uloggerfileplugin"); - TPtrC8 mediaptr(KTextmedia); - result=logger.ActivateOutputPlugin(mediaptr); - if(result == KErrNone) - { - INFO_PRINTF1(_L("file set as active output plugin ok")); - TPluginConfiguration pluginConfig; - _LIT(KTextsetting, "output_path"); - pluginConfig.SetKey(KTextsetting); - pluginConfig.SetValue(KLogFilename()); - result=logger.SetPluginConfigurations(mediaptr, pluginConfig); - if(result == KErrNone) - { - INFO_PRINTF1(_L("output plugin settings set ok")); + AddTraceHelper((TGroupId) USER_DEFINED_GID_2, + (TTraceId) TEST_OSTTRACEWRAPPER8, KTestTInt2); + OstTrace1(USER_DEFINED_GID_2, TEST_OSTTRACEWRAPPER8, "CTOstv2TraceTestWrapper USER_DEFINED_GID_1 test 2 KTestTInt2 (%d)" , KTestTInt2); + + result = logger.Stop(); + + if (result == KErrNone) + { + SetBlockResult( + CheckResults(KLogFilename()) == KErrNone + ? EPass + : EFail); + } + } + else + { + INFO_PRINTF2(_L("ulogger start returns error %d"), result); + } + } + else + { + INFO_PRINTF2(_L("setting output plugin settings failed with err %d"), result); + } + } + else + { + INFO_PRINTF2(_L("add file as output plugin failed with err %d"), result); + } + } + + +void CTOstv2TraceTestWrapper::TestOstDebugOnlyWrapL() + { + INFO_PRINTF1(_L("CTOstv2TraceTestWrapper::TestDuplicates")); - result=logger.Start(); - if(result == KErrNone) - { - // add some traces TRACE_DEBUG & TRACE_DUMP equate to the same numeric value - - AddTraceHelper((TGroupId)TRACE_FATAL, (TTraceId)TEST_OSTTRACEWRAPPER1, KTestTInt1); - OstTrace1(TRACE_FATAL, TEST_OSTTRACEWRAPPER1, "CTOstv2TraceTestWrapper TRACE_FATAL test 1 KTestTInt1 (%d)" , KTestTInt1); - - - AddTraceHelper((TGroupId)TRACE_DEBUG, (TTraceId)TEST_OSTTRACEWRAPPER2, KTestTInt1); - OstTrace1(TRACE_DEBUG, TEST_OSTTRACEWRAPPER2, "CTOstv2TraceTestWrapper TRACE_DEBUG test 1 KTestTInt1 (%d)" , KTestTInt1); - - AddTraceHelper((TGroupId)TRACE_DUMP, (TTraceId)TEST_OSTTRACEWRAPPER3, KTestTInt1); - OstTrace1(TRACE_DUMP, TEST_OSTTRACEWRAPPER3, "CTOstv2TraceTestWrapper TRACE_DUMP test 1 KTestTInt1 (%d)" , KTestTInt1); + RULogger logger; + + + User::LeaveIfError(OpenUlogger(logger)); + // clear the config file + CClearConfig configIni; + configIni.Clear(logger); + + // extract the user ids from the values generated by tracecompiler + const TUint8 USER_DEFINED_GID_1w = TEST_OSTTRACEWRAPPER7w >> 16; + const TUint8 USER_DEFINED_GID_2w = TEST_OSTTRACEWRAPPER8w >> 16; + + // switch on primary filtering mechanism + CArrayFixFlat *setprimfilter = + new (ELeave) CArrayFixFlat (22); + setprimfilter->AppendL(KGroupId); + setprimfilter->AppendL(TRACE_FATAL); + setprimfilter->AppendL(TRACE_DUMP); + setprimfilter->AppendL(TRACE_DUMP); + setprimfilter->AppendL(USER_DEFINED_GID_1w); + setprimfilter->AppendL(USER_DEFINED_GID_2w); + + TInt result = logger.SetPrimaryFiltersEnabled(*setprimfilter, ETrue); + + if (result != KErrNone) + { + ERR_PRINTF2(_L("Failed to set Ulogger primary filters result(%d"), result); + SetBlockResult(EFail); + } + + // switch off secondary filtering + result = logger.SetSecondaryFilteringEnabled(EFalse); + if (result != KErrNone) + { + ERR_PRINTF2(_L("Failed to set Ulogger secondary filters result(%d"), result); + SetBlockResult(EFail); + } - AddTraceHelper((TGroupId)TRACE_FATAL, (TTraceId)TEST_OSTTRACEWRAPPER4, KTestTInt2); - OstTrace1(TRACE_FATAL, TEST_OSTTRACEWRAPPER4, "CTOstv2TraceTestWrapper TRACE_FATAL test 2 KTestTInt2 (%d)" , KTestTInt2); - - AddTraceHelper((TGroupId)TRACE_DEBUG, (TTraceId)TEST_OSTTRACEWRAPPER5, KTestTInt2); - OstTrace1(TRACE_DEBUG, TEST_OSTTRACEWRAPPER5, "CTOstv2TraceTestWrapper TRACE_DEBUG test 2 KTestTInt2 (%d)" , KTestTInt2); + delete setprimfilter; + setprimfilter = NULL; + // setup output file + _LIT(KLogFilename, "C:\\logs\\duplicate_trace_test.utf"); + EmptyFile(KLogFilename); + // setup ulogger to write to the file using its output plugin + _LIT8(KTextmedia,"uloggerfileplugin"); + TPtrC8 mediaptr(KTextmedia); + result = logger.ActivateOutputPlugin(mediaptr); + if (result == KErrNone) + { + INFO_PRINTF1(_L("file set as active output plugin ok")); + TPluginConfiguration pluginConfig; + _LIT(KTextsetting, "output_path"); + pluginConfig.SetKey(KTextsetting); + pluginConfig.SetValue(KLogFilename()); + result = logger.SetPluginConfigurations(mediaptr, pluginConfig); + if (result == KErrNone) + { + INFO_PRINTF1(_L("output plugin settings set ok")); - AddTraceHelper((TGroupId)TRACE_DUMP, (TTraceId)TEST_OSTTRACEWRAPPER6, KTestTInt2); - OstTrace1(TRACE_DUMP, TEST_OSTTRACEWRAPPER6, "CTOstv2TraceTestWrapper TRACE_DUMP test 2 KTestTInt2 (%d)" , KTestTInt2); - - AddTraceHelper((TGroupId)USER_DEFINED_GID_1, (TTraceId)TEST_OSTTRACEWRAPPER7, KTestTInt1); - OstTrace1(USER_DEFINED_GID_1, TEST_OSTTRACEWRAPPER7, "CTOstv2TraceTestWrapper USER_DEFINED_GID_1 test 2 KTestTInt2 (%d)" , KTestTInt1); + result = logger.Start(); + if (result == KErrNone) + { + // now try the same traces again but with the OST_DEBUG_ONLY wrapper + OST_DEBUG_ONLY(AddTraceHelper((TGroupId) TRACE_FATAL, + (TTraceId) TEST_OSTTRACEWRAPPER1w, KTestTInt1)); + OST_DEBUG_ONLY(OstTrace1(TRACE_FATAL, TEST_OSTTRACEWRAPPER1w, "CTOstv2TraceTestWrapper TRACE_FATAL test 1 KTestTInt1 (%d)" , KTestTInt1)); + + OST_DEBUG_ONLY(AddTraceHelper((TGroupId) TRACE_DUMP, + (TTraceId) TEST_OSTTRACEWRAPPER2w, KTestTInt1)); + OST_DEBUG_ONLY(OstTrace1(TRACE_DUMP, TEST_OSTTRACEWRAPPER2w, "CTOstv2TraceTestWrapper TRACE_DUMP test 1 KTestTInt1 (%d)" , KTestTInt1)); + + OST_DEBUG_ONLY(AddTraceHelper((TGroupId) TRACE_DUMP, + (TTraceId) TEST_OSTTRACEWRAPPER3w, KTestTInt1)); + OST_DEBUG_ONLY(OstTrace1(TRACE_DUMP, TEST_OSTTRACEWRAPPER3w, "CTOstv2TraceTestWrapper TRACE_DUMP test 1 KTestTInt1 (%d)" , KTestTInt1)); + + OST_DEBUG_ONLY(AddTraceHelper((TGroupId) TRACE_FATAL, + (TTraceId) TEST_OSTTRACEWRAPPER4w, KTestTInt2)); + OST_DEBUG_ONLY(OstTrace1(TRACE_FATAL, TEST_OSTTRACEWRAPPER4w, "CTOstv2TraceTestWrapper TRACE_FATAL test 2 KTestTInt2 (%d)" , KTestTInt2)); - AddTraceHelper((TGroupId)USER_DEFINED_GID_2, (TTraceId)TEST_OSTTRACEWRAPPER8, KTestTInt2); - OstTrace1(USER_DEFINED_GID_2, TEST_OSTTRACEWRAPPER8, "CTOstv2TraceTestWrapper USER_DEFINED_GID_1 test 2 KTestTInt2 (%d)" , KTestTInt2); - - result=logger.Stop(); - - if(result == KErrNone) - { - SetBlockResult(CheckResults(KLogFilename()) == KErrNone ? EPass : EFail); - } - } - else - { - INFO_PRINTF2(_L("ulogger start returns error %d"), result); - } - } - else - { - INFO_PRINTF2(_L("setting output plugin settings failed with err %d"), result); - } - } - else - { - INFO_PRINTF2(_L("add file as output plugin failed with err %d"), result); - } - } - return ETrue; - } + OST_DEBUG_ONLY(AddTraceHelper((TGroupId) TRACE_DUMP, + (TTraceId) TEST_OSTTRACEWRAPPER5w, KTestTInt2)); + OST_DEBUG_ONLY(OstTrace1(TRACE_DUMP, TEST_OSTTRACEWRAPPER5w, "CTOstv2TraceTestWrapper TRACE_DUMP test 2 KTestTInt2 (%d)" , KTestTInt2)); + + OST_DEBUG_ONLY(AddTraceHelper((TGroupId) TRACE_DUMP, + (TTraceId) TEST_OSTTRACEWRAPPER6w, KTestTInt2)); + OST_DEBUG_ONLY(OstTrace1(TRACE_DUMP, TEST_OSTTRACEWRAPPER6w, "CTOstv2TraceTestWrapper TRACE_DUMP test 2 KTestTInt2 (%d)" , KTestTInt2)); + + OST_DEBUG_ONLY(AddTraceHelper((TGroupId) USER_DEFINED_GID_1w, + (TTraceId) TEST_OSTTRACEWRAPPER7w, KTestTInt1)); + OST_DEBUG_ONLY(OstTrace1(USER_DEFINED_GID_1, TEST_OSTTRACEWRAPPER7w, "CTOstv2TraceTestWrapper USER_DEFINED_GID_1 test 2 KTestTInt2 (%d)" , KTestTInt1)); + + OST_DEBUG_ONLY(AddTraceHelper((TGroupId) USER_DEFINED_GID_2w, + (TTraceId) TEST_OSTTRACEWRAPPER8w, KTestTInt2)); + OST_DEBUG_ONLY(OstTrace1(USER_DEFINED_GID_2, TEST_OSTTRACEWRAPPER8w, "CTOstv2TraceTestWrapper USER_DEFINED_GID_1 test 2 KTestTInt2 (%d)" , KTestTInt2)); + + + result = logger.Stop(); + + if (result == KErrNone) + { + SetBlockResult( + CheckResults(KLogFilename()) == KErrNone + ? EPass + : EFail); + } + } + else + { + INFO_PRINTF2(_L("ulogger start returns error %d"), result); + } + } + else + { + INFO_PRINTF2(_L("setting output plugin settings failed with err %d"), result); + } + } + else + { + INFO_PRINTF2(_L("add file as output plugin failed with err %d"), result); + } + } TInt CTOstv2TraceTestWrapper::CheckResults(const TDesC& aLogFilename) - { - // read the logged traces from the log file - TInt err = ReadFromLogFile(aLogFilename); - if(err == KErrNone) - { - err = CompareTraces(); - if(err == KErrNone) - { - - } - else{ - ERR_PRINTF2(_L("CompareTraces returned err (%d)"), err); - } - } - else - { - ERR_PRINTF2(_L("ReadFromLogFile returned err (%d)"), err); - } - - return err; - } + { + // read the logged traces from the log file + TInt err = ReadFromLogFile(aLogFilename); + if (err == KErrNone) + { + err = CompareTraces(); + if (err == KErrNone) + { + + } + else + { + ERR_PRINTF2(_L("CompareTraces returned err (%d)"), err); + } + } + else + { + ERR_PRINTF2(_L("ReadFromLogFile returned err (%d)"), err); + } + + return err; + } + +void CTOstv2TraceTestWrapper::CTOstv2TraceTestWrapper::AddTraceHelper( + const TGroupId aGroupId, const TTraceId aTraceId, TUint32 aValue) + { + if (CreateTraceObject(KOstTraceComponentID, aGroupId, + EAddThreadIdentification, ENoProgramCounter, iSentTraces)) + { + TTraceConfigs& config = *iSentTraces[iSentTraces.Count() - 1]; + TTraceConfigsOperator::SetData(config, aValue); + TTraceConfigsOperator::SetHeader(config, aGroupId, + KOstTraceComponentID, EAddThreadIdentification, + ENoProgramCounter, aTraceId); + } + else + { + ERR_PRINTF2(_L("CreateTraceObject failed with for traceid (%d)"), aTraceId); + SetBlockResult(EFail); + } + } -void CTOstv2TraceTestWrapper::CTOstv2TraceTestWrapper::AddTraceHelper(const TGroupId aGroupId, const TTraceId aTraceId, TUint32 aValue) - { - if( CreateTraceObject(KOstTraceComponentID, aGroupId, EAddThreadIdentification , ENoProgramCounter, iSentTraces)) - { - TTraceConfigs& config = *iSentTraces[iSentTraces.Count()-1]; - TTraceConfigsOperator::SetData(config, aValue ); - TTraceConfigsOperator::SetHeader(config, aGroupId, KOstTraceComponentID, EAddThreadIdentification , ENoProgramCounter, aTraceId); - } - else - { - ERR_PRINTF2(_L("CreateTraceObject failed with for traceid (%d)"), aTraceId); - SetBlockResult(EFail); - } - } + diff -r 6862383cf555 -r 5ffdb8f2067f traceservices/tracefw/integ_test/ost/TEF/te_ostv2integsuite_functional/testdata/scripts/te_integ_tracecollectorclient.script --- a/traceservices/tracefw/integ_test/ost/TEF/te_ostv2integsuite_functional/testdata/scripts/te_integ_tracecollectorclient.script Wed Feb 03 12:02:34 2010 +0000 +++ b/traceservices/tracefw/integ_test/ost/TEF/te_ostv2integsuite_functional/testdata/scripts/te_integ_tracecollectorclient.script Sat Feb 20 00:33:55 2010 +0200 @@ -39,6 +39,12 @@ COMMAND OstTraceTestWrapper TestDuplicates END_TEST_BLOCK +PRINT Run OstTrace OST_DEBUG_ONLY wrapped trace points + +START_TEST_BLOCK 20000 te_ostv2integsuite_enabled \testdata\configs\te_integ_tracecollectorclient.ini + CREATE_OBJECT OstTraceTestWrapper OstTraceTestWrapper + COMMAND OstTraceTestWrapper TestOstDebugOnlyWrap +END_TEST_BLOCK diff -r 6862383cf555 -r 5ffdb8f2067f traceservices/tracefw/integ_test/ost/TEF/traces/te_ostv2tracetestwrapperTraces.h --- a/traceservices/tracefw/integ_test/ost/TEF/traces/te_ostv2tracetestwrapperTraces.h Wed Feb 03 12:02:34 2010 +0000 +++ b/traceservices/tracefw/integ_test/ost/TEF/traces/te_ostv2tracetestwrapperTraces.h Sat Feb 20 00:33:55 2010 +0200 @@ -1,19 +1,27 @@ -// Created by TraceCompiler 1.3.1 +// Created by TraceCompiler 2.1.0 // DO NOT EDIT, CHANGES WILL BE LOST #ifndef __TE_OSTV2TRACETESTWRAPPERTRACES_H__ #define __TE_OSTV2TRACETESTWRAPPERTRACES_H__ -#define KOstTraceComponentID 0x1028722f +#define KOstTraceComponentID 0x1028722e #define TEST_OSTTRACEWRAPPER1 0x810013 #define TEST_OSTTRACEWRAPPER4 0x810014 +#define TEST_OSTTRACEWRAPPER1w 0x810015 +#define TEST_OSTTRACEWRAPPER4w 0x810016 #define TEST_OSTTRACEWRAPPER2 0x890001 -#define TEST_OSTTRACEWRAPPER5 0x890002 -#define TEST_OSTTRACEWRAPPER3 0x890001 -#define TEST_OSTTRACEWRAPPER6 0x890002 +#define TEST_OSTTRACEWRAPPER3 0x890002 +#define TEST_OSTTRACEWRAPPER5 0x890003 +#define TEST_OSTTRACEWRAPPER6 0x890004 +#define TEST_OSTTRACEWRAPPER2w 0x890005 +#define TEST_OSTTRACEWRAPPER3w 0x890006 +#define TEST_OSTTRACEWRAPPER5w 0x890007 +#define TEST_OSTTRACEWRAPPER6w 0x890008 #define TEST_OSTTRACEWRAPPER7 0xdf0001 +#define TEST_OSTTRACEWRAPPER7w 0xdf0002 #define TEST_OSTTRACEWRAPPER8 0xe00001 +#define TEST_OSTTRACEWRAPPER8w 0xe00002 #endif