os/persistentdata/persistentstorage/dbms/pcdbms/tdbms/src/t_window.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 <s32file.h>
    18 #include <e32test.h>
    19 
    20 #include "crccheck.h"
    21 
    22 #undef __UHEAP_MARK
    23 #define __UHEAP_MARK
    24 #undef __UHEAP_MARKEND
    25 #define __UHEAP_MARKEND
    26 
    27 LOCAL_D TDBMS_CRCChecks TheCrcChecker;
    28 
    29 #ifndef __linux__ //No CRC test on LINUX
    30 #ifdef __TOOLS2__
    31 const TPtrC	KCrcRecord=_L("\\epoc32\\winscw\\c\\dbms-tst\\T_WINDOW.CRC");
    32 #else
    33 const TPtrC	KCrcRecord=_L("C:\\dbms-tst\\T_WINDOW.CRC");
    34 #endif
    35 #endif
    36 
    37 
    38 LOCAL_D RTest test(_L("T_WINDOW : Testing the 'window' stage"));
    39 LOCAL_D CTrapCleanup* TheTrapCleanup;
    40 LOCAL_D CFileStore* TheStore;
    41 LOCAL_D RDbStoreDatabase TheDatabase;
    42 LOCAL_D RDbView TheView;
    43 LOCAL_D RFs TheFs;
    44 
    45 const TInt KTestCleanupStack=0x20;
    46 
    47 #ifdef __TOOLS2__
    48 const TPtrC KTestDir=_L(".\\dbms-tst\\");
    49 #else
    50 const TPtrC KTestDir=_L("C:\\dbms-tst\\");
    51 #endif
    52 
    53 const TPtrC KTestFile=_S("T_WINDOW.DB");
    54 const TPtrC KTableName=_S("TestTable");
    55 const TPtrC KColumnID=_S("id");
    56 const TPtrC KIndexName=_S("TestIndex");
    57 const TInt KRecords=10;
    58 const TPtrC KCreateTable=_L("CREATE TABLE TestTable (id INTEGER NOT NULL)");
    59 const TPtrC KCreateIndex=_L("CREATE UNIQUE INDEX TestIndex ON TestTable (id)");
    60 const TPtrC KEmptyQuery=_L("select * from TestTable where id is null");
    61 const TPtrC KOrderQuery=_L("select * from TestTable order by id");
    62 const TDbWindow KSingleSlotWindow(0,0);
    63 const TDbWindow KSmallWindow(2,2);
    64 const TDbWindow KLargeWindow(20,0);
    65 
    66 //
    67 // Create the database-in-a-store
    68 //
    69 LOCAL_C void CreateDatabaseL()
    70 	{
    71 	CFileStore* store=CPermanentFileStore::ReplaceLC(TheFs,KTestFile,EFileRead|EFileWrite);
    72 	store->SetTypeL(KPermanentFileStoreLayoutUid);
    73 	TStreamId id;
    74 		id=TheDatabase.CreateL(store);
    75 	store->SetRootL(id);
    76 	store->CommitL();
    77 	CleanupStack::Pop();
    78 	TheStore=store;
    79 	}
    80 
    81 LOCAL_C void CloseDatabaseL()
    82 	{
    83 	// cannot evaluate size info for store database
    84 	RDbDatabase::TSize size=TheDatabase.Size();
    85 	test (size.iSize<0);
    86 	test (size.iUsage<0);
    87 	test (TheDatabase.UpdateStats()==KErrNone);
    88 	size=TheDatabase.Size();
    89 	test (size.iSize<0);
    90 	test (size.iUsage<0);
    91 	TheDatabase.Close();
    92 	delete TheStore;
    93 	
    94 	TInt err = TheCrcChecker.GenerateCrcL(KTestFile);
    95 	test(err == KErrNone);
    96 	}
    97 
    98 LOCAL_C void CreateTable()
    99 	{
   100 	TheDatabase.Begin();
   101 	test(TheDatabase.Execute(KCreateTable)==KErrNone);
   102 	RDbTable table;
   103 	test(table.Open(TheDatabase,KTableName,table.EInsertOnly)==KErrNone);
   104 	for (TInt ii=0;ii<KRecords;++ii)
   105 		{
   106 		table.InsertL();
   107 		table.SetColL(1,ii);
   108 		table.PutL();
   109 		}
   110 	table.Close();
   111 	test(TheDatabase.Execute(KCreateIndex)==KErrNone);
   112 	test (TheDatabase.Commit()==KErrNone);
   113 	}
   114 
   115 LOCAL_C void Init()
   116 	{
   117 	CreateDatabaseL();
   118 	CreateTable();
   119 	}
   120 
   121 /**
   122 @SYMTestCaseID          SYSLIB-DBMS-CT-0638
   123 @SYMTestCaseDesc        Tests for navigation 
   124 @SYMTestPriority        Medium
   125 @SYMTestActions         Tests for navigation in an empty window
   126 @SYMTestExpectedResults Test must not fail
   127 @SYMREQ                 REQ0000
   128 */
   129 LOCAL_C void TestEmpty()
   130 	{
   131 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0638 Unevaluated "));
   132 	test(TheView.Prepare(TheDatabase,KEmptyQuery,TDbWindow::EUnlimited)==KErrNone);
   133 	test(TheView.CountL(TheView.EQuick)==0);
   134 	test(!TheView.FirstL());
   135 	test(TheView.AtEnd());
   136 	test(!TheView.PreviousL());
   137 	test(TheView.AtBeginning());
   138 	test(!TheView.LastL());
   139 	test(TheView.AtBeginning());
   140 	test(!TheView.NextL());
   141 	test(TheView.AtEnd());
   142 	test.Next(_L("Evaluated"));
   143 	test(TheView.EvaluateAll()==KErrNone);
   144 	test(TheView.CountL()==0);
   145 	test(!TheView.FirstL());
   146 	test(TheView.AtEnd());
   147 	test(!TheView.PreviousL());
   148 	test(TheView.AtBeginning());
   149 	test(!TheView.LastL());
   150 	test(TheView.AtBeginning());
   151 	test(!TheView.NextL());
   152 	test(TheView.AtEnd());
   153 	test.End();
   154 	TheView.Close();
   155 	}
   156 
   157 /**
   158 @SYMTestCaseID          SYSLIB-DBMS-CT-0639
   159 @SYMTestCaseDesc        Tests for navigation 
   160 @SYMTestPriority        Medium
   161 @SYMTestActions         Tests for the unlimited (dynaset) window
   162 @SYMTestExpectedResults Test must not fail
   163 @SYMREQ                 REQ0000
   164 */
   165 LOCAL_C void TestUnlimited()
   166 	{
   167 	test.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0639 EvaluateAll "));
   168 	test(TheView.Prepare(TheDatabase,KOrderQuery,TDbWindow::EUnlimited)==KErrNone);
   169 	test(TheView.EvaluateAll()==KErrNone);
   170 	test(!TheView.Unevaluated());
   171 	test(TheView.CountL()==KRecords);
   172 	TInt cc=0;
   173 	for (TheView.BeginningL();TheView.NextL();)
   174 		++cc;
   175 	test(cc==KRecords);
   176 	for (TheView.EndL();TheView.PreviousL();)
   177 		--cc;
   178 	test(cc==0);
   179 	test(!TheView.Unevaluated());
   180 	test.Next(_L("Incremental evaluate"));
   181 	TheView.Reset();
   182 	cc=TheView.CountL(TheView.EQuick);
   183 	test(cc==0);
   184 	test(!TheView.FirstL());
   185 	while (TheView.Unevaluated())
   186 		{
   187 		test(TheView.Evaluate()>=KErrNone);
   188 		TInt ii=TheView.CountL()-cc;
   189 		test(ii>=0);
   190 		cc+=ii;
   191 		while (--ii>=0)
   192 			{
   193 			test(TheView.AtRow());
   194 			TheView.NextL();
   195 			}
   196 		test(!TheView.AtRow());
   197 		}
   198 	test(cc==KRecords);
   199 	test.Next(_L("Insert"));
   200 // The new records should go on the end of the set
   201 	TheView.InsertL();
   202 	TheView.SetColL(1,TInt(-1));
   203 	TheView.PutL();
   204 	test(TheView.CountL()==KRecords+1);
   205 	test(TheView.LastL());
   206 	TheView.GetL();
   207 	test(TheView.ColInt(1)==-1);
   208 // because of order, it should appear at beginning on re-evaluation
   209 	TheView.Reset();
   210 	test(TheView.EvaluateAll()==KErrNone);
   211 	test(TheView.CountL()==KRecords+1);
   212 	test(TheView.FirstL());
   213 	TheView.GetL();
   214 	test(TheView.ColInt(1)==-1);
   215 	test.Next(_L("Update"));
   216 // updated records should not move (or disappear) in the set
   217 	TheView.UpdateL();
   218 	TheView.SetColL(1,KRecords);
   219 	TheView.PutL();
   220 	test(TheView.CountL()==KRecords+1);
   221 	test(TheView.FirstL());
   222 	TheView.GetL();
   223 	test(TheView.ColInt(1)==KRecords);
   224 // because of order, it should appear at end on re-evaluation
   225 	TheView.Reset();
   226 	test(TheView.EvaluateAll()==KErrNone);
   227 	test(TheView.CountL()==KRecords+1);
   228 	test(TheView.LastL());
   229 	TheView.GetL();
   230 	test(TheView.ColInt(1)==KRecords);
   231 	test.Next(_L("Bookmarks"));
   232 	TDbBookmark mark=TheView.Bookmark();
   233 	TheView.BeginningL();
   234 	TRAPD(r,TheView.GotoL(mark));
   235 	test(r==KErrNone);
   236 	TheView.GetL();
   237 	test(TheView.ColInt(1)==KRecords);
   238 	test(!TheView.NextL());
   239 	test(TheView.PreviousL());
   240 	test.Next(_L("Delete"));
   241 // should disappear from the set
   242 	TheView.DeleteL();
   243 	test(TheView.CountL()==KRecords);
   244 	for (TheView.BeginningL();TheView.NextL();)
   245 		{
   246 		TheView.GetL();
   247 		test(TheView.ColInt(1)!=KRecords);
   248 		}
   249 	TRAP(r,TheView.GotoL(mark));
   250 	test(r!=KErrNone);
   251 	TheView.Reset();
   252 	test(TheView.EvaluateAll()==KErrNone);
   253 	test(TheView.CountL()==KRecords);
   254 	for (TheView.BeginningL();TheView.NextL();)
   255 		{
   256 		TheView.GetL();
   257 		test(TheView.ColInt(1)!=KRecords);
   258 		}
   259 	TRAP(r,TheView.GotoL(mark));
   260 	test(r!=KErrNone);
   261 	test.End();
   262 	TheView.Close();
   263 	}
   264 
   265 //
   266 // do as much incremental evaluation as possible
   267 //
   268 LOCAL_C void Evaluate()
   269 	{
   270 	test(TheView.EvaluateAll()==KErrNone);
   271 	}
   272 
   273 //
   274 // get to the true end of set
   275 //
   276 LOCAL_C void GotoEnd()
   277 	{
   278 	for (;;)
   279 		{
   280 		while (TheView.AtRow())
   281 			TheView.NextL();
   282 		if (!TheView.Unevaluated())
   283 			break;
   284 		Evaluate();
   285 		}
   286 	}
   287 
   288 LOCAL_C void CheckWindow(TInt forward,TInt back)
   289 	{
   290 	TInt ii;
   291 	for (ii=0;ii<forward;++ii)
   292 		test(TheView.NextL());
   293 	test(!TheView.NextL());
   294 	for (ii=0;ii<forward+back+1;++ii)
   295 		test(TheView.PreviousL());
   296 	test(!TheView.PreviousL());
   297 	for (ii=0;ii<back+1;++ii)
   298 		test(TheView.NextL());
   299 	}
   300 
   301 /**
   302 @SYMTestCaseID          SYSLIB-DBMS-CT-0640
   303 @SYMTestCaseDesc        Tests for RDbView 
   304 @SYMTestPriority        Medium
   305 @SYMTestActions         Tests for a restricted sized window
   306 @SYMTestExpectedResults Test must not fail
   307 @SYMREQ                 REQ0000
   308 */
   309 LOCAL_C void TestRestricted()
   310 	{
   311 	test.Start(_L("	@SYMTestCaseID:SYSLIB-DBMS-CT-0640 Behaviour at start of set "));
   312 	test(TheView.Prepare(TheDatabase,KOrderQuery,KSingleSlotWindow)==KErrNone);
   313 	test(TheView.EvaluateAll()==KErrNone);
   314 	test(TheView.CountL()==1);
   315 	test(!TheView.Unevaluated());
   316 	test(TheView.NextL());
   317 	test(!TheView.Unevaluated());
   318 	TheView.GetL();
   319 	TInt id=TheView.ColInt(1);
   320 	test(!TheView.NextL());
   321 	test(TheView.Unevaluated());
   322 	Evaluate();
   323 	test(TheView.CountL()==1);
   324 	test(TheView.AtRow());
   325 	test(!TheView.PreviousL());
   326 	test(TheView.Unevaluated());
   327 	Evaluate();
   328 	test(TheView.CountL()==1);
   329 	test(TheView.AtRow());
   330 	TheView.GetL();
   331 	test(TheView.ColInt(1)==id);
   332 	test(!TheView.PreviousL());
   333 	test(TheView.Unevaluated());
   334 	Evaluate();
   335 	test(TheView.CountL()==1);
   336 	test(TheView.AtBeginning());
   337 	test(TheView.NextL());
   338 	TheView.GetL();
   339 	test(TheView.ColInt(1)==id);
   340 	test(!TheView.Unevaluated());
   341 	test.Next(_L("Behaviour at end of set"));
   342 	GotoEnd();
   343 	test(TheView.LastL());
   344 	test(!TheView.Unevaluated());
   345 	TheView.GetL();
   346 	id=TheView.ColInt(1);
   347 	test(!TheView.PreviousL());
   348 	test(TheView.Unevaluated());
   349 	Evaluate();
   350 	test(TheView.CountL()==1);
   351 	test(TheView.AtRow());
   352 	test(!TheView.NextL());
   353 	test(TheView.Unevaluated());
   354 	Evaluate();
   355 	test(TheView.CountL()==1);
   356 	test(TheView.AtRow());
   357 	TheView.GetL();
   358 	test(TheView.ColInt(1)==id);
   359 	test(!TheView.NextL());
   360 	test(TheView.Unevaluated());
   361 	Evaluate();
   362 	test(TheView.CountL()==1);
   363 	test(TheView.AtEnd());
   364 	test(TheView.PreviousL());
   365 	TheView.GetL();
   366 	test(TheView.ColInt(1)==id);
   367 	test(!TheView.Unevaluated());
   368 	TheView.Close();
   369 //
   370 	test.Next(_L("Forward and backwards slots"));
   371 	test(TheView.Prepare(TheDatabase,KOrderQuery,KSmallWindow)==KErrNone);
   372 	test(TheView.EvaluateAll()==KErrNone);
   373 	test(TheView.CountL()==5);
   374 	test(TheView.FirstL());
   375 	CheckWindow(4,0);
   376 	test(TheView.NextL());
   377 	test(TheView.NextL());		// now on preferred slot (id=2)
   378 	test(!TheView.Unevaluated());
   379 	test(TheView.NextL());
   380 	test(TheView.Unevaluated());
   381 	Evaluate();
   382 	CheckWindow(2,2);
   383 	test(TheView.LastL());		// id=5
   384 	Evaluate();
   385 	test(TheView.LastL());		// id=7
   386 	Evaluate();					// should now have last five rows
   387 	CheckWindow(2,2);
   388 	test(TheView.LastL());		// id=9
   389 	Evaluate();					// no more rows
   390 	CheckWindow(0,4);			// all behind us now
   391 	TheView.GetL();
   392 	test(TheView.ColInt(1)==9);
   393 	TheView.FirstL();			// id=5
   394 	Evaluate();
   395 	TheView.FirstL();			// id=3
   396 	Evaluate();
   397 	TheView.FirstL();			// id=1
   398 	Evaluate();
   399 	CheckWindow(3,1);
   400 //
   401 	test.Next(_L("Bookmarks"));
   402 	TDbBookmark mark=TheView.Bookmark();
   403 	test(TheView.NextL());
   404 	test(TheView.NextL());
   405 	test(TheView.NextL());
   406 	Evaluate();
   407 	TRAPD(r,TheView.GotoL(mark));
   408 	test(r!=KErrNone);
   409 	TheView.FirstL();
   410 	Evaluate();
   411 	TRAP(r,TheView.GotoL(mark));
   412 	test(r==KErrNone);
   413 	test.Next(_L("Delete"));
   414 	test(TheView.FirstL());
   415 	TheView.GetL();
   416 	test(TheView.ColInt(1)==0);
   417 	TheView.DeleteL();
   418 	test(TheView.CountL()==4);
   419 	TheView.FirstL();
   420 	CheckWindow(3,0);
   421 	test.Next(_L("Insert"));
   422 	TheView.InsertL();
   423 	TheView.SetColL(1,TInt(0));
   424 	TheView.PutL();
   425 	test(TheView.CountL()==4);
   426 	TheView.FirstL();
   427 	TheView.GetL();
   428 	test(TheView.ColInt(1)==1);
   429 	TheView.Reset();
   430 	test(TheView.EvaluateAll()==KErrNone);
   431 	test(TheView.FirstL());
   432 	TheView.GetL();
   433 	test(TheView.ColInt(1)==0);
   434 //
   435 	test.End();
   436 	TheView.Close();
   437 	}
   438 
   439 LOCAL_C void Test()
   440 	{
   441 	__UHEAP_MARK;
   442 	test.Start(_L("Setting up test table"));
   443 	TRAPD(r,Init();)
   444 	test(r==KErrNone);
   445 	test.Next(_L("Empty Window"));
   446 	TRAP(r,TestEmpty();)
   447 	test(r==KErrNone);
   448 	test.Next(_L("Unlimited Window"));
   449 	TRAP(r,TestUnlimited();)
   450 	test(r==KErrNone);
   451 	test.Next(_L("Sized window"));
   452 	TRAP(r,TestRestricted();)
   453 	test(r==KErrNone);
   454 	test.Next(_L("Cleanup"));
   455 	TRAP(r,CloseDatabaseL();)
   456 	test(r==KErrNone);
   457 	test.End();
   458 	__UHEAP_MARKEND;
   459 	}
   460 
   461 //
   462 // Prepare the test directory.
   463 //
   464 LOCAL_C void setupTestDirectory()
   465     {
   466 	TInt r=TheFs.Connect();
   467 	test(r==KErrNone);
   468 //
   469 	r=TheFs.MkDir(KTestDir);
   470 	test(r==KErrNone || r==KErrAlreadyExists);
   471 	r=TheFs.SetSessionPath(KTestDir);
   472 	test(r==KErrNone);
   473 // On TOOLS2 - RFs::SetSessionPath() will affect all RFs Sessions, 
   474 // the two RFs need same session path anyway
   475 #ifdef __WINSCW__ 
   476 	r=TheCrcChecker.SetSessionPath(KTestDir);
   477 	test(r==KErrNone);
   478 #endif
   479 	}
   480 
   481 //
   482 // Initialise the cleanup stack.
   483 //
   484 LOCAL_C void setupCleanup()
   485     {
   486 	TheTrapCleanup=CTrapCleanup::New();
   487 	test(TheTrapCleanup!=NULL);
   488 	TRAPD(r,\
   489 		{\
   490 		for (TInt i=KTestCleanupStack;i>0;i--)\
   491 			CleanupStack::PushL((TAny*)0);\
   492 		CleanupStack::Pop(KTestCleanupStack);\
   493 		});
   494 	test(r==KErrNone);
   495 	}
   496 
   497 LOCAL_C void DeleteDataFile(const TDesC& aFullName)
   498 	{
   499 	RFs fsSession;
   500 	TInt err = fsSession.Connect();
   501 	if(err == KErrNone)
   502 		{
   503 		TEntry entry;
   504 		if(fsSession.Entry(aFullName, entry) == KErrNone)
   505 			{
   506 			RDebug::Print(_L("Deleting \"%S\" file.\n"), &aFullName);
   507 			err = fsSession.SetAtt(aFullName, 0, KEntryAttReadOnly);
   508 			if(err != KErrNone) 
   509 				{
   510 				RDebug::Print(_L("Error %d changing \"%S\" file attributes.\n"), err, &aFullName);
   511 				}
   512 			err = fsSession.Delete(aFullName);
   513 			if(err != KErrNone) 
   514 				{
   515 				RDebug::Print(_L("Error %d deleting \"%S\" file.\n"), err, &aFullName);
   516 				}
   517 			}
   518 		fsSession.Close();
   519 		}
   520 	else
   521 		{
   522 		RDebug::Print(_L("Error %d connecting file session. File: %S.\n"), err, &aFullName);
   523 		}
   524 	}
   525 
   526 //
   527 // Test streaming conversions.
   528 //
   529 GLDEF_C TInt E32Main()
   530     {
   531 	test.Title();
   532 	setupTestDirectory();
   533 	setupCleanup();
   534 //
   535 	test.Start(_L("Standard database"));
   536 	Test();
   537 	test.Next(_L("Secure database"));
   538 	Test();
   539 
   540 	//deletion of data files must be done before call to end - DEF047652
   541 #ifndef __TOOLS2__
   542 	_LIT(KTestDbName, "C:\\dbms-tst\\T_WINDOW.DB");
   543 	::DeleteDataFile(KTestDbName);
   544 #else
   545 	::DeleteDataFile(KTestFile);
   546 #endif
   547 
   548 #ifndef __linux__
   549 	TInt err;
   550 #ifndef __TOOLS2__
   551 	TRAPD(lc, err = TheCrcChecker.DumpCrcRecordsL(KCrcRecord));
   552 	test(err==KErrNone);
   553 	test(lc==KErrNone);
   554 #else
   555 	TRAPD(lc, err = TheCrcChecker.ValidateCrcRecordsL(KCrcRecord));
   556 	TPtrC errmsg;
   557 	TheCrcChecker.ErrorReportL(err, errmsg);
   558 	RDebug::Print(errmsg);
   559 	test(err==KErrNone || err==TDBMS_CRCChecks::ECrcCheckOk);
   560 #endif
   561 #endif
   562 
   563 	test.End();
   564 //
   565 
   566 	delete TheTrapCleanup;
   567 	TheFs.Close();
   568 	test.Close();
   569 	return 0;
   570     }