kerneltest/f32test/server/t_chkuid.cpp
author Slion
Tue, 08 Dec 2009 08:11:42 +0100
branchanywhere
changeset 19 f6d3d9676ee4
parent 0 a41df078684a
child 109 b3a1d9898418
permissions -rw-r--r--
Trying to figure out how to implement my WINC like compatibility layer. Going the emulation way is probably not so smart. We should not use the kernel but rather hook native functions in the Exec calls.

// 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);
	}