sl@0: // Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #ifndef t_logutil2_h sl@0: #define t_logutil2_h sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "LogChangeDefinition.h" sl@0: #include "LogServShared.h" sl@0: #include "LogCliServShared.h" sl@0: #include sl@0: #include "t_logservsession.h" sl@0: #include "logcntdef.h" sl@0: #include "t_logutil.h" sl@0: sl@0: #ifdef LOGGING_ENABLED sl@0: sl@0: #include sl@0: #include sl@0: sl@0: sl@0: sl@0: _LIT(KLogFileName, "LogEng.txt"); sl@0: _LIT(KLogFolder, "LogEng"); sl@0: _LIT(KTimeFormat, "%02d.%02d:%02d:%06d "); sl@0: _LIT(KTextFormat, "%S"); sl@0: const TInt KLogEngLogBufferSize = 256; sl@0: sl@0: class Log : public RFileLogger sl@0: { sl@0: public: sl@0: static void New(); sl@0: static void Write(const TDesC& aText); sl@0: static void WriteFormat(TRefByValue aFmt, ...); sl@0: private: sl@0: static void PruneLogFile(); sl@0: }; sl@0: sl@0: #define LOGNEW Log::New() sl@0: #define LOGTEXT(AAA) { _LIT(KString, AAA); Log::Write(KString); } sl@0: #define LOGTEXT2(AAA, BBB) { _LIT(KString, AAA); Log::WriteFormat(TRefByValue(KString()), BBB); } sl@0: #define LOGTEXT3(AAA, BBB, CCC) { _LIT(KString, AAA); Log::WriteFormat(TRefByValue(KString()), BBB, CCC); } sl@0: #define LOGTEXT4(AAA, BBB, CCC, DDD) { _LIT(KString, AAA); Log::WriteFormat(TRefByValue(KString()), BBB, CCC, DDD); } sl@0: sl@0: #else//LOGGING_ENABLED sl@0: sl@0: #define LOGNEW sl@0: #define LOGTEXT(AAA) sl@0: #define LOGTEXT2(AAA, BBB) sl@0: #define LOGTEXT3(AAA, BBB, CCC) sl@0: #define LOGTEXT4(AAA, BBB, CCC, DDD) sl@0: sl@0: #endif//LOGGING_ENABLED sl@0: sl@0: // Globals sl@0: GLREF_D CTrapCleanup* theCleanup; sl@0: GLREF_D CActiveScheduler *testScheduler; sl@0: GLREF_D RFs theFs; sl@0: GLREF_D TFileName theLogName; sl@0: GLREF_D RFile theLog; sl@0: GLREF_D RLogTestSession theLogServ; sl@0: sl@0: #define __FILE_FAILNEXT(err, iteration) theFs.SetErrorCondition(err, iteration) sl@0: #define __FILE_RESET theFs.SetErrorCondition(KErrNone, 0) sl@0: sl@0: #if defined(_UNICODE) sl@0: _LIT(KLogDatabaseName,"c:\\private\\101f401d\\Logdbu.dat"); sl@0: #else sl@0: _LIT(KLogDatabaseName,"c:\\private\\101f401d\\Logdb.dat"); sl@0: #endif sl@0: sl@0: sl@0: //********************************** sl@0: // CTestActive sl@0: //********************************** sl@0: sl@0: class CTestActive : public CActive sl@0: { sl@0: public: sl@0: CTestActive(TInt aPriority = EPriorityIdle-100); sl@0: ~CTestActive(); sl@0: void StartL(); sl@0: void StartL(TInt); sl@0: protected: sl@0: void DoCancel(); sl@0: void RunL(); sl@0: private: sl@0: TBool iDelayCompletion; sl@0: TRequestStatus iStoredStatus; sl@0: TInt iDelayTime; sl@0: }; sl@0: sl@0: void doTestsL(); sl@0: sl@0: sl@0: //********************************** sl@0: // CTestTimer sl@0: //********************************** sl@0: sl@0: class CTestTimer : public CTimer sl@0: { sl@0: public: sl@0: static CTestTimer* NewL(); sl@0: private: sl@0: CTestTimer(); sl@0: void RunL(); sl@0: }; sl@0: sl@0: //********************************** sl@0: // TestUtils sl@0: //********************************** sl@0: sl@0: class TestUtils sl@0: { sl@0: public: sl@0: static void Initialize(const TDesC& aName); sl@0: static void DeleteDatabaseL(TBool aCloseBeforeDelete = ETrue); sl@0: static HBufC* CreateBufLC(TInt aLength); sl@0: static HBufC8* CreateBuf8LC(TInt aLength); sl@0: static TBool FiltersEqual(const CLogFilter& aFilter1, const CLogFilter& aFilter2); sl@0: static TBool EventsEqual(const CLogEvent& aEvent1, const CLogEvent& aEvent2); sl@0: static TBool TypesEqual(const CLogEventType& aType1, const CLogEventType& aType2); sl@0: static TBool WaitForKeyL(TTimeIntervalMicroSeconds32 aDelay, TKeyCode& aKeyCode); sl@0: static TBool FileExists(const TDesC& aFile); sl@0: static void SetLogServHeapFailureL(RHeap::TAllocFail aType, TInt aRate); sl@0: static TBool IsDatabaseOpenL(); sl@0: static TInt DatabaseSizeL(); sl@0: static TInt AddEventL(); sl@0: static void AddViewTestEventsL(); sl@0: static void AddEventTypeL(); sl@0: static void CopyCorruptDbL(); sl@0: static void CopyCorruptDamagedDbL(); sl@0: static void CopyOldDbL(); sl@0: static void TestInvalidSchemaL(); sl@0: static TBool MatchingEnabledL(); sl@0: sl@0: private: sl@0: // starts t_HiCapHelper.exe which has sufficient capability sl@0: static TInt ExecuteRemoteL(const TDesC& aCommandLineArg); sl@0: }; sl@0: sl@0: #define __LOGSERV_UHEAP_FAILNEXT(X) TestUtils::SetLogServHeapFailureL(RHeap::EFailNext, X) sl@0: #define __LOGSERV_UHEAP_RESET TestUtils::SetLogServHeapFailureL(RHeap::ENone, 0) sl@0: sl@0: //********************************** sl@0: // CLogViewChangeObserver sl@0: //********************************** sl@0: sl@0: class CLogViewChangeObserver : public CActive, public MLogViewChangeObserver sl@0: { sl@0: public: sl@0: enum TStopType sl@0: { sl@0: EStopOnChanges = 0, sl@0: EStopOnRunL, sl@0: EStopOnBoth, sl@0: EStopOnCount, sl@0: EDontStopScheduler sl@0: }; sl@0: public: sl@0: static CLogViewChangeObserver* NewLC(); sl@0: ~CLogViewChangeObserver(); sl@0: sl@0: protected: sl@0: CLogViewChangeObserver(); sl@0: sl@0: public: sl@0: inline void StartCollectingChanges() sl@0: { sl@0: Reset(); sl@0: iType = EDontStopScheduler; sl@0: } sl@0: CLogChangeDefinition* WaitForChangesLC(TStopType aType = EStopOnChanges, TInt aCount = 0); sl@0: CLogChangeDefinition* WaitForChangesLC(TCallBack aCallBack, TStopType aType, TInt aCount = 0); sl@0: inline TBool HaveChanges() const sl@0: { sl@0: return iChanges != NULL; sl@0: } sl@0: inline const CLogChangeDefinition& Changes() const sl@0: { sl@0: __ASSERT_ALWAYS(iChanges, User::Invariant()); sl@0: return *iChanges; sl@0: } sl@0: inline void SetActive() sl@0: { sl@0: CActive::SetActive(); sl@0: iStatus = KRequestPending; sl@0: } sl@0: inline void ResetChanges() sl@0: { sl@0: __ASSERT_ALWAYS(iChanges, User::Invariant()); sl@0: iChanges->Reset(); sl@0: } sl@0: sl@0: public: sl@0: void HandleLogViewChangeEventAddedL(TLogId aId, TInt aViewIndex, TInt aChangeIndex, TInt aTotalChangeCount); sl@0: void HandleLogViewChangeEventChangedL(TLogId aId, TInt aViewIndex, TInt aChangeIndex, TInt aTotalChangeCount); sl@0: void HandleLogViewChangeEventDeletedL(TLogId aId, TInt aViewIndex, TInt aChangeIndex, TInt aTotalChangeCount); sl@0: sl@0: private: sl@0: void RunL(); sl@0: void DoCancel(); sl@0: sl@0: private: sl@0: void Reset(); sl@0: sl@0: protected: sl@0: void CheckForSchedulerStop(); sl@0: void AddChangeL(TLogDatabaseChangeType aType, TLogId aId, TInt aViewIndex); sl@0: sl@0: private: sl@0: TInt iExpectedChangeCount; sl@0: TBool iHaveFinishedOperation; sl@0: TBool iHaveObtainedChanges; sl@0: TBool iSchedulerStarted; sl@0: TStopType iType; sl@0: CLogChangeDefinition* iChanges; sl@0: TBool iHaveCallBack; sl@0: TCallBack iCallBack; sl@0: }; sl@0: sl@0: //********************************** sl@0: // CLogViewChangeObserverErrorTest sl@0: //********************************** sl@0: sl@0: class CLogViewChangeObserverErrorTest : public CLogViewChangeObserver sl@0: { sl@0: public: sl@0: static CLogViewChangeObserverErrorTest* NewLC(); sl@0: sl@0: private: sl@0: CLogViewChangeObserverErrorTest(); sl@0: sl@0: public: sl@0: void HandleLogViewChangeEventAddedL(TLogId aId, TInt aViewIndex, TInt aChangeIndex, TInt aTotalChangeCount); sl@0: }; sl@0: sl@0: sl@0: //********************************** sl@0: // CLogSchedulerTimer sl@0: //********************************** sl@0: sl@0: class CLogSchedulerTimer : public CTimer sl@0: { sl@0: public: sl@0: static CLogSchedulerTimer* NewLC(); sl@0: ~CLogSchedulerTimer(); sl@0: sl@0: private: sl@0: CLogSchedulerTimer(); sl@0: void ConstructL(); sl@0: sl@0: public: sl@0: void Wait(TTimeIntervalMicroSeconds32 aTime); sl@0: sl@0: private: sl@0: void RunL(); sl@0: }; sl@0: sl@0: //********************************** sl@0: // CLogChangeNotifier sl@0: //********************************** sl@0: sl@0: class CLogChangeNotifier : public CActive sl@0: { sl@0: public: sl@0: static CLogChangeNotifier* NewL(); sl@0: ~CLogChangeNotifier(); sl@0: // sl@0: private: sl@0: CLogChangeNotifier(); sl@0: void ConstructL(); sl@0: // sl@0: void RunL(); sl@0: void DoCancel(); sl@0: // sl@0: private: sl@0: CLogClient* iClient; sl@0: TTime iStart; sl@0: }; sl@0: sl@0: //********************************** sl@0: // Global sl@0: //********************************** sl@0: sl@0: void SetupSchedulerL(); sl@0: void CloseScheduler(); sl@0: void doMainL(); sl@0: TInt E32Main(); sl@0: void DeleteDataFile(const TDesC& aFullName); sl@0: sl@0: #endif//t_logutil2_h