kerneltest/f32test/server/t_chkuid.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 29 743008598095
parent 0 a41df078684a
child 43 c1f20ce4abcf
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

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