kerneltest/e32test/dll/t_xxver2.cpp
changeset 0 a41df078684a
child 189 a5496987b1da
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // e32test\dll\t_xxver2.cpp
       
    15 // Overview:
       
    16 // Test matching algorithm for DLL versions. Test aspects of DLL and EXE files.
       
    17 // API Information:
       
    18 // RLibrary
       
    19 // Details:
       
    20 // - This test makes use of 4 versions of a single DLL, and 15 EXEs which link
       
    21 // against it.  The EXEs all have different reqirements on which DLL versions
       
    22 // are acceptable
       
    23 // - Test that the correct version of linked libraries are used (Run for each
       
    24 // EXE and for the 16 combinations in which the 4 versions of the DLL can be
       
    25 // available.  The test is performed with each EXE run in sequence, and again
       
    26 // with all of them run at the same time)
       
    27 // - Test that the correct version of dynamically loaded libraries are used and
       
    28 // the libary exports are as expected.  (Run for each DLL version and for the
       
    29 // 16 combinations of DLL availability)
       
    30 // - Test that RLibrary::GetInfo and RLibrary::GetInfoFromHeader return the
       
    31 // expected data for all DLLs and EXEs
       
    32 // Platforms/Drives/Compatibility:
       
    33 // All.
       
    34 // Assumptions/Requirement/Pre-requisites:
       
    35 // Failures and causes:
       
    36 // Base Port information:
       
    37 // 
       
    38 //
       
    39 
       
    40 #include <e32uid.h>
       
    41 #include <e32test.h>
       
    42 #include <f32file.h>
       
    43 #include <d_ldrtst.h>
       
    44 #include <f32image.h>
       
    45 
       
    46 RTest test(_L("T_XXVER2"));
       
    47 RFs	gFs;
       
    48 CFileMan* gFileMan;
       
    49 RLdrTest LdrTest;
       
    50 
       
    51 TBuf<8> SourcePath = _S16("Z:\\img\\");
       
    52 
       
    53 
       
    54 TFileName KDestPath()
       
    55 	{
       
    56 	_LIT(KDestPath, "C:\\system\\bin\\ver");
       
    57 	_LIT(KDestPathSysBin, "C:\\sys\\bin\\ver");
       
    58 	if(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin))
       
    59 		return KDestPathSysBin();
       
    60 	else
       
    61 		return KDestPath();
       
    62 	}
       
    63 
       
    64 _LIT(KDllName0, "t_ver2{00010000}.dll");
       
    65 _LIT(KDllName1, "t_ver2{00010001}.dll");
       
    66 _LIT(KDllName2, "t_ver2{00020000}.dll");
       
    67 _LIT(KDllName3, "t_ver2.dll");
       
    68 
       
    69 const TDesC* const DllArray[] =
       
    70 	{
       
    71 	&KDllName0(),
       
    72 	&KDllName1(),
       
    73 	&KDllName2(),
       
    74 	&KDllName3()
       
    75 	};
       
    76 
       
    77 const TInt KNumDlls = sizeof(DllArray)/sizeof(const TDesC* const);
       
    78 
       
    79 const TInt DllVersion[KNumDlls] =
       
    80 	{
       
    81 	0x00010000,
       
    82 	0x00010001,
       
    83 	0x00020000,
       
    84 	0x00030000
       
    85 	};
       
    86 
       
    87 const TInt KNumTestVersions = 7;
       
    88 const TInt TestDllVersion[KNumTestVersions] =
       
    89 	{
       
    90 	0x00000000,
       
    91 	0x00010000,
       
    92 	0x00010001,
       
    93 	0x00010002,
       
    94 	0x00020000,
       
    95 	0x00030000,
       
    96 	0x00040000
       
    97 	};
       
    98 
       
    99 _LIT(KExeName0, "t_xver2a.exe");	// request 1.0 work with any
       
   100 _LIT(KExeName1, "t_xver2b.exe");	// request 1.0 work with 2.0 but not 3.0
       
   101 _LIT(KExeName2, "t_xver2c.exe");	// request 1.0 don't work with 2.0
       
   102 _LIT(KExeName3, "t_xver2d.exe");	// request 1.1 work with 1.0 but not 2.0
       
   103 _LIT(KExeName4, "t_xver2e.exe");	// request 1.1 work with any
       
   104 _LIT(KExeName5, "t_xver2f.exe");	// request 1.1 work with 2.0, 3.0 but not with 1.0
       
   105 _LIT(KExeName6, "t_xver2g.exe");	// request 1.1 don't work with 2.0, 3.0 or 1.0
       
   106 _LIT(KExeName7, "t_xver2h.exe");	// request 1.1 work with 1.0 and 2.0 but not 3.0
       
   107 _LIT(KExeName8, "t_xver2i.exe");	// request 1.1 work with 2.0 but not 3.0 or 1.0
       
   108 _LIT(KExeName9, "t_xver2j.exe");	// request 2.0 only use 1.0 exports
       
   109 _LIT(KExeName10, "t_xver2k.exe");	// request 2.0 only use 1.0, 1.1 exports
       
   110 _LIT(KExeName11, "t_xver2l.exe");	// request 2.0 use 2.0 exports work on 3.0
       
   111 _LIT(KExeName12, "t_xver2m.exe");	// request 2.0 use 2.0 exports, don't work on 3.0
       
   112 _LIT(KExeName13, "t_xver2n.exe");	// request 3.0 use 1.0 exports only
       
   113 _LIT(KExeName14, "t_xver2o.exe");	// request 3.0 use all
       
   114 
       
   115 const TDesC* const ExeArray[] =
       
   116 	{
       
   117 	&KExeName0(),
       
   118 	&KExeName1(),
       
   119 	&KExeName2(),
       
   120 	&KExeName3(),
       
   121 	&KExeName4(),
       
   122 	&KExeName5(),
       
   123 	&KExeName6(),
       
   124 	&KExeName7(),
       
   125 	&KExeName8(),
       
   126 	&KExeName9(),
       
   127 	&KExeName10(),
       
   128 	&KExeName11(),
       
   129 	&KExeName12(),
       
   130 	&KExeName13(),
       
   131 	&KExeName14()
       
   132 	};
       
   133 
       
   134 const TInt KNumExes = sizeof(ExeArray)/sizeof(const TDesC* const);
       
   135 
       
   136 const TInt ResultArray[KNumExes<<KNumDlls] =
       
   137 	{
       
   138 //	DLLs Present			A	B	C	D	E	F	G	H	I	J	K	L	M	N	O
       
   139 // None
       
   140 							-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,	-1,
       
   141 // 1.0
       
   142 							0,	0,	0,	0,	0,	-1,	-1,	0,	-1,	-1,	-1,	-1,	-1,	-1,	-1,
       
   143 // 1.1
       
   144 							1,	1,	1,	1,	1,	1,	1,	1,	1,	-1,	-1,	-1,	-1,	-1,	-1,
       
   145 // 1.0, 1.1
       
   146 							1,	1,	1,	1,	1,	1,	1,	1,	1,	-1,	-1,	-1,	-1,	-1,	-1,
       
   147 // 2.0
       
   148 							2,	2,	-1,	-1,	2,	2,	-1,	2,	2,	2,	2,	2,	2,	-1,	-1,
       
   149 // 2.0, 1.0
       
   150 							0,	0,	0,	0,	2,	2,	-1,	2,	2,	2,	2,	2,	2,	-1,	-1,
       
   151 // 2.0, 1.1
       
   152 							1,	1,	1,	1,	1,	1,	1,	1,	1,	2,	2,	2,	2,	-1,	-1,
       
   153 // 2.0, 1.1, 1.0
       
   154 							1,	1,	1,	1,	1,	1,	1,	1,	1,	2,	2,	2,	2,	-1,	-1,
       
   155 // 3.0
       
   156 							3,	-1,	-1,	-1,	3,	3,	-1,	-1,	-1,	3,	3,	3,	-1,	3,	3,
       
   157 // 3.0, 1.0
       
   158 							0,	0,	0,	0,	3,	3,	-1,	0,	-1,	3,	3,	3,	-1,	3,	3,
       
   159 // 3.0, 1.1
       
   160 							1,	1,	1,	1,	1,	1,	1,	1,	1,	3,	3,	3,	-1,	3,	3,
       
   161 // 3.0, 1.1, 1.0
       
   162 							1,	1,	1,	1,	1,	1,	1,	1,	1,	3,	3,	3,	-1,	3,	3,
       
   163 // 3.0, 2.0
       
   164 							2,	2,	-1,	-1,	2,	2,	-1,	2,	2,	2,	2,	2,	2,	3,	3,
       
   165 // 3.0, 2.0, 1.0
       
   166 							0,	0,	0,	0,	2,	2,	-1,	2,	2,	2,	2,	2,	2,	3,	3,
       
   167 // 3.0, 2.0, 1.1
       
   168 							1,	1,	1,	1,	1,	1,	1,	1,	1,	2,	2,	2,	2,	3,	3,
       
   169 // 3.0, 2.0, 1.1, 1.0
       
   170 							1,	1,	1,	1,	1,	1,	1,	1,	1,	2,	2,	2,	2,	3,	3
       
   171 //
       
   172 	};
       
   173 
       
   174 const TInt ResultArray2[KNumTestVersions<<KNumDlls] =
       
   175 	{
       
   176 //	DLLs Present			0.0	1.0	1.1	1.2	2.0	3.0	4.0
       
   177 // None
       
   178 							-1,	-1,	-1,	-1,	-1,	-1,	-1,
       
   179 // 1.0
       
   180 							-1,	0,	-1,	-1,	-1,	-1,	-1,
       
   181 // 1.1
       
   182 							-1,	1,	1,	-1,	-1,	-1,	-1,
       
   183 // 1.0, 1.1
       
   184 							-1,	1,	1,	-1,	-1,	-1,	-1,
       
   185 // 2.0
       
   186 							-1,	-1,	-1,	-1,	2,	-1,	-1,
       
   187 // 2.0, 1.0
       
   188 							-1,	0,	-1,	-1,	2,	-1,	-1,
       
   189 // 2.0, 1.1
       
   190 							-1,	1,	1,	-1,	2,	-1,	-1,
       
   191 // 2.0, 1.1, 1.0
       
   192 							-1,	1,	1,	-1,	2,	-1,	-1,
       
   193 // 3.0
       
   194 							-1,	-1,	-1,	-1,	-1,	3,	-1,
       
   195 // 3.0, 1.0
       
   196 							-1,	0,	-1,	-1,	-1,	3,	-1,
       
   197 // 3.0, 1.1
       
   198 							-1,	1,	1,	-1,	-1,	3,	-1,
       
   199 // 3.0, 1.1, 1.0
       
   200 							-1,	1,	1,	-1,	-1,	3,	-1,
       
   201 // 3.0, 2.0
       
   202 							-1,	-1,	-1,	-1,	2,	3,	-1,
       
   203 // 3.0, 2.0, 1.0
       
   204 							-1,	0,	-1,	-1,	2,	3,	-1,
       
   205 // 3.0, 2.0, 1.1
       
   206 							-1,	1,	1,	-1,	2,	3,	-1,
       
   207 // 3.0, 2.0, 1.1, 1.0
       
   208 							-1,	1,	1,	-1,	2,	3,	-1
       
   209 //
       
   210 	};
       
   211 
       
   212 struct SExportInfo
       
   213 	{
       
   214 	TInt	iTotal;
       
   215 	TInt	iHoles;
       
   216 	TInt	iHole[1];
       
   217 	};
       
   218 
       
   219 const TInt Dll0ExportInfo[] = {19,0};
       
   220 const TInt Dll1ExportInfo[] = {29,0};
       
   221 const TInt Dll2ExportInfo[] = {39,4,2,3,23,24};
       
   222 const TInt Dll3ExportInfo[] = {59,6,2,3,4,23,24,39};
       
   223 
       
   224 const SExportInfo* const DllExportInfo[KNumDlls] =
       
   225 	{
       
   226 	(const SExportInfo*)Dll0ExportInfo,
       
   227 	(const SExportInfo*)Dll1ExportInfo,
       
   228 	(const SExportInfo*)Dll2ExportInfo,
       
   229 	(const SExportInfo*)Dll3ExportInfo
       
   230 	};
       
   231 
       
   232 void CheckExports(TInt aDllNum, RLibrary aLib)
       
   233 	{
       
   234 	test.Printf(_L("Testing exports for DLL %d\n"), aDllNum);
       
   235 	const TFileName& fn = aLib.FileName();
       
   236 	test.Printf(_L("Filename %S\n"), &fn);
       
   237 	const SExportInfo* e = DllExportInfo[aDllNum];
       
   238 	TAny* libcs = LdrTest.LibraryCodeSeg(aLib.Handle());
       
   239 	test.Printf(_L("Code seg @%08x\n"), libcs);
       
   240 	test(libcs != NULL);
       
   241 	TInt n = e->iTotal;
       
   242 	TInt nh = e->iHoles;
       
   243 	TInt ord;
       
   244 	for (ord=1; ord<=n+1; ++ord)
       
   245 		{
       
   246 		TLibraryFunction f = aLib.Lookup(ord);
       
   247 		test.Printf(_L("Ord %3d->%08x\n"), ord, f);
       
   248 		if (ord>n)
       
   249 			{
       
   250 			test(!f);
       
   251 			continue;
       
   252 			}
       
   253 		TInt i;
       
   254 		for (i=0; i<nh && e->iHole[i]!=ord; ++i) {}
       
   255 		if (i<nh)
       
   256 			test(!f);	// hole
       
   257 		else
       
   258 			test(f!=NULL);
       
   259 		TAny* cs = LdrTest.CodeSegFromAddr((TLinAddr)f);
       
   260 		test(f ? (cs==libcs) : !cs);
       
   261 		}
       
   262 	}
       
   263 
       
   264 void CreateAndPopulateDir(TUint aMask)
       
   265 	{
       
   266 	test.Printf(_L("CreateAndPopulateDir %d\n"), aMask);
       
   267 	TFileName fn = KDestPath();
       
   268 	fn.AppendNumFixedWidth(aMask, EDecimal, 2);
       
   269 	fn.Append('\\');
       
   270 	TInt r = gFs.MkDirAll(fn);
       
   271 	test.Printf(_L("MkDir %S->%d\n"), &fn, r);
       
   272 	test(r==KErrNone || r==KErrAlreadyExists);
       
   273 	TFileName fn2 = fn;
       
   274 	fn2.Append(_L("*.*"));
       
   275 	TTime now;
       
   276 	now.HomeTime();
       
   277 	r = gFileMan->Attribs(fn2, 0, KEntryAttReadOnly|KEntryAttHidden|KEntryAttSystem|KEntryAttArchive, now);
       
   278 	test.Printf(_L("Attribs %S->%d\n"), &fn2, r);
       
   279 	r = gFileMan->Delete(fn2);
       
   280 	test.Printf(_L("Delete %S->%d\n"), &fn2, r);
       
   281 	TInt n = 0;
       
   282 	for (; aMask; aMask>>=1, ++n)
       
   283 		{
       
   284 		if (!(aMask & 1))
       
   285 			continue;
       
   286 		fn2 = fn;
       
   287 		fn2.Append(*DllArray[n]);
       
   288 		TFileName src = SourcePath;
       
   289 		src.Append(*DllArray[n]);
       
   290 		r = gFileMan->Copy(src, fn2);
       
   291 		test.Printf(_L("%S->%S (%d)\n"), &src, &fn2, r);
       
   292 		test(r == KErrNone);
       
   293 		}
       
   294 	for (n=0; n<KNumExes; ++n)
       
   295 		{
       
   296 		fn2 = fn;
       
   297 		fn2.Append(*ExeArray[n]);
       
   298 		TFileName src = SourcePath;
       
   299 		src.Append(*ExeArray[n]);
       
   300 		r = gFileMan->Copy(src, fn2);
       
   301 		test.Printf(_L("%S->%S (%d)\n"), &src, &fn2, r);
       
   302 		test(r == KErrNone);
       
   303 		}
       
   304 	}
       
   305 
       
   306 void RunExe(TUint aMask, TInt aExeNum)
       
   307 	{
       
   308 	test.Printf(_L("RunExe mask %d exenum %d\n"), aMask, aExeNum);
       
   309 	RProcess p;
       
   310 	TRequestStatus s;
       
   311 	TFileName fn = KDestPath();
       
   312 	fn.AppendNumFixedWidth(aMask, EDecimal, 2);
       
   313 	fn.Append('\\');
       
   314 	fn.Append(*ExeArray[aExeNum]);
       
   315 	TInt r = p.Create(fn, KNullDesC);
       
   316 	test.Printf(_L("Create %S->%d\n"), &fn, r);
       
   317 	TInt rix = aExeNum + KNumExes*TInt(aMask);
       
   318 	TInt expected = ResultArray[rix];
       
   319 	test.Printf(_L("RunExe expected %d\n"), expected);
       
   320 	if (expected<0)
       
   321 		{
       
   322 		test(r<0);
       
   323 		return;
       
   324 		}
       
   325 	p.Logon(s);
       
   326 	p.Resume();
       
   327 	User::WaitForRequest(s);
       
   328 	if (p.ExitType()!=EExitKill)
       
   329 		{
       
   330 		TInt et = p.ExitType();
       
   331 		TInt er = p.ExitReason();
       
   332 		const TDesC& ec = p.ExitCategory();
       
   333 		test.Printf(_L("Exit %d,%d,%S\n"), et, er, &ec);
       
   334 		test(0);
       
   335 		}
       
   336 	CLOSE_AND_WAIT(p);
       
   337 	test.Printf(_L("Return code %08x\n"), s.Int());
       
   338 	test(s.Int() == DllVersion[expected]);
       
   339 	}
       
   340 
       
   341 void RunExes(TUint aMask)
       
   342 	{
       
   343 	test.Printf(_L("RunExes mask %d\n"), aMask);
       
   344 	RProcess p[KNumExes];
       
   345 	TRequestStatus s[KNumExes];
       
   346 	TInt xn;
       
   347 	for (xn=0; xn<KNumExes; ++xn)
       
   348 		{
       
   349 		TFileName fn = KDestPath();
       
   350 		fn.AppendNumFixedWidth(aMask, EDecimal, 2);
       
   351 		fn.Append('\\');
       
   352 		fn.Append(*ExeArray[xn]);
       
   353 		TInt r = p[xn].Create(fn, KNullDesC);
       
   354 		test.Printf(_L("Create %S->%d\n"), &fn, r);
       
   355 		TInt rix = xn + KNumExes*TInt(aMask);
       
   356 		TInt expected = ResultArray[rix];
       
   357 		test.Printf(_L("RunExe expected %d\n"), expected);
       
   358 		if (expected<0)
       
   359 			{
       
   360 			test(r<0);
       
   361 			continue;
       
   362 			}
       
   363 		p[xn].Logon(s[xn]);
       
   364 		}
       
   365 	for (xn=0; xn<KNumExes; ++xn)
       
   366 		{
       
   367 		TInt rix = xn + KNumExes*TInt(aMask);
       
   368 		TInt expected = ResultArray[rix];
       
   369 		if (expected<0)
       
   370 			continue;
       
   371 		p[xn].Resume();
       
   372 		}
       
   373 	for (xn=0; xn<KNumExes; ++xn)
       
   374 		{
       
   375 		TInt rix = xn + KNumExes*TInt(aMask);
       
   376 		TInt expected = ResultArray[rix];
       
   377 		if (expected<0)
       
   378 			continue;
       
   379 		User::WaitForRequest(s[xn]);
       
   380 		if (p[xn].ExitType()!=EExitKill)
       
   381 			{
       
   382 			TInt et = p[xn].ExitType();
       
   383 			TInt er = p[xn].ExitReason();
       
   384 			const TDesC& ec = p[xn].ExitCategory();
       
   385 			test.Printf(_L("Exit %d,%d,%S\n"), et, er, &ec);
       
   386 			test(0);
       
   387 			}
       
   388 		CLOSE_AND_WAIT(p[xn]);
       
   389 		test.Printf(_L("Return code %08x\n"), s[xn].Int());
       
   390 		test(s[xn].Int() == DllVersion[expected]);
       
   391 		}
       
   392 	}
       
   393 
       
   394 void TestDynamic(TUint aMask, TInt aTN)
       
   395 	{
       
   396 	TUint32 ver = TestDllVersion[aTN];
       
   397 	TInt rix = aTN + KNumTestVersions*TInt(aMask);
       
   398 	TInt expected = ResultArray2[rix];
       
   399 	test.Printf(_L("ReqVer %08x Expected %d\n"), ver, expected);
       
   400 	TFileName path = KDestPath();
       
   401 	path.AppendNumFixedWidth(aMask, EDecimal, 2);
       
   402 	TFileName fn = path;
       
   403 	fn.Append(_L("\\T_VER2.DLL"));
       
   404 	RLibrary l;
       
   405 	TInt r = l.Load(fn, KNullDesC, TUidType(), ver);
       
   406 	test.Printf(_L("Load %S returns %d\n"), &fn, r);
       
   407 	if (expected<0)
       
   408 		{
       
   409 		test(r<0);
       
   410 		return;
       
   411 		}
       
   412 	TLibraryFunction f = l.Lookup(1);
       
   413 	test(f != 0);
       
   414 	TInt result = (*f)();
       
   415 	test.Printf(_L("Ord 1 returns %08x\n"), result);
       
   416 	test(result == DllVersion[expected]);
       
   417 	l.Close();
       
   418 	r = l.Load(_L("T_VER2.DLL"), path, TUidType(), ver);
       
   419 	test.Printf(_L("Load T_VER2.DLL path %S returns %d\n"), &path, r);
       
   420 	if (expected<0)
       
   421 		{
       
   422 		test(r<0);
       
   423 		return;
       
   424 		}
       
   425 	f = l.Lookup(1);
       
   426 	test(f != 0);
       
   427 	result = (*f)();
       
   428 	test.Printf(_L("Ord 1 returns %08x\n"), result);
       
   429 	test(result == DllVersion[expected]);
       
   430 	CheckExports(expected, l);
       
   431 	l.Close();
       
   432 	}
       
   433 
       
   434 void TestLibraryInfo(TInt aN)
       
   435 	{
       
   436 	TFileName fn;
       
   437 	if(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin))
       
   438 		fn = _S16("C:\\sys\\bin\\ver15\\");
       
   439 	else
       
   440 		fn = _S16("C:\\system\\bin\\ver15\\");
       
   441 	fn += *DllArray[aN];
       
   442 	test.Printf(_L("Getting info for %S\n"), &fn);
       
   443 	TBool formHeader=EFalse;
       
   444 	for(;;)
       
   445 		{
       
   446 		RLibrary::TInfoV2 info;
       
   447 		TPckg<RLibrary::TInfoV2> infoBuf(info);
       
   448 		TInt r;
       
   449 		if(formHeader)
       
   450 			{
       
   451 			TUint8* buf;
       
   452 
       
   453 			RFs fs;
       
   454 			test(fs.Connect()==KErrNone);
       
   455 			RFile file;
       
   456 			test((r=file.Open(fs,fn,0))==KErrNone);
       
   457 			TInt size;
       
   458 			test((r=file.Size(size))==KErrNone);
       
   459 			if(size>RLibrary::KRequiredImageHeaderSize)
       
   460 				size=RLibrary::KRequiredImageHeaderSize;
       
   461 			buf=new TUint8[size];
       
   462 			test(buf!=0);
       
   463 			TPtr8 header(buf,size);
       
   464 			test((r=file.Read(header))==KErrNone);
       
   465 			file.Close();
       
   466 			fs.Close();
       
   467 
       
   468 			r = RLibrary::GetInfoFromHeader(header, infoBuf);
       
   469 			test.Printf(_L("GetInfoFromHeader returns %d\n"), r);
       
   470 
       
   471 			delete buf;
       
   472 			}
       
   473 		else
       
   474 			{
       
   475 			r = RLibrary::GetInfo(fn, infoBuf);
       
   476 			test.Printf(_L("GetInfo returns %d\n"), r);
       
   477 			}
       
   478 
       
   479 		test(r==KErrNone);
       
   480 		const TUint32* uid = (const TUint32*)&info.iUids;
       
   481 		test.Printf(_L("VER  %08x\n"), info.iModuleVersion);
       
   482 		test.Printf(_L("UID1 %08x\n"), uid[0]);
       
   483 		test.Printf(_L("UID2 %08x\n"), uid[1]);
       
   484 		test.Printf(_L("UID3 %08x\n"), uid[2]);
       
   485 		test.Printf(_L("SID  %08x\n"), (TUint32)info.iSecurityInfo.iSecureId);
       
   486 		test.Printf(_L("VID  %08x\n"), (TUint32)info.iSecurityInfo.iVendorId);
       
   487 		test.Printf(_L("CAP0 %08x\n"), ((SSecurityInfo&)info.iSecurityInfo).iCaps[0]);
       
   488 		test.Printf(_L("CAP1 %08x\n"), ((SSecurityInfo&)info.iSecurityInfo).iCaps[1]);
       
   489 		TUint32 v = (TUint32)DllVersion[aN];
       
   490 		test(info.iModuleVersion == v);
       
   491 		test(uid[0] == (TUint32)KDynamicLibraryUidValue);
       
   492 		test(uid[2] == (TUint32)0x40abcdef);
       
   493 		TUint32 xsid = ((v>>16)<<4)|(v&0x0f)|0x89abcd00u;
       
   494 		test(info.iSecurityInfo.iSecureId == xsid);
       
   495 		TUint32 xvid = 0x01234500+(xsid&0xff);
       
   496 		test(info.iSecurityInfo.iVendorId == xvid);
       
   497 		test(((SSecurityInfo&)info.iSecurityInfo).iCaps[0]==0x0002aaab);
       
   498 		test(((SSecurityInfo&)info.iSecurityInfo).iCaps[1]==0);
       
   499 		if(formHeader)
       
   500 #if defined(__ARMCC__)
       
   501 			test(info.iHardwareFloatingPoint == EFpTypeVFPv2);
       
   502 #else
       
   503 			test(info.iHardwareFloatingPoint == EFpTypeNone);
       
   504 #endif
       
   505 
       
   506 		if(formHeader)
       
   507 			break;
       
   508 		formHeader = ETrue;
       
   509 		}
       
   510 	}
       
   511 
       
   512 void TestExeInfo(TInt aN)
       
   513 	{
       
   514 	TFileName fn;
       
   515 	if(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin))
       
   516 		fn = _S16("C:\\sys\\bin\\ver15\\");
       
   517 	else
       
   518 		fn = _S16("C:\\system\\bin\\ver15\\");
       
   519 	fn += *ExeArray[aN];
       
   520 	test.Printf(_L("Getting info for %S\n"), &fn);
       
   521 	TBool formHeader=EFalse;
       
   522 	for(;;)
       
   523 		{
       
   524 		RLibrary::TInfoV2 info;
       
   525 		TPckg<RLibrary::TInfoV2> infoBuf(info);
       
   526 		TInt r;
       
   527 		if(formHeader)
       
   528 			{
       
   529 			TUint8* buf;
       
   530 
       
   531 			RFs fs;
       
   532 			test(fs.Connect()==KErrNone);
       
   533 			RFile file;
       
   534 			test((r=file.Open(fs,fn,0))==KErrNone);
       
   535 			TInt size;
       
   536 			test((r=file.Size(size))==KErrNone);
       
   537 			if(size>RLibrary::KRequiredImageHeaderSize)
       
   538 				size=RLibrary::KRequiredImageHeaderSize;
       
   539 			buf=new TUint8[size];
       
   540 			test(buf!=0);
       
   541 			TPtr8 header(buf,size);
       
   542 			test((r=file.Read(header))==KErrNone);
       
   543 			file.Close();
       
   544 			fs.Close();
       
   545 
       
   546 			r = RLibrary::GetInfoFromHeader(header, infoBuf);
       
   547 			test.Printf(_L("GetInfoFromHeader returns %d\n"), r);
       
   548 
       
   549 			delete buf;
       
   550 			}
       
   551 		else
       
   552 			{
       
   553 			r = RLibrary::GetInfo(fn, infoBuf);
       
   554 			test.Printf(_L("GetInfo returns %d\n"), r);
       
   555 			}
       
   556 
       
   557 		test(r==KErrNone);
       
   558 		const TUint32* uid = (const TUint32*)&info.iUids;
       
   559 		test.Printf(_L("VER  %08x\n"), info.iModuleVersion);
       
   560 		test.Printf(_L("UID1 %08x\n"), uid[0]);
       
   561 		test.Printf(_L("UID2 %08x\n"), uid[1]);
       
   562 		test.Printf(_L("UID3 %08x\n"), uid[2]);
       
   563 		test.Printf(_L("SID  %08x\n"), (TUint32)info.iSecurityInfo.iSecureId);
       
   564 		test.Printf(_L("VID  %08x\n"), (TUint32)info.iSecurityInfo.iVendorId);
       
   565 		test.Printf(_L("CAP0 %08x\n"), ((SSecurityInfo&)info.iSecurityInfo).iCaps[0]);
       
   566 		test.Printf(_L("CAP1 %08x\n"), ((SSecurityInfo&)info.iSecurityInfo).iCaps[1]);
       
   567 	#if defined(__EABI__) && !defined(__X86__)
       
   568 		test(info.iModuleVersion == 0x000a0000);
       
   569 	#else
       
   570 		test(info.iModuleVersion == 0x00010000);
       
   571 	#endif
       
   572 		test(uid[0] == (TUint32)KExecutableImageUidValue);
       
   573 		TUint32 xuid3 = 0x40abcd61u + aN;
       
   574 		test(uid[2] == xuid3);
       
   575 		test(info.iSecurityInfo.iSecureId == xuid3);
       
   576 		TUint32 xvid = 0x01234500+(xuid3&0xff);
       
   577 		test(info.iSecurityInfo.iVendorId == xvid);
       
   578 		test(((SSecurityInfo&)info.iSecurityInfo).iCaps[0]==0x0002aaab);
       
   579 		test(((SSecurityInfo&)info.iSecurityInfo).iCaps[1]==0);
       
   580 		if(formHeader)
       
   581 			test(info.iHardwareFloatingPoint == EFpTypeNone);
       
   582 
       
   583 		if(formHeader)
       
   584 			break;
       
   585 		formHeader = ETrue;
       
   586 		}
       
   587 	}
       
   588 	
       
   589 void TestCompression(void)
       
   590 	{
       
   591 	
       
   592 	// Check target directory
       
   593 	TFileName fn;
       
   594 	if(PlatSec::ConfigSetting(PlatSec::EPlatSecEnforceSysBin))
       
   595 		fn = _S16("c:\\sys\\bin\\");
       
   596 	else
       
   597 		fn = _S16("c:\\system\\bin\\");
       
   598 	
       
   599 	TInt r = gFs.MkDirAll(fn);
       
   600 	test.Printf(_L("MkDir %S->%d\n"), &fn, r);
       
   601 	test(r==KErrNone || r==KErrAlreadyExists);
       
   602 	
       
   603 	// Make copy from t_xxver2.exe to t_xxvercomp.exe 
       
   604 	fn.Append(_L("t_xxvercomp.exe"));
       
   605 	
       
   606 	TFileName fn2 = fn;
       
   607 	TTime now;
       
   608 	now.HomeTime();
       
   609 	r = gFileMan->Attribs(fn2, 0, KEntryAttReadOnly|KEntryAttHidden|KEntryAttSystem|KEntryAttArchive, now);
       
   610 	test.Printf(_L("Attribs %S->%d\n"), &fn2, r);
       
   611 	r = gFileMan->Delete(fn2);
       
   612 	test.Printf(_L("Delete %S->%d\n"), &fn2, r);
       
   613 
       
   614 	fn2 = fn;
       
   615 	TFileName src = SourcePath;
       
   616 	src.Append(*ExeArray[0]);
       
   617 	r = gFileMan->Copy(src, fn2);
       
   618 	test.Printf(_L("%S->%S (%d)\n"), &src, &fn2, r);
       
   619 	test(r == KErrNone);
       
   620 	
       
   621 	
       
   622 	// Check RLibrary::GetInfoFromHeader  on a correct executable
       
   623 	test.Printf(_L("fn:%S\n"), &fn);
       
   624 	
       
   625 	RLibrary::TInfoV2 info;
       
   626 	TPckg<RLibrary::TInfoV2> infoBuf(info);
       
   627 		
       
   628 	TUint8* buf;
       
   629 
       
   630 	RFs fs;
       
   631 	test(fs.Connect()==KErrNone);
       
   632 	RFile file;
       
   633 	r=file.Open(fs,fn,0);
       
   634 	test.Printf(_L("file.Open returns %d\n"), r);
       
   635 	test(r==KErrNone);
       
   636 	TInt size;
       
   637 	test((r=file.Size(size))==KErrNone);
       
   638 	if(size>RLibrary::KRequiredImageHeaderSize)
       
   639 		size=RLibrary::KRequiredImageHeaderSize;
       
   640 	buf=new TUint8[size];
       
   641 	test(buf!=0);
       
   642 	TPtr8 header(buf,size);
       
   643 	test((r=file.Read(header))==KErrNone);
       
   644 	file.Close();
       
   645 	
       
   646 
       
   647 	r = RLibrary::GetInfoFromHeader(header, infoBuf);
       
   648 	test.Printf(_L("GetInfoFromHeader returns %d\n"), r);
       
   649 	test(r==KErrNone);
       
   650 
       
   651 
       
   652 	test.Printf(_L("Write invalid compression info into the header.\n"));
       
   653 	E32ImageHeader* e32Header = (E32ImageHeader*) buf;
       
   654 	
       
   655 	e32Header->iCompressionType = 0x00000001;
       
   656 	test((r=file.Open(fs,fn,EFileWrite))==KErrNone);
       
   657 	r=file.Write(header);
       
   658 	test.Printf(_L("file.Write returns %d\n"), r);
       
   659 	test(r==KErrNone);
       
   660 	file.Close();
       
   661 
       
   662 	// Check RLibrary::GetInfoFromHeader on a wrong compression method.
       
   663 	
       
   664 	r = RLibrary::GetInfoFromHeader(header, infoBuf);
       
   665 	test.Printf(_L("GetInfoFromHeader returns %d\n"), r);
       
   666 	test(r==KErrCorrupt);
       
   667 
       
   668 
       
   669 	fs.Close();
       
   670 	delete buf;
       
   671 	
       
   672 	
       
   673 	
       
   674 	} // End of TestCompression()
       
   675 
       
   676 TInt E32Main()
       
   677 	{
       
   678 	test.Title();
       
   679 
       
   680 	// Turn off evil lazy dll unloading
       
   681 	RLoader l;
       
   682 	test(l.Connect()==KErrNone);
       
   683 	test(l.CancelLazyDllUnload()==KErrNone);
       
   684 	l.Close();
       
   685 
       
   686 	TBuf<256> cmdline;
       
   687 	User::CommandLine(cmdline);
       
   688 	TLex lex(cmdline);
       
   689 	TInt options[8];
       
   690 	TInt i;
       
   691 	memclr(options, sizeof(options));
       
   692 	for (i=0; i<8; ++i)
       
   693 		{
       
   694 		lex.SkipSpace();
       
   695 		if (lex.Eos())
       
   696 			break;
       
   697 		lex.Val(options[i]);
       
   698 		}
       
   699 	TUint tm = 0xffffffffu;
       
   700 	if (options[0])
       
   701 		tm = (TUint)options[0];
       
   702 
       
   703 	test.Start(_L("Create cleanup stack"));
       
   704 	CTrapCleanup* ct = CTrapCleanup::New();
       
   705 	test(ct!=0);
       
   706 	test.Next(_L("Connect to file server"));
       
   707 	TInt r = gFs.Connect();
       
   708 	test(r==KErrNone);
       
   709 	test.Next(_L("Create CFileMan"));
       
   710 	TRAP(r, gFileMan=CFileMan::NewL(gFs));
       
   711 	test(r==KErrNone);
       
   712 	test.Next(_L("Connect to test driver"));
       
   713 	r = User::LoadLogicalDevice(_L("d_ldrtst"));
       
   714 	test(r==KErrNone || r==KErrAlreadyExists);
       
   715 	r = LdrTest.Open();
       
   716 	test(r==KErrNone);
       
   717 	TFileName fn(RProcess().FileName());
       
   718 	test.Printf(_L("Process file name = %S\n"), &fn);
       
   719 	SourcePath[0] = fn[0];	// use same drive as this EXE
       
   720 
       
   721 	TUint mask;
       
   722 	TUint nmasks = 1u << KNumDlls;
       
   723 	for (mask=0; mask<nmasks; ++mask)
       
   724 		{
       
   725 		CreateAndPopulateDir(mask);
       
   726 		if (!(tm&1))
       
   727 			continue;
       
   728 		TInt n;
       
   729 		for (n=0; n<KNumExes; ++n)
       
   730 			{
       
   731 			RunExe(mask, n);
       
   732 			}
       
   733 		RunExes(mask);
       
   734 		}
       
   735 
       
   736 	if (tm & 2)
       
   737 		{
       
   738 		test.Next(_L("Test dynamic loading by version"));
       
   739 		for (mask=0; mask<nmasks; ++mask)
       
   740 			{
       
   741 			TInt n;
       
   742 			for (n=0; n<KNumTestVersions; ++n)
       
   743 				{
       
   744 				TestDynamic(mask, n);
       
   745 				}
       
   746 			}
       
   747 		}
       
   748 
       
   749 	if (tm & 4)
       
   750 		{
       
   751 		test.Next(_L("Test get library info"));
       
   752 		TInt n;
       
   753 		for (n=0; n<KNumDlls; ++n)
       
   754 			{
       
   755 			TestLibraryInfo(n);
       
   756 			}
       
   757 		for (n=0; n<KNumExes; ++n)
       
   758 			{
       
   759 			TestExeInfo(n);
       
   760 			}
       
   761 		}
       
   762 
       
   763 	if( tm & 8)
       
   764 		{
       
   765 		TestCompression();
       
   766 		}
       
   767 	
       
   768 	delete gFileMan;
       
   769 	gFs.Close();
       
   770 	delete ct;
       
   771 	LdrTest.Close();
       
   772 	test.End();
       
   773 	return KErrNone;
       
   774 	}
       
   775