genericservices/httputils/Test/Integration/TestFileUriSuite/TestForAllFilesStep.cpp
changeset 31 ce057bb09d0b
parent 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericservices/httputils/Test/Integration/TestFileUriSuite/TestForAllFilesStep.cpp	Fri Jun 04 16:20:51 2010 +0100
@@ -0,0 +1,232 @@
+// Copyright (c) 2004-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:
+// TESTGENERATEFILEURIFORALLFILESSTEP.CPP
+// 
+//
+
+/**
+ @file
+ @internalTechnology 
+*/
+
+// Epoc Includes
+// For File URI handler API
+#include <uri16.h>
+#include <uri8.h>
+#include <escapeutils.h>
+
+// User Include
+#include "TestForAllFilesStep.h"
+
+/**
+Constructor. Sets the test step name
+*/
+CTestForAllFilesStep::CTestForAllFilesStep()
+	{
+	//Call base class method to set human readable name for test step
+	SetTestStepName(KTestForAllFilesStep);
+	}
+
+/**
+Does the main functionality of a test step. Here just calls DoTestL.
+@internalTechnology 
+@param		None
+@return		EPass or EFail indicating the success or failure of the test step
+*/
+TVerdict CTestForAllFilesStep::doTestStepL()
+	{
+	__UHEAP_MARK;
+	INFO_PRINTF1(_L("\n"));
+	TRAPD(err, DoTestL());
+	if(err != KErrNone)
+		{
+		ERR_PRINTF2(_L("Leave occured in CTestForAllFilesStep::DoTestL: %D"), err);
+		SetTestStepResult(EFail);
+		}
+	INFO_PRINTF1(_L("\n"));	
+	__UHEAP_MARKEND;
+	return TestStepResult();	
+	}		// doTestStepL()
+
+/**
+Scans all the directories and calls TestBothWaysL that tests the
+creation of URI from a filename and vice versa for all the files.
+*/
+void CTestForAllFilesStep::DoTestL()
+	{
+	RFs fs;
+	TInt err = fs.Connect();
+	if(err != KErrNone)
+		{
+		ERR_PRINTF2(_L("Error occured while connecting to file server: %D"), err);
+		SetTestStepResult(EFail);
+		}
+	else
+		{
+		TBuf<4> rootDir;
+		CDirScan *dirScan = CDirScan::NewLC(fs);
+		TInt drive;
+		for(drive = EDriveA; drive <= EDriveZ; ++drive)
+			{
+			rootDir.Format(_L("%c:\\"), static_cast<char>(KLetterA + drive));
+			dirScan->SetScanDataL(rootDir, KEntryAttNormal, ESortNone);
+			CDir* entryList = NULL;
+			FOREVER
+				{
+				TRAPD(err, dirScan->NextL(entryList));
+				if(err == KErrNotReady)
+					{
+					INFO_PRINTF2(_L("Drive %S not ready"), &rootDir);
+					break;
+					}
+				if (entryList==NULL)
+					{
+					break;
+					}
+				CleanupStack::PushL(entryList);
+				TFileName filename;
+				TInt index;
+				for(index = 0; index < entryList->Count(); ++index)
+					{
+					const TEntry& entry = (*entryList)[index];
+					filename = dirScan->FullPath();
+					filename.Append(entry.iName);
+					INFO_PRINTF1(_L("\n"));
+					INFO_PRINTF2(_L("The next file name in the dir-scan = %S"), &filename);
+					INFO_PRINTF1(_L("Calling 8-bit versions"));
+					
+					// To keep VC compiler happy as it does not support
+					// explicit template calls.Hence passing empty variables 
+					// cUri8 and tUriParser8
+					CUri8* cUri8 = NULL;
+					TUriParser8 tUriParser8;
+					TestBothWaysL(cUri8, tUriParser8, filename);
+					INFO_PRINTF1(_L("\n"));
+					INFO_PRINTF1(_L("Calling 16-bit versions"));
+					CUri16* cUri16 = NULL;
+					TUriParser16 tUriParser16;
+					TestBothWaysL(cUri16, tUriParser16, filename);
+					}
+				CleanupStack::PopAndDestroy(entryList);	
+				}	// FOREVER
+			}
+		fs.Close();
+		CleanupStack::PopAndDestroy(dirScan);	
+		}
+	}	// DoTestL
+
+/**
+Template function that calls CUri::CreateFileUriL to generate a URI and 
+calls TUriC::GetFileNameL() with this URI, to verify that the filename so got
+is the same as the original one.
+*/
+template <class CUriType, class TUriParserType>
+void CTestForAllFilesStep::TestBothWaysL(CUriType*& cUri8Or16, TUriParserType& tUriParser8Or16, TFileName& aFileName)
+	{
+	TUint flags = KErrNone;
+	TDriveNumber driveNum;
+	TParse parser;
+	parser.Set(aFileName, 0, 0);
+	TBuf<1> drive = parser.Drive().Left(1);
+	drive.LowerCase();
+		
+	CTestFileUriServer::GetDriveNumber(drive, driveNum);
+	TBool aResult;
+	TInt err = CTestFileUriServer::IsRemovableDrive(driveNum, aResult);
+	if(err != KErrNone)
+		{
+		ERR_PRINTF2(_L("Error occured while checking whether drive is removable: %D"), err);
+		SetTestStepResult(EFail);
+		}
+	else
+		{
+		if(aResult)
+			{// The drive is a removable drive
+			INFO_PRINTF1(_L("The drive is a removable drive"));
+			flags = EExtMedia;
+			}
+		
+		// Generate the URI	
+		TRAPD(err, cUri8Or16 = CUriType::CreateFileUriL(aFileName, flags));
+			
+		if(err != KErrNone)
+			{
+			ERR_PRINTF2(_L("Error occured in CreateFileUriL: %D"), err);
+			SetTestStepResult(EFail);
+			}
+		else
+			{
+			CleanupStack::PushL(cUri8Or16);
+			// Just in case, create a 16-bit heap desc and print.
+			HBufC16* tempBuf = HBufC16::NewL(cUri8Or16->Uri().UriDes().Length());
+			tempBuf->Des().Copy(cUri8Or16->Uri().UriDes());
+			INFO_PRINTF2(_L("File URI returned by CreateFileUriL = %S"), tempBuf);
+			delete tempBuf;
+			
+			if(aResult)
+				{
+				TBuf<1> correctDrive;
+				err = CTestFileUriServer::FirstRemovableDriveWithSameFileName(aFileName, correctDrive);
+				if(err != KErrNone)
+					{
+					ERR_PRINTF2(_L("Error occured in FirstRemovableDriveWithSameFileName: %D"), err);
+					SetTestStepResult(EFail);
+					}
+				else
+					{
+					correctDrive.LowerCase();
+					if(correctDrive != drive)
+						{
+						aFileName.Replace(0, 1, correctDrive);
+						INFO_PRINTF1(_L("One more removable drive found with the same file name, but is ahead in alphabetical order"));
+						INFO_PRINTF2(_L("Hence the correct expected file name is %S"), aFileName);
+						}	
+					}
+				}
+				
+			// Convert the URI to filename back again
+			HBufC16* returnedFileName = NULL;
+			
+			tUriParser8Or16.Parse(cUri8Or16->Uri().UriDes());
+			TRAPD(err, returnedFileName = tUriParser8Or16.GetFileNameL());
+			CleanupStack::PopAndDestroy(cUri8Or16);
+			if(err != KErrNone)
+				{
+				ERR_PRINTF2(_L("Error occured in GetFileNameL: %D"), err);
+				SetTestStepResult(EFail);
+				}
+			else
+				{
+				INFO_PRINTF2(_L("The filename returned by GetFileNameL = %S"), returnedFileName);
+			
+				// Verify the result
+				aFileName.LowerCase();
+				returnedFileName->Des().LowerCase();
+				
+				if(returnedFileName->Compare(aFileName) != KErrNone)
+					{
+					INFO_PRINTF1(_L("The returned filename did not match the original filename. Result = INCORRECT"));
+					SetTestStepResult(EFail);
+					}
+				else
+					{
+					INFO_PRINTF1(_L("The returned filename is same as the original filename. Result = CORRECT"));
+					}	
+				delete returnedFileName;
+				}	
+			}
+		}
+	}	// TestBothWaysL
+
+