kerneltest/f32test/server/t_chkuid.cpp
changeset 0 a41df078684a
child 43 c1f20ce4abcf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/server/t_chkuid.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,431 @@
+// Copyright (c) 1995-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:
+// f32test\server\t_chkuid.cpp
+//
+//
+
+#include <f32file.h>
+#include <e32test.h>
+#include "t_server.h"
+#include "t_chlffs.h"
+
+#if defined(__WINS__)
+#define WIN32_LEAN_AND_MEAN
+#pragma warning (disable:4201) // warning C4201: nonstandard extension used : nameless struct/union
+#pragma warning (default:4201) // warning C4201: nonstandard extension used : nameless struct/union
+#endif
+
+GLDEF_D RTest test(_L("T_CHKUID"));
+
+
+LOCAL_C void CreateUidTestFiles()
+//
+// Create files with uids for testing
+//
+	{
+    // Create \\gSessionPath\\UIDCHKNO.SHT - no uid, zero length
+	RFile file;
+	TInt r=file.Replace(TheFs,_L("UIDCHKNO.SHT"),EFileRead|EFileWrite);
+	test(r==KErrNone);
+	file.Close();
+
+    // Create \\gSessionPath\\UIDCHKNO.LNG - no uid, long length
+	r=file.Replace(TheFs,_L("UIDCHKNO.LNG"),EFileRead|EFileWrite);
+	test(r==KErrNone);
+	r=file.Write(_L8("Hello World needs to be over 16 bytes"));
+	file.Close();
+
+    // Create \\gSessionPath\\UIDCHK.BLG - with uid no data
+	r=file.Replace(TheFs,_L("UIDCHK.BLG"),EFileRead|EFileWrite);
+	test(r==KErrNone);
+	TUidType uidType(TUid::Uid('U'),TUid::Uid('I'),TUid::Uid('D'));
+	TCheckedUid checkedUid(uidType);
+	TPtrC8 buf((TUint8*)&checkedUid,sizeof(TCheckedUid));
+	r=file.Write(buf);
+	test(r==KErrNone);
+	file.Close();
+
+    // Create \\gSessionPath\\UIDCHK.MSG - with uid and data
+	r=file.Replace(TheFs,_L("UIDCHK.MSG"),EFileRead|EFileWrite);
+	test(r==KErrNone);
+	TUidType uidType2(TUid::Uid('X'),TUid::Uid('Y'),TUid::Uid('Z'));
+	checkedUid.Set(uidType2);
+	buf.Set((TUint8*)&checkedUid,sizeof(TCheckedUid));
+	r=file.Write(buf);
+	test(r==KErrNone);
+	r=file.Write(_L8("More file data"));
+	test(r==KErrNone);
+	file.Close();
+
+    // Create \\gSessionPath\\UIDCHK.DAT - uid stored only in the file
+	r=file.Replace(TheFs,_L("UIDCHK.DAT"),EFileRead|EFileWrite);
+	test(r==KErrNone);
+	TUidType uidType3(TUid::Uid('D'),TUid::Uid('A'),TUid::Uid('T'));
+	checkedUid.Set(uidType3);
+	buf.Set((TUint8*)&checkedUid,sizeof(TCheckedUid));
+	r=file.Write(buf);
+	test(r==KErrNone);
+	r=file.Write(_L8("More file data"));
+	test(r==KErrNone);
+	file.Close();
+
+    // Create \\gSessionPath\\UIDCHK.PE - uid stored in WINS PE file header
+	r=file.Replace(TheFs,_L("UIDWINS.PE"),EFileRead|EFileWrite);
+	test(r==KErrNone);
+
+#if defined(__WINS__)
+    if (!IsTestingLFFS())
+        {
+	    RFile fileSource;
+	    r=fileSource.Open(TheFs,_L("Z:\\TEST\\T_CHKUID.EXE"),EFileShareReadersOnly|EFileRead);
+	    test(r==KErrNone);
+
+	    TBuf8<0x100> buffer;
+	    do
+		    {
+		    r=fileSource.Read(buffer);
+		    test(r==KErrNone);
+		    r=file.Write(buffer);
+		    test(r==KErrNone);
+		    }
+	    while (buffer.Length()==buffer.MaxLength());
+
+	    fileSource.Close();
+        }
+    else
+        {
+	    r=file.Write(_L8("Some zany stuff here!"));
+	    test(r==KErrNone);
+        }
+#else
+	r=file.Write(_L8("Some zany stuff here!"));
+	test(r==KErrNone);
+#endif
+	file.Close();
+	}
+
+LOCAL_C void Test1()
+//
+// Test GetDir
+//
+	{
+
+	test.Next(_L("Use GetDir to check files"));
+	CDir* dum=NULL;
+	TInt r=TheFs.GetDir(_L("UID*"),KEntryAttAllowUid,ESortByName,dum);
+	CDir& dir=*dum;
+	test(r==KErrNone);
+	TInt count=dir.Count();
+	test(count==6);
+
+	TEntry entry=dir[0];
+	test(entry.iName==_L("UIDCHK.BLG"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('U') && entry.iType[1]==TUid::Uid('I') && entry.iType[2]==TUid::Uid('D'));
+
+	entry=dir[1];
+	test(entry.iName==_L("UIDCHK.DAT"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('D') && entry.iType[1]==TUid::Uid('A') && entry.iType[2]==TUid::Uid('T'));
+
+	entry=dir[2];
+	test(entry.iName==_L("UIDCHK.MSG"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('X') && entry.iType[1]==TUid::Uid('Y') && entry.iType[2]==TUid::Uid('Z'));
+
+	entry=dir[3];
+	test(entry.iName==_L("UIDCHKNO.LNG"));
+	test(entry.IsTypeValid()==EFalse);
+
+	entry=dir[4];
+	test(entry.iName==_L("UIDCHKNO.SHT"));
+	test(entry.IsTypeValid()==EFalse);
+
+	entry=dir[5];
+	test(entry.iName==_L("UIDWINS.PE"));
+#if defined(__WINS__)
+	TFileName sessionPath;
+	TheFs.SessionPath(sessionPath);
+	if (sessionPath[0]!='C')
+		test(entry.IsTypeValid()==EFalse);
+	else
+		{
+		test(entry.IsTypeValid());
+		test(entry.iType[0]==TUid::Uid(0x1000007a) && entry.iType[1]==TUid::Uid(2) && entry.iType[2]==TUid::Uid(3));
+		}
+#else
+	test(entry.IsTypeValid()==EFalse);
+#endif
+	delete dum;
+	}
+
+LOCAL_C void Test2()
+//
+// Test GetDir
+//
+	{
+
+	test.Next(_L("Test KEntryAttAllowUid allows uids"));
+	CDir* dum=NULL;
+	TInt r=TheFs.GetDir(_L("UID*"),0,ESortByName,dum);
+	CDir& dir=*dum;
+	test(r==KErrNone);
+	TInt count=dir.Count();
+	test(count==6);
+
+	TEntry entry=dir[0];
+	test(entry.iName==_L("UIDCHK.BLG"));
+	test(!entry.IsTypeValid());
+
+	entry=dir[1];
+	test(entry.iName==_L("UIDCHK.DAT"));
+	test(!entry.IsTypeValid());
+
+	entry=dir[2];
+	test(entry.iName==_L("UIDCHK.MSG"));
+	test(!entry.IsTypeValid());
+
+	entry=dir[3];
+	test(entry.iName==_L("UIDCHKNO.LNG"));
+	test(entry.IsTypeValid()==EFalse);
+
+	entry=dir[4];
+	test(entry.iName==_L("UIDCHKNO.SHT"));
+	test(entry.IsTypeValid()==EFalse);
+
+	entry=dir[5];
+	test(entry.iName==_L("UIDWINS.PE"));
+	test(entry.IsTypeValid()==EFalse);
+	delete dum;
+	}
+
+LOCAL_C void Test3()
+//
+// Test RFs::Entry()
+//
+	{
+
+	test.Next(_L("Use RFs::EntryL() to check files"));
+	TEntry entry;
+	TInt r=TheFs.Entry(_L("UIDCHKNO.SHT"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDCHKNO.SHT"));
+	test(entry.IsTypeValid()==EFalse);
+
+	r=TheFs.Entry(_L("UIDCHKNO.LNG"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDCHKNO.LNG"));
+	test(entry.IsTypeValid()==EFalse);
+
+	r=TheFs.Entry(_L("UIDCHK.MSG"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDCHK.MSG"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('X') && entry.iType[1]==TUid::Uid('Y') && entry.iType[2]==TUid::Uid('Z'));
+
+	r=TheFs.Entry(_L("UIDCHK.BLG"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDCHK.BLG"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('U') && entry.iType[1]==TUid::Uid('I') && entry.iType[2]==TUid::Uid('D'));
+
+	r=TheFs.Entry(_L("UIDCHK.DAT"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDCHK.DAT"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('D') && entry.iType[1]==TUid::Uid('A') && entry.iType[2]==TUid::Uid('T'));
+
+	r=TheFs.Entry(_L("UIDWINS.PE"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDWINS.PE"));
+#if defined(__WINS__)
+	TFileName sessionPath;
+	TheFs.SessionPath(sessionPath);
+	if (sessionPath[0]!='C')
+		test(entry.IsTypeValid()==EFalse);
+	else
+		{
+		test(entry.IsTypeValid());
+		test(entry.iType[0]==TUid::Uid(0x1000007a) && entry.iType[1]==TUid::Uid(2) && entry.iType[2]==TUid::Uid(3));
+		}
+#else
+	test(entry.IsTypeValid()==EFalse);
+#endif
+	}
+
+LOCAL_C void Test4()
+//
+// Test uid's can be read when the file is open
+//
+//	EFileShareExclusive,EFileShareReadersOnly,EFileShareAny,
+//	EFileStream=0,EFileStreamText=0x100,
+//	EFileRead=0,EFileWrite=0x200
+//
+	{
+
+	test.Next(_L("Uids can be read if the file is open"));
+	RFile f;
+	TEntry entry;
+	TInt r=f.Open(TheFs,_L("UIDCHK.DAT"),EFileShareExclusive|EFileRead);
+	test(r==KErrNone);
+	r=TheFs.Entry(_L("UIDCHK.DAT"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDCHK.DAT"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('D') && entry.iType[1]==TUid::Uid('A') && entry.iType[2]==TUid::Uid('T'));
+	f.Close();
+
+	r=f.Open(TheFs,_L("UIDCHK.DAT"),EFileShareExclusive|EFileWrite);
+	test(r==KErrNone);
+	r=TheFs.Entry(_L("UIDCHK.DAT"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDCHK.DAT"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('D') && entry.iType[1]==TUid::Uid('A') && entry.iType[2]==TUid::Uid('T'));
+
+	r=f.SetSize(256);
+	test(r==KErrNone);
+	TBuf8<16> des;
+	r=TheFs.ReadFileSection(_L("UIDCHK.DAT"),0,des,16);
+	test(r==KErrNone);
+
+	f.Close();
+
+	r=f.Open(TheFs,_L("UIDCHK.DAT"),EFileShareReadersOnly|EFileRead);
+	test(r==KErrNone);
+	r=TheFs.Entry(_L("UIDCHK.DAT"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDCHK.DAT"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('D') && entry.iType[1]==TUid::Uid('A') && entry.iType[2]==TUid::Uid('T'));
+	f.Close();
+
+//	EFileShareReadersOnly|EFileWrite is illegal
+
+	r=f.Open(TheFs,_L("UIDCHK.DAT"),EFileShareAny|EFileRead);
+	test(r==KErrNone);
+	r=TheFs.Entry(_L("UIDCHK.DAT"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDCHK.DAT"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('D') && entry.iType[1]==TUid::Uid('A') && entry.iType[2]==TUid::Uid('T'));
+	f.Close();
+
+	r=f.Open(TheFs,_L("UIDCHK.DAT"),EFileShareAny|EFileWrite);
+	test(r==KErrNone);
+
+	RFile secondFile;
+	r=secondFile.Open(TheFs,_L("UIDCHK.DAT"),EFileShareAny|EFileWrite);
+	test(r==KErrNone);
+
+	RFile thirdFile;
+	r=thirdFile.Open(TheFs,_L("UIDCHK.DAT"),EFileShareAny|EFileRead);
+	test(r==KErrNone);
+
+	r=TheFs.Entry(_L("UIDCHK.DAT"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDCHK.DAT"));
+	test(entry.IsTypeValid());
+	test(entry.iType[0]==TUid::Uid('D') && entry.iType[1]==TUid::Uid('A') && entry.iType[2]==TUid::Uid('T'));
+	f.Close();
+	secondFile.Close();
+	thirdFile.Close();
+
+	r=f.Open(TheFs,_L("UIDWINS.PE"),EFileShareAny|EFileWrite);
+	test(r==KErrNone);
+
+	r=TheFs.Entry(_L("UIDWINS.PE"),entry);
+	test(r==KErrNone);
+	test(entry.iName==_L("UIDWINS.PE"));
+#if defined(__WINS__)
+	TFileName sessionPath;
+	TheFs.SessionPath(sessionPath);
+	if (sessionPath[0]!='C')
+		test(entry.IsTypeValid()==EFalse);
+	else
+		{
+		test(entry.IsTypeValid());
+		test(entry.iType[0]==TUid::Uid(0x1000007a) && entry.iType[1]==TUid::Uid(2) && entry.iType[2]==TUid::Uid(3));
+		}
+#else
+	test(entry.IsTypeValid()==EFalse);
+#endif
+	f.Close();
+	}
+
+LOCAL_C void TestZ()
+//
+// Test Rom filesystem
+//
+	{
+
+	CDir* dum=NULL;
+
+	TInt r=TheFs.GetDir(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin)?_L("Z:\\Sys\\Bin\\*"):_L("Z:\\System\\Bin\\*"),KEntryAttAllowUid,0,dum);
+
+	if (r==KErrNotReady)
+		{
+		test.Printf(_L("Error: Unable to open Z:\n"));
+		return;
+		}
+	test(r==KErrNone);
+	CDir& dir=*dum;
+	TInt count=dir.Count();
+	if (count==0)
+		test.Printf(_L("No files present on Z:\\*\n"));
+	while (count--)
+		{
+		TBuf<32> UID;
+		if (dir[count].IsTypeValid()==EFalse)
+			UID=_L("INVALID");
+		else
+			{
+			UID=dir[count].iType[0].Name();
+			UID.Append(dir[count].iType[1].Name());
+			UID.Append(dir[count].iType[2].Name());
+			}
+		test.Printf(_L("FILE: %S UID %S\n"),&dir[count].iName,&UID);
+		}
+	delete &dir;
+	TEntry entry;
+	r=TheFs.Entry(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin)?_L("Z:\\Sys\\Bin\\ELOCAL.FSY"):_L("Z:\\System\\Bin\\ELOCAL.FSY"),entry);
+	}
+
+GLDEF_C void CallTestsL(void)
+//
+// Do all tests
+//
+	{
+
+	TBuf<64> b;
+
+	TFileName sessionPath;
+
+	TInt r=TheFs.SessionPath(sessionPath);
+	test(r==KErrNone);
+	TChar driveLetter=sessionPath[0];
+	b.Format(_L("Testing filesystem on %c:"),(TText)driveLetter);
+	test.Next(b);
+
+	CreateUidTestFiles();
+	Test1();
+	Test2();
+	Test3();
+	Test4();
+
+	test.Next(_L("Testing filesystem on Z:"));
+	TRAP(r,TestZ());
+	if (r!=KErrNone)
+		test.Printf(_L("Error: %d\n"),r);
+	}