os/persistentdata/persistentstorage/dbms/pcdbms/tdbms/src/t_fail.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 1998-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 <d32dbms.h>
    17 #include <e32math.h>
    18 #include <s32file.h>
    19 #include <e32test.h>
    20 #include "t_fail.h"
    21 
    22 #include "crccheck.h"
    23 
    24 #undef __UHEAP_MARK
    25 #define __UHEAP_MARK
    26 #undef __UHEAP_MARKEND
    27 #define __UHEAP_MARKEND
    28 #undef __UHEAP_CHECK
    29 #define __UHEAP_CHECK(a)
    30 
    31 LOCAL_D TDBMS_CRCChecks TheCrcChecker;
    32 
    33 #ifndef __linux__ //No CRC test on LINUX
    34 #ifdef __TOOLS2__
    35 const TPtrC	KCrcRecord=_L("\\epoc32\\winscw\\c\\dbms-tst\\T_FAIL.CRC");
    36 #else
    37 const TPtrC	KCrcRecord=_L("C:\\dbms-tst\\T_FAIL.CRC");
    38 #endif
    39 #endif
    40 
    41 #define CRCCHECK  (TheCrcChecker.GenerateCrcL(KTestDatabase))
    42 
    43 
    44 _LIT(KTestTitle,"T_FAIL: DBMS Failure mode test");
    45 GLDEF_D RTest test(KTestTitle);
    46 GLDEF_D RDbs TheDbs;
    47 GLDEF_D RDbNamedDatabase TheDatabase;
    48 GLDEF_D TClientHeap KClientHeap;
    49 GLDEF_D TServerHeap KServerHeap;
    50 
    51 
    52 LOCAL_D CTrapCleanup* TheTrapCleanup;
    53 LOCAL_D RFs TheFs;
    54 LOCAL_D RDbView TheView;
    55 LOCAL_D RDbTable TheTable;
    56 LOCAL_D RDbRowSet::TAccess Access;
    57 LOCAL_D CDbColSet* TheColSet;
    58 LOCAL_D CDbKey* TheKey;
    59 LOCAL_D const TDesC* TheSql;
    60 LOCAL_D TBuf<64> TheFormat;
    61 
    62 const TInt KTestCleanupStack=0x20;
    63 
    64 #ifndef __TOOLS2__
    65 const TPtrC KTestDatabase=_L("C:\\dbms-tst\\t_fail.db");
    66 #else
    67 const TPtrC KTestDatabase=_L(".\\dbms-tst\\t_fail.db");
    68 #endif
    69 
    70 _LIT(TableName,"Table1");
    71 _LIT(TableName2,"Table_two");
    72 _LIT(TableNameX,"Bad Table Name");
    73 _LIT(IndexName,"Index1");
    74 _LIT(IndexName2,"Index2");
    75 _LIT(Column1,"column_one");
    76 _LIT(Column1Fold,"COLUMN_ONE");
    77 _LIT(Column2,"column_2");
    78 _LIT(Column2X,"column_2%");
    79 _LIT(SimpleSql,"select * from Table1");
    80 _LIT(UpdateSql,"update Table1 SET column_2='hello'");
    81 
    82 //const TPtrC ComplexSql(_S("select * from Table1 where column_one<0 and not column_one is null or column_2 not like '*fred*' and column_2>'m' order by column_one desc"));
    83 const TPtrC ComplexSql[]=
    84 	{
    85 	_S("select * from Table1 where column_one<0 and column_one is null"),
    86 	_S("select * from Table1 where column_one<0 and (column_one is null and column_2 like '')"),
    87 	_S("select * from Table1 where (column_one<0 and column_one is null) and column_2 like ''"),
    88 	_S("select * from Table1 where (column_one<0 and column_one is null) and (column_2 like '' and column_one>0)"),
    89 	_S("select * from Table1 where (column_one<0 and column_one is null) and (column_2 like '' and column_one>0 and column_one is null)"),
    90 	_S("select * from Table1 where (column_one<0 and column_one is null and column_one = 10) and (column_2 like '' and column_one>0 and column_one is null)"),
    91 	_S("select * from Table1 where column_one<0 and column_one is null and column_one = 10 and column_2 like '' and column_one>0 and column_one is null")
    92 	};
    93 
    94 struct SSqlErrors
    95 	{
    96 	const TText* iSql;
    97 	TInt iError;
    98 	};
    99 
   100 LOCAL_D SSqlErrors const BadSql[]=
   101 	{
   102 		{_S("sponge"),KErrArgument},
   103 		{_S("select * from widget"),KErrNotFound},
   104 		{_S("select * from Table1 where x = 0"),KErrNotFound},
   105 		{_S("select * from Table1 where x 0 like"),KErrArgument},
   106 		{_S("select * from Table1 where column_2>'a' and column_one<'z'"),KErrGeneral},
   107 		{_S("select from Table1"),KErrArgument},
   108 		{_S("select x, from Table1"),KErrArgument},
   109 		{_S("select x from Table1"),KErrNotFound},
   110 		{_S("select column_2 column_one from Table1"),KErrArgument},
   111 		{_S("select * from Table1 order by x"),KErrNotFound},
   112 		{_S("select * from Table1 order column_one"),KErrArgument},
   113 		{_S("select * from Table1 order by column_one down"),KErrArgument}
   114 	};
   115 
   116 GLDEF_C void Connect()
   117 	{
   118 #ifndef __TOOLS2__
   119 	TInt r=TheDbs.Connect();
   120 	test (r==KErrNone);
   121 	TheDbs.ResourceMark();
   122 #endif
   123 	}
   124 
   125 GLDEF_C void Disconnect()
   126 	{
   127 #ifndef __TOOLS2__
   128 	TheDbs.ResourceCheck();
   129 	TheDbs.Close();
   130 #endif
   131 	}
   132 
   133 
   134 //SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version
   135 LOCAL_C void DbCreateL()
   136 	{
   137 	User::LeaveIfError(TheDatabase.Replace(TheFs,KTestDatabase,TheFormat));
   138 	}
   139 
   140 //SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version
   141 LOCAL_C void DbOpenL()
   142 	{
   143 	User::LeaveIfError(TheDatabase.Open(TheFs,KTestDatabase,TheFormat));
   144 	CleanupClosePushL(TheDatabase);
   145 	delete TheDatabase.TableNamesL();	// force a schema load
   146 	CleanupStack::Pop();
   147 	}
   148 
   149 //SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version
   150 LOCAL_C void DbShareL()
   151 	{
   152 	User::LeaveIfError(TheDatabase.Open(TheDbs,KTestDatabase,TheFormat));
   153 	CleanupClosePushL(TheDatabase);
   154 	delete TheDatabase.TableNamesL();	// force a schema load
   155 	CleanupStack::Pop();
   156 	}
   157 
   158 
   159 /**
   160 @SYMTestCaseID          SYSLIB-DBMS-CT-0612
   161 @SYMTestCaseDesc        Database validity test
   162 @SYMTestPriority        Medium
   163 @SYMTestActions         Tests for opening and closing of database
   164 @SYMTestExpectedResults Test must not fail
   165 @SYMREQ                 REQ0000
   166 */
   167 LOCAL_C void TestOpen()
   168 	{
   169 	_LIT(KFileNotFound,"not a database");
   170 	TInt r=TheDatabase.Open(TheFs,KFileNotFound);
   171 	test (r==KErrNotFound || r==KErrPathNotFound);
   172 //
   173 	_LIT(KPathNotFound,"C:\\not a path\\database.db");
   174 	r=TheDatabase.Open(TheFs,KPathNotFound);
   175 #ifndef __TOOLS2__
   176 	test (r==KErrPathNotFound);
   177 #else
   178 	// Tools2 f32 does not return KErrPathNotFound
   179 	test( (r==KErrPathNotFound) || (r==KErrNotFound));
   180 #endif
   181 //
   182 	_LIT(KNotFormat,"not.a.dbx");
   183 	r=TheDatabase.Open(TheFs,KFileNotFound,KNotFormat);
   184 	test (r==KErrNotFound || r==KErrPathNotFound);
   185 //
   186 	DbCreateL();
   187 	TheDatabase.Close();
   188 	TInt err = CRCCHECK;
   189 	test(err == KErrNone);
   190 	r=TheDatabase.Open(TheFs,KTestDatabase,TUid::Uid(0x01234567).Name());
   191 	test (r==KErrNone); // New code has no loadable drivers, it is irrelevant to expect error here
   192 	TheDatabase.Close(); // We have added it here because previous statement does not return error anymore
   193 	err = CRCCHECK;
   194 	test(err == KErrNone);
   195 //
   196 	RFile f;
   197 	r=f.Replace(TheFs,KTestDatabase,EFileWrite);
   198 	test (r==KErrNone);
   199 	TCheckedUid type(KDirectFileStoreLayoutUid);
   200 	r=f.Write(type.Des());
   201 	test (r==KErrNone);
   202 	f.Close();
   203 	r=TheDatabase.Open(TheFs,KTestDatabase);
   204 	test (r==KErrNotSupported);
   205 //
   206 	_LIT(KDefaultFormat,"epoc");
   207 	r=TheDatabase.Open(TheFs,KTestDatabase,KDefaultFormat);
   208 	test (r==KErrNotSupported); // We expect not supported db here
   209 	}
   210 
   211 class TClient : public TContext
   212 	{
   213 public:
   214 	TClient() {}
   215 private:
   216 	void OpenDbL() const
   217 		{DbOpenL();}
   218 	};
   219 class TServer : public TContext
   220 	{
   221 public:
   222 	TServer() {}
   223 private:
   224 	void OpenDbL() const
   225 		{DbShareL();}
   226 	};
   227 
   228 const TClient KClient;
   229 const TServer KServer;
   230 
   231 void TFail::Test(const THeapFail& aHeap,const TContext* aContext)
   232 	{
   233 	TInt ii;
   234 	TInt errCode;
   235 	for (ii=1;;++ii)
   236 		{
   237 		if (aContext)
   238 			{
   239 			TRAP(errCode, aContext->OpenDbL());
   240 			if(errCode != KErrNone)
   241 				return;
   242 			}
   243 		aHeap.Fail(ii);
   244 		aHeap.Mark();
   245 		TRAPD(r,RunL());
   246 		aHeap.Reset();
   247 		if (r==KErrNone)
   248 			break;
   249 		test(r==KErrNoMemory);
   250 		if (aContext)
   251 			{
   252 			TheDatabase.Close();
   253 			TRAPD(lc, errCode = CRCCHECK);
   254 			test(errCode == KErrNone);
   255 			test(lc == KErrNone);
   256 			}
   257 		aHeap.Check();
   258 		}
   259 	End();
   260 	if (aContext)
   261 		{
   262 		TheDatabase.Close();
   263 		TRAPD(lc, errCode = CRCCHECK);
   264 		test(errCode == KErrNone);
   265 		test(lc == KErrNone);
   266 		}
   267 	aHeap.Check();
   268 	}
   269 
   270 class TFailCreateDatabase : public TFail
   271 	{
   272 	void RunL()
   273 		{DbCreateL();}
   274 	void End()
   275 		{
   276 		TheDatabase.Close();
   277 		TInt err;
   278 		TRAPD(lc, err = CRCCHECK);
   279 		test(err == KErrNone);
   280 		test(lc == KErrNone);
   281 		}
   282 	};
   283 
   284 class TFailOpenDatabase : public TFail
   285 	{
   286 	void RunL()
   287 		{DbOpenL();}
   288 	void End()
   289 		{
   290 		TheDatabase.Close();
   291 		TInt err;
   292 		TRAPD(lc, err = CRCCHECK);
   293 		test(err == KErrNone);
   294 		test(lc == KErrNone);
   295 	   	}
   296 	};
   297 
   298 class TFailShareDatabase : public TFail
   299 	{
   300 	void RunL()
   301 		{DbShareL();}
   302 	void End()
   303 		{
   304 		TheDatabase.Close();
   305 // Unfortunately it is not possible to generate CRC checks here. The
   306 // database on a number of occasions is still open by another instance.
   307 // This causes a KErrInUse in the CRC check code for Symbian, but
   308 // works on TOOLS2, thus giving probably spurious mismatches.
   309 //		TInt err;
   310 //		TRAPD(lc, err = CRCCHECK);
   311 //		RDebug::Print(_L("ERROR %d\n"), err);
   312 //		test(err == KErrNone);
   313 //		test(lc == KErrNone);
   314 	   	}
   315 	};
   316 
   317 /**
   318 @SYMTestCaseID          SYSLIB-DBMS-CT-0613
   319 @SYMTestCaseDesc        Tests for allocation failures on creating a database
   320 @SYMTestPriority        Medium
   321 @SYMTestActions         Tests for allocation failure for differently sourced databases
   322 @SYMTestExpectedResults Test must not fail
   323 @SYMREQ                 REQ0000
   324 */
   325 LOCAL_C void Origins()
   326 	{
   327 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0613 Allocation failures on Creating a database "));
   328 	TFailCreateDatabase t1;
   329 	t1.Test(KClientHeap);
   330 //
   331 	test.Next(_L("Fail to create existing database"));
   332 #ifndef __TOOLS2__
   333 	TUint att;
   334 	TInt r=TheFs.Att(KTestDatabase,att);
   335 	test (r==KErrNone);
   336 #else
   337 	TInt r;
   338 #endif
   339 	r=TheDatabase.Create(TheFs,KTestDatabase,TheFormat);
   340 	test (r==KErrAlreadyExists);
   341 #ifndef __TOOLS2__
   342 	r=TheFs.Att(KTestDatabase,att);
   343 	test (r==KErrNone);
   344 #endif
   345 //
   346 	test.Next(_L("Allocation failures on Open"));
   347 	TFailOpenDatabase t2;
   348 	t2.Test(KClientHeap);
   349 //
   350 	test.Next(_L("Allocation failures on 1st Share"));
   351 	Connect();
   352 	TFailShareDatabase t3;
   353 	t3.Test(KClientHeap);
   354 	t3.Test(KServerHeap);
   355 //
   356 	test.Next(_L("Allocation failures on 2nd Share"));
   357 	DbShareL();
   358 	RDbNamedDatabase temp=TheDatabase;TheDatabase=RDbNamedDatabase();
   359 	t3.Test(KClientHeap);
   360 	t3.Test(KServerHeap);
   361 	temp.Close();
   362 	Disconnect();
   363 	test.End();
   364 	}
   365 
   366 
   367 class TFailCreateTable : public TFail
   368 	{
   369 	void RunL()
   370 		{User::LeaveIfError(TheDatabase.CreateTable(TableName,*TheColSet));}
   371 	};
   372 
   373 class TFailAlterTable : public TFail
   374 	{
   375 	void RunL()
   376 		{User::LeaveIfError(TheDatabase.AlterTable(TableName,*TheColSet));}
   377 	};
   378 
   379 class TFailDropTable : public TFail
   380 	{
   381 	void RunL()
   382 		{User::LeaveIfError(TheDatabase.DropTable(TableName));}
   383 	};
   384 
   385 class TFailCreateIndex : public TFail
   386 	{
   387 	void RunL()
   388 		{User::LeaveIfError(TheDatabase.CreateIndex(IndexName,TableName,*TheKey));}
   389 	};
   390 
   391 class TFailDropIndex : public TFail
   392 	{
   393 	void RunL()
   394 		{User::LeaveIfError(TheDatabase.DropIndex(IndexName,TableName));}
   395 	};
   396 
   397 class TFailGetObject : public TFail
   398 	{
   399 protected:
   400 	void End()
   401 		{delete iObject;}
   402 protected:
   403 	CBase* iObject;
   404 	};
   405 
   406 class TFailDatabaseTables : public TFailGetObject
   407 	{
   408 	void RunL()
   409 		{iObject=TheDatabase.TableNamesL();}
   410 	};
   411 
   412 class TFailDatabaseColSet : public TFailGetObject
   413 	{
   414 	void RunL()
   415 		{iObject=TheDatabase.ColSetL(TableName);}
   416 	};
   417 
   418 class TFailDatabaseIndexes : public TFailGetObject
   419 	{
   420 	void RunL()
   421 		{iObject=TheDatabase.IndexNamesL(TableName);}
   422 	};
   423 
   424 class TFailDatabaseKeys : public TFailGetObject
   425 	{
   426 	void RunL()
   427 		{iObject=TheDatabase.KeyL(IndexName,TableName);}
   428 	};
   429 
   430 const TInt KRowCount=60;
   431 
   432 LOCAL_C void WriteTableL()
   433 	{
   434 	DbOpenL();
   435 	TInt r=TheTable.Open(TheDatabase,TableName);
   436 	test (r==KErrNone);
   437 	TheDatabase.Begin();
   438 	for (TInt ii=0;ii<KRowCount;++ii)
   439 		{
   440 		TheTable.InsertL();
   441 		TheTable.SetColL(1,TUint((ii*17)%KRowCount));
   442 		TheTable.PutL();
   443 		}
   444 	r=TheDatabase.Commit();
   445 	test (r==KErrNone);
   446 	TheTable.Close();
   447 	TheDatabase.Close();
   448 	TInt err = CRCCHECK;
   449 	test(err == KErrNone);
   450 	}
   451 
   452 LOCAL_C void Database()
   453 	{
   454 	test.Start(_L("Adding and dropping tables"));
   455 	DbCreateL();
   456 // ensure the database locking list has been allocated
   457 	TheDatabase.Begin();
   458 	TheDatabase.Commit();
   459 //
   460 	CDbColSet *col=CDbColSet::NewLC();
   461 //
   462 	test.Next(_L("Empty Column Set"));
   463 	__UHEAP_MARK;
   464 	test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
   465 	__UHEAP_MARKEND;
   466 //
   467 	test.Next(_L("Invalid table name"));
   468 	col->AddL(TDbCol(Column1,EDbColInt32));
   469 	__UHEAP_MARK;
   470 	test(TheDatabase.CreateTable(TableNameX,*col)!=KErrNone);
   471 	__UHEAP_MARKEND;
   472 //
   473 	test.Next(_L("Invalid column name"));
   474 	col->AddL(TDbCol(Column2X,EDbColBit));
   475 	__UHEAP_MARK;
   476 	test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
   477 	__UHEAP_MARKEND;
   478 //
   479 	test.Next(_L("Duplicate column name"));
   480 	col->Remove(Column2X);
   481 	col->AddL(TDbCol(Column1Fold,EDbColBit));
   482 	__UHEAP_MARK;
   483 	test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
   484 	__UHEAP_MARKEND;
   485 //
   486 	test.Next(_L("Invalid column type"));
   487 	col->Remove(Column1);
   488 	col->AddL(TDbCol(Column2,TDbColType(-1)));
   489 	__UHEAP_MARK;
   490 	test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
   491 	__UHEAP_MARKEND;
   492 //
   493 	test.Next(_L("Invalid maximum length"));
   494 	col->Remove(Column2);
   495 	col->AddL(TDbCol(Column2,EDbColInt32,0));
   496 	__UHEAP_MARK;
   497 	test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
   498 	__UHEAP_MARKEND;
   499 //
   500 	test.Next(_L("Invalid attributes"));
   501 	col->Remove(Column2);
   502 	TDbCol cc(Column2,EDbColInt32);
   503 	cc.iAttributes=13;
   504 	col->AddL(cc);
   505 	__UHEAP_MARK;
   506 	test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
   507 	__UHEAP_MARKEND;
   508 //
   509 	test.Next(_L("Adding/dropping a table name twice"));
   510 	col->Remove(Column2);
   511 	col->AddL(TDbCol(Column2,EDbColText8));
   512 	__UHEAP_MARK;
   513 	test(TheDatabase.CreateTable(TableName,*col)==KErrNone);
   514 	test(TheDatabase.CreateTable(TableName,*col)==KErrAlreadyExists);
   515 	test(TheDatabase.DropTable(TableNameX)!=KErrNone);
   516 	test(TheDatabase.DropTable(TableName)==KErrNone);
   517 	test(TheDatabase.DropTable(TableName)==KErrNotFound);
   518 	__UHEAP_MARKEND;
   519 //
   520 	test.Next(_L("Adding and dropping indexes"));
   521 	test(TheDatabase.CreateTable(TableName,*col)==KErrNone);
   522 	TheDatabase.Close();
   523 	TInt err = CRCCHECK;
   524 	test(err == KErrNone);
   525 	CDbKey *key=CDbKey::NewLC();
   526 	__UHEAP_MARK;
   527 	DbOpenL();
   528 	test(TheDatabase.CreateIndex(IndexName,TableName,*key)!=KErrNone);
   529 	TheDatabase.Close();
   530 	err = CRCCHECK;
   531 	test(err == KErrNone);
   532 	__UHEAP_MARKEND;
   533 	key->AddL(Column2X());
   534 	__UHEAP_MARK;
   535 	DbOpenL();
   536 	test(TheDatabase.CreateIndex(IndexName,TableName,*key)!=KErrNone);
   537 	TheDatabase.Close();
   538 	err = CRCCHECK;
   539 	test(err == KErrNone);
   540 	__UHEAP_MARKEND;
   541 	key->Clear();
   542 	key->AddL(Column1());
   543 	__UHEAP_MARK;
   544 	DbOpenL();
   545 	test(TheDatabase.CreateIndex(TableNameX,TableName,*key)!=KErrNone);
   546 	TheDatabase.Close();
   547 	err = CRCCHECK;
   548 	test(err == KErrNone);
   549 	__UHEAP_CHECK(0);
   550 	DbOpenL();
   551 	test(TheDatabase.CreateIndex(IndexName,TableNameX,*key)!=KErrNone);
   552 	TheDatabase.Close();
   553 	err = CRCCHECK;
   554 	test(err == KErrNone);
   555 	__UHEAP_MARKEND;
   556 	__UHEAP_MARK;
   557 	DbOpenL();
   558 	test(TheDatabase.CreateIndex(IndexName,TableName,*key)==KErrNone);
   559 	test(TheDatabase.CreateIndex(IndexName,TableName,*key)==KErrAlreadyExists);
   560 	test(TheDatabase.DropIndex(TableNameX,TableName)!=KErrNone);
   561 	test(TheDatabase.DropIndex(IndexName,TableNameX)!=KErrNone);
   562 	test(TheDatabase.DropIndex(IndexName,TableName)==KErrNone);
   563 	test(TheDatabase.DropIndex(IndexName,TableName)==KErrNotFound);
   564 	test(TheDatabase.DropTable(TableName)==KErrNone);
   565 	test(TheDatabase.DropIndex(IndexName,TableName)==KErrNotFound);
   566 	TheDatabase.Close();
   567 	err = CRCCHECK;
   568 	test(err == KErrNone);
   569 	__UHEAP_MARKEND;
   570 //
   571 	test.Next(_L("Allocation failure during DDL"));
   572 	TFailCreateTable fct;
   573 	TFailAlterTable fat;
   574 	TFailDropTable fdt;
   575 	TFailCreateIndex fci;
   576 	TFailDropIndex fdi;
   577 	TheColSet=CDbColSet::NewL();
   578 	TheColSet->AddL(TDbCol(Column1,EDbColUint16));
   579 	TheKey=CDbKey::NewL();
   580 	TheKey->AddL(Column1());
   581 	fct.Test(KClientHeap,KClient);
   582 	WriteTableL();
   583 	TheColSet->AddL(TDbCol(Column2,EDbColText));
   584 	fat.Test(KClientHeap,KClient);
   585 	fci.Test(KClientHeap,KClient);
   586 	fdi.Test(KClientHeap,KClient);
   587 	fdt.Test(KClientHeap,KClient);
   588 //
   589 	test.Next(_L("Allocation failure during server DDL"));
   590 	Connect();
   591 	TheColSet->Remove(Column2);
   592 	fct.Test(KClientHeap,KServer);
   593 	WriteTableL();
   594 	TheColSet->AddL(TDbCol(Column2,EDbColText));
   595 	fat.Test(KClientHeap,KServer);
   596 	fci.Test(KClientHeap,KServer);
   597 	fdi.Test(KClientHeap,KServer);
   598 	fdt.Test(KClientHeap,KServer);
   599 //
   600 	TheColSet->Remove(Column2);
   601 	fct.Test(KServerHeap,KServer);
   602 	WriteTableL();
   603 	TheColSet->AddL(TDbCol(Column2,EDbColText));
   604 	fat.Test(KServerHeap,KServer);
   605 	fci.Test(KServerHeap,KServer);
   606 	fdi.Test(KServerHeap,KServer);
   607 	fdt.Test(KServerHeap,KServer);
   608 	Disconnect();
   609 //
   610 	delete TheColSet;
   611 	delete TheKey;
   612 
   613 //
   614 	test.Next(_L("Allocation failure on schema enquiry"));
   615 	DbCreateL();
   616 	test(TheDatabase.CreateTable(TableName,*col)==KErrNone);
   617 	test(TheDatabase.CreateIndex(IndexName,TableName,*key)==KErrNone);
   618 	CleanupStack::PopAndDestroy(2);	// columns set and key
   619 	TheDatabase.Close();
   620 	err = CRCCHECK;
   621 	test(err == KErrNone);
   622 	TFailDatabaseTables t4;
   623 	TFailDatabaseColSet t5;
   624 	TFailDatabaseIndexes t6;
   625 	TFailDatabaseKeys t7;
   626 	t4.Test(KClientHeap,KClient);
   627 	t5.Test(KClientHeap,KClient);
   628 	t6.Test(KClientHeap,KClient);
   629 	t7.Test(KClientHeap,KClient);
   630 //
   631 	test.Next(_L("Allocation failure on server schema enquiry"));
   632 	Connect();
   633 	t4.Test(KClientHeap,KServer);
   634 	t4.Test(KServerHeap,KServer);
   635 	t5.Test(KClientHeap,KServer);
   636 	t5.Test(KServerHeap,KServer);
   637 	t6.Test(KClientHeap,KServer);
   638 	t6.Test(KServerHeap,KServer);
   639 	t7.Test(KClientHeap,KServer);
   640 	t7.Test(KServerHeap,KServer);
   641 	Disconnect();
   642 	test.End();
   643 	}
   644 
   645 class TFailOpenTable : public TFail
   646 	{
   647 	void RunL()
   648 		{User::LeaveIfError(TheTable.Open(TheDatabase,TableName,Access));}
   649 	void End()
   650 		{TheTable.Close();}
   651 	};
   652 
   653 /**
   654 @SYMTestCaseID          SYSLIB-DBMS-CT-0614
   655 @SYMTestCaseDesc        Tests for allocation failure on opening and closing of database
   656 @SYMTestPriority        Medium
   657 @SYMTestActions         Tests for opening and closing of database
   658 @SYMTestExpectedResults Test must not fail
   659 @SYMREQ                 REQ0000
   660 */
   661 LOCAL_C void TestTable(const THeapFail& aHeap,const TContext& aContext)
   662 	{
   663 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0614 Allocation failure on Open "));
   664 	TFailOpenTable fot;
   665 	Access=RDbRowSet::EUpdatable;
   666 	fot.Test(aHeap,aContext);
   667 	Access=RDbRowSet::EReadOnly;
   668 	fot.Test(aHeap,aContext);
   669 	Access=RDbRowSet::EInsertOnly;
   670 	fot.Test(aHeap,aContext);
   671 //
   672 	test.Next(_L("Open invalid table"));
   673 	aContext.OpenDbL();
   674 	__UHEAP_MARK;
   675 	TInt r=TheTable.Open(TheDatabase,TableNameX);
   676 	test (r!=KErrNone);
   677 	__UHEAP_MARKEND;
   678 //
   679 	test.Next(_L("Set invalid index"));
   680 	r=TheTable.Open(TheDatabase,TableName);
   681 	test (r==KErrNone);
   682 	__UHEAP_MARK;
   683 	r=TheTable.SetIndex(IndexName2);
   684 	test (r!=KErrNone);
   685 	__UHEAP_MARKEND;
   686 //
   687 	test.Next(_L("Allocation failure on 2nd Open"));
   688 	RDbTable table(TheTable);
   689 	Access=RDbRowSet::EUpdatable;
   690 	fot.Test(aHeap);
   691 	Access=RDbRowSet::EReadOnly;
   692 	fot.Test(aHeap);
   693 	Access=RDbRowSet::EInsertOnly;
   694 	fot.Test(aHeap);
   695 	table.Close();
   696 	TheDatabase.Close();
   697 	r = CRCCHECK;
   698 	test(r == KErrNone);
   699 	test.End();
   700 	}
   701 
   702 LOCAL_C void TestTableDDL(const TContext& aContext)
   703 	{
   704 	test.Start(_L("DDL while open"));
   705 	aContext.OpenDbL();
   706 	TInt r=TheTable.Open(TheDatabase,TableName);
   707 	test (r==KErrNone);
   708 	CDbColSet* set=CDbColSet::NewLC();
   709 	set->AddL(TDbCol(Column1,EDbColText));
   710 	r=TheDatabase.CreateTable(TableName2,*set);
   711 	test (r==KErrNone);
   712 	TRAP(r,TheTable.CountL(TheTable.EQuick));
   713 	test (r==KErrNone);
   714 	TheTable.Close();
   715 	r=TheTable.Open(TheDatabase,TableName2);
   716 	test (r==KErrNone);
   717 //
   718 	set->AddL(TDbCol(Column2,EDbColUint32));
   719 	r=TheDatabase.AlterTable(TableName2,*set);
   720 	test (r==KErrNone);
   721 	CleanupStack::PopAndDestroy();		// set
   722 	TRAP(r,TheTable.CountL(TheTable.EQuick));
   723 	test (r==KErrDisconnected);
   724 	TheTable.Reset();
   725 	TRAP(r,TheTable.CountL(TheTable.EQuick));
   726 	test (r==KErrDisconnected);
   727 	TheTable.Close();
   728 	r=TheTable.Open(TheDatabase,TableName2);
   729 	test (r==KErrNone);
   730 //
   731 	CDbKey* key=CDbKey::NewLC();
   732 	key->AddL(Column2());
   733 	r=TheDatabase.CreateIndex(IndexName2,TableName,*key);
   734 	test (r==KErrNone);
   735 	TRAP(r,TheTable.CountL(TheTable.EQuick));
   736 	test (r==KErrNone);
   737 	r=TheDatabase.DropIndex(IndexName2,TableName);
   738 	test (r==KErrNone);
   739 	TRAP(r,TheTable.CountL(TheTable.EQuick));
   740 	test (r==KErrNone);
   741 //
   742 	r=TheDatabase.CreateIndex(IndexName,TableName2,*key);
   743 	test (r==KErrNone);
   744 	CleanupStack::PopAndDestroy();	// key
   745 	TRAP(r,TheTable.CountL(TheTable.EQuick));
   746 	test (r==KErrDisconnected);
   747 	TheTable.Close();
   748 	r=TheTable.Open(TheDatabase,TableName2);
   749 	test (r==KErrNone);
   750 //
   751 	r=TheDatabase.DropIndex(IndexName,TableName2);
   752 	test (r==KErrNone);
   753 	TRAP(r,TheTable.CountL(TheTable.EQuick));
   754 	test (r==KErrDisconnected);
   755 	TheTable.Close();
   756 	r=TheTable.Open(TheDatabase,TableName2);
   757 	test (r==KErrNone);
   758 //
   759 	r=TheDatabase.DropTable(TableName2);
   760 	test (r==KErrNone);
   761 	TRAP(r,TheTable.CountL(TheTable.EQuick));
   762 	test (r==KErrDisconnected);
   763 	TheTable.Close();
   764 	TheDatabase.Close();
   765 	r = CRCCHECK;
   766 	test(r == KErrNone);
   767 	test.End();
   768 	}
   769 
   770 LOCAL_C void Table()
   771 	{
   772 	test.Start(_L("Testing Client-side"));
   773 	TestTable(KClientHeap,KClient);
   774 	TestTableDDL(KClient);
   775 	test.Next(_L("Testing Client-Server"));
   776 	Connect();
   777 	TestTable(KClientHeap,KServer);
   778 	TestTable(KServerHeap,KServer);
   779 	TestTableDDL(KServer);
   780 	Disconnect();
   781 	test.End();
   782 	}
   783 
   784 class TFailExecuteSQL : public TFail
   785 	{
   786 	void RunL()
   787 		{User::LeaveIfError(TheDatabase.Execute(*TheSql));}
   788 	void End()
   789 		{}
   790 	};
   791 
   792 class TFailPrepareView : public TFail
   793 	{
   794 	void RunL()
   795 		{User::LeaveIfError(TheView.Prepare(TheDatabase,*TheSql,Access));}
   796 	void End()
   797 		{TheView.Close();}
   798 	};
   799 
   800 /**
   801 @SYMTestCaseID          SYSLIB-DBMS-CT-0615
   802 @SYMTestCaseDesc        Tests for allocation failure on prepare
   803 @SYMTestPriority        Medium
   804 @SYMTestActions         Tests for error on updating a row set data
   805 @SYMTestExpectedResults Test must not fail
   806 @SYMREQ                 REQ0000
   807 */
   808 LOCAL_C void TestView(const THeapFail& aHeap,const TContext& aContext)
   809 	{
   810 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0615 Allocation failure on Prepare "));
   811 	TFailPrepareView fpv;
   812 	TheSql=&SimpleSql;
   813 	Access=RDbRowSet::EUpdatable;
   814 	fpv.Test(aHeap,aContext);
   815 	Access=RDbRowSet::EReadOnly;
   816 	fpv.Test(aHeap,aContext);
   817 	Access=RDbRowSet::EInsertOnly;
   818 	fpv.Test(aHeap,aContext);
   819 //
   820 	test.Next(_L("Allocation failure on Prepare (complex SQL)"));
   821 	for (TUint ii=0;ii<sizeof(ComplexSql)/sizeof(ComplexSql[0]);++ii)
   822 		{
   823 		TheSql=&ComplexSql[ii];
   824 		Access=RDbRowSet::EUpdatable;
   825 		fpv.Test(aHeap,aContext);
   826 		}
   827 	test.End();
   828 	}
   829 
   830 /**
   831 @SYMTestCaseID          SYSLIB-DBMS-CT-0616
   832 @SYMTestCaseDesc        Bad SQL query test 
   833 @SYMTestPriority        Medium
   834 @SYMTestActions         Test for bad query
   835 @SYMTestExpectedResults Test must not fail
   836 @SYMREQ                 REQ0000
   837 */
   838 LOCAL_C void TestSQL(const TContext& aContext)
   839 	{
   840 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0616 Bad SQL "));
   841 	aContext.OpenDbL();
   842 	for (TUint ii=0;ii<sizeof(BadSql)/sizeof(BadSql[0]);++ii)
   843 		test(TheView.Prepare(TheDatabase,TPtrC(BadSql[ii].iSql))==BadSql[ii].iError);
   844 	TheDatabase.Close();
   845 	TInt err = CRCCHECK;
   846 	test(err == KErrNone);
   847 	test.End();
   848 	}
   849 
   850 /**
   851 @SYMTestCaseID          SYSLIB-DBMS-CT-0617
   852 @SYMTestCaseDesc        Tests for updation of an SQL statement
   853 @SYMTestPriority        Medium
   854 @SYMTestActions         Tests for update SQL statement
   855 @SYMTestExpectedResults Test must not fail
   856 @SYMREQ                 REQ0000
   857 */
   858 LOCAL_C void TestUpdateSQL(const THeapFail& aHeap,const TContext& aContext)
   859 	{
   860 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0617 Test for UPDATE SQL statement "));
   861 	TFailExecuteSQL fsql;
   862 	TheSql=&UpdateSql;
   863 	fsql.Test(aHeap,aContext);
   864 	test.End();
   865 	}
   866 
   867 LOCAL_C void View()
   868 	{
   869 	test.Start(_L("Client side"));
   870 	TestView(KClientHeap,KClient);
   871 	TestSQL(KClient);
   872 	test.Next(_L("Client-Server"));
   873 	Connect();
   874 	TestView(KClientHeap,KServer);
   875 	TestView(KServerHeap,KServer);
   876 	TestSQL(KServer);
   877 	TestUpdateSQL(KClientHeap,KClient);
   878 	TestUpdateSQL(KServerHeap,KClient);
   879 	Disconnect();
   880 	test.End();
   881 	}
   882 
   883 //TFailIncrementalUpdate implements the base class' virtual methods - RunL() and End().
   884 //TFailIncrementalUpdate::RunL() is called by the base class' Test() method, which simulates
   885 //OOM failures and checks the behaviour of the "incremental update" statement used by RunL().
   886 class TFailIncrementalUpdate : public TFail
   887 	{
   888 	virtual void RunL()
   889 		{
   890 		RDbUpdate dbUpdate;
   891 		CleanupClosePushL(dbUpdate);
   892 		User::LeaveIfError(dbUpdate.Execute(TheDatabase, _L("UPDATE A SET Name = 'ModifiedNameString' WHERE Id2 > 10")));
   893 		TInt step = 0;
   894 		for(TInt err=1;err>0;++step)
   895 			{
   896 			err = dbUpdate.Next();
   897 			User::LeaveIfError(err);
   898 			}
   899 		test(step > 1);//just to be sure that the test executes dbUpdate.Next() more than once
   900 		CleanupStack::PopAndDestroy(&dbUpdate);
   901 		}
   902 	virtual void End()
   903 		{
   904 		TheDatabase.Close();
   905 		TInt err;
   906 		TRAPD( lc, err = CRCCHECK);
   907 		test(err == KErrNone);
   908 		test(lc == KErrNone);
   909 		}
   910 	};	
   911 
   912 /**
   913 @SYMTestCaseID          SYSLIB-DBMS-UT-3414
   914 @SYMTestCaseDesc        "Incremental update" operations - OOM test.
   915 @SYMTestPriority        High
   916 @SYMTestActions         Create a test database with one table and insert some records there (> 100).
   917 						Run an "incremental update" operation in OOM loop.
   918 @SYMTestExpectedResults The test should not fail or panic.
   919 @SYMDEF INC101720
   920 */
   921 LOCAL_C void IncrementalUpdateTest(const THeapFail& aHeap)
   922 	{
   923 	//Create a test shared database with a table
   924 	TheDatabase.Close();
   925 	TInt err, lc;
   926 #ifndef __TOOLS2__
   927 	TheDbs.Close();
   928 #endif
   929 	TRAP(lc, err = CRCCHECK);
   930 	test(err == KErrNone);
   931 	test(lc == KErrNone);
   932 #ifndef __TOOLS2__
   933 	err = TheDbs.Connect();
   934 	test(err == KErrNone);
   935 #endif
   936 	err = TheDatabase.Replace(TheFs, KTestDatabase);
   937 	test(err == KErrNone);
   938 	TheDatabase.Close();
   939 	TRAP(lc, err = CRCCHECK);
   940 	test(err == KErrNone);
   941 	test(lc == KErrNone);
   942 	err = TheDatabase.Open(TheDbs, KTestDatabase);
   943 	test(err == KErrNone);
   944 	//Create a test table and fill the table with enough test records (> 100)
   945 	err = TheDatabase.Execute(_L("CREATE TABLE A(Id COUNTER, Id2 INTEGER, Name LONG VARCHAR)"));	
   946 	test(err == KErrNone);
   947 	const TInt KTestRecCount = 110;
   948 	err = TheDatabase.Begin();	
   949 	test(err == KErrNone);
   950 	for(TInt i=0;i<KTestRecCount;++i)
   951 		{
   952 		_LIT(KSqlFmtStr, "INSERT INTO A(Id2, Name) VALUES(%d, 'TestNameString')");
   953 		TBuf<100> sql;
   954 //		TUint32 id = Math::Random() % KTestRecCount;
   955 		TUint32 id = (i^0x55555555) % KTestRecCount;
   956 		sql.Format(KSqlFmtStr, id + 1);
   957 		err = TheDatabase.Execute(sql);
   958 		test(err == 1);
   959 		}
   960 	err = TheDatabase.Commit();	
   961 	test(err == KErrNone);
   962 	//The OOM test
   963 	TFailIncrementalUpdate testObj;
   964 	testObj.Test(aHeap);
   965 	//Cleanup
   966 	TheDatabase.Close();
   967 #ifndef __TOOLS2__
   968 	TheDbs.Close();
   969 #endif
   970 	TRAP(lc, err = CRCCHECK);
   971 	test(err == KErrNone);
   972 	test(lc == KErrNone);
   973 	}
   974 
   975 //
   976 // Testing the DBMS for failure modes
   977 //
   978 LOCAL_C void doMain()
   979 	{
   980 	test.Start(_L("Class RDbNamedDatabase"));
   981 	__UHEAP_MARK;
   982 	Origins();
   983 	__UHEAP_CHECK(0);
   984 	__UHEAP_MARK;
   985 //  secure shared, not supported on tools2.
   986 //	Origins2();
   987 
   988 	__UHEAP_CHECK(0);
   989 	test.Next(_L("Class RDbDatabase"));
   990 	Database();
   991 	__UHEAP_CHECK(0);
   992 	test.Next(_L("Class RDbTable"));
   993 	Table();
   994 	__UHEAP_CHECK(0);
   995 	test.Next(_L("Class RDbView"));
   996 	View();
   997 	__UHEAP_MARKEND;
   998 	test.End();
   999 	}
  1000 
  1001 //
  1002 // Prepare the test directory.
  1003 //
  1004 LOCAL_C void setupTestDirectory()
  1005     {
  1006 	TInt r=TheFs.Connect();
  1007 	test(r==KErrNone);
  1008 //
  1009 	r=TheFs.MkDir(KTestDatabase);
  1010 	test(r==KErrNone || r==KErrAlreadyExists);
  1011 	}
  1012 
  1013 //
  1014 // Initialise the cleanup stack.
  1015 //
  1016 LOCAL_C void setupCleanup()
  1017     {
  1018 	TheTrapCleanup=CTrapCleanup::New();
  1019 	test(TheTrapCleanup!=NULL);
  1020 	TRAPD(r,\
  1021 		{\
  1022 		for (TInt i=KTestCleanupStack;i>0;i--)\
  1023 			CleanupStack::PushL((TAny*)0);\
  1024 		CleanupStack::Pop(KTestCleanupStack);\
  1025 		});
  1026 	test(r==KErrNone);
  1027 	}
  1028 
  1029 LOCAL_C void DeleteDataFile(const TDesC& aFullName)
  1030 	{
  1031 	RFs fsSession;
  1032 	TInt err = fsSession.Connect();
  1033 	if(err == KErrNone)
  1034 		{
  1035 		TEntry entry;
  1036 		if(fsSession.Entry(aFullName, entry) == KErrNone)
  1037 			{
  1038 			RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
  1039 			err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
  1040 			if(err != KErrNone) 
  1041 				{
  1042 				RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
  1043 				}
  1044 			err = fsSession.Delete(aFullName);
  1045 			if(err != KErrNone) 
  1046 				{
  1047 				RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
  1048 				}
  1049 			}
  1050 		fsSession.Close();
  1051 		}
  1052 	else
  1053 		{
  1054 		RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
  1055 		}
  1056 	}
  1057 
  1058 GLDEF_C TInt E32Main()
  1059 	{
  1060 	test.Title();
  1061 	setupTestDirectory();
  1062 	setupCleanup();
  1063 	__UHEAP_MARK;
  1064 //
  1065 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0612 Locating a database "));
  1066 	TRAPD(r,TestOpen());
  1067 	test(r==KErrNone);
  1068 	
  1069 //  These are in t_fail2, secure shared tests, unsupported.
  1070 //	PrepareDbFmtString();
  1071 //	TRAP(r,TestOpen2());
  1072 //	test(r==KErrNone);
  1073 
  1074 	test.Next(_L("Standard database"));
  1075 	TRAP(r,doMain());
  1076 	test(r==KErrNone);
  1077 	test.Next(_L("Secure database"));
  1078 	TRAP(r,doMain());
  1079 	test(r==KErrNone);
  1080 	test.Next(_L("ISAM database"));
  1081 	TheFormat=_S("epoc[12345678]");
  1082 	TRAP(r,Origins());
  1083 	test(r==KErrNone);
  1084 
  1085 //	TRAP(r,Origins2());
  1086 //	test(r==KErrNone);
  1087 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-UT-3414 \"Incremental update\" - client test "));
  1088 	IncrementalUpdateTest(KClientHeap);
  1089 	test.End();
  1090 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-UT-3414 \"Incremental update\" - client-server test "));
  1091 	IncrementalUpdateTest(KServerHeap);
  1092 	test.End();
  1093 	test.Printf(_L("Waiting for server exit\n"));
  1094 	const TUint KExitDelay=6*0x100000;	// ~6 seconds
  1095 	User::After(KExitDelay);
  1096 
  1097 	::DeleteDataFile(KTestDatabase);		// clean up data file used by this test - must be done before call to End() - DEF047652
  1098 
  1099 #ifndef __linux__
  1100 	TInt err;
  1101 #ifndef __TOOLS2__
  1102 	TRAPD(lc, err = TheCrcChecker.DumpCrcRecordsL(KCrcRecord));
  1103 	test(err==KErrNone);
  1104 	test(lc==KErrNone);
  1105 #else
  1106 	TRAPD(lc, err = TheCrcChecker.ValidateCrcRecordsL(KCrcRecord));
  1107 	TPtrC errmsg;
  1108 	TheCrcChecker.ErrorReportL(err, errmsg);
  1109 	RDebug::Print(errmsg);
  1110 	test(err==KErrNone || err==TDBMS_CRCChecks::ECrcCheckOk);
  1111 #endif
  1112 #endif
  1113 
  1114 	test.End();
  1115 
  1116 	__UHEAP_MARKEND;
  1117 
  1118 	delete TheTrapCleanup;
  1119 	TheFs.Close();
  1120 	test.Close();
  1121 	return 0;
  1122 	}