compressionlibs/ziplib/test/rtest/ezdefect/ezdefect.cpp
changeset 31 ce057bb09d0b
parent 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/compressionlibs/ziplib/test/rtest/ezdefect/ezdefect.cpp	Fri Jun 04 16:20:51 2010 +0100
@@ -0,0 +1,303 @@
+// 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 <zipfile.h>
+
+LOCAL_D RTest				test(_L("ezdefect.exe"));
+LOCAL_D RFs					TheFs;
+LOCAL_D CTrapCleanup* 		TheTrapCleanup 		= NULL;
+
+#if !defined(__WINS__)
+_LIT(KPath, "Z:\\test\\zip\\");
+#else
+_LIT(KPath, "C:\\test\\zip\\");
+#endif
+
+
+
+void ExtractFileL(const CZipFileMember* aMember, CZipFile* aZip)
+	{
+	HBufC* name = aMember->Name()->AllocLC();
+	for (TInt i = 0; i<name->Length(); i++)
+		{
+		if ((*name)[i] == '/')
+			{
+			name->Des()[i] = '\\';
+			}
+		}
+	
+	RZipFileMemberReaderStream* fileStream;
+	User::LeaveIfError(aZip->GetInputStreamL(aMember, fileStream));
+	CleanupStack::PushL(fileStream);
+
+	TUint32 size = aMember->UncompressedSize();
+	HBufC8* bytes = HBufC8::New(size);
+	CleanupStack::PushL(bytes);
+	TPtr8 ptr = bytes->Des();
+	User::LeaveIfError(fileStream->Read(ptr,size));	
+	CleanupStack::PopAndDestroy(3,name); // bytes, fileStream and name
+	}
+		
+// Extract all members from the zip.
+// These files are non compressed, i.e. EStored.
+void ExtractMembersL(CZipFile* aZip)
+	{
+	test.Next(_L("DEF057916: Getting Corrupt file error when reading wav-file from Zip - PART 2"));
+
+	CZipFileMemberIterator*	members = aZip->GetMembersL();
+	CleanupStack::PushL(members);
+	
+	CZipFileMember* member = members->NextL();
+	while (member)
+		{
+		CleanupStack::PushL(member);
+		ExtractFileL(member, aZip);
+		CleanupStack::PopAndDestroy(member); 
+		member = members->NextL();
+		}
+
+	CleanupStack::PopAndDestroy(members); 
+	}
+
+// Extract the specified files from the zip.
+// These files are non compressed, i.e. EStored.
+void DEF057916L()
+    {
+	test.Next(_L("DEF057916: Getting Corrupt file error when reading wav-file from Zip - PART 1"));
+
+	User::LeaveIfError(TheFs.Connect()); //Connect to file session
+	User::LeaveIfError(TheFs.SetSessionPath(KPath)); //Set Session Path to direcrt containing test zip files
+	CleanupClosePushL(TheFs);
+
+	const TUint KDataChunk = 2048;
+	_LIT(tmpFileName, "\\Test\\Zip\\compression_estored.zip");
+	_LIT(testFile1, "zip\\test.wav");
+	_LIT(testFile2, "zip\\rfc2459.zip");
+	_LIT(testFile3, "zip\\META-INF\\MANIFEST.MF");
+	
+	CZipFile* iZipFile = CZipFile::NewL(TheFs, tmpFileName);
+	CleanupStack::PushL(iZipFile);
+
+	TInt err = KErrNone;
+
+	CZipFileMember* zipMember1 = iZipFile->CaseSensitiveOrCaseInsensitiveMemberL(testFile1);
+	if(zipMember1)
+		{
+		CleanupStack::PushL(zipMember1);
+
+		RZipFileMemberReaderStream* iZipStream;
+		iZipFile->GetInputStreamL(zipMember1, iZipStream);
+		CleanupStack::PushL(iZipStream);
+
+		HBufC8* data = HBufC8::NewLC(KDataChunk);
+		TPtr8 ptr = data->Des();
+		err = KErrNone;
+		
+		err = iZipStream->Read(ptr,KDataChunk);
+		test (err == KErrNone);
+		
+		err = iZipStream->Read(ptr,KDataChunk);
+		test (err == KErrEof);
+		
+		CleanupStack::PopAndDestroy(data);
+		CleanupStack::PopAndDestroy(iZipStream);
+		CleanupStack::PopAndDestroy(zipMember1);  
+		}  
+		
+		
+	CZipFileMember* zipMember2 = iZipFile->CaseSensitiveOrCaseInsensitiveMemberL(testFile2);
+	if(zipMember2)
+		{
+		CleanupStack::PushL(zipMember2);
+
+		RZipFileMemberReaderStream* iZipStream;
+		iZipFile->GetInputStreamL(zipMember2, iZipStream);
+		CleanupStack::PushL(iZipStream);
+
+		HBufC8* data = HBufC8::NewLC(KDataChunk*65);
+		TPtr8 ptr = data->Des();
+		err = KErrNone;
+		
+		err = iZipStream->Read(ptr,KDataChunk*65);
+		test (err == KErrNone); // file is very very large
+		
+		err = iZipStream->Read(ptr,KDataChunk);
+		test (err == KErrEof);
+
+		CleanupStack::PopAndDestroy(data);
+		CleanupStack::PopAndDestroy(iZipStream);
+		CleanupStack::PopAndDestroy(zipMember2);  
+		}  
+		
+	
+	CZipFileMember* zipMember3 = iZipFile->CaseSensitiveOrCaseInsensitiveMemberL(testFile3);
+	if(zipMember3)
+		{
+		CleanupStack::PushL(zipMember3);
+
+		RZipFileMemberReaderStream* iZipStream;
+		iZipFile->GetInputStreamL(zipMember3, iZipStream);
+		CleanupStack::PushL(iZipStream);
+
+		HBufC8* data = HBufC8::NewLC(KDataChunk);
+		TPtr8 ptr = data->Des();
+		err = KErrNone;
+		
+		err = iZipStream->Read(ptr,KDataChunk);
+		test (err == KErrNone);
+		
+		err = iZipStream->Read(ptr,KDataChunk);
+		test (err == KErrEof);
+
+		CleanupStack::PopAndDestroy(data);
+		CleanupStack::PopAndDestroy(iZipStream);
+		CleanupStack::PopAndDestroy(zipMember3);  
+		}  		
+		
+	ExtractMembersL (iZipFile);
+	
+	CleanupStack::PopAndDestroy(iZipFile);
+	CleanupStack::PopAndDestroy(&TheFs);
+	}
+
+/**
+@SYMTestCaseID       	SYSLIB-EZLIB-CT-3464
+@SYMTestCaseDesc     	RZipFileMemberReaderStream::Read returns incorrect error code under OOM
+@SYMTestPriority     	High
+@SYMTestActions      	Tries to read zipfile stream with heap allocation set to fail on all following 
+						allocations.  Check result returned from Read(TDes16&, TInt) and Read(TDes8&, TInt) 
+						is KErrNoMemory.  Note that zip file contents must be compressed, otherwise no 
+						allocations are performed and Read() function returns KErrNone.
+@SYMTestExpectedResults Read() function should return KErrNoMemory
+@SYMDEF                 DEF103961
+*/
+void DEF103961L()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-EZLIB-CT-3464 DEF103961: RZipFileMemberReaderStream::Read returns incorrect error code under OOM "));
+
+	User::LeaveIfError(TheFs.Connect()); //Connect to file session
+	User::LeaveIfError(TheFs.SetSessionPath(KPath)); //Set Session Path to directory containing test zip files
+	CleanupClosePushL(TheFs);
+
+	const TUint KDataChunk = 512;
+	_LIT(testFile1, "zip_archive2_with_comments.zip");
+	_LIT(internalFile, "doorslam.wav");
+	
+	// open zip file
+	CZipFile* zipFile = CZipFile::NewL(TheFs, testFile1);
+	CleanupStack::PushL(zipFile);
+
+	// get input stream for a file contained in the zip archive
+	CZipFileMember* zipMember = zipFile->CaseSensitiveOrCaseInsensitiveMemberL(internalFile);
+	test(zipMember!=NULL);
+	CleanupStack::PushL(zipMember);
+	RZipFileMemberReaderStream* zipStream;
+	zipFile->GetInputStreamL(zipMember, zipStream);
+	CleanupStack::PushL(zipStream);
+	
+	// some descriptors to hold stream data...
+	HBufC8* data8 = HBufC8::NewLC(KDataChunk);
+	TPtr8 ptr8 = data8->Des();
+	HBufC16* data16 = HBufC16::NewLC(KDataChunk);
+	TPtr16 ptr16 = data16->Des();
+
+	// do memory tests for RZipFileMemberReaderStream::Read() and its overloaded brother
+	__UHEAP_SETFAIL(RHeap::EDeterministic,1);
+	TInt error = zipStream->Read(ptr8, KDataChunk);
+	test (error == KErrNoMemory);
+	error = zipStream->Read(ptr16, KDataChunk);
+	test (error == KErrNoMemory);
+	__UHEAP_SETFAIL(RHeap::ENone,0);
+	
+	CleanupStack::PopAndDestroy(data16);
+	CleanupStack::PopAndDestroy(data8);
+	CleanupStack::PopAndDestroy(zipStream);
+	CleanupStack::PopAndDestroy(zipMember);
+	CleanupStack::PopAndDestroy(zipFile);
+	CleanupStack::PopAndDestroy(&TheFs);
+	}	
+
+/**
+@SYMTestCaseID		SYSLIB-EZLIB-CT-3475
+@SYMTestCaseDesc 	RZipFileMemberReaderStream constructor ignores errors under OOM
+@SYMTestPriority    High
+@SYMTestActions     Construct RZipFileMemberReaderStream under OOM conditions.  Check the Leave code.
+@SYMTestExpectedResults	Should Leave with KErrNoMemory
+@SYMDEF              	DEF105995
+*/
+void DEF105995L()
+	{
+	test.Next(_L(" @SYMTestCaseID:SYSLIB-EZLIB-CT-3475 DEF105995: RZipFileMemberReaderStream constructor not checking OOM conditions "));
+	
+	User::LeaveIfError(TheFs.Connect()); //Connect to file session
+	User::LeaveIfError(TheFs.SetSessionPath(KPath)); //Set Session Path to directory containing test zip files
+	CleanupClosePushL(TheFs);
+
+	_LIT(testFile1, "zip_archive2_with_comments.zip");
+	_LIT(internalFile, "doorslam.wav");
+	
+	// open zip file
+	CZipFile* zipFile = CZipFile::NewL(TheFs, testFile1);
+	CleanupStack::PushL(zipFile);
+
+	// get input stream for a file contained in the zip archive
+	CZipFileMember* zipMember = zipFile->CaseSensitiveOrCaseInsensitiveMemberL(internalFile);
+	test(zipMember!=NULL);
+	CleanupStack::PushL(zipMember);
+	
+	__UHEAP_SETFAIL(RHeap::EDeterministic,2); // so memory allocation in inflateInit2() fails
+
+	RZipFileMemberReaderStream* zipStream;
+	TRAPD(err, zipFile->GetInputStreamL(zipMember, zipStream));
+	test(err == KErrNoMemory);	
+
+	__UHEAP_SETFAIL(RHeap::ENone,0);
+	
+	CleanupStack::PopAndDestroy(zipMember);
+	CleanupStack::PopAndDestroy(zipFile);
+	CleanupStack::PopAndDestroy(&TheFs);
+	}
+				
+void RunTestL()
+	{
+	DEF057916L(); // Getting Corrupt file error when reading wav-file from Zip
+	#if defined(_DEBUG)	// OOM tests are only run on Debug builds
+	DEF103961L(); // RZipFileMemberReaderStream::Read returns incorrect error code under OOM
+	DEF105995L(); // inflateInit2 is not checked for errors in RZipFileMemberReaderStream constructor
+	#endif
+	}	
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+
+	test.Printf(_L("\n"));
+	test.Title();
+	test.Start( _L("EZlib defect Tests.") );
+
+	TheTrapCleanup=CTrapCleanup::New();
+
+	TRAPD(err,RunTestL());
+	test (err==KErrNone);
+
+	test.End();
+	test.Close();
+	delete TheTrapCleanup;
+
+	__UHEAP_MARKEND;
+	return KErrNone;
+	}