diff -r 000000000000 -r 08ec8eefde2f persistentstorage/sql/TEST/t_sqlauthorizer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/sql/TEST/t_sqlauthorizer.cpp Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,527 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include + +#define __SQLSRV_STRINGS__ +#include "SqlSrvStrings.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +RFs TheFs; +RSqlDatabase TheDb; +TParse TheFileNameParse; +RTest TheTest(_L("t_sqlauthorizer test")); + +const TSecurityPolicy KPolicy1(ECapabilityReadUserData, ECapabilityNetworkControl, ECapabilityWriteUserData); +const TSecurityPolicy KPolicy2(ECapabilityReadUserData); + +_LIT8(KPragma , "PRAGMA %S.%S\x0"); +_LIT8(KPragmaWithParam, "PRAGMA %S.%S%S\x0"); + +_LIT(KPublicDir, "C:\\test\\"); +_LIT(KPrivateDir, "C:\\private\\21212129\\"); + +_LIT(KPublicDbName, "C:\\test\\t_sqlauthorizer.db"); +_LIT(KSecureDbName, "C:[21212129]t_sqlauthorizer.db"); +_LIT(KPrivateDbName, "C:\\private\\21212129\\t_sqlauthorizer.db"); +_LIT(KAttachDb, "AttachedDB"); + +_LIT(KCreateTable1, "CREATE TABLE A(Id INTEGER,Name TEXT)"); +_LIT(KCreateTable2, "CREATE TABLE B(Id INTEGER,Address TEXT, Num INTEGER, FOREIGN KEY (Address) REFERENCES A(id))"); +_LIT(KCreateIndex, "CREATE INDEX Index1 ON B (Num)"); +_LIT(KInsertTable, "INSERT INTO A VALUES(1, 'AAA')"); + +TBuf8 TheSql; +const TInt KNumPragma = 34; + +//////////////////////////////////////////// Input List /////////////////////////////////////////////// +struct TInputList + { + const TPtrC8 iPragmaName; + const TPtrC8 iReadParam; + const TPtrC8 iWriteParam; + }; + +const TInputList KInputList [KNumPragma] = + { + //////////////////////////////////////////////////////////////////////////////////////////////// + // Pragma Name |Read Parameter |Write Parameter |Pragma Command + //////////////////////////////////////////////////////////////////////////////////////////////// + {KAutoVacuum(), KNullDesC8(), _L8(" = 0")}, //auto_vacuum + {KCacheSize(), KNullDesC8(), _L8(" = 32")}, //cache_size + {KCaseSensitiveLike(), KNullDesC8(), _L8(" = 0")}, //case_sensitive_like + {KCountChanges(), KNullDesC8(), _L8(" = 1")}, //count_changes + {KDefaultCacheSize(), KNullDesC8(), _L8(" = 32")}, //DefaultAccess_cache_size + {KEmptyResultCallbacks(), KNullDesC8(), _L8(" = 0")}, //empty_result_callbacks + {KEncoding(), KNullDesC8(), _L8(" = \"UTF-8\"")}, //encoding + {KFullColumnNames(), KNullDesC8(), _L8(" = 0")}, //full_column_names + {KFullfsync(), KNullDesC8(), _L8(" = 1")}, //fullfsync + {KIncrementalVacuum(), KNullDesC8(), _L8(" = 0")}, //incremental_vacuum + {KJournalMode(), KNullDesC8(), _L8(" = DELETE")}, //journal_mode + {KJournalSizeLimit(), KNullDesC8(), _L8(" = 1000000")}, //journal_size_limit + {KLegacyFileFormat(), KNullDesC8(), _L8(" = ON")}, //legacy_file_format + {KLockingMode(), KNullDesC8(), _L8(" = Normal")}, //locking_mode + {KPageSize(), KNullDesC8(), _L8(" = 2048")}, //page_size + {KMaxPageCount(), KNullDesC8(), _L8(" = 32")}, //max_page_count + {KReadUncommitted(), KNullDesC8(), _L8(" = 1")}, //read_uncommitted + {KShortColumnNames(), KNullDesC8(), _L8(" = 0")}, //short_column_names + {KSynchronousFlag(), KNullDesC8(), _L8(" = NORMAL")}, //synchronous + {KTempStore(), KNullDesC8(), _L8(" = MEMORY")}, //temp_store + {KTempStoreDirectory(), KNullDesC8(), _L8(" = TEMP")}, //temp_store_directory + {KDatabaseList(), KNullDesC8(), KNullDesC8()}, //database_list + {KForeignKeyList(), _L8("(B)"), KNullDesC8()}, //foreign_key_list + {KFreelistCount(), KNullDesC8(), KNullDesC8()}, //freelist_count + {KIndexInfo(), _L8("(Index1)"), KNullDesC8()}, //index_info + {KIndexIist(), _L8("(B)"), KNullDesC8()}, //index_list + {KPageCount(), KNullDesC8(), KNullDesC8()}, //page_count + {KTableInfo(), _L8("(B)"), KNullDesC8()}, //table_info + {KSchemaVersion(), KNullDesC8(), _L8(" = 10")}, //schema_version + {KUserVersion(), KNullDesC8(), _L8(" = 10")}, //user_version + {KIntegrityCheck(), KNullDesC8(), _L8(" = 1")}, //integrity_check + {KParserTrace(), KNullDesC8(), _L8(" = ON")}, //parser_trace + {KVdbeTrace(), KNullDesC8(), _L8(" = ON")}, //vdbe_trace + {KdbeListing(), KNullDesC8(), _L8(" = ON")}, //vdbe_listing + }; + +//////////////////////////////////////////////// Expected results /////////////////////////////////////////////////////////// + +enum TAccessType + { + EReadParam, + EWriteParam, + }; + +enum TDatabaseType + { + ENonSecure, + ESecure, + }; + +enum TAccessResult + { + EOk = KErrNone, + EIgnore, + EDeny, + ENoCheck + }; + + +// Table listing the expected for each pragma command for the following access conditions:- +// 1) Pragma Read with non-secure database +// 2) Pragma Write with non-secure database +// 3) Pragma Read with secure database +// 4) Pragma Write with secure database +const TInt KResultsTable[KNumPragma][4] = + { + //////////////////////////////////////////////////////////////////////////////////// + // NON_SECURE | SECURE | + //W/out Pram |With Param|W/out Pram |With Param |Pragma Command + /////////////////////////////////////////////////////////////////////////////////// + {EOk, EIgnore, EDeny, EDeny }, //auto_vacuum + {EOk, EIgnore, EDeny, EDeny }, //cache_size + {EOk, ENoCheck, EDeny, EDeny }, //case_sensitive_like + {EOk, EOk, EDeny, EDeny }, //count_changes + {EOk, EIgnore, EDeny, EDeny }, //cache_size + {EOk, EIgnore, EDeny, EDeny }, //empty_result_callbacks + {EOk, EIgnore, EDeny, EDeny }, //encoding + {EOk, EOk, EDeny, EDeny }, //full_column_names + {EOk, EIgnore, EDeny, EDeny }, //fullfsync + {EIgnore, EIgnore, EDeny, EDeny }, //incremental_vacuum + {EIgnore, EIgnore, EDeny, EDeny }, //journal_mode + {EIgnore, EIgnore, EDeny, EDeny }, //journal_size_limit + {EOk, EIgnore, EDeny, EDeny }, //legacy_file_format + {EOk, EIgnore, EDeny, EDeny }, //locking_mode + {EOk, EIgnore, EDeny, EDeny }, //page_size + {EIgnore, EIgnore, EDeny, EDeny }, //max_page_count + {EOk, EIgnore, EDeny, EDeny }, //read_uncommitted + {EOk, EOk, EDeny, EDeny }, //short_column_names + {EOk, EIgnore, EDeny, EDeny }, //synchronous + {EOk, EIgnore, EDeny, EDeny }, //temp_store + {EOk, ENoCheck, EDeny, EDeny }, //temp_store_directory + {EOk, EOk, EDeny, EDeny }, //database_list + {ENoCheck, EOk, EDeny, EDeny }, //foreign_key_list + {EOk, EIgnore, EDeny, EDeny }, //freelist_count + {ENoCheck, EOk, EDeny, EDeny }, //index_info + {ENoCheck, EOk, EDeny, EDeny }, //index_list + {EOk, EIgnore, EDeny, EDeny }, //page_count + {ENoCheck, EOk, EDeny, EDeny }, //table_info + {EOk, EIgnore, EDeny, EDeny }, //schema_version + {EOk, EIgnore, EDeny, EDeny }, //user_version + {EOk, EIgnore, EDeny, EDeny }, //integrity_check + {EOk, EIgnore, EDeny, EDeny }, //parser_trace + {EOk, EIgnore, EDeny, EDeny }, //vdbe_trace + {EOk, EIgnore, EDeny, EDeny }, //vdbe_trace + }; + +/////////////////////////////////////////////////////////////////////////////////////// +//Deletes all created test files. +void DeleteTestFiles() + { + (void)RSqlDatabase::Delete(KPrivateDbName); + (void)RSqlDatabase::Delete(KSecureDbName); + (void)RSqlDatabase::Delete(KPublicDbName); + } + +/////////////////////////////////////////////////////////////////////////////////////// +//Test macros and functions +void Check1(TInt aValue, TInt aLine) + { + if(!aValue) + { + DeleteTestFiles(); + RDebug::Print(_L("*** Line %d\r\n"), aLine); + TheTest(EFalse, aLine); + } + } +void Check2(TInt aValue, TInt aExpected, TInt aLine) + { + if(aValue != aExpected) + { + DeleteTestFiles(); + RDebug::Print(_L("*** Line %d, Expected error: %d, got: %d\r\n"), aLine, aExpected, aValue); + TheTest(EFalse, aLine); + } + } +#define TEST(arg) ::Check1((arg), __LINE__) +#define TEST2(aValue, aExpected) ::Check2(aValue, aExpected, __LINE__) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////// +//Creates file session instance and the test directory +void CreateTestEnv() + { + TInt err = TheFs.Connect(); + TEST2(err, KErrNone); + + err = TheFs.MkDir(KPublicDir); + TEST(err == KErrNone || err == KErrAlreadyExists); + + err = TheFs.MkDir(KPrivateDir); + TEST(err == KErrNone || err == KErrAlreadyExists); + } +/////////////////////////////////////////////////////////////////////////////////////////////////////////// +//Create and setup all the database test files + +//Perform common setup steps for all databases +void SetupTestDb() + { + TInt err = TheDb.Exec(KCreateTable1); + TEST(err >= KErrNone); + + err = TheDb.Exec(KCreateTable2); + TEST(err >= KErrNone); + + err = TheDb.Exec(KCreateIndex); + TEST(err >= KErrNone); + + err = TheDb.Exec(KInsertTable); + TEST(err >= KErrNone); + } + +void CreateTestDBs() + { + RSqlSecurityPolicy policy; //required for secure database + + //Create Private Database + TInt err = TheDb.Create(KPublicDbName); + TEST2(err, KErrNone); + + SetupTestDb(); + + TheDb.Close(); + + //Create Public Database + err = TheDb.Create(KPrivateDbName); + TEST2 (err, KErrNone); + + SetupTestDb(); + + TheDb.Close(); + + //Create Secure Database + err = policy.Create(TSecurityPolicy(TSecurityPolicy::EAlwaysPass)); + TEST2 (err, KErrNone); + err = policy.SetDbPolicy(RSqlSecurityPolicy::EReadPolicy, KPolicy1); + TEST2 (err, KErrNone); + err = policy.SetDbPolicy(RSqlSecurityPolicy::EWritePolicy, KPolicy2); + TEST2 (err, KErrNone); + err = TheDb.Create(KSecureDbName,policy); + TEST2 (err, KErrNone); + + SetupTestDb(); + + policy.Close(); + TheDb.Close(); + } + +void PragmaTests(const TAccessType aAccessType, TDatabaseType aDbType, TBool aAttached) + { + TBuf8<10> databaseName; + TPtrC8 param; + TInt index = 0; + //Depending if we are + aAttached ? databaseName.Copy(_L8("AttachedDB")) : databaseName.Copy(_L8("main")); + + if(aDbType == ENonSecure) + { + index = (aAccessType == EReadParam) ? 0 : 1; + } + else + { + index = (aAccessType == EReadParam) ? 2 : 3; + } + + for(TInt i=0;i