kerneltest/f32test/server/t_scan.cpp
changeset 0 a41df078684a
child 109 b3a1d9898418
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/server/t_scan.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,540 @@
+// Copyright (c) 1996-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:
+//
+
+#include <f32file.h>
+#include <e32test.h>
+#include "t_server.h"
+
+GLDEF_D RTest test(_L("T_SCAN"));
+
+LOCAL_C void BuildTestDir()
+//
+// Build up a test directory structure
+//
+
+/*
+//               SCANTEST
+//                  | 
+//  File1 File2 Left File3 Right Empty(Directory)
+//             /  \        /  \
+//           Dir2  Dir3 File4 File5
+//            |      |
+//           File6 Dir4----Hidden---HiddenFile       
+//                   |      /  \
+//                 File7 File8 System
+//                              |
+//                             File9
+*/
+	{
+
+	MakeDir(_L("\\F32-TST\\SCANTEST\\Empty\\"));
+
+	MakeFile(_L("\\F32-TST\\SCANTEST\\File1"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\File2"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\File3"));
+	
+	MakeFile(_L("\\F32-TST\\SCANTEST\\Right\\File4"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\Right\\File5"));
+
+	MakeFile(_L("\\F32-TST\\SCANTEST\\Left\\Dir2\\File6"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\Left\\Dir3\\Dir4\\File7"));
+
+	MakeFile(_L("\\F32-TST\\SCANTEST\\Left\\Dir3\\Dir4\\Hidden\\File8"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\Left\\Dir3\\Dir4\\Hidden\\HiddenFile"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\Left\\Dir3\\Dir4\\Hidden\\System\\File9"));
+
+	TInt r;
+	r=TheFs.SetAtt(_L("\\F32-TST\\SCANTEST\\Left\\Dir3\\Dir4\\Hidden"), KEntryAttHidden, 0);
+	test(r==KErrNone);
+	r=TheFs.SetAtt(_L("\\F32-TST\\SCANTEST\\Left\\Dir3\\Dir4\\Hidden\\HiddenFile"), KEntryAttHidden, 0);
+	test(r==KErrNone);
+	r=TheFs.SetAtt(_L("\\F32-TST\\SCANTEST\\Left\\Dir3\\Dir4\\Hidden\\System"), KEntryAttSystem, 0);
+	test(r==KErrNone);
+	}
+
+LOCAL_C void Test1()
+//
+// Test all methods
+//
+	{
+	
+	test.Next(_L("Create scanner"));
+	CDirScan* scanner=CDirScan::NewL(TheFs);
+	TParse dirName;
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\"),dirName);
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttDir,ESortByName);
+	CDir* entryList;
+//
+	test.Next(_L("Scan top level directory"));
+	scanner->NextL(entryList);
+	TInt count=entryList->Count();
+	test(count==6);
+	TEntry entry=(*entryList)[0];
+	test(entry.iName==_L("Empty"));
+	entry=(*entryList)[1];
+	test(entry.iName==_L("File1"));
+	entry=(*entryList)[2];
+	test(entry.iName==_L("File2"));
+	entry=(*entryList)[3];
+	test(entry.iName==_L("File3"));
+	entry=(*entryList)[4];
+	test(entry.iName==_L("Left"));
+	entry=(*entryList)[5];
+	test(entry.iName==_L("Right"));
+	delete entryList;
+//
+	test.Next(_L("Reset scanner"));
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttDir,ESortByName);
+//
+	test.Next(_L("Scan ascending: ScanTest directory"));
+	scanner->NextL(entryList);
+	count=entryList->Count();
+	test(count==6);
+	entry=(*entryList)[0];
+	test(entry.iName==_L("Empty"));
+	entry=(*entryList)[1];
+	test(entry.iName==_L("File1"));
+	entry=(*entryList)[2];
+	test(entry.iName==_L("File2"));
+	entry=(*entryList)[3];
+	test(entry.iName==_L("File3"));
+	entry=(*entryList)[4];
+	test(entry.iName==_L("Left"));
+	entry=(*entryList)[5];
+	test(entry.iName==_L("Right"));
+	delete entryList;
+//
+	test.Next(_L("Check next directory: Empty"));
+	scanner->NextL(entryList);
+	count=entryList->Count();
+	test(count==0);
+	delete entryList;
+//
+	test.Next(_L("Check next directory: Left"));
+	scanner->NextL(entryList);
+	count=entryList->Count();
+	test(count==2);
+	entry=(*entryList)[0];
+	test(entry.iName==_L("Dir2"));
+	entry=(*entryList)[1];
+	test(entry.iName==_L("Dir3"));
+	delete entryList;
+//
+	test.Next(_L("Check next directory: Left\\Dir2"));
+	scanner->NextL(entryList);
+	count=entryList->Count();
+	test(count==1);
+	entry=(*entryList)[0];
+	//test(entry.iName==_L("File6"));
+	delete entryList;
+//
+	test.Next(_L("Check next directory: Left\\Dir3"));
+	scanner->NextL(entryList);
+	count=entryList->Count();
+	test(count==1);
+	entry=(*entryList)[0];
+	test(entry.iName==_L("Dir4"));
+	delete entryList;
+//
+	test.Next(_L("Check next directory: Left\\Dir3\\Dir4"));
+	scanner->NextL(entryList);
+	count=entryList->Count();
+	test(count==1);
+	entry=(*entryList)[0];
+	test(entry.iName==_L("File7"));
+	delete entryList;
+//
+	test.Next(_L("Check next directory: Right"));
+	scanner->NextL(entryList);
+	count=entryList->Count();
+	test(count==2);
+	entry=(*entryList)[0];
+	test(entry.iName==_L("File4"));
+	entry=(*entryList)[1];
+	test(entry.iName==_L("File5"));
+	delete entryList;
+//
+	test.Next(_L("End of scan"));
+	scanner->NextL(entryList);
+	test(entryList==NULL);
+	delete entryList;
+	delete scanner;
+	}	
+
+LOCAL_C void Test2()
+//
+// Scan subset of test directory structure and test abs/rel paths
+//
+	{
+
+	test.Next(_L("Scan descending: ScanTest\\Left "));
+	CDirScan* scanner=CDirScan::NewL(TheFs);
+	TParse dirName;
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\"),dirName);
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttNormal,ESortByName|EDescending);
+//
+	test.Next(_L("Check next directory: Left"));
+	CDir* entryList;
+	scanner->NextL(entryList);
+	TInt count=entryList->Count();
+	test(count==0);
+	test(scanner->AbbreviatedPath()==_L("\\"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\"),dirName);
+	test(scanner->FullPath()==dirName.FullName());
+	delete entryList;
+//
+	test.Next(_L("Check next directory: Left\\Dir3"));
+	scanner->NextL(entryList);
+	count=entryList->Count();
+	test(count==0);
+	test(scanner->AbbreviatedPath()==_L("\\Dir3\\"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\Dir3\\"),dirName);
+	test(scanner->FullPath()==dirName.FullName());
+	delete entryList;
+//
+	test.Next(_L("Check next directory: Left\\Dir3\\Dir4"));
+	scanner->NextL(entryList);
+	count=entryList->Count();
+	test(count==1);
+	test((*entryList)[0].iName==_L("File7"));
+	test(scanner->AbbreviatedPath()==_L("\\Dir3\\Dir4\\"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\Dir3\\Dir4\\"),dirName);
+	test(scanner->FullPath()==dirName.FullName());
+	delete entryList;
+//
+	test.Next(_L("Check next directory: Left\\Dir2"));
+	scanner->NextL(entryList);
+	count=entryList->Count();
+	test(count==1);
+	test((*entryList)[0].iName==_L("File6"));
+	test(scanner->AbbreviatedPath()==_L("\\Dir2\\"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\Dir2\\"),dirName);
+	test(scanner->FullPath()==dirName.FullName());
+	delete entryList;
+	delete scanner;
+	}
+
+LOCAL_C void Test3()
+//
+// Print directory structure
+//
+	{
+
+	test.Next(_L("List directory structure"));
+	TheFs.SetAllocFailure(gAllocFailOff);
+	TFileName sessionPath;
+	TInt r=TheFs.SessionPath(sessionPath);
+	test(r==KErrNone);
+	r=TheFs.SetSessionPath(_L("N:\\"));
+	test(r==KErrNone);
+	TAutoClose<RFs> fs;
+	r=fs.iObj.Connect();
+	test(r==KErrNone);
+	CDirScan* scanner=CDirScan::NewL(fs.iObj);
+	TParse dirName;
+	TheFs.Parse(sessionPath,dirName);
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttDir,ESortByName);
+	CDir* entryList;
+	FOREVER
+		{
+		scanner->NextL(entryList);
+		if (entryList==NULL)
+			break;
+		TInt count=entryList->Count();
+		while (count--)
+			{
+			TEntry data=(*entryList)[count];
+			TBuf<KMaxFileName> path=scanner->AbbreviatedPath();
+			test.Printf(_L("%S%S\n"),&path,&data.iName);
+			}
+		delete entryList;
+		entryList=NULL;
+		}
+	delete scanner;
+	r=TheFs.SetSessionPath(sessionPath);
+	test(r==KErrNone);
+	TheFs.SetAllocFailure(gAllocFailOn);
+	}
+
+LOCAL_C void Test4()
+//
+// Scan for a matching filename
+//
+	{
+
+	test.Start(_L("Scan for a matching filename"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\MaTCHteST.EXTENSION"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\MATCH.EXT"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\ANOTherteST.EXTENSION"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\APPDLL.DLL"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\TEST.EXTENSION"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\DIR4\\MaTCHteST.EXTENSION"));
+
+	CDir* entryList;
+	CDirScan* scanner=CDirScan::NewL(TheFs);
+	TParse dirName;
+
+	test.Next(_L("Scan for MAT??.EXT")); // can't test for MAT*.EXT because shortname of MaTCHteST.EXTENSION
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\MAT??.EXT"),dirName); // is MATCHT~1.EXT !!!
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttNormal,ESortByName);
+	scanner->NextL(entryList);
+	test((TInt)entryList);
+	test(entryList->Count()==1);
+	test((*entryList)[0].iName.MatchF(_L("MATCH.EXT"))!=KErrNotFound);
+	test(scanner->AbbreviatedPath()==_L("\\"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\"),dirName);
+	test(scanner->FullPath()==dirName.FullName());
+	delete entryList;
+	FOREVER
+		{
+		scanner->NextL(entryList);
+		if (entryList==NULL)
+			break;
+		test(entryList->Count()==0);
+		delete entryList;
+		}
+
+	test.Next(_L("Scan for *.EXTENSION"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\*.EXTENSION"),dirName);
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttNormal,ESortByName);
+	scanner->NextL(entryList);
+	test((TInt)entryList);
+	test(entryList->Count()==1);
+	test((*entryList)[0].iName.MatchF(_L("MATCHTEST.EXTENSION"))!=KErrNotFound);
+	test(scanner->AbbreviatedPath()==_L("\\"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\"),dirName);
+	test(scanner->FullPath()==dirName.FullName());
+	do {
+		delete entryList;
+		scanner->NextL(entryList);
+		test((TInt)entryList);
+		} while (entryList->Count()==0);
+	test(entryList->Count()==2);
+	test((*entryList)[0].iName.MatchF(_L("ANOTHERTEST.EXTENSION"))!=KErrNotFound);
+	test((*entryList)[1].iName.MatchF(_L("test.EXTENSION"))!=KErrNotFound);
+	test(scanner->AbbreviatedPath().MatchF(_L("\\LEFT\\DIR3\\"))!=KErrNotFound);
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\"),dirName);
+	test(scanner->FullPath().MatchF(dirName.FullName())!=KErrNotFound);
+	do {
+		delete entryList;
+		scanner->NextL(entryList);
+		test((TInt)entryList);
+		} while (entryList->Count()==0);
+	test(entryList->Count()==1);
+	test((*entryList)[0].iName.MatchF(_L("MATCHTEST.EXTENSION"))!=KErrNotFound);
+	test(scanner->AbbreviatedPath().MatchF(_L("\\LEFT\\DIR3\\DIR4\\"))!=KErrNotFound);
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\DIR4\\"),dirName);
+	test(scanner->FullPath().MatchF(dirName.FullName())!=KErrNotFound);
+	delete entryList;
+	FOREVER
+		{
+		scanner->NextL(entryList);
+		if (entryList==NULL)
+			break;
+		test(entryList->Count()==0);
+		delete entryList;
+		}
+
+	test.Next(_L("Scan for APPDLL.DLL"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\APPDLL.DLL"),dirName);
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttNormal,ESortByName);
+	FOREVER
+		{
+		scanner->NextL(entryList);
+		if (entryList->Count()!=0)
+			break;
+		test((TInt)entryList);
+		delete entryList;
+		}
+	test(entryList->Count()==1);
+	test((*entryList)[0].iName==_L("APPDLL.DLL"));
+	test(scanner->AbbreviatedPath().MatchF(_L("\\LEFT\\DIR3\\"))!=KErrNotFound);
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\"),dirName);
+	test(scanner->FullPath().MatchF(dirName.FullName())!=KErrNotFound);
+	delete entryList;
+	FOREVER
+		{
+		scanner->NextL(entryList);
+		if (entryList==NULL)
+			break;
+		test(entryList->Count()==0);
+		delete entryList;
+		}
+	delete scanner;
+	test.End();
+	}		
+
+LOCAL_C void Test5()
+//
+// Do a scan of Z:
+//
+	{
+
+	test.Next(_L("List Z: directory structure"));
+	CDirScan* scanner=CDirScan::NewLC(TheFs);
+	TPtrC romPath(_L("Z:\\"));
+	TParse dirName;
+	TInt r=TheFs.Parse(romPath,dirName);
+	test(r==KErrNone);
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttDir,ESortByName);
+	CDir* entryList;
+	FOREVER
+		{
+		scanner->NextL(entryList);
+		if (entryList==NULL)
+			break;
+		TInt count=entryList->Count();
+		while (count--)
+			{
+			TEntry data=(*entryList)[count];
+			TBuf<KMaxFileName> path=scanner->AbbreviatedPath();
+			test.Printf(_L("%S%S\n"),&path,&data.iName);
+			}
+		delete entryList;
+		entryList=NULL;
+		}
+	CleanupStack::PopAndDestroy();
+	}
+
+LOCAL_C void Test6()
+//
+// Scan up a directory tree
+//
+	{
+
+	test.Next(_L("Test ascending scan"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\MaTCHteST.EXTENSION"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\MATCH.EXT"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\ANOTherteST.EXTENSION"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\APPDLL.DLL"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\TEST.EXTENSION"));
+	MakeFile(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\DIR4\\MaTCHteST.EXTENSION"));
+	
+	CDir* entryList;
+	CDirScan* scanner=CDirScan::NewL(TheFs);
+	TParse dirName;
+
+	test.Next(_L("Scan for MAT*.EXT"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\"),dirName);
+//	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\DIR4\\MaTCHteST.EXTENSION"),dirName);
+//	scanner->SetScanDataL(dirName.FullName(),KEntryAttNormal,ESortByName,CDirScan::EScanUpTree);
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttDir,ESortByName,CDirScan::EScanUpTree);
+	
+	FOREVER
+		{
+		scanner->NextL(entryList);
+		if (entryList==NULL)
+			break;
+		TInt count=entryList->Count();
+		while(count--)
+			{
+			TEntry entry=(*entryList)[count];
+			test.Printf(_L("entry.iName = %S\n"),&entry.iName);
+		//	test(entry.iName==_L("MATCH.EXT"));
+			}
+		delete entryList;
+		}
+	
+	delete scanner;
+	}
+
+
+LOCAL_C void Test7()
+//
+// Test scanning hidden directories
+//
+	{
+
+	CDir* entryList;
+	CDirScan* scanner=CDirScan::NewL(TheFs);
+	TParse dirName;
+
+	test.Next(_L("Scan in hidden directories for files"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\*"),dirName);
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttHidden,ESortByName,CDirScan::EScanDownTree);
+	
+	TInt hiddenCount=0;
+	FOREVER
+		{
+		scanner->NextL(entryList);
+		if (entryList==NULL)
+			break;
+		TInt count=entryList->Count();
+		while(count--)
+			{
+			TEntry entry=(*entryList)[count];
+			test.Printf(_L("entry.iName = %S\n"),&entry.iName);
+			if (entry.IsHidden())
+				hiddenCount++;
+			if (entry.iName==_L("File8"))
+				hiddenCount++;
+			}
+		delete entryList;
+		}
+	test(hiddenCount==2);
+
+	test.Next(_L("Scan for system and hidden directories and files"));
+	TheFs.Parse(_L("\\F32-TST\\SCANTEST\\LEFT\\DIR3\\*"),dirName);
+	scanner->SetScanDataL(dirName.FullName(),KEntryAttSystem|KEntryAttHidden|KEntryAttDir,ESortByName,CDirScan::EScanDownTree);
+
+	hiddenCount=0;
+	FOREVER
+		{
+		scanner->NextL(entryList);
+		if (entryList==NULL)
+			break;
+		TInt count=entryList->Count();
+		while(count--)
+			{
+			TEntry entry=(*entryList)[count];
+			test.Printf(_L("entry.iName = %S\n"),&entry.iName);
+			if (entry.IsHidden())
+				hiddenCount++;
+			if (entry.iName==_L("File8"))
+				hiddenCount++;
+			if (entry.IsSystem())
+				hiddenCount++;
+			if (entry.iName==_L("File9"))
+				hiddenCount++;
+			}
+		delete entryList;
+		}
+	test(hiddenCount==5);
+	
+	delete scanner;
+	}
+
+GLDEF_C void CallTestsL()
+//
+// Call all tests
+//
+	{
+
+	CreateTestDirectory(_L("\\F32-TST\\SCANTEST\\"));
+	DeleteTestDirectory();
+	BuildTestDir();
+	Test1();
+	Test2();
+	Test3();
+	Test4();
+	Test5();
+	DeleteTestDirectory();
+	Test6();
+	DeleteTestDirectory();
+
+	BuildTestDir();
+	Test7();
+	DeleteTestDirectory();
+	}