kerneltest/f32test/server/t_ftrace.cpp
changeset 0 a41df078684a
child 109 b3a1d9898418
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/server/t_ftrace.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,423 @@
+// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "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:
+// f32test\server\t_ftrace.cpp
+// 
+//
+
+#include <f32file.h>
+#include <f32tracedef.h>
+#include <e32test.h>
+#include "t_server.h"
+
+#include "../../../kernel/eka/include/d32btrace.h"
+#include "../../../kernel/eka/include/e32btrace.h"
+#include <utraceefsrv.h>
+
+RTest test(_L("T_FTRACE"));
+
+RBTrace Trace;
+
+void SetBTraceFilter(const TUint32* aNew,TUint32* aOld)
+	{
+	TUint category = 0;
+	do
+		{
+		TUint32 newBits = *aNew++;
+		TUint32 oldBits = 0;
+		do
+			{
+			oldBits >>= 1;
+			if(Trace.SetFilter(category,newBits&1))
+				oldBits |= 0x80000000u;
+			newBits >>= 1;
+			++category;
+			}
+		while(category&31);
+		if(aOld)
+			*aOld++ = oldBits;
+		}
+	while(category<256);
+	}
+
+
+
+//---------------------------------------------------------------------------------------------------------------------
+//! @SYMTestCaseID				KBASE-T_FTRACE-0001
+//! @SYMTestCaseDesc			Test File Server Tracing of RFile::Replace()
+//! @SYMTestType				UT
+//! @SYMPREQ					PREQ1617
+//! @SYMTestPriority			Medium
+//! @SYMTestActions				
+//! 	1.	Call RFile::Replace() to create a file
+//! 	2.	Get trace data from BTrace and verify that the expected trace data is present
+//! 
+//! @SYMTestExpectedResults
+//! 	1.	Trace data payload should be as expected, i.e. it should contain the file name, mode etc.
+//---------------------------------------------------------------------------------------------------------------------
+void TestRFileReplace()
+	{
+	test.Start(_L("Test trace output from creating a file"));
+	RFile file;
+	TFileName testFileName = _L("File.txt");
+
+	TheFs.Delete(testFileName);
+
+	Trace.Empty();
+
+	TInt r = file.Replace(TheFs,testFileName,EFileStreamText);
+	test(r==KErrNone);
+
+
+	TBool funcInFound = EFalse;
+	TBool funcOutFound = EFalse;
+
+	TBuf8<1024> buf;
+	for(;;)
+		{
+		TUint8* record;
+		TInt dataSize = Trace.GetData(record);
+		if(!dataSize)
+			break;
+		TUint8* end = record+dataSize;
+
+		while(record<end)
+			{
+			TUint size = record[BTrace::ESizeIndex];
+			TUint flags = record[BTrace::EFlagsIndex];
+			TUint category = record[BTrace::ECategoryIndex];
+			TUint subCategory = record[BTrace::ESubCategoryIndex];
+			TUint8* data = record+4;
+			size -= 4;
+
+			buf.Zero();
+			if(flags&(BTrace::EHeader2Present))
+				{
+				data += 4;
+				size -= 4;
+				}
+
+			if((flags&(BTrace::ETimestampPresent|BTrace::ETimestamp2Present))==(BTrace::ETimestampPresent|BTrace::ETimestamp2Present))
+				{
+				buf.AppendFormat(_L8("time:%08x:%08x "),((TUint32*)data)[1],*(TUint32*)data);
+				data += 8;
+				size -= 8;
+				}
+			else if(flags&(BTrace::ETimestampPresent|BTrace::ETimestamp2Present))
+				{
+				buf.AppendFormat(_L8("time:%08x "),*(TUint32*)data);
+				data += 4;
+				size -= 4;
+				}
+
+			if(flags&(BTrace::EContextIdPresent))
+				{
+				buf.AppendFormat(_L8("context:%08x "),*(TUint32*)data);
+				data += 4;
+				size -= 4;
+				}
+			else
+				{
+				buf.AppendFormat(_L8("                 "));
+				}
+
+			if(flags&(BTrace::EPcPresent))
+				{
+				buf.AppendFormat(_L8("pc:%08x "),*(TUint32*)data);
+				data += 4;
+				size -= 4;
+				}
+
+			if(flags&(BTrace::EExtraPresent))
+				{
+				data += 4;
+				size -= 4;
+				}
+
+			TUint32 data0 = (size>0) ? *(TUint32*)(data) : 0;
+			TUint32 data1 = (size>4) ? *(TUint32*)(data+4) : 0;
+			TPtrC8 des(0,0);
+			if(size>=8)
+				des.Set(data+8,size-8);
+
+			buf.AppendFormat(_L8("size:%d flags:%02x cat:%d,%d data: "),size,flags,category,subCategory);
+			for(TUint i=0; i<size; i+=4)
+				buf.AppendFormat(_L8("%08x "),*(TUint32*)(data+i));
+			buf.Append('\r');
+			buf.Append('\n');
+			test(buf.MaxLength() >= (buf.Length()*2));
+			RDebug::RawPrint(buf.Expand());
+
+
+			if (category == UTF::EBorder && subCategory == 0 && data0 == EF32TraceUidEfsrv)
+				{
+				if (data1 == UTraceModuleEfsrv::EFileReplace)
+					{
+					TInt sessionHandle = (size>8) ? *(TUint32*)(data+8) : 0;
+					TUint32 fileMode = (size>12) ? *(TUint32*)(data+12) : 0;
+					TInt fileNameLen = (size>16) ? *(TUint32*)(data+16) : 0;
+					fileNameLen/= 2;	// convert to unicode length
+					TText16* fileName = (TText16*) ((size>20) ? (data+20) : NULL);
+
+					test(sessionHandle == TheFs.Handle());
+					test(fileMode == EFileStreamText);
+					test(fileNameLen == testFileName.Length());
+					TPtrC16 fileNamePtr (fileName, fileNameLen);
+					test(fileName != NULL);
+					test(testFileName.Compare(fileNamePtr) == 0);
+					funcInFound = ETrue;
+					}
+				else if (data1 == UTraceModuleEfsrv::EFileReplaceReturn)
+					{
+					TInt retCode = (size>8) ? *(TUint32*)(data+8) : 0;
+					TInt subsessionHandle = (size>12) ? *(TUint32*)(data+12) : 0;
+
+					test(retCode == KErrNone);
+					test(subsessionHandle == file.SubSessionHandle());
+					funcOutFound = ETrue;
+					}
+				}
+
+			record = BTrace::NextRecord(record);
+			}
+		Trace.DataUsed();
+		}
+
+	file.Close();
+	TheFs.Delete(testFileName);
+
+	test (funcInFound);
+	test (funcOutFound);
+	}
+
+//---------------------------------------------------------------------------------------------------------------------
+//! @SYMTestCaseID				KBASE-T_FTRACE-0002
+//! @SYMTestCaseDesc			Test File Server Tracing of RFs::Rename()
+//! @SYMTestType				UT
+//! @SYMPREQ					PREQ1617
+//! @SYMTestPriority			Medium
+//! @SYMTestActions				
+//! 	1.	Call RFile::Replace() to create a file
+//! 	2.	Close the file
+//! 	3.	Call RFs::Rename to rename the file
+//! 	4.	Get trace data from BTrace and verify that the expected trace data is present
+//! 
+//! @SYMTestExpectedResults
+//! 	1.	Trace data payload should be as expected, i.e. it should contain both file names, etc.
+//---------------------------------------------------------------------------------------------------------------------
+void TestRFsRename()
+	{
+	test.Start(_L("Test trace output from renaming a file"));
+	RFile file;
+	TFileName testFileName1 = _L("File1.txt");
+	TFileName testFileName2 = _L("File2.txt");
+
+	TheFs.Delete(testFileName1);
+	TheFs.Delete(testFileName2);
+
+	TInt r = file.Replace(TheFs,testFileName1,EFileStreamText);
+	test(r==KErrNone || KErrAlreadyExists);
+	file.Close();
+
+	Trace.Empty();
+
+	r = TheFs.Rename(testFileName1, testFileName2);
+	test(r==KErrNone);
+
+
+	TBool funcInFound = EFalse;
+	TBool funcOutFound = EFalse;
+
+	TBuf8<1024> buf;
+	for(;;)
+		{
+		TUint8* record;
+		TInt dataSize = Trace.GetData(record);
+		if(!dataSize)
+			break;
+		TUint8* end = record+dataSize;
+
+		while(record<end)
+			{
+			TUint size = record[BTrace::ESizeIndex];
+			TUint flags = record[BTrace::EFlagsIndex];
+			TUint category = record[BTrace::ECategoryIndex];
+			TUint subCategory = record[BTrace::ESubCategoryIndex];
+			TUint8* data = record+4;
+			size -= 4;
+
+			buf.Zero();
+			if(flags&(BTrace::EHeader2Present))
+				{
+				data += 4;
+				size -= 4;
+				}
+
+			if((flags&(BTrace::ETimestampPresent|BTrace::ETimestamp2Present))==(BTrace::ETimestampPresent|BTrace::ETimestamp2Present))
+				{
+				buf.AppendFormat(_L8("time:%08x:%08x "),((TUint32*)data)[1],*(TUint32*)data);
+				data += 8;
+				size -= 8;
+				}
+			else if(flags&(BTrace::ETimestampPresent|BTrace::ETimestamp2Present))
+				{
+				buf.AppendFormat(_L8("time:%08x "),*(TUint32*)data);
+				data += 4;
+				size -= 4;
+				}
+
+			if(flags&(BTrace::EContextIdPresent))
+				{
+				buf.AppendFormat(_L8("context:%08x "),*(TUint32*)data);
+				data += 4;
+				size -= 4;
+				}
+			else
+				{
+				buf.AppendFormat(_L8("                 "));
+				}
+
+			if(flags&(BTrace::EPcPresent))
+				{
+				buf.AppendFormat(_L8("pc:%08x "),*(TUint32*)data);
+				data += 4;
+				size -= 4;
+				}
+
+			if(flags&(BTrace::EExtraPresent))
+				{
+				data += 4;
+				size -= 4;
+				}
+
+			TUint32 data0 = (size>0) ? *(TUint32*)(data) : 0;
+			TUint32 data1 = (size>4) ? *(TUint32*)(data+4) : 0;
+			TPtrC8 des(0,0);
+			if(size>=8)
+				des.Set(data+8,size-8);
+
+			buf.AppendFormat(_L8("size:%d flags:%02x cat:%d,%d data: "),size,flags,category,subCategory);
+			for(TUint i=0; i<size; i+=4)
+				buf.AppendFormat(_L8("%08x "),*(TUint32*)(data+i));
+			buf.Append('\r');
+			buf.Append('\n');
+			test(buf.MaxLength() >= (buf.Length()*2));
+			RDebug::RawPrint(buf.Expand());
+
+
+			if (category == UTF::EBorder && subCategory == 0 && data0 == EF32TraceUidEfsrv)
+				{
+				TUint8* recData = data+8;
+				if (data1 == UTraceModuleEfsrv::EFsRename)
+					{
+					TInt sessionHandle = *(TUint32*) recData; recData+= 4;
+
+					TInt fileNameLen1 = *(TUint32*) recData; recData+= 4;
+					TText16* fileName1 = (TText16*) recData; recData+= ((fileNameLen1 +4) & ~3);
+
+					TInt fileNameLen2 = *(TUint32*) recData; recData+= 4;
+					TText16* fileName2 = (TText16*) recData; recData+= fileNameLen2;
+
+					fileNameLen1/= 2;	// convert to unicode length
+					fileNameLen2/= 2;	// convert to unicode length
+
+
+					test(sessionHandle == TheFs.Handle());
+					
+					test(fileNameLen1 == testFileName1.Length());
+					TPtrC16 fileNamePtr1 (fileName1, fileNameLen1);
+					test(fileName1 != NULL);
+					test(testFileName1.Compare(fileNamePtr1) == 0);
+
+					test(fileNameLen2 == testFileName2.Length());
+					TPtrC16 fileNamePtr2 (fileName2, fileNameLen2);
+					test(fileName2 != NULL);
+					test(testFileName2.Compare(fileNamePtr2) == 0);
+
+					funcInFound = ETrue;
+					}
+				else if (data1 == UTraceModuleEfsrv::EFsRenameReturn)
+					{
+					TInt retCode = (size>8) ? *(TUint32*)(data+8) : 0;
+
+					test(retCode == KErrNone);
+
+					funcOutFound = ETrue;
+					}
+				}
+
+			record = BTrace::NextRecord(record);
+			}
+		Trace.DataUsed();
+		}
+
+
+	test (funcInFound);
+	test (funcOutFound);
+
+	TheFs.Delete(testFileName1);
+	TheFs.Delete(testFileName2);
+	}
+
+void CallTestsL()
+	{
+
+// By default, file server trace-points are only compiled in in debug mode
+#if defined(_DEBUG)
+	test.Title();
+	TInt r;
+
+	test.Start(_L("Open LDD"));
+	r = Trace.Open();
+	test(r == KErrNone);
+
+
+	TUint32 OldTraceFilter[8] = {0};
+
+	TUint savedMode = Trace.Mode();
+	SetBTraceFilter(OldTraceFilter,OldTraceFilter);
+
+	Trace.ResizeBuffer(0x100000);
+	Trace.Empty();
+
+	Trace.SetMode(RBTrace::EEnable | RBTrace::EFreeRunning);
+
+	TBool b;
+//	b = Trace.SetFilter(BTrace::EThreadIdentification, ETrue);
+//	test(b >= 0);
+	b = Trace.SetFilter(UTF::EPanic, ETrue);
+	test(b >= 0);
+	b = Trace.SetFilter(UTF::EError, ETrue);
+	test(b >= 0);
+	b = Trace.SetFilter(UTF::EBorder, ETrue);
+	test(b >= 0);
+
+	b = Trace.SetFilter2(EF32TraceUidEfsrv, ETrue);
+	test(b >= 0);
+
+	TestRFileReplace();
+	TestRFsRename();
+
+	// restore trace settings...
+	Trace.SetMode(0);
+	SetBTraceFilter(OldTraceFilter,OldTraceFilter);
+	Trace.SetMode(savedMode);
+
+
+	test.Next(_L("Close LDD"));
+	Trace.Close();
+
+	test.End();
+#endif
+	}
+