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