sl@0: // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // DBMS security policy - performance tests sl@0: // Please, ensure that t_dbenvcreate test is executed before t_dbplatsec<N>/t_dbplatsecperf tests! sl@0: // Please, ensure that t_dbenvdestroy test is executed after t_dbplatsec<N>/t_dbplatsecperf tests! sl@0: // sl@0: // sl@0: sl@0: #include <e32test.h> sl@0: #include "t_dbplatsecutl.h" sl@0: sl@0: static RTest TheTest(_L("t_dbplatsecperf: DBMS platform security - Performance test")); sl@0: sl@0: static RDbs TheDbs; sl@0: static RDbNamedDatabase TheDb; sl@0: sl@0: const TUid KSecureDbUid = {0x11335579}; sl@0: _LIT(KSecure, "SECURE"); sl@0: _LIT(KDbNameC, "C:TestDB.DB"); sl@0: _LIT(KTblNameA, "A"); sl@0: _LIT(KTblNameB, "B"); sl@0: _LIT(KTblNameC, "C"); sl@0: _LIT(KDbDirNSC, "C:\\DBMS-TST\\"); sl@0: _LIT(KDbNameNSC,"C:\\DBMS-TST\\TestDB.DB"); sl@0: sl@0: static void DeleteNsDb() sl@0: { sl@0: RFs fileSess; sl@0: if(fileSess.Connect() == KErrNone) sl@0: { sl@0: fileSess.Delete(KDbNameNSC); sl@0: } sl@0: fileSess.Close(); sl@0: } sl@0: sl@0: static void CleanupTest() sl@0: { sl@0: ::DeleteNsDb(); sl@0: } sl@0: sl@0: TDBSCUtils TheDbscUtils(TheTest, &CleanupTest); sl@0: sl@0: const TInt KGetPolicyCallCnt = 10000; sl@0: const TInt KInsertRecCnt = 10000; sl@0: sl@0: //Measures the performance of RDbs::GetDatabasePolicy() and RDbs::GetTablePolicy() calls. sl@0: //The DBMS server session kept alive during the test. sl@0: static void GetPolicyTest1() sl@0: { sl@0: TUint time = User::TickCount(); sl@0: RDbs::TPolicyType tblPolicyType[2] = {RDbs::EReadPolicy, RDbs::EWritePolicy}; sl@0: TSecurityPolicy dbPolicy; sl@0: TSecurityPolicy tblPolicy; sl@0: TInt i, k; sl@0: for(i=0,k=0;i<KGetPolicyCallCnt;++i,k=(k+1)%2) sl@0: { sl@0: TInt err = TheDbs.GetDatabasePolicy(KSecureDbUid, tblPolicyType[k], dbPolicy); sl@0: TEST2(err, KErrNone); sl@0: err = TheDbs.GetTablePolicy(KSecureDbUid, KTblNameA, tblPolicyType[k], tblPolicy); sl@0: TEST2(err, KErrNone); sl@0: } sl@0: time = User::TickCount() - time; sl@0: TheTest.Printf(_L("GetDatabasePolicy(), GetTablePolicy(). Time=%d\r\n"), time); sl@0: } sl@0: sl@0: //Measures the performance of RDbs::GetTablePolicies() call. sl@0: //The DBMS server session connected before each GetTablePolicies() call and disconnected sl@0: //after the call. sl@0: static void GetPolicyTest2() sl@0: { sl@0: TheDbs.Close(); sl@0: TUint time = User::TickCount(); sl@0: RDbs::TPolicyType tblPolicyType[2] = {RDbs::EReadPolicy, RDbs::EWritePolicy}; sl@0: TSecurityPolicy dbPolicy; sl@0: TSecurityPolicy tblPolicy; sl@0: TInt i, k; sl@0: for(i=0,k=0;i<KGetPolicyCallCnt;++i,k=(k+1)%2) sl@0: { sl@0: TInt err = TheDbs.Connect(); sl@0: TEST2(err, KErrNone); sl@0: err = TheDbs.GetTablePolicies(KSecureDbUid, KTblNameA, tblPolicyType[k], dbPolicy, tblPolicy); sl@0: TEST2(err, KErrNone); sl@0: TheDbs.Close(); sl@0: } sl@0: time = User::TickCount() - time; sl@0: TheTest.Printf(_L("GetTablePolicies(). Time=%d\r\n"), time); sl@0: TInt err = TheDbs.Connect(); sl@0: TEST2(err, KErrNone); sl@0: } sl@0: sl@0: //Measures the performance of RDbs::GetTablePolicies() call. sl@0: //The DBMS server session kept alive during the test. sl@0: static void GetPolicyTest3() sl@0: { sl@0: TUint time = User::TickCount(); sl@0: RDbs::TPolicyType tblPolicyType[2] = {RDbs::EReadPolicy, RDbs::EWritePolicy}; sl@0: TSecurityPolicy dbPolicy; sl@0: TSecurityPolicy tblPolicy; sl@0: TInt i, k; sl@0: for(i=0,k=0;i<KGetPolicyCallCnt;++i,k=(k+1)%2) sl@0: { sl@0: TInt err = TheDbs.GetTablePolicies(KSecureDbUid, KTblNameA, tblPolicyType[k], dbPolicy, tblPolicy); sl@0: TEST2(err, KErrNone); sl@0: } sl@0: time = User::TickCount() - time; sl@0: TheTest.Printf(_L("GetTablePolicies(). Time=%d\r\n"), time); sl@0: } sl@0: sl@0: static void CreateNonsecureDbL() sl@0: { sl@0: TColDef const KColumns[]= sl@0: { sl@0: {_S("ID"), EDbColInt32, TDbCol::ENotNull | TDbCol::EAutoIncrement}, sl@0: {_S("DATA1"), EDbColInt32, TDbCol::ENotNull}, sl@0: {_S("DATA2"), EDbColInt32, TDbCol::ENotNull}, sl@0: {0} sl@0: }; sl@0: RFs fileSess; sl@0: CleanupClosePushL(fileSess); sl@0: TInt err = fileSess.Connect(); sl@0: TEST2(err, KErrNone); sl@0: sl@0: err = fileSess.MkDir(KDbDirNSC); sl@0: TEST(err == KErrNone || err == KErrAlreadyExists); sl@0: sl@0: RDbNamedDatabase db; sl@0: err = db.Create(fileSess, KDbNameNSC); sl@0: TEST2(err, KErrNone); sl@0: CleanupClosePushL(db); sl@0: err = db.Open(fileSess, KDbNameNSC); sl@0: sl@0: CDbColSet* colset = TDBSCUtils::CreateColSetLC(KColumns); sl@0: err = db.CreateTable(KTblNameA, *colset); sl@0: TEST2(err, KErrNone); sl@0: err = db.CreateTable(KTblNameB, *colset); sl@0: TEST2(err, KErrNone); sl@0: err = db.CreateTable(KTblNameC, *colset); sl@0: TEST2(err, KErrNone); sl@0: sl@0: CleanupStack::PopAndDestroy(colset); sl@0: CleanupStack::PopAndDestroy(&db); sl@0: CleanupStack::PopAndDestroy(&fileSess); sl@0: } sl@0: sl@0: static void DoInsertRecL(RDbNamedDatabase& aDb, RDbTable& aTbl) sl@0: { sl@0: TUint time = User::TickCount(); sl@0: TInt err = aDb.Begin(); sl@0: TEST2(err, KErrNone); sl@0: for(TInt i=0;i<KInsertRecCnt;++i) sl@0: { sl@0: aTbl.InsertL(); sl@0: aTbl.SetColL(2, i); sl@0: aTbl.SetColL(3, i); sl@0: aTbl.PutL(); sl@0: } sl@0: err = aDb.Commit(); sl@0: TEST2(err, KErrNone); sl@0: time = User::TickCount() - time; sl@0: TheTest.Printf(_L("Insert. Time=%d\r\n"), time); sl@0: } sl@0: sl@0: //Measures the performance of "Insert" operations in a non-secure database. sl@0: static void InsertRec1L() sl@0: { sl@0: RDbNamedDatabase db; sl@0: CleanupClosePushL(db); sl@0: TInt err = db.Open(TheDbs, KDbNameNSC); sl@0: TEST2(err, KErrNone); sl@0: sl@0: RDbTable tblA; sl@0: CleanupClosePushL(tblA); sl@0: err = tblA.Open(db, KTblNameA); sl@0: TEST2(err, KErrNone); sl@0: sl@0: ::DoInsertRecL(db, tblA); sl@0: sl@0: CleanupStack::PopAndDestroy(&tblA); sl@0: CleanupStack::PopAndDestroy(&db); sl@0: } sl@0: sl@0: //Measures the performance of "Insert" operations in a secure shared database. sl@0: static void InsertRec2L() sl@0: { sl@0: TBuf<32> format; sl@0: format.Copy(KSecure); sl@0: format.Append(KSecureDbUid.Name()); sl@0: sl@0: CleanupClosePushL(TheDb); sl@0: TInt err = TheDb.Open(TheDbs, KDbNameC, format); sl@0: TEST2(err, KErrNone); sl@0: sl@0: RDbTable tblA; sl@0: CleanupClosePushL(tblA); sl@0: err = tblA.Open(TheDb, KTblNameA); sl@0: TEST2(err, KErrNone); sl@0: sl@0: ::DoInsertRecL(TheDb, tblA); sl@0: sl@0: CleanupStack::PopAndDestroy(&tblA); sl@0: CleanupStack::PopAndDestroy(&TheDb); sl@0: } sl@0: sl@0: //Measures the performance of "Update" SQL operations in a non-secure database. sl@0: static void UpdateRec1L() sl@0: { sl@0: RDbNamedDatabase db; sl@0: CleanupClosePushL(db); sl@0: TInt err = db.Open(TheDbs, KDbNameNSC); sl@0: TEST2(err, KErrNone); sl@0: sl@0: TUint time = User::TickCount(); sl@0: sl@0: err = db.Begin(); sl@0: TEST2(err, KErrNone); sl@0: sl@0: TInt cnt = db.Execute(_L("UPDATE A SET DATA1=10, DATA2=20 WHERE ID >= 0")); sl@0: TEST(cnt > 0); sl@0: sl@0: err = db.Commit(); sl@0: TEST2(err, KErrNone); sl@0: sl@0: time = User::TickCount() - time; sl@0: TheTest.Printf(_L("Update. Time=%d\r\n"), time); sl@0: sl@0: CleanupStack::PopAndDestroy(&db); sl@0: } sl@0: sl@0: //Measures the performance of "Update" SQL operations in a secure shared database. sl@0: static void UpdateRec2L() sl@0: { sl@0: TBuf<32> format; sl@0: format.Copy(KSecure); sl@0: format.Append(KSecureDbUid.Name()); sl@0: sl@0: CleanupClosePushL(TheDb); sl@0: TInt err = TheDb.Open(TheDbs, KDbNameC, format); sl@0: TEST2(err, KErrNone); sl@0: sl@0: TUint time = User::TickCount(); sl@0: sl@0: err = TheDb.Begin(); sl@0: TEST2(err, KErrNone); sl@0: sl@0: TInt cnt = TheDb.Execute(_L("UPDATE A SET DATA1=10, DATA2=20 WHERE ID >= 0")); sl@0: TEST(cnt > 0); sl@0: sl@0: err = TheDb.Commit(); sl@0: TEST2(err, KErrNone); sl@0: sl@0: time = User::TickCount() - time; sl@0: TheTest.Printf(_L("Update. Time=%d\r\n"), time); sl@0: sl@0: CleanupStack::PopAndDestroy(&TheDb); sl@0: } sl@0: sl@0: /** sl@0: @SYMTestCaseID SYSLIB-DBMS-CT-0020 sl@0: @SYMTestCaseDesc DBMS security - performance tests. Insert/Update and Get<AAA>Policy sl@0: operations performance measured for non-secure and secure shared database. sl@0: @SYMTestPriority High sl@0: @SYMTestActions RDbs::GetDatabasePolicy(), Rdbs::GetTablePolicy() and RDbs::GetTablePolicies() sl@0: calls measured. sl@0: RDBTable: insert operation measured, SQL: update operation measured. sl@0: @SYMTestExpectedResults The test must not fail. sl@0: @SYMREQ REQ2429 sl@0: DBMS shall provide an API to apply security policies to database tables. sl@0: */ sl@0: static void DoRunL() sl@0: { sl@0: TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0020 GetPolicy performance test ")); sl@0: ::GetPolicyTest1(); sl@0: ::GetPolicyTest2(); sl@0: ::GetPolicyTest3(); sl@0: sl@0: ::CreateNonsecureDbL(); sl@0: sl@0: TheTest.Next(_L("Insert records performance test")); sl@0: InsertRec1L(); sl@0: InsertRec2L(); sl@0: sl@0: TheTest.Next(_L("Update records performance test")); sl@0: ::UpdateRec1L(); sl@0: ::UpdateRec2L(); sl@0: } sl@0: sl@0: TInt E32Main() sl@0: { sl@0: __UHEAP_MARK; sl@0: CTrapCleanup* tc = CTrapCleanup::New(); sl@0: TEST(tc != NULL); sl@0: sl@0: TInt err = TheDbs.Connect(); sl@0: TEST2(err, KErrNone); sl@0: sl@0: ::DeleteNsDb(); sl@0: sl@0: TRAP(err, ::DoRunL()); sl@0: TEST2(err, KErrNone); sl@0: sl@0: TheDb.Close(); sl@0: TheDbs.Close(); sl@0: ::CleanupTest(); sl@0: sl@0: TheTest.End(); sl@0: TheTest.Close(); sl@0: sl@0: delete tc; sl@0: sl@0: __UHEAP_MARKEND; sl@0: User::Heap().Check(); sl@0: return KErrNone; sl@0: }