diff -r a151135b0cf9 -r aa2539c91954 tracesrv/tracecore/btrace_handler/test/t_tracecore/src/t_tracecore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tracesrv/tracecore/btrace_handler/test/t_tracecore/src/t_tracecore.cpp Fri Oct 08 14:56:39 2010 +0300 @@ -0,0 +1,729 @@ +// 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" +// 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: +// e32test\ost\t_tracecore.cpp +// Overview: +// Tests activation/deactivation of traces using the TraceCore +// kernel - side APIs +// + +#define __E32TEST_EXTENSION__ +#include +#include +#include +#include +#include +#include "t_rtest_panic.h" + + +// the following definition is mutually exclusive +// with loading tracecore as extension +// eg epoc.ini extension tracecore.dll + + +#include "TraceCoreConstants.h" +#include "d_tracecore.h" +#include "t_tracecore.h" +#include "TestDataWriterNotifier.h" + +#define __TRACE_LINE__() test.Printf(_L("%d\n"),__LINE__) + +RTest test(_L("T_TRACECORE")); + +RTraceCoreTest TraceTest; +TComponentId KOstTraceComponentID; +TUint32 KTraceMultipartTestData[60]; +TBuf8 buf; + + + +/** + * Validate all filters are in sync for the component ids in this test + * @param aComponentId the component id to check group id (category) filters on + */ +void ValidateGroupIdFiltersInSync(TUint32 aComponentId) + { + TInt r = KErrNone; + TcDriverParameters p; + + p.iComponentId = aComponentId; + for (TInt i = BTrace::EThreadIdentification; i < KMaxGroupId; i++) + { + p.iGroupId = i; + r = TraceTest.ValidateFilterSync(p); + TEST_KErrNone(r); + } + } + +void ValidateAllFiltersInSync() + { + ValidateGroupIdFiltersInSync(KTestComponentID1); + ValidateGroupIdFiltersInSync(KTestComponentID2); + } + +/* + * Activate a trace depending on aMatch + * + * @param aMatch if aMatch is true then activate the correct GID and CID + * @param aNum Number of group id's and component id pairs to activate + * + */ +void ActivateTrace(TBool aMatch, TInt aNum = 1) + { + test.Printf(_L("In ActivateTrace()\n")); + TcDriverParameters p; + TInt r = 0; + p.iComponentId = (aMatch) ? KTestComponentID1 : KTestComponentID2; + p.iGroupId = (aMatch) ? KTestGroupId1 : KTestGroupId2; + + r = TraceTest.ValidateFilterSync(p); + TEST_KErrNone(r); + + //if we want to activate correct gids &cids, activate the correct number of them + //starting from KTestGroupId1 and KTestComponentID1 else just activate one incorrect + //pair i.e KTestComponentID2 & KTestGroupId1 + if (aMatch) + r = TraceTest.ActivateTrace(p, aNum); + else + r = TraceTest.ActivateTrace(p); + TEST_KErrNone(r); + + r = TraceTest.ValidateFilterSync(p); + TEST_KErrNone(r); + + } + +/* + * Deactivate a trace depending on aMatch + * + * @param aMatch if aMatch is true then deactivate the correct GID and CID + * @param aNum Number of group id's to deactivate + * + */ +void DeactivateTrace(TBool aMatch, TInt aNum = 1) + { + test.Printf(_L("In DeactivateTrace()\n")); + TcDriverParameters p; + TInt r = 0; + p.iComponentId = (aMatch) ? KTestComponentID1 : KTestComponentID2; + p.iGroupId = (aMatch) ? KTestGroupId1 : KTestGroupId2; + + r = TraceTest.ValidateFilterSync(p); + TEST_KErrNone(r); + + //if we want to deactivate correct gids &cids, deactivate the correct number of them + //starting from KTestGroupId1 and KTestComponentID1 else just deactivate one incorrect + //pair i.e KTestComponentID2 & KTestGroupId1 + if (aMatch) + r = TraceTest.DeactivateTrace(p, aNum); + else + r = TraceTest.DeactivateTrace(p); + TEST_KErrNone(r); + + r = TraceTest.ValidateFilterSync(p); + TEST_KErrNone(r); + } + +/* + * Tell the test writer to start/stop dropping + * traces + * + * @param aDrop ETrue to drop Traces, EFalse to stop + * dropping them + */ +void DropNextTrace(TBool aDrop) + { + TInt r = KErrNone; + r = TraceTest.DropNextTrace(aDrop); + TEST_KErrNone(r); + } + +/* + * Activate/deactivate the printf handler + * + * TBool aActivate to activate(ETrue)/deactivate(EFalse) + * + * Activate/Deactivate TRACECORE_KERN_PRINTF=BTrace::EKernPrintf=0 + * TRACECORE_RDEBUG_PRINT=BTrace::ERDebugPrintf=1 + * TRACECORE_PLATSEC_PRINTF=BTrace::EPlatsecPrintf=2 + * + */ +void ActivatePrintfHandler(TBool aActivate, TInt aMaxCategory = BTrace::EPlatsecPrintf) + { + TcDriverParameters p; + TInt r=0; + TInt maxPrintfCategory = aMaxCategory; + p.iComponentId = 0x2001022D; //from BTraceHooks_0x2001022D_dictionary.xml + p.iGroupId = BTrace::ERDebugPrintf; + + for(TInt i=0; i<=maxPrintfCategory; i++) + { + if(aActivate) + r = TraceTest.ActivateTrace(p); + else + r = TraceTest.DeactivateTrace(p); + if (r!=KErrNone) + { + test.Printf(_L("Unable to activate/deactivate printf handler for printf %d: error: %d"), i, r); + } + TEST_KErrNone(r); + p.iGroupId++; + } + r = TraceTest.ValidateFilterSync(p); + TEST_KErrNone(r); + } + +/* + * Activate/deactivate kernel GIDs + * + * TBool aActivate to activate(ETrue)/deactivate(EFalse) + * TBool aFirstGID start of range of GIDs to activate/deactivate + * TBool aLastGID end of range of GIDs to activate/deactivate + * + */ +void ActivateKernelTraces(TBool aActivate, TInt aFirstGID = -1, TInt aLastGID = -1) + { + TInt r=KErrNone; + + if(aFirstGID == -1) + { + aFirstGID = KMinKernelCategory; + if(aLastGID == -1) + { + aLastGID = KMaxKernelCategory; + } + } + if(aLastGID < aFirstGID) + { + aLastGID = aFirstGID; + } + + TcDriverParameters p; + p.iComponentId = 0x2001022D; //from BTraceHooks_0x2001022D_dictionary.xml + + for(TInt i=aFirstGID; i<=aLastGID; i++) + { + p.iGroupId = i; + if(aActivate) + r = TraceTest.ActivateTrace(p); + else + r = TraceTest.DeactivateTrace(p); + if (r 18) + { + test.Printf( + _L("Incorrect argument... Please use a trace size that is <=18 words (72bytes)")); + return KErrArgument; + } + + if (aNumberDropped>=aNum) + { + test.Printf( + _L("Incorrect argument... Please use aNumberDropped less than number you wish to send)")); + return KErrArgument; + } + + test.Printf(_L("In SendTestTraces()\n")); + TUint32 traceword = TEST_TRACE; + KOstTraceComponentID = KTestComponentID1; + TRequestStatus status; + TUint8* buffer = NULL; + + //Drop next Trace + DropNextTrace(ETrue); + TBool dropped = ETrue; + TBool missing = EFalse; + + for (TInt i = 0; i < aNum; i++) + { + if (i>=aNumberDropped) + { + DropNextTrace(EFalse); //stop dropping traces + dropped = EFalse; + } + + if ((i==aNumberDropped)&&(i!=0)) + missing = ETrue; + else + missing = EFalse; + + TInt size = 0; + + //make request to read trace data from memory + TInt bufferedTraces=1; + if (aPrintfTrace&&missing&&!dropped) // if it's a printf trace and we're dropped traces + bufferedTraces++; // and the one we're currently sending isn't to be dropped + RequestDataNotification(status, bufferedTraces); + + if (!aPrintfTrace) + OstTraceData(TRACE_NORMAL+i, traceword, "You will only see this text in Trace Viewer: %d", KTraceMultipartTestData,(aSize*4)); + else + { + ActivatePrintfHandler(ETrue,BTrace::ERDebugPrintf); + RDebug::Printf(KTestPrintfTraceString); + ActivatePrintfHandler(EFalse,BTrace::ERDebugPrintf); + } + + //read traces from memory + TEST_KErrNone(ReadTraceFromBuffer(status, buffer, size)); + + //Validate Traces + //test.Next(_L("Validate payload")); + TPtrC8 expectedPrintfData(KTestPrintfTraceLiteral); + TInt r = ValidatePayload((aTracePresent&&!dropped), TRACE_NORMAL+i, KOstTraceComponentID, missing, aPrintfTrace, &expectedPrintfData); + TEST_KErrNone(r); + traceword += (1 << GROUPIDSHIFT); //incrememnt the group id part of the trace word... + KOstTraceComponentID++; + } + + return KErrNone; + } + +/* + * Send a big (>80bytes)Test Trace + * + * @param aTracePresent indicates id a trace packet should be present or not + */ +void SendAndValidateBigTestTrace(TBool aTracePresent) + { + test.Printf(_L("In SendBigTestTrace()\n")); + KOstTraceComponentID = KTestComponentID1; + TRequestStatus status; + + TUint8* buffer = NULL; + TInt size = 0; + + //make request to read trace data from memory + RequestDataNotification(status); + + OstTraceData(TRACE_NORMAL, TEST_TRACE, "You will only see this text in Trace Viewer", KTraceMultipartTestData,240); + TEST_KErrNone(ReadTraceFromBuffer(status, buffer, size)); + + //Validate Traces + test.Next(_L("Validate payload for test big trace")); + TEST_KErrNone(ValidatePayload(aTracePresent,TRACE_NORMAL,KOstTraceComponentID)); + } + +/* + * Test Trace Activation in Trace core + * + * @pre Trace Core settings must be cleared before trying to activate correct attributes + */ +void TestBasicActivation() + { + test.Printf(_L("In TestBasicActivation()\n")); + + //Send Activation + test.Next(_L("Send Activation message to TraceCore")); + ActivateTrace(ETrue); + + //Send and Validate Traces + TEST_KErrNone(SendAndValidateTestTraces(ETrue)); + + //Deactivate when done sending trace + DeactivateTrace(ETrue); + } + +/* + * Test Trace Deactivation in Trace core + * + */ +void TestBasicDeactivation() + { + test.Printf(_L("In TestBasicDeactivation()\n")); + + //Have correct trace attributes activated, then try to deactivate them + ActivateTrace(ETrue); + + //Send Deactivation + test.Next(_L("Send Deactivation message to TraceCore")); + DeactivateTrace(ETrue); + + //Send and Validate Traces + TEST_KErrNone(SendAndValidateTestTraces(EFalse)); + } + +/* + * Negative Test Trace Activation in Trace core + * + * @pre Trace Core settings must be cleared before trying to activate wrong attributes + */ +void NegativeTestActivation() + { + test.Printf(_L("In NegativeTestActivation()\n")); + + //Send Activation + test.Next(_L("Send Negative Activation message to TraceCore")); + ActivateTrace(EFalse); + + //Send and Validate Traces + TEST_KErrNone(SendAndValidateTestTraces(EFalse)); + + //Deactivate when done sending trace + DeactivateTrace(EFalse); + } + +/* + * Test Trace Deactivation in Trace core + * + */ +void NegativeTestDeactivation() + { + test.Printf(_L("In NegativeTestDeactivation()\n")); + + //Have correct trace attributes activated, then try to deactivate the wrong ones + ActivateTrace(ETrue); + + //Send Deactivation + test.Next(_L("Send Negative Deactivation message to TraceCore")); + DeactivateTrace(EFalse); + + //Send and Validate Traces + TEST_KErrNone(SendAndValidateTestTraces(ETrue)); + + //Deactivate when done sending trace + DeactivateTrace(ETrue); + } + +/* + * Test Trace Activation in Trace core when multiple (16 here) GID and CID pairs are activated + * + * @pre Trace Core settings must be cleared before trying to activate correct attributes + */ +void TestMultipleActivation() + { + test.Printf(_L("In TestMultipleActivation()\n")); + + //Send Activation + test.Next(_L("Send Activation message to TraceCore")); + ActivateTrace(ETrue, 16); + + //Send and Validate Traces + TEST_KErrNone(SendAndValidateTestTraces(ETrue,1,16)); + + //Deactivate when done sending trace + DeactivateTrace(ETrue, 16); + } + +/* + * Test Trace Deactivation in Trace core when multiple (64 here) GID and CID pairs are activated + * + * @pre Trace Core settings must be cleared before trying to activate correct attributes + */ +void TestMultipleDeactivation() + { + test.Printf(_L("In TestMultipleDeactivation()\n")); + + //Have correct trace attributes activated, then try to deactivate them + ActivateTrace(ETrue, 16); + + //Send Deactivation + test.Next(_L("Send Deactivation message to TraceCore")); + DeactivateTrace(ETrue, 16); + + //Send Traces + TEST_KErrNone(SendAndValidateTestTraces(EFalse,1,16)); + } + +/* + * Test Trace Activation when big traces are sent + * + */ +void TestBigTrace() + { + test.Printf(_L("In TestBigTrace()\n")); + + //Send Activation + test.Next(_L("Send Activation message to TraceCore")); + ActivateTrace(ETrue); + + //Send and Validate Big Trace + SendAndValidateBigTestTrace(ETrue); + + //Deactivate when done sending trace + DeactivateTrace(ETrue); + + } + +/* + * Test that TraceCore Handlers ouput missing data notification when traces are dropped + */ +void TestDroppedTraces() + { + test.Printf(_L("In TestDroppedTraces()\n")); + + //Send Activation + test.Next(_L("Send Activation message to TraceCore")); + ActivateTrace(ETrue, 5); + + //Send and Validate 5 Traces when no traces are dropped + TEST_KErrNone(SendAndValidateTestTraces(ETrue,1,5,EFalse,0)); + + //Send and Validate 5 Traces where 1st 2 traces are dropped (check for missing flag on 3rd) + TEST_KErrNone(SendAndValidateTestTraces(ETrue,1,5,EFalse,2)); + + //Send and Validate 1 Printf Trace where no traces are dropped + TEST_KErrNone(SendAndValidateTestTraces(ETrue,1,5,ETrue,0)); + + //Send and Validate 2 Printf Trace where 1st trace is dropped + TEST_KErrNone(SendAndValidateTestTraces(ETrue,1,2,ETrue,1));//(check for "dropped trace" on 2nd) + + //Send and Validate 7 Printf Trace where 1st 5 traces are dropped + TEST_KErrNone(SendAndValidateTestTraces(ETrue,1,7,ETrue,5));//(check for "dropped trace" on 6th) + + //Deactivate when done sending traces + DeactivateTrace(ETrue, 5); + } + +/* + * Test that when activation notification is received, the group is actually activated from TraceCore + */ +void TestActivationNotification() + { + test.Printf(_L("In TestActivationNotification()\n")); + + // Create activation parameters + TcDriverParameters p; p.iComponentId = 5; p.iGroupId = 7; + TcDriverParameters p2; p2.iComponentId = 6; p2.iGroupId = 8; + + // Register activation notification listener + TraceTest.RegisterActivationNotification(p, ETrue); + + // Activate and test that we receive notification and it's in sync with TraceCore + for (TInt i=0;i<5;i++) + { + TraceTest.ActivateTrace(p); + TEST_KErrNone(TraceTest.CheckActivationNotificationOk(ETrue)); + TraceTest.DeactivateTrace(p); + TEST_KErrNone(TraceTest.CheckActivationNotificationOk(ETrue)); + } + + // Activate with different ID's, we shouldn't get notification + TraceTest.ActivateTrace(p2); + TEST_KErrNone(TraceTest.CheckActivationNotificationOk(EFalse)); + + // Unregister activation notification listener + TraceTest.RegisterActivationNotification(p, EFalse); + } + +/* + * Test RefreshActivations() method for kernel GIDs + * + * The purpose of this test is to make sure TraceCore can refresh all activations with no error when + * different numbers of kernel GIDs have been activated + */ +void TestRefreshActivations() + { + test.Printf(_L("In TestRefreshActivations()\n")); + + test.Next(_L("Test RefreshActivations() when all kernel GIDs are deactivated\n")); + + //Deactivate all kernel GIDs + ActivateKernelTraces(EFalse); + + //deactivate and reactivate all active GIDs + TEST_KErrNone(TraceTest.RefreshActivations()); + + test.Next(_L("Test RefreshActivations() when all some kernel GIDs are activated\n")); + + //Activate some kernel GIDs + ActivateKernelTraces(ETrue,BTrace::EThreadIdentification); + ActivateKernelTraces(ETrue,BTrace::EPaging); + ActivateKernelTraces(ETrue,BTrace::EClientServer); + + //deactivate and reactivate all active GIDs + TEST_KErrNone(TraceTest.RefreshActivations()); + + //Deactivate the kernel GIDs previously activated + ActivateKernelTraces(EFalse,BTrace::EThreadIdentification); + ActivateKernelTraces(EFalse,BTrace::EPaging); + ActivateKernelTraces(EFalse,BTrace::EClientServer); + + test.Next(_L("Test RefreshActivations() when all kernel GIDs are activated\n")); + + //Activate all kernel GIDs + ActivateKernelTraces(ETrue); + + //deactivate and reactivate all active GIDs + TEST_KErrNone(TraceTest.RefreshActivations()); + + //Deactivate all kernel GIDs + ActivateKernelTraces(EFalse); + } + +/* + * Utility function for generating a trace packet + * until the test memory writer is available + * + */ +void GenerateTraceData() + { + + //actual data that will be sent in trace tests + for (TInt i = 0; i < 60; i++) + KTraceMultipartTestData[i] = KTestData + i; + } + +GLDEF_C TInt E32Main() + { + + test.Title(); + + test.Start(_L("Trace Core tests")); + + GenerateTraceData(); + + // free the tcore related LDD's this is because + // if one of the other tests say t_tracecoreostldd + // panics the LDDs will not be released + User::FreeLogicalDevice(_L("TraceCoreOstLdd")); + User::FreeLogicalDevice(_L("TcLdd")); + + TInt r = KErrNone; + + + test.Next(_L("Open test LDD")); + r = User::LoadLogicalDevice(RTraceCoreTest::Name()); + TEST(r==KErrNone || r==KErrAlreadyExists); + r = TraceTest.Open(); + TEST_KErrNone(r); + + ValidateAllFiltersInSync(); + + ActivatePrintfHandler(EFalse); + + test.Next(_L("Test Basic TraceCore Activation")); + TestBasicActivation(); + test.Next(_L("Test Basic TraceCore Deactivation")); + TestBasicDeactivation(); + test.Next(_L("Negative Test TraceCore Activation")); + NegativeTestActivation(); + test.Next(_L("Negative Test TraceCore Deactivation")); + NegativeTestDeactivation(); + test.Next(_L("Test Multiple TraceCore Activation")); + TestMultipleActivation(); + test.Next(_L("Test Multiple TraceCore Deactivation")); + TestMultipleDeactivation(); + test.Next(_L("Test Big Trace")); + TestBigTrace(); + test.Next(_L("Test Dropped Traces")); + TestDroppedTraces(); + test.Next(_L("Test Activation Notification")); + TestActivationNotification(); + test.Next(_L("Test Refresh Activations")); + TestRefreshActivations(); + + + ActivatePrintfHandler(ETrue); + + ValidateAllFiltersInSync(); + + test.Next(_L("Close LDD")); + TraceTest.Close(); + User::FreeLogicalDevice(RTraceCoreTest::Name()); + + + + test.Printf(_L("\nFinished Simple Activation/Deactivation tests in trace Core!!!")); + //test.Getch(); + test.End(); + test.Close(); + return (0); + }