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".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
26 #undef __UHEAP_MARKEND
27 #define __UHEAP_MARKEND
29 #define __UHEAP_CHECK(a)
31 LOCAL_D TDBMS_CRCChecks TheCrcChecker;
33 #ifndef __linux__ //No CRC test on LINUX
35 const TPtrC KCrcRecord=_L("\\epoc32\\winscw\\c\\dbms-tst\\T_FAIL.CRC");
37 const TPtrC KCrcRecord=_L("C:\\dbms-tst\\T_FAIL.CRC");
41 #define CRCCHECK (TheCrcChecker.GenerateCrcL(KTestDatabase))
44 _LIT(KTestTitle,"T_FAIL: DBMS Failure mode test");
45 GLDEF_D RTest test(KTestTitle);
47 GLDEF_D RDbNamedDatabase TheDatabase;
48 GLDEF_D TClientHeap KClientHeap;
49 GLDEF_D TServerHeap KServerHeap;
52 LOCAL_D CTrapCleanup* TheTrapCleanup;
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;
62 const TInt KTestCleanupStack=0x20;
65 const TPtrC KTestDatabase=_L("C:\\dbms-tst\\t_fail.db");
67 const TPtrC KTestDatabase=_L(".\\dbms-tst\\t_fail.db");
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'");
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[]=
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")
100 LOCAL_D SSqlErrors const BadSql[]=
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}
116 GLDEF_C void Connect()
119 TInt r=TheDbs.Connect();
121 TheDbs.ResourceMark();
125 GLDEF_C void Disconnect()
128 TheDbs.ResourceCheck();
134 //SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version
135 LOCAL_C void DbCreateL()
137 User::LeaveIfError(TheDatabase.Replace(TheFs,KTestDatabase,TheFormat));
140 //SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version
141 LOCAL_C void DbOpenL()
143 User::LeaveIfError(TheDatabase.Open(TheFs,KTestDatabase,TheFormat));
144 CleanupClosePushL(TheDatabase);
145 delete TheDatabase.TableNamesL(); // force a schema load
149 //SYMBIAN_REMOVE_TRIVIAL_ENCRYPTION version
150 LOCAL_C void DbShareL()
152 User::LeaveIfError(TheDatabase.Open(TheDbs,KTestDatabase,TheFormat));
153 CleanupClosePushL(TheDatabase);
154 delete TheDatabase.TableNamesL(); // force a schema load
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
167 LOCAL_C void TestOpen()
169 _LIT(KFileNotFound,"not a database");
170 TInt r=TheDatabase.Open(TheFs,KFileNotFound);
171 test (r==KErrNotFound || r==KErrPathNotFound);
173 _LIT(KPathNotFound,"C:\\not a path\\database.db");
174 r=TheDatabase.Open(TheFs,KPathNotFound);
176 test (r==KErrPathNotFound);
178 // Tools2 f32 does not return KErrPathNotFound
179 test( (r==KErrPathNotFound) || (r==KErrNotFound));
182 _LIT(KNotFormat,"not.a.dbx");
183 r=TheDatabase.Open(TheFs,KFileNotFound,KNotFormat);
184 test (r==KErrNotFound || r==KErrPathNotFound);
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
194 test(err == KErrNone);
197 r=f.Replace(TheFs,KTestDatabase,EFileWrite);
199 TCheckedUid type(KDirectFileStoreLayoutUid);
200 r=f.Write(type.Des());
203 r=TheDatabase.Open(TheFs,KTestDatabase);
204 test (r==KErrNotSupported);
206 _LIT(KDefaultFormat,"epoc");
207 r=TheDatabase.Open(TheFs,KTestDatabase,KDefaultFormat);
208 test (r==KErrNotSupported); // We expect not supported db here
211 class TClient : public TContext
219 class TServer : public TContext
228 const TClient KClient;
229 const TServer KServer;
231 void TFail::Test(const THeapFail& aHeap,const TContext* aContext)
239 TRAP(errCode, aContext->OpenDbL());
240 if(errCode != KErrNone)
249 test(r==KErrNoMemory);
253 TRAPD(lc, errCode = CRCCHECK);
254 test(errCode == KErrNone);
255 test(lc == KErrNone);
263 TRAPD(lc, errCode = CRCCHECK);
264 test(errCode == KErrNone);
265 test(lc == KErrNone);
270 class TFailCreateDatabase : public TFail
278 TRAPD(lc, err = CRCCHECK);
279 test(err == KErrNone);
280 test(lc == KErrNone);
284 class TFailOpenDatabase : public TFail
292 TRAPD(lc, err = CRCCHECK);
293 test(err == KErrNone);
294 test(lc == KErrNone);
298 class TFailShareDatabase : public TFail
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.
310 // TRAPD(lc, err = CRCCHECK);
311 // RDebug::Print(_L("ERROR %d\n"), err);
312 // test(err == KErrNone);
313 // test(lc == KErrNone);
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
325 LOCAL_C void Origins()
327 test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0613 Allocation failures on Creating a database "));
328 TFailCreateDatabase t1;
329 t1.Test(KClientHeap);
331 test.Next(_L("Fail to create existing database"));
334 TInt r=TheFs.Att(KTestDatabase,att);
339 r=TheDatabase.Create(TheFs,KTestDatabase,TheFormat);
340 test (r==KErrAlreadyExists);
342 r=TheFs.Att(KTestDatabase,att);
346 test.Next(_L("Allocation failures on Open"));
347 TFailOpenDatabase t2;
348 t2.Test(KClientHeap);
350 test.Next(_L("Allocation failures on 1st Share"));
352 TFailShareDatabase t3;
353 t3.Test(KClientHeap);
354 t3.Test(KServerHeap);
356 test.Next(_L("Allocation failures on 2nd Share"));
358 RDbNamedDatabase temp=TheDatabase;TheDatabase=RDbNamedDatabase();
359 t3.Test(KClientHeap);
360 t3.Test(KServerHeap);
367 class TFailCreateTable : public TFail
370 {User::LeaveIfError(TheDatabase.CreateTable(TableName,*TheColSet));}
373 class TFailAlterTable : public TFail
376 {User::LeaveIfError(TheDatabase.AlterTable(TableName,*TheColSet));}
379 class TFailDropTable : public TFail
382 {User::LeaveIfError(TheDatabase.DropTable(TableName));}
385 class TFailCreateIndex : public TFail
388 {User::LeaveIfError(TheDatabase.CreateIndex(IndexName,TableName,*TheKey));}
391 class TFailDropIndex : public TFail
394 {User::LeaveIfError(TheDatabase.DropIndex(IndexName,TableName));}
397 class TFailGetObject : public TFail
406 class TFailDatabaseTables : public TFailGetObject
409 {iObject=TheDatabase.TableNamesL();}
412 class TFailDatabaseColSet : public TFailGetObject
415 {iObject=TheDatabase.ColSetL(TableName);}
418 class TFailDatabaseIndexes : public TFailGetObject
421 {iObject=TheDatabase.IndexNamesL(TableName);}
424 class TFailDatabaseKeys : public TFailGetObject
427 {iObject=TheDatabase.KeyL(IndexName,TableName);}
430 const TInt KRowCount=60;
432 LOCAL_C void WriteTableL()
435 TInt r=TheTable.Open(TheDatabase,TableName);
438 for (TInt ii=0;ii<KRowCount;++ii)
441 TheTable.SetColL(1,TUint((ii*17)%KRowCount));
444 r=TheDatabase.Commit();
449 test(err == KErrNone);
452 LOCAL_C void Database()
454 test.Start(_L("Adding and dropping tables"));
456 // ensure the database locking list has been allocated
458 TheDatabase.Commit();
460 CDbColSet *col=CDbColSet::NewLC();
462 test.Next(_L("Empty Column Set"));
464 test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
467 test.Next(_L("Invalid table name"));
468 col->AddL(TDbCol(Column1,EDbColInt32));
470 test(TheDatabase.CreateTable(TableNameX,*col)!=KErrNone);
473 test.Next(_L("Invalid column name"));
474 col->AddL(TDbCol(Column2X,EDbColBit));
476 test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
479 test.Next(_L("Duplicate column name"));
480 col->Remove(Column2X);
481 col->AddL(TDbCol(Column1Fold,EDbColBit));
483 test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
486 test.Next(_L("Invalid column type"));
487 col->Remove(Column1);
488 col->AddL(TDbCol(Column2,TDbColType(-1)));
490 test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
493 test.Next(_L("Invalid maximum length"));
494 col->Remove(Column2);
495 col->AddL(TDbCol(Column2,EDbColInt32,0));
497 test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
500 test.Next(_L("Invalid attributes"));
501 col->Remove(Column2);
502 TDbCol cc(Column2,EDbColInt32);
506 test(TheDatabase.CreateTable(TableName,*col)!=KErrNone);
509 test.Next(_L("Adding/dropping a table name twice"));
510 col->Remove(Column2);
511 col->AddL(TDbCol(Column2,EDbColText8));
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);
520 test.Next(_L("Adding and dropping indexes"));
521 test(TheDatabase.CreateTable(TableName,*col)==KErrNone);
524 test(err == KErrNone);
525 CDbKey *key=CDbKey::NewLC();
528 test(TheDatabase.CreateIndex(IndexName,TableName,*key)!=KErrNone);
531 test(err == KErrNone);
533 key->AddL(Column2X());
536 test(TheDatabase.CreateIndex(IndexName,TableName,*key)!=KErrNone);
539 test(err == KErrNone);
542 key->AddL(Column1());
545 test(TheDatabase.CreateIndex(TableNameX,TableName,*key)!=KErrNone);
548 test(err == KErrNone);
551 test(TheDatabase.CreateIndex(IndexName,TableNameX,*key)!=KErrNone);
554 test(err == KErrNone);
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);
568 test(err == KErrNone);
571 test.Next(_L("Allocation failure during DDL"));
572 TFailCreateTable fct;
575 TFailCreateIndex fci;
577 TheColSet=CDbColSet::NewL();
578 TheColSet->AddL(TDbCol(Column1,EDbColUint16));
579 TheKey=CDbKey::NewL();
580 TheKey->AddL(Column1());
581 fct.Test(KClientHeap,KClient);
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);
589 test.Next(_L("Allocation failure during server DDL"));
591 TheColSet->Remove(Column2);
592 fct.Test(KClientHeap,KServer);
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);
600 TheColSet->Remove(Column2);
601 fct.Test(KServerHeap,KServer);
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);
614 test.Next(_L("Allocation failure on schema enquiry"));
616 test(TheDatabase.CreateTable(TableName,*col)==KErrNone);
617 test(TheDatabase.CreateIndex(IndexName,TableName,*key)==KErrNone);
618 CleanupStack::PopAndDestroy(2); // columns set and key
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);
631 test.Next(_L("Allocation failure on server schema enquiry"));
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);
645 class TFailOpenTable : public TFail
648 {User::LeaveIfError(TheTable.Open(TheDatabase,TableName,Access));}
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
661 LOCAL_C void TestTable(const THeapFail& aHeap,const TContext& aContext)
663 test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0614 Allocation failure on Open "));
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);
672 test.Next(_L("Open invalid table"));
675 TInt r=TheTable.Open(TheDatabase,TableNameX);
679 test.Next(_L("Set invalid index"));
680 r=TheTable.Open(TheDatabase,TableName);
683 r=TheTable.SetIndex(IndexName2);
687 test.Next(_L("Allocation failure on 2nd Open"));
688 RDbTable table(TheTable);
689 Access=RDbRowSet::EUpdatable;
691 Access=RDbRowSet::EReadOnly;
693 Access=RDbRowSet::EInsertOnly;
702 LOCAL_C void TestTableDDL(const TContext& aContext)
704 test.Start(_L("DDL while open"));
706 TInt r=TheTable.Open(TheDatabase,TableName);
708 CDbColSet* set=CDbColSet::NewLC();
709 set->AddL(TDbCol(Column1,EDbColText));
710 r=TheDatabase.CreateTable(TableName2,*set);
712 TRAP(r,TheTable.CountL(TheTable.EQuick));
715 r=TheTable.Open(TheDatabase,TableName2);
718 set->AddL(TDbCol(Column2,EDbColUint32));
719 r=TheDatabase.AlterTable(TableName2,*set);
721 CleanupStack::PopAndDestroy(); // set
722 TRAP(r,TheTable.CountL(TheTable.EQuick));
723 test (r==KErrDisconnected);
725 TRAP(r,TheTable.CountL(TheTable.EQuick));
726 test (r==KErrDisconnected);
728 r=TheTable.Open(TheDatabase,TableName2);
731 CDbKey* key=CDbKey::NewLC();
732 key->AddL(Column2());
733 r=TheDatabase.CreateIndex(IndexName2,TableName,*key);
735 TRAP(r,TheTable.CountL(TheTable.EQuick));
737 r=TheDatabase.DropIndex(IndexName2,TableName);
739 TRAP(r,TheTable.CountL(TheTable.EQuick));
742 r=TheDatabase.CreateIndex(IndexName,TableName2,*key);
744 CleanupStack::PopAndDestroy(); // key
745 TRAP(r,TheTable.CountL(TheTable.EQuick));
746 test (r==KErrDisconnected);
748 r=TheTable.Open(TheDatabase,TableName2);
751 r=TheDatabase.DropIndex(IndexName,TableName2);
753 TRAP(r,TheTable.CountL(TheTable.EQuick));
754 test (r==KErrDisconnected);
756 r=TheTable.Open(TheDatabase,TableName2);
759 r=TheDatabase.DropTable(TableName2);
761 TRAP(r,TheTable.CountL(TheTable.EQuick));
762 test (r==KErrDisconnected);
772 test.Start(_L("Testing Client-side"));
773 TestTable(KClientHeap,KClient);
774 TestTableDDL(KClient);
775 test.Next(_L("Testing Client-Server"));
777 TestTable(KClientHeap,KServer);
778 TestTable(KServerHeap,KServer);
779 TestTableDDL(KServer);
784 class TFailExecuteSQL : public TFail
787 {User::LeaveIfError(TheDatabase.Execute(*TheSql));}
792 class TFailPrepareView : public TFail
795 {User::LeaveIfError(TheView.Prepare(TheDatabase,*TheSql,Access));}
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
808 LOCAL_C void TestView(const THeapFail& aHeap,const TContext& aContext)
810 test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0615 Allocation failure on Prepare "));
811 TFailPrepareView fpv;
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);
820 test.Next(_L("Allocation failure on Prepare (complex SQL)"));
821 for (TUint ii=0;ii<sizeof(ComplexSql)/sizeof(ComplexSql[0]);++ii)
823 TheSql=&ComplexSql[ii];
824 Access=RDbRowSet::EUpdatable;
825 fpv.Test(aHeap,aContext);
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
838 LOCAL_C void TestSQL(const TContext& aContext)
840 test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0616 Bad SQL "));
842 for (TUint ii=0;ii<sizeof(BadSql)/sizeof(BadSql[0]);++ii)
843 test(TheView.Prepare(TheDatabase,TPtrC(BadSql[ii].iSql))==BadSql[ii].iError);
846 test(err == KErrNone);
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
858 LOCAL_C void TestUpdateSQL(const THeapFail& aHeap,const TContext& aContext)
860 test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0617 Test for UPDATE SQL statement "));
861 TFailExecuteSQL fsql;
863 fsql.Test(aHeap,aContext);
869 test.Start(_L("Client side"));
870 TestView(KClientHeap,KClient);
872 test.Next(_L("Client-Server"));
874 TestView(KClientHeap,KServer);
875 TestView(KServerHeap,KServer);
877 TestUpdateSQL(KClientHeap,KClient);
878 TestUpdateSQL(KServerHeap,KClient);
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
891 CleanupClosePushL(dbUpdate);
892 User::LeaveIfError(dbUpdate.Execute(TheDatabase, _L("UPDATE A SET Name = 'ModifiedNameString' WHERE Id2 > 10")));
894 for(TInt err=1;err>0;++step)
896 err = dbUpdate.Next();
897 User::LeaveIfError(err);
899 test(step > 1);//just to be sure that the test executes dbUpdate.Next() more than once
900 CleanupStack::PopAndDestroy(&dbUpdate);
906 TRAPD( lc, err = CRCCHECK);
907 test(err == KErrNone);
908 test(lc == KErrNone);
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.
921 LOCAL_C void IncrementalUpdateTest(const THeapFail& aHeap)
923 //Create a test shared database with a table
929 TRAP(lc, err = CRCCHECK);
930 test(err == KErrNone);
931 test(lc == KErrNone);
933 err = TheDbs.Connect();
934 test(err == KErrNone);
936 err = TheDatabase.Replace(TheFs, KTestDatabase);
937 test(err == KErrNone);
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)
952 _LIT(KSqlFmtStr, "INSERT INTO A(Id2, Name) VALUES(%d, 'TestNameString')");
954 // TUint32 id = Math::Random() % KTestRecCount;
955 TUint32 id = (i^0x55555555) % KTestRecCount;
956 sql.Format(KSqlFmtStr, id + 1);
957 err = TheDatabase.Execute(sql);
960 err = TheDatabase.Commit();
961 test(err == KErrNone);
963 TFailIncrementalUpdate testObj;
970 TRAP(lc, err = CRCCHECK);
971 test(err == KErrNone);
972 test(lc == KErrNone);
976 // Testing the DBMS for failure modes
978 LOCAL_C void doMain()
980 test.Start(_L("Class RDbNamedDatabase"));
985 // secure shared, not supported on tools2.
989 test.Next(_L("Class RDbDatabase"));
992 test.Next(_L("Class RDbTable"));
995 test.Next(_L("Class RDbView"));
1002 // Prepare the test directory.
1004 LOCAL_C void setupTestDirectory()
1006 TInt r=TheFs.Connect();
1009 r=TheFs.MkDir(KTestDatabase);
1010 test(r==KErrNone || r==KErrAlreadyExists);
1014 // Initialise the cleanup stack.
1016 LOCAL_C void setupCleanup()
1018 TheTrapCleanup=CTrapCleanup::New();
1019 test(TheTrapCleanup!=NULL);
1022 for (TInt i=KTestCleanupStack;i>0;i--)\
1023 CleanupStack::PushL((TAny*)0);\
1024 CleanupStack::Pop(KTestCleanupStack);\
1029 LOCAL_C void DeleteDataFile(const TDesC& aFullName)
1032 TInt err = fsSession.Connect();
1036 if(fsSession.Entry(aFullName, entry) == KErrNone)
1038 RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
1039 err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
1042 RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
1044 err = fsSession.Delete(aFullName);
1047 RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
1054 RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
1058 GLDEF_C TInt E32Main()
1061 setupTestDirectory();
1065 test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0612 Locating a database "));
1066 TRAPD(r,TestOpen());
1069 // These are in t_fail2, secure shared tests, unsupported.
1070 // PrepareDbFmtString();
1071 // TRAP(r,TestOpen2());
1072 // test(r==KErrNone);
1074 test.Next(_L("Standard database"));
1077 test.Next(_L("Secure database"));
1080 test.Next(_L("ISAM database"));
1081 TheFormat=_S("epoc[12345678]");
1085 // TRAP(r,Origins2());
1086 // test(r==KErrNone);
1087 test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-UT-3414 \"Incremental update\" - client test "));
1088 IncrementalUpdateTest(KClientHeap);
1090 test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-UT-3414 \"Incremental update\" - client-server test "));
1091 IncrementalUpdateTest(KServerHeap);
1093 test.Printf(_L("Waiting for server exit\n"));
1094 const TUint KExitDelay=6*0x100000; // ~6 seconds
1095 User::After(KExitDelay);
1097 ::DeleteDataFile(KTestDatabase); // clean up data file used by this test - must be done before call to End() - DEF047652
1102 TRAPD(lc, err = TheCrcChecker.DumpCrcRecordsL(KCrcRecord));
1103 test(err==KErrNone);
1106 TRAPD(lc, err = TheCrcChecker.ValidateCrcRecordsL(KCrcRecord));
1108 TheCrcChecker.ErrorReportL(err, errmsg);
1109 RDebug::Print(errmsg);
1110 test(err==KErrNone || err==TDBMS_CRCChecks::ECrcCheckOk);
1118 delete TheTrapCleanup;