xml/xmllibxml2parser/test/tef/xmlparser2/src/texmlparser2step.cpp
changeset 0 e35f40988205
child 20 889504eac4fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/xmllibxml2parser/test/tef/xmlparser2/src/texmlparser2step.cpp	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,353 @@
+// 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 "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 texmlparser2step.cpp
+ @internalTechnology
+*/
+ 
+#include "texmlparser2step.h"
+#include "tetestcontenthandler.h"
+#include "libxml2_globals_private.h"
+#include <e32cmn.h>
+#include <xml/parserfeature.h>
+#include <xml/matchdata.h>
+
+using namespace Xml;
+/**
+ * Class CXmlParser2Step implementation
+ */
+_LIT(KSimpleXmlFile, "z:\\testdata\\xmlexample.xml");
+#ifdef _DEBUG
+_LIT(KCorruptXm1File, "z:\\testdata\\corruptxml1.xml");
+#endif
+
+/**
+ * Constructor. Sets the test step name so that it can be 
+ * differentiated from within doTestStepL()
+ */
+CXmlParser2Step::CXmlParser2Step(const TDesC& aStepName)
+	{
+	SetTestStepName(aStepName);
+	}
+
+/**
+ * TEF invokes doTestStepL interface along with the step name
+ * to let appropriate action to be taken for the test step.
+ */
+TVerdict CXmlParser2Step::doTestStepL(void)
+	{
+	if (TestStepName() == KXmlParser2SetContentSink)
+		{
+		INFO_PRINTF1(KXmlParser2SetContentSink);
+		SetTestStepResult(TestKXmlParser2SetContentSink());
+		}
+	else if (TestStepName() == KXmlParser2OOMTests)
+		{
+		INFO_PRINTF1(KXmlParser2OOMTests);
+		SetTestStepResult(TestKXmlParser2OOMTests());
+		}
+	else if (TestStepName() == KXmlParser2OOMTests2)
+		{
+		INFO_PRINTF1(KXmlParser2OOMTests2);
+		SetTestStepResult(TestKXmlParser2OOMTests2());
+		}
+	else if (TestStepName() == KXmlParser2OOMTests3)
+		{
+		INFO_PRINTF1(KXmlParser2OOMTests3);
+		SetTestStepResult(TestKXmlParser2OOMTests3());
+		}
+	else if (TestStepName() == KXmlParser2OOMTests4)
+		{
+		INFO_PRINTF1(KXmlParser2OOMTests4);
+		SetTestStepResult(TestKXmlParser2OOMTests4());
+		}
+	return TestStepResult();
+	}
+
+TVerdict CXmlParser2Step::TestKXmlParser2SetContentSink()
+	{
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+
+	CTestContentHandler *sax = CTestContentHandler::NewL();
+	RFile handle;
+	TInt err;
+	TRAP(err,handle.Open(fs, KSimpleXmlFile, EFileShareReadersOnly));
+	if (err != KErrNone)
+		{
+		INFO_PRINTF1(_L("Error opening test XML file"));
+		User::Leave(err);
+		}
+	CleanupClosePushL(handle);
+	CMatchData *matchData = CMatchData::NewL();
+	matchData->SetMimeTypeL(_L8("text/xml"));
+	matchData->SetVariantL(_L8("libxml2"));
+	CParser *parser = CParser::NewL(*matchData, *sax);
+	TInt retVal = KErrNone;
+	//Valid feature
+	retVal = parser->EnableFeature(EReportNamespaceMapping);
+	if (retVal != KErrNone)
+		{
+		INFO_PRINTF1(_L("Error Enabling valid feature"));
+		return EFail;
+		}
+	//Invalid feature
+	TInt EInvalidFeatureId = 0x1111;
+	retVal = parser->EnableFeature(EInvalidFeatureId);
+	if (retVal != KErrNotSupported)
+		{
+		INFO_PRINTF1(_L("Unexpected error while enabling invalid feature"));
+		return EFail;
+		}
+	//Valid feature
+	retVal = parser->DisableFeature(EReportNamespaces);
+	if (retVal != KErrNone)
+		{
+		INFO_PRINTF1(_L("Error Disabling valid feature"));
+		return EFail;
+		}
+
+	//Invalid feature
+	retVal = parser->DisableFeature(EInvalidFeatureId);
+	if (retVal != KErrNotSupported)
+		{
+		INFO_PRINTF1(_L("Unexpected error while disabling invalid feature"));
+		return EFail;
+		}
+	RContentProcessorUids *uid = new (ELeave)RContentProcessorUids;
+	const TUid KXmlContProcUid =
+		{
+		0x20021CE5 //UID3
+		};
+	uid->Append(KXmlContProcUid);
+	TRAP(err, parser->SetProcessorChainL(*uid));
+	if (err != KErrNone)
+		{
+		INFO_PRINTF1(_L("Error Setting up processor chain"));
+		return EFail;
+		}
+	TRAP(err,ParseL(*parser, handle));
+	if (err != KErrNone)
+		{
+		INFO_PRINTF1(_L("Error Parsing"));
+		return EFail;
+		}
+	delete parser;
+	fs.Close();
+	CleanupStack::Pop(&handle);
+	return EPass;
+	}
+/**
+ * This test step should be run only on debug builds owing to the 
+ * __UHEAP macros that are defined only in debug builds.
+ */
+TVerdict CXmlParser2Step::TestKXmlParser2OOMTests()
+	{
+#ifdef _DEBUG
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CTestContentHandler *sax = CTestContentHandler::NewL();
+	RFile handle;
+	TInt err;
+	CleanupClosePushL(handle);
+	TRAP(err,handle.Open(fs, KSimpleXmlFile, EFileShareReadersOnly));
+	if (err != KErrNone)
+		{
+		INFO_PRINTF1(_L("Error opening test XML file"));
+		User::Leave(err);
+		}
+
+	CMatchData *matchData = CMatchData::NewL();
+	matchData->SetMimeTypeL(_L8("text/xml"));
+	matchData->SetVariantL(_L8("libxml2"));
+	CParser *parser = CParser::NewL(*matchData, *sax);
+	CleanupStack::PushL(parser);
+
+	__UHEAP_SETFAIL(RHeap::EDeterministic, 40);
+	TRAP(err,ParseL(*parser, handle));
+	//it could be a random error
+	if (err == KErrNone)
+		{
+		return EFail;
+		}
+	INFO_PRINTF1(_L("Tests passed at Heap failure rate :40"));
+	parser->ParseBeginL();
+	__UHEAP_SETFAIL(RHeap::EDeterministic, 50);
+	TRAP(err,ParseL(*parser, handle));
+	//it could be a random error
+	if (err == KErrNone)
+		{
+		return EFail;
+		}
+	INFO_PRINTF1(_L("Tests passed at Heap failure rate :50"));
+	parser->ParseBeginL();
+	__UHEAP_SETFAIL(RHeap::EDeterministic, 100);
+	TRAP(err,ParseL(*parser, handle));
+	//it could be a random error
+	if (err == KErrNone)
+		{
+		return EFail;
+		}
+	INFO_PRINTF1(_L("Tests passed at Heap failure rate :100"));
+	parser->ParseBeginL();
+	__UHEAP_SETFAIL(RHeap::ENone, 0);
+	fs.Close();
+	CleanupStack::Pop(parser);
+	CleanupStack::Pop(&handle);
+#else
+	INFO_PRINTF1(_L("This test is meant to be run only in DEBUG builds. Returning EPASS"));
+#endif
+	return EPass;
+	}
+
+/**
+ * This test step should be run only on debug builds owing to the 
+ * __UHEAP macros that are defined only in debug builds.
+ */
+TVerdict CXmlParser2Step::TestKXmlParser2OOMTests2()
+	{
+#ifdef _DEBUG
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CTestContentHandler *sax = CTestContentHandler::NewL();
+	RFile handle;
+	TInt err;
+	CleanupClosePushL(handle);
+	TRAP(err,handle.Open(fs, KSimpleXmlFile, EFileShareReadersOnly));
+	if (err != KErrNone)
+		{
+		INFO_PRINTF1(_L("Error opening test XML file"));
+		User::Leave(err);
+		}
+
+	CMatchData *matchData = CMatchData::NewL();
+	matchData->SetMimeTypeL(_L8("text/xml"));
+	matchData->SetVariantL(_L8("libxml2"));
+	CParser *parser = CParser::NewL(*matchData, *sax);
+	CleanupStack::PushL(parser);
+
+	__UHEAP_SETFAIL(RHeap::EDeterministic, 1);
+	TRAP(err,ParseL(*parser, handle));
+	if (err != KErrNoMemory)
+		{
+		return EFail;
+		}
+	INFO_PRINTF1(_L("Tests passed at Heap failure rate :1"));
+	__UHEAP_SETFAIL(RHeap::EDeterministic, 33);
+	TRAP(err,ParseL(*parser, handle));
+	//it could be a random error
+	if (err == KErrNone)
+		{
+		return EFail;
+		}
+	INFO_PRINTF1(_L("Tests passed at Heap failure rate :33"));
+	__UHEAP_SETFAIL(RHeap::ENone, 0);
+	
+  fs.Close();
+	CleanupStack::Pop(parser);
+	CleanupStack::Pop(&handle);
+#else
+	INFO_PRINTF1(_L("This test is meant to be run only in DEBUG builds. Returning EPASS"));
+#endif
+	return EPass;
+	}
+/**
+ * This test step should be run only on debug builds owing to the 
+ * __UHEAP macros that are defined only in debug builds.
+ */
+TVerdict CXmlParser2Step::TestKXmlParser2OOMTests3()
+	{
+#ifdef _DEBUG
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CTestContentHandler *sax = CTestContentHandler::NewL();
+	RFile handle;
+	TInt err;
+	CleanupClosePushL(handle);
+	TRAP(err,handle.Open(fs, KSimpleXmlFile, EFileShareReadersOnly));
+	if (err != KErrNone)
+		{
+		INFO_PRINTF1(_L("Error opening test XML file"));
+		User::Leave(err);
+		}
+
+	CMatchData *matchData = CMatchData::NewL();
+	matchData->SetMimeTypeL(_L8("text/xml"));
+	matchData->SetVariantL(_L8("libxml2"));
+	CParser *parser = CParser::NewL(*matchData, *sax);
+	CleanupStack::PushL(parser);
+
+	__UHEAP_SETFAIL(RHeap::EDeterministic, 32);
+	TRAP(err,ParseL(*parser, handle));
+	//it could be a random error
+	if (err == KErrNone)
+		{
+		return EFail;
+		}
+	INFO_PRINTF1(_L("Tests passed at Heap failure rate :32"));
+	__UHEAP_SETFAIL(RHeap::ENone, 0);
+
+	fs.Close();
+	CleanupStack::Pop(parser);
+	CleanupStack::Pop(&handle);
+#else
+	INFO_PRINTF1(_L("This test is meant to be run only in DEBUG builds. Returning EPASS"));
+#endif
+	return EPass;
+	}
+
+TVerdict CXmlParser2Step::TestKXmlParser2OOMTests4()
+	{
+#ifdef _DEBUG
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CTestContentHandler *sax = CTestContentHandler::NewL();
+	RFile handle;
+	TInt err;
+	CleanupClosePushL(handle);
+	TRAP(err,handle.Open(fs, KCorruptXm1File, EFileShareReadersOnly));
+	if (err != KErrNone)
+		{
+		INFO_PRINTF1(_L("Error opening test XML file"));
+		User::Leave(err);
+		}
+
+	CMatchData *matchData = CMatchData::NewL();
+	CleanupStack::PushL(matchData);
+	matchData->SetMimeTypeL(_L8("text/xml"));
+	matchData->SetVariantL(_L8("libxml2"));
+	CParser *parser = CParser::NewL(*matchData, *sax);
+	CleanupStack::PushL(parser);
+	
+	__UHEAP_SETFAIL(RHeap::EDeterministic, 72);
+	
+	TRAP(err,ParseL(*parser, handle););
+	TInt EXmlTagMismatch = -993; //copied from xmlparseerrors.h
+	if (err != EXmlTagMismatch)
+		{
+		return EFail;
+		}
+	__UHEAP_SETFAIL(RHeap::ENone, 0);
+
+	fs.Close();
+	CleanupStack::Pop(parser);
+	CleanupStack::Pop(matchData);
+	CleanupStack::Pop(&handle);
+#else
+	INFO_PRINTF1(_L("This test is meant to be run only in DEBUG builds. Returning EPASS"));
+#endif
+	return EPass;
+	}