kerneltest/f32test/server/t_sysbin.cpp
changeset 0 a41df078684a
child 6 0173bcd7697c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/server/t_sysbin.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,388 @@
+// 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 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_sysbin.cpp
+// 
+//
+
+#define __E32TEST_EXTENSION__
+#include <e32test.h>
+#include <f32file.h>
+
+_LIT(KCheckFailed,"Check failed %d != %d\n");
+
+#define CHECK_EQ(a,b) { if(a!=b) { test.Printf(KCheckFailed,a,b); test(0); } }
+
+RTest test(_L("T_SYSBIN"));
+
+TBool SysBinEnforced = 0;
+TBool RunningFromROM;
+
+RFs TheFs;
+CFileMan* TheFileMan;
+
+void CheckFileName(RProcess aProcess, const TDesC& aFileName)
+	{
+	TFileName fileName = aProcess.FileName();
+	test(fileName.MatchF(aFileName)==0);
+	}
+
+_LIT(KExeAInSysBin,"z:\\sys\\bin\\t_sysbina.exe");
+_LIT(KExeBInSystemPrograms,"z:\\system\\programs\\t_sysbinb.exe");
+_LIT(KDllAInSysBin,"z:\\sys\\bin\\t_sysbin_dlla.dll");
+_LIT(KDllBInSystemLibs,"z:\\system\\libs\\t_sysbin_dllb.dll");
+#ifndef __WINS__
+_LIT(KExeBInSysBin,"z:\\sys\\bin\\t_sysbinb.exe");
+_LIT(KDllBInSysBin,"z:\\sys\\bin\\t_sysbin_dllb.dll");
+#endif
+_LIT(KRamDll,"z:\\sys\\bin\\t_sysbin_dll_ram.dll");
+_LIT(KDllCInCTest,"c:\\sysbin_test\\t_sysbin_dllc.dll");
+_LIT(KDllC,"t_sysbin_dllc.dll");
+_LIT(KDllDInCSysBinTest,"c:\\sys\\bin\\test\\t_sysbin_dlld.dll");
+_LIT(KDllD,"t_sysbin_dlld.dll");
+
+
+void CheckFileName(RLibrary aLibrary, const TDesC& aFileName)
+	{
+	TFileName fileName = aLibrary.FileName();
+	test(fileName.MatchF(aFileName)==0);
+	}
+
+
+
+void TestExeB(const TDesC& aFileName)
+	{
+	RProcess p;
+	TInt r = p.Create(aFileName,KNullDesC);
+	if(SysBinEnforced)
+		{
+#ifdef __WINS__
+		CHECK_EQ(r,KErrNotFound)
+#else
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(p,KExeBInSysBin);
+		p.Terminate(0);
+		p.Close();
+#endif
+		}
+	else
+		{
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(p,KExeBInSystemPrograms);
+		p.Terminate(0);
+		p.Close();
+		}
+	}
+
+
+
+void TestDllB(const TDesC& aFileName)
+	{
+	RLibrary l;
+	TInt r = l.Load(aFileName);
+	if(SysBinEnforced)
+		{
+#ifdef __WINS__
+		CHECK_EQ(r,KErrNotFound)
+#else
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(l,KDllBInSysBin);
+		l.Close();
+#endif
+		}
+	else
+		{
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(l,KDllBInSystemLibs);
+		l.Close();
+		}
+	}
+
+
+
+void TestDllC(const TDesC& aFileName,const TDesC& aPath)
+	{
+	RLibrary l;
+	test.Printf(_L("Load(%S,%S)\n"),&aFileName,&aPath);
+	TInt r = l.Load(aFileName,aPath);
+	if(SysBinEnforced)
+		CHECK_EQ(r,KErrNotFound)
+	else
+		{
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(l,KDllCInCTest);
+		l.Close();
+		}
+	}
+
+
+
+void TestDllD(const TDesC& aFileName,const TDesC& aPath)
+	{
+	RLibrary l;
+	test.Printf(_L("Load(%S,%S)\n"),&aFileName,&aPath);
+	TInt r = l.Load(aFileName,aPath);
+	CHECK_EQ(r,KErrNone)
+	CheckFileName(l,KDllDInCSysBinTest);
+	l.Close();
+	}
+
+
+
+GLDEF_C TInt E32Main()
+    {
+	SysBinEnforced=PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin);
+
+	TInt r;
+	RProcess p;
+	RLibrary l;
+
+ 	test.Title();
+
+	test( KErrNone == TheFs.Connect() );
+	RunningFromROM = TheFs.IsFileInRom(RProcess().FileName())!=0;
+
+	// Turn off evil lazy dll unloading
+	{
+	RLoader l;
+	test_KErrNone(l.Connect());
+	test_KErrNone(l.CancelLazyDllUnload());
+	l.Close();
+	}
+
+	CTrapCleanup* ct = CTrapCleanup::New();
+	test_NotNull(ct);
+	TRAP(r, TheFileMan=CFileMan::NewL(TheFs));
+	test_KErrNone(r);
+
+	test.Start(_L("Check loading an EXE which lives in \\SYS\\BIN"));
+
+		test.Start(_L("Load without path or ext"));
+		r = p.Create(_L("T_SYSBINa"),KNullDesC);
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(p,KExeAInSysBin);
+		p.Terminate(0);
+		p.Close();
+
+		test.Next(_L("Load without path"));
+		r = p.Create(_L("T_SYSBINa.EXE"),KNullDesC);
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(p,KExeAInSysBin);
+		p.Terminate(0);
+		p.Close();
+
+		test.Next(_L("Load with path but without ext"));
+		r = p.Create(_L("\\Sys\\Bin\\T_SYSBINa"),KNullDesC);
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(p,KExeAInSysBin);
+		p.Terminate(0);
+		p.Close();
+
+		test.Next(_L("Load with path and ext"));
+		r = p.Create(_L("\\Sys\\Bin\\T_SYSBINa.EXE"),KNullDesC);
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(p,KExeAInSysBin);
+		p.Terminate(0);
+		p.Close();
+
+		test.Next(_L("Load with SYSTEM\\PROGRAMS path and without ext"));
+		r = p.Create(_L("\\SYSTEM\\PROGRAMS\\T_SYSBINa"),KNullDesC);
+		if(!SysBinEnforced)
+			CHECK_EQ(r,KErrNotFound)
+		else
+			{
+			CHECK_EQ(r,KErrNone)
+			CheckFileName(p,KExeAInSysBin);
+			p.Terminate(0);
+			p.Close();
+			}
+
+		test.Next(_L("Load with SYSTEM\\PROGRAMS path and with ext"));
+		r = p.Create(_L("\\SYSTEM\\PROGRAMS\\T_SYSBINa.EXE"),KNullDesC);
+		if(!SysBinEnforced)
+			CHECK_EQ(r,KErrNotFound)
+		else
+			{
+			CHECK_EQ(r,KErrNone)
+			CheckFileName(p,KExeAInSysBin);
+			p.Terminate(0);
+			p.Close();
+			}
+
+		test.End();
+
+	test.Next(_L("Check loading an EXE which lives in \\SYSTEM\\PROGRAMS"));
+
+	if(!RunningFromROM)
+		{
+		test.Printf(_L("TESTS NOT RUN - Not running from ROM"));
+		}
+	else
+		{
+		test.Start(_L("Load without path or ext"));
+		TestExeB(_L("T_SYSBINb"));
+
+		test.Next(_L("Load without path"));
+		TestExeB(_L("T_SYSBINb.EXE"));
+
+		test.Next(_L("Load with path but without ext"));
+		TestExeB(_L("\\System\\programs\\T_SYSBINb"));
+
+		test.Next(_L("Load with path and ext"));
+		TestExeB(_L("\\System\\programs\\T_SYSBINb.EXE"));
+
+		test.End();
+		}
+
+	test.Next(_L("Check loading an DLL which lives in \\SYS\\BIN"));
+
+		test.Start(_L("Load without path or ext"));
+		r = l.Load(_L("T_SYSBIN_DLLa"));
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(l,KDllAInSysBin);
+		l.Close();
+
+		test.Next(_L("Load without path"));
+		r = l.Load(_L("T_SYSBIN_DLLa.DLL"));
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(l,KDllAInSysBin);
+		l.Close();
+
+		test.Next(_L("Load with path but without ext"));
+		r = l.Load(_L("\\Sys\\Bin\\T_SYSBIN_DLLa"));
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(l,KDllAInSysBin);
+		l.Close();
+
+		test.Next(_L("Load with path and ext"));
+		r = l.Load(_L("\\Sys\\Bin\\T_SYSBIN_DLLa.DLL"));
+		CHECK_EQ(r,KErrNone)
+		CheckFileName(l,KDllAInSysBin);
+		l.Close();
+
+		test.Next(_L("Load with SYSTEM\\LIBS path and without ext"));
+		r = l.Load(_L("\\SYSTEM\\LIBS\\T_SYSBIN_DLLa"));
+		if(!SysBinEnforced)
+			CHECK_EQ(r,KErrNotFound)
+		else
+			{
+			CHECK_EQ(r,KErrNone)
+			CheckFileName(l,KDllAInSysBin);
+			l.Close();
+			}
+
+		test.Next(_L("Load with SYSTEM\\LIBS path and with ext"));
+		r = l.Load(_L("\\SYSTEM\\LIBS\\T_SYSBIN_DLLa.DLL"));
+		if(!SysBinEnforced)
+			CHECK_EQ(r,KErrNotFound)
+		else
+			{
+			CHECK_EQ(r,KErrNone)
+			CheckFileName(l,KDllAInSysBin);
+			l.Close();
+			}
+
+		test.End();
+
+	test.Next(_L("Check loading an DLL which lives in \\SYSTEM\\LIBS"));
+
+	if(!RunningFromROM)
+		{
+		test.Printf(_L("TESTS NOT RUN - Not running from ROM"));
+		}
+	else
+		{
+		test.Start(_L("Load without path or ext"));
+		TestDllB(_L("T_SYSBIN_DLLb"));
+
+		test.Next(_L("Load without path"));
+		TestDllB(_L("T_SYSBIN_DLLb.DLL"));
+
+		test.Next(_L("Load with path but without ext"));
+		TestDllB(_L("\\System\\Libs\\T_SYSBIN_DLLb"));
+
+		test.Next(_L("Load with path and ext"));
+		TestDllB(_L("\\System\\Libs\\T_SYSBIN_DLLb.DLL"));
+
+		test.End();
+		}
+
+	test.Next(_L("Check loading an DLL which lives in \\SYSBIN_TEST"));
+
+	r = TheFileMan->Copy(KRamDll,KDllCInCTest,CFileMan::ERecurse);
+	test_KErrNone(r);
+
+		test.Start(_L("Load using full path+name"));
+		TestDllC(KDllCInCTest,KNullDesC);
+
+		test.Next(_L("Load using separate search path"));
+		TestDllC(KDllC,_L("\\sysbin_test\\"));
+#ifndef __WINS__
+		TestDllC(KDllC,_L("\\sysbin_test"));
+		TestDllC(KDllC,_L("sysbin_test\\"));
+		TestDllC(KDllC,_L("sysbin_test"));
+#endif
+
+		TestDllC(KDllC,_L("c:\\sysbin_test\\"));
+#ifndef __WINS__
+		TestDllC(KDllC,_L("c:\\sysbin_test"));
+		TestDllC(KDllC,_L("c:sysbin_test\\"));
+		TestDllC(KDllC,_L("c:sysbin_test"));
+#endif
+
+		test.End();
+
+	_LIT(KCTestPath,"c:\\sysbin_test\\");
+	r = TheFileMan->RmDir(KCTestPath);
+	test_KErrNone(r);
+
+	test.Next(_L("Check loading an DLL which lives in \\SYS\\BIN\\TEST"));
+
+	r = TheFileMan->Copy(KRamDll,KDllDInCSysBinTest,CFileMan::ERecurse);
+	test_KErrNone(r);
+
+		test.Start(_L("Load using full path+name"));
+		TestDllD(KDllDInCSysBinTest,KNullDesC);
+
+		test.Next(_L("Load using separate search path"));
+		TestDllD(KDllD,_L("\\sys\\bin\\test\\"));
+#ifndef __WINS__
+		TestDllD(KDllD,_L("\\sys\\bin\\test"));
+		TestDllD(KDllD,_L("sys\\bin\\test"));
+		TestDllD(KDllD,_L("sys\\bin\\test\\"));
+#endif
+
+		TestDllD(KDllD,_L("c:\\sys\\bin\\test\\"));
+#ifndef __WINS__
+		TestDllD(KDllD,_L("c:\\sys\\bin\\test"));
+		TestDllD(KDllD,_L("c:sys\\bin\\test\\"));
+		TestDllD(KDllD,_L("c:sys\\bin\\test"));
+#endif
+
+		TestDllD(KDllD,_L("\\dummy;\\sys\\bin\\test\\"));
+		TestDllD(KDllD,_L("\\sys\\bin\\test\\;\\dummy2"));
+		TestDllD(KDllD,_L("\\dummy1;\\sys\\bin\\test2;\\sys\\bin\\test\\"));
+
+		TestDllD(KDllD,_L("c:\\dummy;c:\\sys\\bin\\test\\"));
+		TestDllD(KDllD,_L("c:\\sys\\bin\\test\\;c:\\dummy2"));
+		TestDllD(KDllD,_L("c:\\dummy1;c:\\sys\\bin\\test2;c:\\sys\\bin\\test\\"));
+
+		test.End();
+
+	_LIT(KCTestPath2,"c:\\sys\\bin\\test\\");
+	r = TheFileMan->RmDir(KCTestPath2);
+	test_KErrNone(r);
+
+	test.End();
+	return(0);
+    }