xml/xmlexpatparser/test/rtest/tsrc/t_xmldefect.cpp
changeset 0 e35f40988205
child 24 74f0b3eb154c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/xmlexpatparser/test/rtest/tsrc/t_xmldefect.cpp	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,623 @@
+// Copyright (c) 2005-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 <e32test.h>
+#include <ecom/ecom.h>
+
+#include <xml/contentprocessor.h>
+#include <xml/documentparameters.h>
+#include <xml/parser.h>
+#include <xml/parserfeature.h>
+#include <xml/stringdictionarycollection.h>
+#include <xml/xmlframeworkerrors.h>
+
+#include "unzip.h"
+
+LOCAL_D RTest 				test(_L("t_xmldefect.exe"));
+
+LOCAL_D RFs					TheFs;
+
+LOCAL_D CTrapCleanup* 		TheTrapCleanup 		= NULL;
+
+LOCAL_D TBool				TheCorruptedXmlFileTest = EFalse;
+
+LOCAL_D TInt    			TheCorruptedXmlFileTestErrorCount = 0;
+
+// Installed via bld.inf test exports
+_LIT(KSimpleFile, "c:\\system\\data\\xml\\xml\\another_simple.xml");
+_LIT(KNsAndBindingFile, "c:\\system\\data\\xml\\xml\\default_namespace_and_unbinding.xml");
+
+_LIT(KZipTestFile, "z:\\system\\data\\xml\\xmldefect.zip");
+_LIT(KXmlTestDir, "c:\\system\\data\\xml");
+
+
+_LIT8(KXmlParserDataType, "text/xml");
+
+
+typedef void (*TestFunc) (void);
+
+
+//----------------------------------------------------------------------------
+// The Content Handler
+
+using namespace Xml;
+
+class RDefectTests : public MContentHandler
+	{
+public:
+	RDefectTests() {/*do nothing*/};
+	virtual ~RDefectTests() {/*do nothing*/};
+
+	void Open() {/*do nothing*/};
+	void Close() {/*do nothing*/};
+
+	// From MContentHandler
+	void OnStartDocumentL(const RDocumentParameters& aDocParam, TInt aErrorCode);
+	void OnEndDocumentL(TInt aErrorCode);
+	void OnStartElementL(const RTagInfo& aElement, const RAttributeArray& aAttribute, TInt aErrorCode);
+	void OnEndElementL(const RTagInfo& aElement, TInt aErrorCode);
+	void OnContentL(const TDesC8& aBytes, TInt aErrorCode);
+	void OnStartPrefixMappingL(const RString& aPrefix, const RString& aUri, TInt aErrorCode);
+	void OnEndPrefixMappingL(const RString& aPrefix, TInt aErrorCode);
+	void OnIgnorableWhiteSpaceL(const TDesC8& aBytes, TInt aErrorCode) ;
+	void OnSkippedEntityL(const RString& aName, TInt aErrorCode);
+	void OnProcessingInstructionL(const TDesC8& aTarget, const TDesC8& aData, TInt aErrorCode);
+	TAny* GetExtendedInterface(const TInt32 aUid);
+
+	void OnError(TInt aErrorCode);
+
+	};
+
+
+
+// From MContentHandler
+
+// maps to SAX 2.0 startDocument method.
+void RDefectTests::OnStartDocumentL(const RDocumentParameters& /*aDocParam*/, TInt aErrorCode)
+	{
+	test(aErrorCode == KErrNone);
+	}
+
+
+	// maps to SAX 2.0 endDocument method.
+void RDefectTests::OnEndDocumentL(TInt aErrorCode)
+	{
+	test(aErrorCode == KErrNone);
+	}
+
+
+// maps to SAX 2.0 startElement method.
+void RDefectTests::OnStartElementL(const RTagInfo& /*aElement*/, const RAttributeArray& /*aAttribute*/, TInt aErrorCode)
+	{
+	test(aErrorCode == KErrNone);
+	}
+
+
+// maps to SAX 2.0 endElement method.
+void RDefectTests::OnEndElementL(const RTagInfo& /*aElement*/, TInt aErrorCode)
+	{
+	test(aErrorCode == KErrNone);
+	}
+
+
+// maps to SAX 2.0 characters method.
+void RDefectTests::OnContentL(const TDesC8& /*aBytes*/, TInt aErrorCode)
+	{
+	test(aErrorCode == KErrNone);
+	}
+
+
+// maps to SAX 2.0 startPrefixMapping method.
+void RDefectTests::OnStartPrefixMappingL(const RString& /*aPrefix*/, const RString& /*aUri*/, TInt aErrorCode)
+	{
+	test.Next(_L("Entered OnStartPrefixMappingL"));
+	test(aErrorCode == KErrNone);
+	}
+
+
+// maps to SAX 2.0 endPrefixMapping method.
+void RDefectTests::OnEndPrefixMappingL(const RString& /*aPrefix*/, TInt aErrorCode)
+	{
+	test(aErrorCode == KErrNone);
+	}
+
+
+// maps to SAX 2.0 ignorableWhitespace method.
+void RDefectTests::OnIgnorableWhiteSpaceL(const TDesC8& /*aBytes*/, TInt aErrorCode)
+	{
+	test(aErrorCode == KErrNone);
+	}
+
+
+// maps to SAX 2.0 skippedEntity method.
+void RDefectTests::OnSkippedEntityL(const RString& /*aName*/, TInt aErrorCode)
+	{
+	test(aErrorCode == KErrNone);
+	}
+
+
+// maps to SAX 2.0 processingInstruction method.
+void RDefectTests::OnProcessingInstructionL(const TDesC8& /*aTarget*/, const TDesC8& /*aData*/, TInt aErrorCode)
+	{
+	test(aErrorCode == KErrNone);
+	}
+
+
+// Note that Oom tests between Xml and Wbxml behave differently.
+// Xml has a preallocated block of memory allocated upfront that
+// it uses to obtain internal memory allocations from.
+// In this manner out of memory allocations happen BEFORE parsing.
+// Therefore, OnError() is never called due to KErrNoMemory. However,
+// the parser will leave and fall into the oom TRAP block.
+// With Wbxml there is no such preallocation so an OnError will occur.
+void RDefectTests::OnError(TInt aErrorCode)
+	{
+	//This is done for the test DEF101097L which parses 2 corrupted xml file
+	//in a sequence & thus to check if OnError is called for both the files
+	//& avoid those errors by checking if the error is not KErrNone.
+	if(TheCorruptedXmlFileTest)
+	{
+		test(aErrorCode != KErrNone);
+		++TheCorruptedXmlFileTestErrorCount;
+	}
+	else
+		test (aErrorCode == KErrEof || aErrorCode == KErrNoMemory);
+	}
+
+
+TAny* RDefectTests::GetExtendedInterface(const TInt32 aUid)
+/**
+This method obtains the interface matching the specified uid.
+@return				0 if no interface matching the uid is found.
+					Otherwise, the this pointer cast to that interface.
+@param				aUid the uid identifying the required interface.
+*/
+	{
+	if (aUid == 0)
+		{
+
+		}
+	return 0;
+	}
+
+
+//----------------------------------------------------------------------------
+// The Defect Tests
+
+LOCAL_C void SetupL()
+	{
+	test.Printf(_L("Unziping test xml files for defects\n"));
+
+	CUnzip* unzip = CUnzip::NewLC(TheFs, KZipTestFile);
+	unzip->ExtractL(KXmlTestDir);
+	CleanupStack::PopAndDestroy(unzip);
+
+	//Getch();
+	}
+
+
+//----------------------------------------------------------------------------
+
+
+/**
+@SYMTestCaseID 		 		SYSLIB-XML-CT-3750
+@SYMTestCaseDesc		    OOM Testing.
+@SYMTestPriority 		    Medium
+@SYMTestActions  		    Runs a set of test in oom conditions.
+@SYMTestExpectedResults 	The component(s) should fucntion as expected and the tests should pass.
+@SYMDEF					 	DEF060070
+*/
+LOCAL_C void DoOomTestL(TestFunc testFuncL, const TDesC& /*aDesc*/)
+	{
+	test.Printf(_L(" @SYMTestCaseID:SYSLIB-XML-CT-3750    OOM test \n "));
+
+	TInt err, tryCount = 0;
+	do
+		{
+		User::__DbgSetAllocFail(RHeap::EUser, RHeap::EFailNext, ++tryCount);
+		User::__DbgMarkStart(RHeap::EUser);
+		TRAP(err, (*testFuncL)());
+		User::__DbgMarkEnd(RHeap::EUser, 0);
+		} while(err==KErrNoMemory);
+
+	if(err==KErrNone)
+		{
+		// Reset
+		User::__DbgSetAllocFail(RHeap::EUser,RHeap::ENone,1);
+		}
+	else
+		{
+		User::Panic(_L("Unexpected leave reason\n"),err);
+		}
+
+	test.Printf(_L("- succeeded with rate %i\r\n"), tryCount);
+	}
+
+
+//----------------------------------------------------------------------------
+
+
+LOCAL_C void DoTestL(TestFunc aTestFuncL, const TDesC& aDesc)
+	{
+	test.Next(aDesc);
+
+	// Set up for heap leak checking
+	__UHEAP_MARK;
+
+	// and leaking thread handles
+	TInt startProcessHandleCount;
+	TInt startThreadHandleCount;
+	TInt endProcessHandleCount;
+	TInt endThreadHandleCount;
+
+	// Test Starts...
+
+	RThread thisThread;
+	thisThread.HandleCount(startProcessHandleCount, startThreadHandleCount);
+
+	(*aTestFuncL)();
+
+	REComSession::FinalClose(); // Don't want leaks outside the test
+
+	//--------------
+	// Check for open handles
+	thisThread.HandleCount(endProcessHandleCount, endThreadHandleCount);
+
+	test(startThreadHandleCount == endThreadHandleCount);
+
+	__UHEAP_MARKEND;
+
+	DoOomTestL(aTestFuncL, aDesc);
+
+	}
+
+
+//----------------------------------------------------------------------------
+
+
+/**
+@SYMTestCaseID 		 		SYSLIB-XML-CT-1571
+@SYMTestCaseDesc		    Testing Prop: Symbian XML
+							Framework-MContentHandler::OnStartPrefixMappingL()never called
+@SYMTestPriority 		    Medium
+@SYMTestActions  		    Parsing a xml file and check whether framework calls
+							MContentHandler::OnStartPrefixMappingL() function
+@SYMTestExpectedResults 	Test output should show  "Entered OnStartPrefixMappingL".
+@SYMDEF 		 		 	DEF074797
+*/
+
+
+LOCAL_C void DEF074797L()
+	{
+
+	_LIT8 (KXmlNamespace,"<?xml version=\"1.0\" encoding=\"utf-8\" ?>\
+			<group xmlns=\"urn:oma:params:xml:ns:list-service\" xmlns:rl=\"urn:ietf:params:xml:ns:resource-lists\" xmlns:cr=\"urn:ietf:params:xml:ns:common-policy\">\
+			<list-service uri=\"sip:prearranged3+s60test.user24@ims3.so.noklab.net\">\
+			<display-name>prearranged3</display-name>\
+			<list>\
+			<entry uri=\"sip:s60test.user24@ims3.so.noklab.net\">\
+			<rl:display-name>tr</rl:display-name>\
+			</entry>\
+			</list>\
+			<invite-members>true</invite-members>\
+			<max-participant-count>10</max-participant-count>\
+			<cr:ruleset>\
+			<cr:rule id=\"0\">\
+			<cr:conditions>\
+			<is-list-member>true</is-list-member>\
+			</cr:conditions>\
+			<cr:actions>\
+			<join-handling>allow</join-handling>\
+			<allow-anonymity>true</allow-anonymity>\
+			<allow-initiate-conference>true</allow-initiate-conference>\
+			<allow-conference-state>true</allow-conference-state>\
+			</cr:actions>\
+			<cr:transformations />\
+			</cr:rule>\
+			</cr:ruleset>\
+			</list-service>\
+			</group>");
+
+
+	TBuf16<128> ucs4_0041;
+
+	// <wml>A</wml>
+	// 0x01, 0x04, 0x6A, 0x00, 0x7F, 0x02, 0x80, 0x41, 0x01
+
+	ucs4_0041.Append(0x01);
+	ucs4_0041.Append(0x04);
+	ucs4_0041.Append(0x6A);
+	ucs4_0041.Append(0x00);
+	ucs4_0041.Append(0x7F);
+	ucs4_0041.Append(0x02);
+	ucs4_0041.Append(0x80);
+	ucs4_0041.Append(0x41);
+	ucs4_0041.Append(0x01);
+
+	_LIT8 (KWbxmlParserDataType, "text/wbxml");
+
+	RDefectTests handler;
+	CleanupClosePushL (handler);
+
+	CParser* parser = CParser::NewL(KXmlParserDataType, handler);
+	CleanupStack::PushL (parser);
+
+	User::LeaveIfError( parser->EnableFeature( EReportNamespaces ) );
+	User::LeaveIfError( parser->EnableFeature( EReportNamespaceMapping ) );
+	User::LeaveIfError( parser->EnableFeature( EReportNamespacePrefixes ) );
+
+	// Parse the xml document
+	ParseL(*parser, KXmlNamespace);
+
+	// Now switch to a different parser (wbxml)
+	parser->ParseBeginL (KWbxmlParserDataType);
+
+	TBuf8<256> buf8;
+	// Copy will ignore the upper byte if the byte-pair < 256, otherwise the value 1 is used.
+	buf8.Copy(ucs4_0041);
+
+	parser->ParseL(buf8);
+
+	// Now switch back to the default parser (xml)
+	ParseL(*parser, KXmlNamespace);
+
+	CleanupStack::PopAndDestroy (parser);
+	CleanupStack::PopAndDestroy (&handler);
+
+	}
+
+
+//----------------------------------------------------------------------------
+
+
+/**
+@SYMTestCaseID 		 		SYSLIB-XML-CT-3749
+@SYMTestCaseDesc		    Swapping parsers back and forth between parsing the same document twice.
+@SYMTestPriority 		    Medium
+@SYMTestActions  		    Parse an xml document, swap to the wbxml parser, then swap back to the xml parser and parse.
+@SYMTestExpectedResults 	The test completes successfully.
+@SYMDEF 		 		 	INC063222
+*/
+LOCAL_C void INC063222L()
+	{
+	_LIT8 (KXmlNamespace, "<RootElement rabbits:att=\"value\">\
+		   <Element xmlns=\"http://www.symbian.com\" att=\"value\">\
+		   <elprefix:Element xmlns:elprefix=\"http://element.uri\" att=\"value\">\
+		   <Element xmlns:attprefix=\"http://attribute.uri\" attprefix:att=\"value\"/>\
+		   <Element attprefix:att=\"value\"/>\
+		   </elprefix:Element>\
+		   </Element>\
+		   </RootElement>");
+
+	TBuf16<128> ucs4_0041;
+
+	// <wml>A</wml>
+	// 0x01, 0x04, 0x6A, 0x00, 0x7F, 0x02, 0x80, 0x41, 0x01
+
+	ucs4_0041.Append(0x01);
+	ucs4_0041.Append(0x04);
+	ucs4_0041.Append(0x6A);
+	ucs4_0041.Append(0x00);
+	ucs4_0041.Append(0x7F);
+	ucs4_0041.Append(0x02);
+	ucs4_0041.Append(0x80);
+	ucs4_0041.Append(0x41);
+	ucs4_0041.Append(0x01);
+
+	_LIT8 (KWbxmlParserDataType, "text/wbxml");
+
+	RDefectTests handler;
+	CleanupClosePushL (handler);
+
+	CParser* parser = CParser::NewL(KXmlParserDataType, handler);
+	CleanupStack::PushL (parser);
+
+	User::LeaveIfError(parser->EnableFeature(EReportNamespaceMapping));
+
+	// Parse the xml document
+	ParseL(*parser, KXmlNamespace);
+
+	// Now switch to a different parser (wbxml)
+	parser->ParseBeginL (KWbxmlParserDataType);
+
+	TBuf8<256> buf8;
+	// Copy will ignore the upper byte if the byte-pair < 256, otherwise the value 1 is used.
+	buf8.Copy(ucs4_0041);
+
+	parser->ParseL(buf8);
+
+	// Now switch back to the default parser (xml)
+	ParseL(*parser, KXmlNamespace);
+
+	CleanupStack::PopAndDestroy (parser);
+	CleanupStack::PopAndDestroy (&handler);
+	}
+
+
+//----------------------------------------------------------------------------
+
+/**
+@SYMTestCaseID 		 		SYSLIB-XML-CT-3747
+@SYMTestCaseDesc		    Parsing a document supplied via a file handle.
+@SYMTestPriority 		    Medium
+@SYMTestActions  		    Creating a parser and opening file handle to a xml document and then parsing the document.
+@SYMTestExpectedResults 	The document is parsed.
+@SYMDEF 		 		 	DEF060070
+*/
+LOCAL_C void DEF060070L()
+	{
+	RDefectTests handler;
+	CleanupClosePushL (handler);
+
+	CParser* parser = CParser::NewLC(KXmlParserDataType, handler);
+
+	RFile handle;
+	handle.Open(TheFs, KSimpleFile, EFileShareReadersOnly);
+	CleanupClosePushL (handle);
+
+	ParseL(*parser, handle);
+
+	CleanupStack::PopAndDestroy (&handle);
+	CleanupStack::PopAndDestroy (parser);
+	CleanupStack::PopAndDestroy (&handler);
+	}
+
+
+//----------------------------------------------------------------------------
+
+/**
+@SYMTestCaseID 		 		SYSLIB-XML-CT-3748
+@SYMTestCaseDesc		    Processing namespaces.
+@SYMTestPriority 		    Medium
+@SYMTestActions  		    Creating an xml parser and enabling namespace mapping reporting, before parsing a document.
+@SYMTestExpectedResults 	The document is parsed with the namespace mapping reporting enabled.
+@SYMDEF 		 		 	INC059062
+*/
+LOCAL_C void INC059062L()
+	{
+	RDefectTests handler;
+	CleanupClosePushL (handler);
+
+	CParser* parser = CParser::NewLC(KXmlParserDataType, handler);
+
+	User::LeaveIfError(parser->EnableFeature(EReportNamespaceMapping));
+
+	RFile handle;
+	handle.Open(TheFs, KNsAndBindingFile, EFileShareReadersOnly);
+	CleanupClosePushL (handle);
+
+	ParseL(*parser, handle);
+
+	CleanupStack::PopAndDestroy (&handle);
+	CleanupStack::PopAndDestroy (parser);
+	CleanupStack::PopAndDestroy (&handler);
+	}
+
+
+//----------------------------------------------------------------------------
+
+
+/*
+@SYMTestCaseID          SYSLIB-XML-UT-3366
+@SYMTestCaseDesc	    DEF101097: The XML parser don't leave twice when it parse several invalid xml files
+@SYMTestPriority 	    Low
+@SYMTestActions  	    Tests that the xml parser returns an error each time it parses the same corrupted xml file.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 DEF101097
+*/
+LOCAL_C void DEF101097L()
+	{
+	TheCorruptedXmlFileTest = ETrue;
+
+	_LIT  (KTestDocument1, "c:\\system\\data\\xml\\xml\\Corruptedbackupreg.xml");
+
+	RDefectTests handler;
+	CleanupClosePushL (handler);
+
+	CParser* parser = CParser::NewLC(KXmlParserDataType, handler);
+
+	// Parse the first xml doc.
+	ParseL(*parser,TheFs, KTestDocument1);
+
+	// Parse the second xml doc i.e. same data.
+	ParseL(*parser,TheFs, KTestDocument1);
+
+	test(TheCorruptedXmlFileTestErrorCount == 2);
+
+	TheCorruptedXmlFileTest = EFalse;
+	TheCorruptedXmlFileTestErrorCount = 0;
+
+	CleanupStack::PopAndDestroy (parser);
+	CleanupStack::PopAndDestroy (&handler);
+	}
+
+
+//----------------------------------------------------------------------------
+
+
+
+/*
+@SYMTestCaseID          SYSLIB-XML-UT-4937
+@SYMTestCaseDesc	   	Xml::ParseL()  Shouldn't Leave with KErrNoMemory for Non-Well formed Large XML file
+@SYMTestPriority 	    Medium
+@SYMTestActions  	    Tests that the Xml parser doesn't leave with KErrNoMemory from ParseL each time it parses the same Corrupted Large Xml file.
+@SYMTestExpectedResults Test must not fail
+@SYMDEF                 INC134125	
+*/
+
+LOCAL_C void INC134125L()
+	{
+		TheCorruptedXmlFileTest = ETrue;
+		
+		_LIT  (KTestDocument1, "c:\\system\\data\\xml\\xml\\Corruptbigfile.xml");
+		RDefectTests handler;
+		CleanupClosePushL (handler);
+		CParser* parser = CParser::NewLC(KXmlParserDataType, handler);
+		// Parse the Corrupt Big Xml file.
+		ParseL(*parser,TheFs, KTestDocument1);
+		test(TheCorruptedXmlFileTestErrorCount == 1);
+		TheCorruptedXmlFileTest = EFalse;
+		TheCorruptedXmlFileTestErrorCount = 0;
+		CleanupStack::PopAndDestroy (parser);
+		CleanupStack::PopAndDestroy (&handler);
+	}
+
+
+//----------------------------------------------------------------------------
+
+LOCAL_C void DoTestsL()
+	{
+	DoTestL(DEF060070L, _L(" @SYMTestCaseID:SYSLIB-XML-CT-3747 DEF060070 - XML parser cannot parse a file supplied by handle...\n "));
+	DoTestL(INC059062L, _L(" @SYMTestCaseID:SYSLIB-XML-CT-3748 INC059062 - XML Parser Integration - namespaces not processing properly...\n "));
+	DoTestL(INC063222L, _L(" @SYMTestCaseID:SYSLIB-XML-CT-3749 INC063222 - Symbian XML Framework - MContentHandler::OnStartPrefixMappingL() is never called...\n "));
+	DoTestL(DEF074797L, _L(" @SYMTestCaseID:SYSLIB-XML-CT-1571 DEF074797 - Prop: Symbian XML Framework-MContentHandler::OnStartPrefixMappingL()never called...\n "));
+	DoTestL(DEF101097L, _L(" @SYMTestCaseID:SYSLIB-XML-UT-3366 DEF101097 - The XML parser don't leave twice when it parse several invalid xml files...\n "));
+	DoTestL(INC134125L, _L("INC134125 - Xml::ParseL()  Shouldn't Leave with KErrNoMemory for Non-Well formed Large XML file...\n"));
+	}
+
+
+//----------------------------------------------------------------------------
+
+
+TInt E32Main()
+    {
+	__UHEAP_MARK;
+
+	test.Printf(_L("\n"));
+	test.Title();
+	test.Start(_L("XML Defect tests\n"));
+
+	// Connect the file server instance
+	User::LeaveIfError(TheFs.Connect());
+
+	TheTrapCleanup = CTrapCleanup::New();
+
+	TRAPD(err, SetupL());
+	test(err == KErrNone);
+
+	TRAP(err, DoTestsL());
+	test(err == KErrNone);
+
+	delete TheTrapCleanup;
+
+	TheFs.Close();
+
+	test.End();
+	test.Close();
+
+	__UHEAP_MARKEND;
+	return (KErrNone);
+    }
+