persistentstorage/sql/TEST/t_sqlbadclient.cpp
changeset 0 08ec8eefde2f
child 12 6b6fd149daa2
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     1 // Copyright (c) 2006-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 "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 //
       
    15 
       
    16 #include <e32test.h>
       
    17 #include <bautils.h>
       
    18 #include <e32math.h>
       
    19 #include <sqldb.h>
       
    20 #include "SqlUtil.h"
       
    21 
       
    22 ///////////////////////////////////////////////////////////////////////////////////////
       
    23 
       
    24 static RFs TheFs;
       
    25 RTest TheTest(_L("t_sqlbadclient test"));
       
    26 _LIT(KTestDir, "c:\\test\\");
       
    27 _LIT(KTestDbName1, "c:\\test\\t_sqlbadclient.db");
       
    28 _LIT(KTestDbName2, "c:[1111D1C1]t_sqlbadclient.db");
       
    29 
       
    30 #if defined __WINS__ || defined __WINSCW__
       
    31 const TInt KTestIterCount = 5000;
       
    32 #else
       
    33 const TInt KTestIterCount = 4000;
       
    34 #endif
       
    35 const TInt KMaxDesArgLen = 1000;
       
    36 enum TArgType 
       
    37 	{
       
    38 	EIntArgType, 
       
    39 	ETextArgType, 
       
    40 	EBinArgType, 
       
    41 	ELastArgType
       
    42 	};
       
    43 
       
    44 //////////////////////////////////////////////////////////////////////////////////////
       
    45 
       
    46 //If the SQL server crashes and the test receives KErrServerTerminated error, then the 
       
    47 //next set will contain the last:
       
    48 // - iteration number;
       
    49 // - handle type;
       
    50 // - function code;
       
    51 // - handle;
       
    52 // - IPC arguments values;
       
    53 struct TThreadData
       
    54 	{
       
    55 	TInt				iIteration;
       
    56 	TSqlSrvHandleType 	iHandleType;
       
    57 	TInt 				iFunction;
       
    58 	TInt 				iHandle;
       
    59 	TArgType 			iArgType[KMaxMessageArguments];
       
    60 	TInt 				iIntArg[KMaxMessageArguments];
       
    61 	TBuf<KMaxDesArgLen> iTextArg[KMaxMessageArguments];
       
    62 	TBuf8<KMaxDesArgLen> iBinArg[KMaxMessageArguments];
       
    63 	TInt64 				iSeed;
       
    64 	};
       
    65 //////////////////////////////////////////////////////////////////////////////////////
       
    66 
       
    67 _LIT(KPanicCategory, "SrvTerm");
       
    68 _LIT(KPanicCategory2, "InvArg");
       
    69 const TInt KPanicCode = 1111;
       
    70 const TInt KPanicCode2 = 2222;
       
    71 
       
    72 ///////////////////////////////////////////////////////////////////////////////////////
       
    73 
       
    74 //Deletes all created test files.
       
    75 void DeleteTestFiles()
       
    76 	{
       
    77 	RSqlDatabase::Delete(KTestDbName1);
       
    78 	}
       
    79 
       
    80 ///////////////////////////////////////////////////////////////////////////////////////
       
    81 ///////////////////////////////////////////////////////////////////////////////////////
       
    82 //Test macros and functions
       
    83 void Check1(TInt aValue, TInt aLine, TBool aPrintThreadName = EFalse)
       
    84 	{
       
    85 	if(!aValue)
       
    86 		{
       
    87 		DeleteTestFiles();
       
    88 		if(aPrintThreadName)
       
    89 			{
       
    90 			RThread th;
       
    91 			TName name = th.Name();
       
    92 			RDebug::Print(_L("*** Thread %S, Line %d\r\n"), &name, aLine);
       
    93 			}
       
    94 		else
       
    95 			{
       
    96 			RDebug::Print(_L("*** Line %d\r\n"), aLine);
       
    97 			}
       
    98 		TheTest(EFalse, aLine);
       
    99 		}
       
   100 	}
       
   101 void Check2(TInt aValue, TInt aExpected, TInt aLine, TBool aPrintThreadName = EFalse)
       
   102 	{
       
   103 	if(aValue != aExpected)
       
   104 		{
       
   105 		DeleteTestFiles();
       
   106 		if(aPrintThreadName)
       
   107 			{
       
   108 			RThread th;
       
   109 			TName name = th.Name();
       
   110 			RDebug::Print(_L("*** Thread %S, Line %d Expected error: %d, got: %d\r\n"), &name, aLine, aExpected, aValue);
       
   111 			}
       
   112 		else
       
   113 			{
       
   114 			RDebug::Print(_L("*** Line %d, Expected error: %d, got: %d\r\n"), aLine, aExpected, aValue);
       
   115 			}
       
   116 		TheTest(EFalse, aLine);
       
   117 		}
       
   118 	}
       
   119 #define TEST(arg) ::Check1((arg), __LINE__)
       
   120 #define TEST2(aValue, aExpected) ::Check2(aValue, aExpected, __LINE__)
       
   121 #define TTEST(arg) ::Check1((arg), __LINE__, ETrue)
       
   122 #define TTEST2(aValue, aExpected) ::Check2(aValue, aExpected, __LINE__, ETrue)
       
   123 
       
   124 ///////////////////////////////////////////////////////////////////////////////////////
       
   125 
       
   126 //Creates file session instance and the test directory
       
   127 void CreateTestEnv()
       
   128     {
       
   129 	TInt err = TheFs.Connect();
       
   130 	TEST2(err, KErrNone);
       
   131 
       
   132 	err = TheFs.MkDir(KTestDir);
       
   133 	TEST(err == KErrNone || err == KErrAlreadyExists);
       
   134 	}
       
   135 
       
   136 //Starts the SQL server process.
       
   137 TInt StartSqlServer()
       
   138 	{
       
   139 	const TUid KSqlSrvUid3 = {0x10281E17};//The same UID is in SqlSrv.mmp file
       
   140 	const TUidType serverUid(KNullUid, KNullUid, KSqlSrvUid3);
       
   141 	_LIT(KSqlSrvImg, "SqlSrv");//SQL server image name
       
   142 	RProcess server;
       
   143 	TInt err = server.Create(KSqlSrvImg, KNullDesC, serverUid);
       
   144 	if(err != KErrNone)
       
   145 		{
       
   146 		return err;
       
   147 		}
       
   148 	TRequestStatus stat;
       
   149 	server.Rendezvous(stat);
       
   150 	if(stat != KRequestPending)
       
   151 		{
       
   152 		server.Kill(0);		// abort startup
       
   153 		}
       
   154 	else
       
   155 		{
       
   156 		server.Resume();	// logon OK - start the server
       
   157 		}
       
   158 	User::WaitForRequest(stat);		// wait for start or death
       
   159 	// we can't use the 'exit reason' if the server panicked as this
       
   160 	// is the panic 'reason' and may be '0' which cannot be distinguished
       
   161 	// from KErrNone
       
   162 	err = (server.ExitType() == EExitPanic) ? KErrGeneral : stat.Int();
       
   163 	server.Close();
       
   164 	return err;
       
   165 	}
       
   166 
       
   167 //////////////////////////////////////////////////////////////////////////////////////////////////
       
   168 /////////////////////////////        RTestSqlDbSession          //////////////////////////////////
       
   169 //////////////////////////////////////////////////////////////////////////////////////////////////
       
   170 
       
   171 //Test client SQL session class
       
   172 class RTestSqlDbSession : public RSessionBase
       
   173 	{
       
   174 public:	
       
   175 	TInt Connect();
       
   176 	void Close();
       
   177 	TInt SendReceive(TInt aFunction);
       
   178 	TInt SendReceive(TInt aFunction, const TIpcArgs& aArgs);
       
   179 
       
   180 private:
       
   181 	TInt DoCreateSession();
       
   182 	};
       
   183 	
       
   184 TInt RTestSqlDbSession::Connect()
       
   185 	{
       
   186 	TInt err = DoCreateSession();
       
   187 	if(err == KErrNone)
       
   188 		{
       
   189 		TIpcArgs ipcArgs(KTestDbName1().Length(), &KTestDbName1(), 0, 0);
       
   190 		err = SendReceive(ESqlSrvDbOpen, ipcArgs);
       
   191 		}
       
   192 	if(err != KErrNone && err != KErrAlreadyExists)
       
   193 		{
       
   194 		Close();	
       
   195 		}
       
   196 	return err;
       
   197 	}
       
   198 
       
   199 void RTestSqlDbSession::Close()
       
   200 	{
       
   201 	if(Handle())
       
   202 		{
       
   203 		(void)SendReceive(ESqlSrvDbClose);
       
   204 		}
       
   205 	RSessionBase::Close();
       
   206 	}
       
   207 
       
   208 TInt RTestSqlDbSession::SendReceive(TInt aFunction)
       
   209 	{
       
   210 	return RSessionBase::SendReceive(aFunction);	
       
   211 	}
       
   212 	
       
   213 TInt RTestSqlDbSession::SendReceive(TInt aFunction, const TIpcArgs& aArgs)
       
   214 	{
       
   215 	return RSessionBase::SendReceive(aFunction, aArgs);	
       
   216 	}
       
   217 
       
   218 TInt RTestSqlDbSession::DoCreateSession()
       
   219 	{
       
   220 	const TInt KTimesToRetryConnection = 2;
       
   221 	TInt retry = KTimesToRetryConnection;
       
   222 	_LIT(KSqlSrvName, "!SQL Server");//SqlDb server name
       
   223 	//SQL server: major version number, minor version number, build number constants.
       
   224 	const TInt KSqlMajorVer = 1;
       
   225 	const TInt KSqlMinorVer = 1;
       
   226 	const TInt KSqlBuildVer = 0;
       
   227 	for(;;)
       
   228 		{
       
   229 		TInt err = CreateSession(KSqlSrvName, TVersion(KSqlMajorVer, KSqlMinorVer, KSqlBuildVer));
       
   230 		if(err != KErrNotFound && err != KErrServerTerminated)
       
   231 			{
       
   232 			return err;
       
   233 			}
       
   234 		if(--retry == 0)
       
   235 			{
       
   236 			return err;
       
   237 			}
       
   238 		err = ::StartSqlServer();
       
   239 		if(err != KErrNone && err != KErrAlreadyExists)
       
   240 			{
       
   241 			return err;
       
   242 			}
       
   243 		}
       
   244 	}
       
   245 	
       
   246 //////////////////////////////////////////////////////////////////////////////////////////////////
       
   247 //////////////////////////////////////////////////////////////////////////////////////////////////
       
   248 
       
   249 TInt SendReceive(RTestSqlDbSession aSession, TSqlSrvHandleType aHandleType, TInt aFunction, TInt aHandle, TIpcArgs& aArgs)
       
   250 	{
       
   251 	return aSession.SendReceive(::MakeMsgCode(static_cast <TSqlSrvFunction> (aFunction), aHandleType, aHandle), aArgs);
       
   252 	}
       
   253 
       
   254 TInt SendReceive(RTestSqlDbSession aSession, TInt aFunction, TIpcArgs& aArgs)
       
   255 	{
       
   256 	return aSession.SendReceive(aFunction, aArgs);
       
   257 	}
       
   258 
       
   259 void PrintIterationCount(TInt aIteration)
       
   260 	{
       
   261 	if((aIteration % 100) == 0)
       
   262 		{
       
   263 		TTime time;
       
   264 		time.HomeTime();
       
   265 		TDateTime dt = time.DateTime();
       
   266 		TBuf<16> tbuf;
       
   267 		tbuf.Format(_L("%02d:%02d:%02d.%06d"), dt.Hour(), dt.Minute(), dt.Second(), dt.MicroSecond());
       
   268 		RDebug::Print(_L("-----[%S] Test iterations: %d\r\n"), &tbuf, aIteration);
       
   269 		}
       
   270 	}
       
   271 
       
   272 //Worker thread function.
       
   273 //It behaves as a malicious client. Connects to the SQL server. In each test iteration generates some random values
       
   274 //for the function number, handle, handle type, IPC arguments. Then sends a command to the server using these
       
   275 //randomly generated values. If the server crashes and the thread function receives KErrServerTerminated error,
       
   276 //then the thread kills itself and the main thread will get KPanicCategory and KPanicCode as a reason for the
       
   277 //worker thread's death. The last set of randomly generated values will be stored in the memory, pointed by aData argument.
       
   278 TInt ThreadFunc1(void* aData)
       
   279 	{
       
   280 	__UHEAP_MARK;
       
   281 	
       
   282 	CTrapCleanup* tc = CTrapCleanup::New();
       
   283 	TTEST(tc != NULL);
       
   284 
       
   285 	TThreadData* p = static_cast <TThreadData*> (aData);
       
   286 	TTEST(p != NULL);
       
   287 	TThreadData& data = *p;
       
   288 
       
   289 	RTestSqlDbSession sess;
       
   290 	TInt err = sess.Connect();
       
   291 	TTEST2(err, KErrNone);
       
   292 
       
   293 	while(++data.iIteration <= KTestIterCount)
       
   294 		{
       
   295 		PrintIterationCount(data.iIteration);
       
   296 		TIpcArgs args;
       
   297 		do
       
   298 			{
       
   299 			data.iFunction = Math::Rand(data.iSeed) % (ESqlSrvStreamClose + 1);//ESqlSrvStreamClose - the last server message number)
       
   300 			}
       
   301 		while(data.iFunction >= ESqlSrvResourceMark && data.iFunction <= ESqlSrvSetHeapFailure);
       
   302 		for(TInt i=0;i<KMaxMessageArguments;++i)
       
   303 			{
       
   304 			//Initialize arguments
       
   305 			data.iArgType[i] = static_cast <TArgType> (Math::Rand(data.iSeed) % ELastArgType);
       
   306 			switch(data.iArgType[i])
       
   307 				{
       
   308 				case EIntArgType:
       
   309 					data.iIntArg[i] = Math::Rand(data.iSeed) % 9711;
       
   310 					args.Set(i, data.iIntArg[i]);
       
   311 					break;
       
   312 				case ETextArgType:
       
   313 					{
       
   314 					TInt len = Math::Rand(data.iSeed) % KMaxDesArgLen;	
       
   315 					data.iTextArg[i].SetLength(len);
       
   316 					args.Set(i, &data.iTextArg[i]);
       
   317 					}
       
   318 					break;
       
   319 				case EBinArgType:
       
   320 					{
       
   321 					TInt len = Math::Rand(data.iSeed) % KMaxDesArgLen;	
       
   322 					data.iBinArg[i].SetLength(len);
       
   323 					args.Set(i, &data.iBinArg[i]);
       
   324 					}
       
   325 					break;
       
   326 				default:
       
   327 					User::Panic(KPanicCategory2, KPanicCode2);
       
   328 					break;
       
   329 				}
       
   330 			}
       
   331 		//Send arguments
       
   332 		User::SetJustInTime(EFalse);
       
   333 		TInt err = KErrNone;
       
   334 		if((Math::Rand(data.iSeed) % 5) == 0)	//Pass a handle (statement or stream)
       
   335 			{
       
   336 			data.iHandleType = (Math::Rand(data.iSeed) % 2) ? ESqlSrvStatementHandle : ESqlSrvStreamHandle;
       
   337 			data.iHandle = Math::Rand(data.iSeed) % 64;
       
   338 			err = ::SendReceive(sess, data.iHandleType, data.iFunction, data.iHandle, args);
       
   339 			}
       
   340 		else
       
   341 			{
       
   342 			err = ::SendReceive(sess, data.iFunction, args);
       
   343 			}
       
   344 		if(err == KErrServerTerminated)
       
   345 			{
       
   346 			User::Panic(KPanicCategory, KPanicCode);
       
   347 			}
       
   348 		User::SetJustInTime(ETrue);
       
   349 		}
       
   350 
       
   351 	sess.Close();
       
   352 
       
   353 	delete tc;	
       
   354 	
       
   355 	__UHEAP_MARKEND;
       
   356 	
       
   357 	return KErrNone;		
       
   358 	}
       
   359 
       
   360 /**
       
   361 @SYMTestCaseID			SYSLIB-SQL-CT-1769
       
   362 @SYMTestCaseDesc		In a loop, where the loop iterations are less than KTestIterCount (5000 at the moment), 
       
   363 						the test creates a public shared database and a worker thread, which will behave as 
       
   364 						malicious client. If the worker thread crashes the SQL server, then the worker thread
       
   365 						dies notifying the main thread about the SQL server crash. The main thread prints the 
       
   366 						values used in the last IPC call and crashes the test.
       
   367 @SYMTestPriority		High
       
   368 @SYMTestActions			SQL, Malicious client simulation test.
       
   369 @SYMTestExpectedResults Test must not fail
       
   370 @SYMREQ					REQ5792
       
   371                         REQ5793
       
   372 						REQ10405
       
   373 						REQ10407
       
   374 */	
       
   375 void BadClientTest()
       
   376 	{
       
   377 	TThreadData* p = new TThreadData;
       
   378 	TEST(p != NULL);
       
   379 	TThreadData& data = *p;
       
   380 	data.iFunction = 0;
       
   381 	TTime now;
       
   382 	now.UniversalTime();
       
   383 	data.iSeed = now.Int64();
       
   384 	
       
   385 	_LIT(KThreadName, "WorkThrd");
       
   386 	
       
   387 	for(data.iIteration=0;data.iIteration<KTestIterCount;++data.iIteration)
       
   388 		{
       
   389 		PrintIterationCount(data.iIteration);
       
   390 		//Create/open the test database
       
   391 		RSqlDatabase db;
       
   392 		TInt err = db.Create(KTestDbName1);
       
   393 		TEST(err == KErrNone || err == KErrAlreadyExists);
       
   394 		if(err == KErrNone)
       
   395 			{
       
   396 			err = db.Exec(_L8("CREATE TABLE A(Id INTEGER); INSERT INTO A(Id) VALUES(1); INSERT INTO A(Id) VALUES(2);"));	
       
   397 			TEST(err >= 0);
       
   398 			}
       
   399 		db.Close();
       
   400 		//Run the malicious client (one worker theread which will try to crash the SQL server)
       
   401 		RThread thread;
       
   402 		TEST2(thread.Create(KThreadName, &ThreadFunc1, 0x2000, 0x1000, 0x10000, &data, EOwnerProcess), KErrNone);
       
   403 		TRequestStatus status;
       
   404 		thread.Logon(status);
       
   405 		TEST2(status.Int(), KRequestPending);
       
   406 		thread.Resume();
       
   407 		User::WaitForRequest(status);
       
   408 		User::SetJustInTime(ETrue);	// enable debugger panic handling
       
   409 		if(thread.ExitType() == EExitPanic)
       
   410 			{
       
   411 			if(thread.ExitReason() == KPanicCode)
       
   412 				{
       
   413 				TheTest.Printf(_L("##Server terminated!\r\n"));
       
   414 				TheTest.Printf(_L("##Iteration=%d, Handle type(hex)=%X, Function(hex)=%X, Handle=%d\r\n"), data.iIteration, data.iHandleType, data.iFunction, data.iHandle);
       
   415 				for(TInt i=0;i<KMaxMessageArguments;++i)
       
   416 					{
       
   417 					switch(data.iArgType[i])
       
   418 						{
       
   419 						case EIntArgType:
       
   420 							TheTest.Printf(_L("##Arg %d, Integer, value=%d\r\n"), i, data.iIntArg[i]);
       
   421 							break;
       
   422 						case ETextArgType:
       
   423 							TheTest.Printf(_L("##Arg %d, Text,    length=%d\r\n"), i, data.iTextArg[i].Length());
       
   424 							break;
       
   425 						case EBinArgType:
       
   426 							TheTest.Printf(_L("##Arg %d, Binary,  length=%d\r\n"), i, data.iBinArg[i].Length());
       
   427 							break;
       
   428 						default:
       
   429 							TheTest.Printf(_L("##Arg %d, Invalid argument type: %d\r\n"), i, data.iArgType[i]);
       
   430 							break;
       
   431 						}
       
   432 					}
       
   433 				TEST(0);
       
   434 				}
       
   435 			}
       
   436 		thread.Close();
       
   437 		}
       
   438 	User::SetJustInTime(ETrue);	// enable debugger panic handling
       
   439 	delete p;
       
   440 	}
       
   441 
       
   442 RSqlSecurityPolicy CreateSecurityPolicy()
       
   443 	{
       
   444 	RSqlSecurityPolicy securityPolicy;
       
   445 	const TSecurityPolicy KDefaultPolicy(TSecurityPolicy::EAlwaysPass);
       
   446 	TInt err = securityPolicy.Create(KDefaultPolicy);
       
   447 	TEST2(err, KErrNone);
       
   448 	return securityPolicy;
       
   449 	}
       
   450 
       
   451 void DoBadNameTest(RSqlDatabase& aDb)
       
   452 	{
       
   453 	TFileName invalidFileName1;
       
   454 	invalidFileName1.SetLength(KMaxFileName);
       
   455 	//Initialise the first character so that it is not treated as an empty descriptor by the sever
       
   456 	invalidFileName1[0] = TChar(204); //0xCC
       
   457 	TFileName invalidFileName2;
       
   458 	invalidFileName2.SetLength(KMaxFileName);
       
   459 	invalidFileName2.Fill(TChar(204));//0xCC
       
   460 	
       
   461 	TInt err = aDb.Attach(invalidFileName1, invalidFileName2);
       
   462 	TheTest.Printf(_L("Attach, invalid database name-1, err=%d\r\n"), err);
       
   463 	TEST(err != KErrNone);
       
   464 	err = aDb.Attach(invalidFileName2, invalidFileName1);
       
   465 	TheTest.Printf(_L("Attach, invalid database name-2, err=%d\r\n"), err);
       
   466 	TEST(err != KErrNone);
       
   467 	err = aDb.Attach(KTestDbName2, invalidFileName2);
       
   468 	TheTest.Printf(_L("Attach, invalid database name-3, err=%d\r\n"), err);
       
   469 	TEST(err != KErrDied);
       
   470 	if(err == KErrNone)
       
   471 		{
       
   472 		err = aDb.Detach(invalidFileName2);
       
   473 		TheTest.Printf(_L("Detach, invalid database name-3, err=%d\r\n"), err);
       
   474 		TEST2(err, KErrNone);
       
   475 		}
       
   476 	err = aDb.Attach(KTestDbName2, invalidFileName1);
       
   477 	TheTest.Printf(_L("Attach, invalid database name-4, err=%d\r\n"), err);
       
   478 	TEST(err != KErrDied);
       
   479 	if(err == KErrNone)
       
   480 		{
       
   481 		err = aDb.Detach(invalidFileName1);
       
   482 		TheTest.Printf(_L("Detach, invalid database name-4, err=%d\r\n"), err);
       
   483 		TEST2(err, KErrNone);
       
   484 		}
       
   485 	
       
   486 	RSqlDatabase::TSize size;
       
   487 
       
   488 	err = aDb.Size(size, invalidFileName1);
       
   489 	TheTest.Printf(_L("Size, invalid database name-1, err=%d\r\n"), err);
       
   490 	TEST(err != KErrNone);
       
   491 	err = aDb.Size(size, invalidFileName2);
       
   492 	TheTest.Printf(_L("Size, invalid database name-2, err=%d\r\n"), err);
       
   493 	TEST(err != KErrNone);
       
   494 
       
   495 	err = aDb.Compact(RSqlDatabase::EMaxCompaction, invalidFileName1);
       
   496 	TheTest.Printf(_L("Compact, invalid database name-1, err=%d\r\n"), err);
       
   497 	TEST(err != KErrNone);
       
   498 	err = aDb.Compact(RSqlDatabase::EMaxCompaction, invalidFileName2);
       
   499 	TheTest.Printf(_L("Compact, invalid database name-2, err=%d\r\n"), err);
       
   500 	TEST(err != KErrNone);
       
   501 
       
   502 	RSqlStatement stmt;
       
   503 	err = stmt.Prepare(aDb, _L("SELECT * FROM A"));
       
   504 	TEST2(err, KErrNone);
       
   505 	
       
   506 	err = stmt.ColumnIndex(invalidFileName1);
       
   507 	TheTest.Printf(_L("ColumnIndex, invalid column name-1, err=%d\r\n"), err);
       
   508 	TEST(err != KErrNone);
       
   509 	err = stmt.ColumnIndex(invalidFileName2);
       
   510 	TheTest.Printf(_L("ColumnIndex, invalid column name-2, err=%d\r\n"), err);
       
   511 	TEST(err != KErrNone);
       
   512 	err = stmt.ParameterIndex(invalidFileName1);
       
   513 	TheTest.Printf(_L("ParameterIndex, invalid parameter name-1, err=%d\r\n"), err);
       
   514 	TEST(err != KErrNone);
       
   515 	err = stmt.ParameterIndex(invalidFileName2);
       
   516 	TheTest.Printf(_L("ParameterIndex, invalid parameter name-2, err=%d\r\n"), err);
       
   517 	TEST(err != KErrNone);
       
   518 
       
   519 	stmt.Close();
       
   520 	}
       
   521 
       
   522 /**
       
   523 @SYMTestCaseID			SYSLIB-SQL-UT-4048
       
   524 @SYMTestCaseDesc		Bad database names - robustness test.
       
   525 						The test defines file names with invalid content and attempts to use 
       
   526 						these file names with the SQL API. The test should not cause crashes 
       
   527 						in the SQL server.
       
   528 @SYMTestPriority		High
       
   529 @SYMTestActions			Bad database names - robustness test.
       
   530 @SYMTestExpectedResults Test must not fail
       
   531 @SYMREQ					REQ10405
       
   532                         REQ10407
       
   533 */
       
   534 void BadNameTest()
       
   535 	{
       
   536 	TFileName invalidFileName1;
       
   537 	invalidFileName1.SetLength(KMaxFileName);
       
   538 	TFileName invalidFileName2;
       
   539 	invalidFileName2.SetLength(KMaxFileName / 2);
       
   540 	
       
   541 	//Initialise the first character so that it is not treated as an empty descriptor by the sever
       
   542 	invalidFileName1[0] = TChar(204); //0xCC
       
   543 	invalidFileName2[0] = TChar(204); //0xCC
       
   544 	
       
   545 	(void)RSqlDatabase::Delete(KTestDbName1);
       
   546 	(void)RSqlDatabase::Delete(KTestDbName2);
       
   547 		
       
   548 	RSqlDatabase db;
       
   549 	TInt err = db.Create(invalidFileName1);
       
   550 	TEST(err != KErrNone);
       
   551 	err = db.Create(invalidFileName2);
       
   552 	TEST(err != KErrNone);
       
   553 
       
   554 	err = db.Open(invalidFileName1);
       
   555 	TEST(err != KErrNone);
       
   556 	err = db.Open(invalidFileName2);
       
   557 	TEST(err != KErrNone);
       
   558 
       
   559 	err = db.Create(KTestDbName1);
       
   560 	TEST2(err, KErrNone);
       
   561 	err = db.Exec(_L("CREATE TABLE A(I INTEGER)"));
       
   562 	TEST(err >= 0);
       
   563 	db.Close();
       
   564 	
       
   565 	RSqlSecurityPolicy sp = CreateSecurityPolicy();
       
   566 	err = db.Create(KTestDbName2, sp);
       
   567 	TEST2(err, KErrNone);
       
   568 	sp.Close();
       
   569 	err = db.Exec(_L("CREATE TABLE A(I INTEGER)"));
       
   570 	TEST(err >= 0);
       
   571 	db.Close();
       
   572 
       
   573 	TheTest.Printf(_L("Bad names test - public shared database\r\n"));
       
   574 	err = db.Open(KTestDbName1);	
       
   575 	TEST2(err, KErrNone);
       
   576 	DoBadNameTest(db);
       
   577 	db.Close();
       
   578 
       
   579 	TheTest.Printf(_L("Bad names test - public secure shared database\r\n"));
       
   580 	err = db.Open(KTestDbName2);	
       
   581 	TEST2(err, KErrNone);
       
   582 	DoBadNameTest(db);
       
   583 	db.Close();
       
   584 	
       
   585 	(void)RSqlDatabase::Delete(KTestDbName2);
       
   586 	(void)RSqlDatabase::Delete(KTestDbName1);
       
   587 	
       
   588 	err = RSqlDatabase::Copy(invalidFileName1, invalidFileName2);
       
   589 	TheTest.Printf(_L("Copy database, err=%d\r\n"), err);
       
   590 	TEST(err != KErrNone);
       
   591 	err = RSqlDatabase::Delete(invalidFileName1);
       
   592 	TheTest.Printf(_L("Delete database-1, err=%d\r\n"), err);
       
   593 	TEST(err != KErrNone);
       
   594 	err = RSqlDatabase::Delete(invalidFileName2);
       
   595 	TheTest.Printf(_L("Delete database-2, err=%d\r\n"), err);
       
   596 	TEST(err != KErrNone);
       
   597 	}
       
   598 	
       
   599 void DoTests()
       
   600 	{
       
   601 	TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-SQL-CT-1769 Bad client test "));
       
   602 	BadClientTest();
       
   603 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SQL-UT-4048 Bad names test"));
       
   604 	BadNameTest();
       
   605 	}
       
   606 
       
   607 TInt E32Main()
       
   608 	{
       
   609 	TheTest.Title();
       
   610 	
       
   611 	CTrapCleanup* tc = CTrapCleanup::New();
       
   612 	
       
   613 	__UHEAP_MARK;
       
   614 	
       
   615 	DeleteTestFiles();
       
   616 	CreateTestEnv();
       
   617 	DoTests();
       
   618 	DeleteTestFiles();
       
   619 	TheFs.Close();
       
   620 
       
   621 	__UHEAP_MARKEND;
       
   622 	
       
   623 	TheTest.End();
       
   624 	TheTest.Close();
       
   625 	
       
   626 	delete tc;
       
   627 
       
   628 	User::Heap().Check();
       
   629 	return KErrNone;
       
   630 	}