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 - testing new APIs
sl@0: // All tests assume that drive C is presented in the system and is not a ROM drive.
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 <d32dbms.h>
sl@0: #include <e32test.h>
sl@0: #include "t_dbplatsecdef.h"
sl@0: #include "t_dbplatsecutl.h"
sl@0: #include "t_dbplatsecdb.h"
sl@0: #include "t_dbplatsectbl.h"
sl@0: 
sl@0: //Global definitions
sl@0: RTest 				TheTest(_L("t_dbplatsec : DBMS platform security testing"));
sl@0: RDbs 				TheDbs;
sl@0: RDbNamedDatabase 	TheDb1;
sl@0: RDbNamedDatabase 	TheDb2;
sl@0: RDbTable			TheTbl1;
sl@0: RDbTable			TheTbl2;
sl@0: 
sl@0: void 		DeleteDatabases();
sl@0: TDBSCUtils 	TheDbscUtils(TheTest, &DeleteDatabases);
sl@0: 
sl@0: void DeleteDatabases()
sl@0: 	{
sl@0: 	TheTbl1.Close();
sl@0: 	TheTbl2.Close();
sl@0: 	TheDb2.Close();
sl@0: 	TheDb1.Close();
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb2Name);
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb3Name);
sl@0: 	}
sl@0: 
sl@0: static void GetDatabaseRPolicyTest()
sl@0: 	{
sl@0: 	TSecurityPolicy policy;
sl@0: 	TInt err = TheDbs.GetDatabasePolicy(KSecureDbUid, RDbs::EReadPolicy, policy);
sl@0: 	TEST2(err, KErrNone);
sl@0: 	TCompiledSecurityPolicy testSecurityPolicy(policy);
sl@0: 	TSecurityPolicy::TType type = testSecurityPolicy.Type();
sl@0: 	TEST(type == TSecurityPolicy::ETypeC3);
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityCommDD));
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityPowerMgmt));
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityTrustedUI));
sl@0: 	}
sl@0: 
sl@0: static void GetDatabaseWPolicyTest()
sl@0: 	{
sl@0: 	TSecurityPolicy policy;
sl@0: 	TInt err = TheDbs.GetDatabasePolicy(KSecureDbUid, RDbs::EWritePolicy, policy);
sl@0: 	TEST2(err, KErrNone);
sl@0: 	TCompiledSecurityPolicy testSecurityPolicy(policy);
sl@0: 	TSecurityPolicy::TType type = testSecurityPolicy.Type();
sl@0: 	TEST(type == TSecurityPolicy::ETypeC3);
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityMultimediaDD));
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityReadDeviceData));
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, static_cast <TCapability> (TUint8(ECapability_None))));
sl@0: 	}
sl@0: 
sl@0: static void GetDatabaseSPolicyTest()
sl@0: 	{
sl@0: 	TSecurityPolicy policy;
sl@0: 	TInt err = TheDbs.GetDatabasePolicy(KSecureDbUid, RDbs::ESchemaPolicy, policy);
sl@0: 	TEST2(err, KErrNone);
sl@0: 	TCompiledSecurityPolicy testSecurityPolicy(policy);
sl@0: 	TSecurityPolicy::TType type = testSecurityPolicy.Type();
sl@0: 	TEST(type == TSecurityPolicy::ETypeC7);
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityWriteDeviceData));
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityDRM));
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityProtServ));
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityDiskAdmin));
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityNetworkControl));
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilityWriteUserData));
sl@0: 	TEST(TDBSCUtils::HasCapability(testSecurityPolicy, ECapabilitySwEvent));
sl@0: 	}
sl@0: 
sl@0: static void GetTablePolicyTest(const TDesC& aTableName,
sl@0: 							   RDbs::TPolicyType aPolicyType,
sl@0: 							   TSecurityPolicy::TType aType,
sl@0: 							   TSecureId aSecureId,
sl@0: 							   TVendorId aVendorId,
sl@0: 							   const TCapability* aCapabilities, TInt aCapCount)
sl@0: 	{
sl@0: 	TSecurityPolicy policy;
sl@0: 	TInt err = TheDbs.GetTablePolicy(KSecureDbUid, aTableName, aPolicyType, policy);
sl@0: 	TEST2(err, KErrNone);
sl@0: 	TCompiledSecurityPolicy testSecurityPolicy(policy);
sl@0: 	TEST(testSecurityPolicy.Type() == aType);
sl@0: 	for(TInt i=0;i<aCapCount;++i)
sl@0: 		{
sl@0: 		TEST(TDBSCUtils::HasCapability(testSecurityPolicy, aCapabilities[i]));
sl@0: 		}
sl@0: 	if(testSecurityPolicy.Type() == TSecurityPolicy::ETypeS3)
sl@0: 		{
sl@0: 		TEST(testSecurityPolicy.SecureId() == aSecureId);
sl@0: 		}
sl@0: 	else if(testSecurityPolicy.Type() == TSecurityPolicy::ETypeV3)
sl@0: 		{
sl@0: 		TEST(testSecurityPolicy.VendorId() == aVendorId);
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: //Tests RDbs::GetDatabasePolicy()/RDbs::GetTablePolicy() with invalid arguments
sl@0: static void InvalidPolicyArgTestsL()
sl@0: 	{
sl@0: 	TheTest.Printf(_L("--Invalid UID\n"));
sl@0: 	const TUid KInvalidUid = {0x490122};
sl@0: 	TSecurityPolicy policy;
sl@0: 	TInt err = TheDbs.GetDatabasePolicy(KInvalidUid, RDbs::EWritePolicy, policy);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 	err = TheDbs.GetDatabasePolicy(KNullUid, RDbs::EWritePolicy, policy);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 	err = TheDbs.GetTablePolicy(KInvalidUid, KTableName1, RDbs::EWritePolicy, policy);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 	err = TheDbs.GetTablePolicy(KNullUid, KTableName1, RDbs::EWritePolicy, policy);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Invalid policy type\n"));
sl@0: 	err = TheDbs.GetDatabasePolicy(KSecureDbUid, static_cast <RDbs::TPolicyType> (100), policy);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 	err = TheDbs.GetTablePolicy(KSecureDbUid, KTableName2, static_cast <RDbs::TPolicyType> (101), policy);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Table name, which is not in the policy file\n"));
sl@0: 	_LIT(KMissingTableName, "AAAAAA");
sl@0: 	err = TheDbs.GetTablePolicy(KSecureDbUid, KMissingTableName, RDbs::EWritePolicy, policy);
sl@0: 	TEST2(err, KErrNone);//This must be the related database policy
sl@0: 	TSecurityPolicy dbPolicy;
sl@0: 	err = TheDbs.GetDatabasePolicy(KSecureDbUid, RDbs::EWritePolicy, dbPolicy);
sl@0: 	TEST2(err, KErrNone);
sl@0: 	TCompiledSecurityPolicy sp1(policy);
sl@0: 	TCompiledSecurityPolicy sp2(dbPolicy);
sl@0: 	TEST(sp1 == sp2);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Table name - zero length\n"));
sl@0: 	_LIT(KInvTableName, "");
sl@0: 	err = TheDbs.GetTablePolicy(KSecureDbUid, KInvTableName, RDbs::EWritePolicy, policy);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Table name - Schema policy request\n"));
sl@0: 	err = TheDbs.GetTablePolicy(KSecureDbUid, KTableName3, RDbs::ESchemaPolicy, policy);
sl@0: 	TEST2(err, KErrNotSupported);
sl@0: 	}
sl@0: 
sl@0: //Returns a valid drive number, but not presented in the system
sl@0: static TDriveNumber FirstNotPresentedDriveNumber()
sl@0: 	{
sl@0: 	RFs fs;
sl@0: 	TEST2(fs.Connect(), KErrNone);
sl@0: 	TDriveNumber drvNumber = static_cast <TDriveNumber> (1000);
sl@0: 	for(TInt i=EDriveA;i<=EDriveZ;++i)
sl@0: 		{
sl@0: 		TDriveInfo driveInfo;
sl@0: 		if(fs.Drive(driveInfo, static_cast <TDriveNumber> (i)) == KErrNone)
sl@0: 			{
sl@0: 			if(driveInfo.iType == EMediaNotPresent)
sl@0: 				{
sl@0: 				drvNumber = static_cast <TDriveNumber> (i);
sl@0: 				break;
sl@0: 				}
sl@0: 			}
sl@0: 		}
sl@0: 	fs.Close();
sl@0: 	TEST(drvNumber <= EDriveZ);
sl@0: 	return drvNumber;
sl@0: 	}
sl@0: 
sl@0: //Returns the first valid ROM drive number.
sl@0: static TDriveNumber FirstROMDriveNumber()
sl@0: 	{
sl@0: 	RFs fs;
sl@0: 	TEST2(fs.Connect(), KErrNone);
sl@0: 	TDriveNumber drvNumber = static_cast <TDriveNumber> (1000);
sl@0: 	for(TInt i=EDriveA;i<=EDriveZ;++i)
sl@0: 		{
sl@0: 		TDriveInfo driveInfo;
sl@0: 		if(fs.Drive(driveInfo, static_cast <TDriveNumber> (i)) == KErrNone)
sl@0: 			{
sl@0: 			if(driveInfo.iDriveAtt & KDriveAttRom)
sl@0: 				{
sl@0: 				drvNumber = static_cast <TDriveNumber> (i);
sl@0: 				break;
sl@0: 				}
sl@0: 			}
sl@0: 		}
sl@0: 	fs.Close();
sl@0: 	TEST(drvNumber <= EDriveZ);
sl@0: 	return drvNumber;
sl@0: 	}
sl@0: 
sl@0: //Tests RDbs::DatabaseNamesL() with invalid arguments
sl@0: static void InvalidPolicyArgTests2L()
sl@0: 	{
sl@0: 	CDbDatabaseNames* dbNames = NULL;
sl@0: 
sl@0: 	TheTest.Printf(_L("--Invalid UID\n"));
sl@0: 	const TUid KInvalidUid = {0x490122};
sl@0: 	TRAPD(err, dbNames = TheDbs.DatabaseNamesL(EDriveC, KInvalidUid));
sl@0: 	TEST2(err, KErrArgument);
sl@0: 	TEST(dbNames == NULL);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Null UID\n"));
sl@0: 	TRAP(err, dbNames = TheDbs.DatabaseNamesL(EDriveC, KNullUid));
sl@0: 	TEST2(err, KErrArgument);
sl@0: 	TEST(dbNames == NULL);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Invalid drive\n"));
sl@0: 	TRAP(err, dbNames = TheDbs.DatabaseNamesL(static_cast <TDriveNumber> (-1), KSecureDbUid));
sl@0: 	TEST2(err, KErrBadName);
sl@0: 	TEST(dbNames == NULL);
sl@0: 	TRAP(err, TheDbs.DatabaseNamesL(static_cast <TDriveNumber> (1765), KSecureDbUid));
sl@0: 	TEST2(err, KErrBadName);
sl@0: 	TEST(dbNames == NULL);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Valid drive number, but not presented in the system\n"));
sl@0: 	TDriveNumber driveNumber = ::FirstNotPresentedDriveNumber();
sl@0: 	TRAP(err, dbNames = TheDbs.DatabaseNamesL(driveNumber, KSecureDbUid));
sl@0: 	TEST2(err, KErrNotReady);
sl@0: 	TEST(dbNames == NULL);
sl@0: 	}
sl@0: 
sl@0: /**
sl@0: @SYMTestCaseID SYSLIB-DBMS-CT-0003
sl@0: @SYMTestCaseDesc Test RDbs::GetDatabasePolicy(), RDbs::GetTablePolicy()
sl@0:                  getting database or table security policies.
sl@0: @SYMTestPriority High
sl@0: @SYMTestActions  A call with valid arguments and result check.
sl@0: 				 A call with an invalid UID.
sl@0: 				 A call with an invalid security policy type.
sl@0: 				 A call with a table name, not presented in the policy file.
sl@0: 				 A call requesting schema security policy of a table.
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 GetPolicyTestL()
sl@0: 	{
sl@0: 	TheTest.Printf(_L("--Simple GetDatabasePolicy() tests\n"));
sl@0: 	::GetDatabaseRPolicyTest();
sl@0: 	::GetDatabaseWPolicyTest();
sl@0: 	::GetDatabaseSPolicyTest();
sl@0: 
sl@0: 	::InvalidPolicyArgTestsL();
sl@0: 
sl@0: 	TheTest.Printf(_L("--Simple GetTablePolicy() tests\n"));
sl@0: 	TCapability caps1[] = {ECapabilityCommDD, ECapabilityPowerMgmt, ECapabilityTrustedUI};
sl@0: 	TCapability caps2[] = {ECapabilityMultimediaDD, ECapabilityReadDeviceData};
sl@0: 	::GetTablePolicyTest(KTableName1, RDbs::EReadPolicy, TSecurityPolicy::ETypeC3, 0, 0, caps1, 3);
sl@0: 	::GetTablePolicyTest(KTableName1, RDbs::EWritePolicy, TSecurityPolicy::ETypeC3, 0, 0, caps2, 2);
sl@0: 
sl@0: 	TCapability caps3[] = {static_cast <TCapability> (TUint8(ECapability_None))};
sl@0: 	::GetTablePolicyTest(KTableName2, RDbs::EReadPolicy, TSecurityPolicy::ETypeC3, 0, 0, caps3, 1);
sl@0: 	::GetTablePolicyTest(KTableName2, RDbs::EWritePolicy, TSecurityPolicy::ETypeC3, 0, 0, caps2, 2);
sl@0: 
sl@0: 	TCapability caps4[] = {ECapabilityReadUserData};
sl@0: 	::GetTablePolicyTest(KTableName3, RDbs::EReadPolicy, TSecurityPolicy::ETypeC3, 0, 0, caps1, 3);
sl@0: 	::GetTablePolicyTest(KTableName3, RDbs::EWritePolicy, TSecurityPolicy::ETypeC3, 0, 0, caps4, 1);
sl@0: 
sl@0: 	TCapability caps5[] = {ECapabilityWriteUserData};
sl@0: 	::GetTablePolicyTest(KTableName4, RDbs::EReadPolicy, TSecurityPolicy::ETypeC3, 0, 0, caps5, 1);
sl@0: 	::GetTablePolicyTest(KTableName4, RDbs::EWritePolicy, TSecurityPolicy::ETypeC3, 0, 0, caps2, 2);
sl@0: 	}
sl@0: 
sl@0: /**
sl@0: @SYMTestCaseID SYSLIB-DBMS-CT-0004
sl@0: @SYMTestCaseDesc Test RDbs::DatabaseNamesL(TDriveNumber, const TDesC&, TUid) -
sl@0:                  getting a list of secure shared databases.
sl@0: @SYMTestPriority High
sl@0: @SYMTestActions  A call with valid arguments and result check
sl@0: 				 A call with an invalid drive number.
sl@0: 				 A call with a valid, but not presented in the system, drive number.
sl@0: 				 A call with an invalid UID.
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 GetDatabaseListTestL()
sl@0: 	{
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb2Name);
sl@0: 
sl@0: 	TheDb1 = TDBSCUtils::CreateDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	TheDb1.Close();
sl@0: 
sl@0: 	TheDb2 = TDBSCUtils::CreateDatabase(TheDbs, KSecureDbUid, KDb2Name);
sl@0: 	TheDb2.Close();
sl@0: 
sl@0: 	TBuf<32> dbName;
sl@0: 	dbName.Copy(KDb1Name().Mid(KDatabaseNamePos));
sl@0: 	TEST(TDBSCUtils::IsDatabaseThereL(TheDbs, KSecureDbUid, EDriveC, dbName));
sl@0: 	dbName.Copy(KDb2Name().Mid(KDatabaseNamePos));
sl@0: 	TEST(TDBSCUtils::IsDatabaseThereL(TheDbs, KSecureDbUid, EDriveC, dbName));
sl@0: 
sl@0: 	TheTest.Printf(_L("--An attempt to retrieve the list of database names for an UID, which security policy cannot be satisfied by the current test application\n"));
sl@0: 	CDbDatabaseNames* dbNames = NULL;
sl@0: 	TRAPD(err, dbNames = TheDbs.DatabaseNamesL(EDriveZ, KSecureDbUid2));
sl@0: 	delete dbNames;
sl@0: 	TEST2(err, KErrNone);
sl@0: 
sl@0: 	::InvalidPolicyArgTests2L();
sl@0: 	}
sl@0: 
sl@0: /**
sl@0: @SYMTestCaseID SYSLIB-DBMS-CT-0005
sl@0: @SYMTestCaseDesc Test RDbs::CopyDatabase(const TDesC&, const TDesC&, TUid) -
sl@0:                  copying secure shared database .
sl@0: @SYMTestPriority High
sl@0: @SYMTestActions  A call with valid arguments and result check
sl@0:                  A call with an invalid source database name.
sl@0: 				 A call with an invalid target database name.
sl@0: 				 A call with an invalid UID.
sl@0: 				 An attempt to copy an opened database.
sl@0: 				 An attempt to copy a database, which security policy cannot be satisfied.
sl@0: 				 An attempt to copy a database with path specified in the database name.
sl@0: 				 An attempt to copy non-existing database.
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 CopyDatabaseTestL()
sl@0: 	{
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	TheDb1 = TDBSCUtils::CreateDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	TheDb1.Close();
sl@0: 
sl@0: 	TheTest.Printf(_L("--Simple copy test\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb3Name);
sl@0: 	TInt err = TheDbs.CopyDatabase(KDb1Name, KDb3Name, KSecureDbUid);
sl@0: 	TEST2(err, KErrNone);
sl@0: 	TBuf<32> dbName;
sl@0: 	dbName.Copy(KDb3Name().Mid(KDatabaseNamePos));
sl@0: 	TEST(TDBSCUtils::IsDatabaseThereL(TheDbs, KSecureDbUid, EDriveC, dbName));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb3Name);
sl@0: 
sl@0: 	TheTest.Printf(_L("--An attempt to copy a source database, which security policy cannot be satisfied by the current test application\n"));
sl@0: 	err = TheDbs.CopyDatabase(KProtDb1ZName, KDb3Name, KSecureDbUid2);
sl@0: 	TEST2(err, KErrPermissionDenied);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Null source database name\n"));
sl@0: 	err = TheDbs.CopyDatabase(KNullDesC, KDb3Name, KSecureDbUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb3Name);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Source database name with not presented drive number\n"));
sl@0: 	TDriveNumber driveNumber = ::FirstNotPresentedDriveNumber();
sl@0: 	TChar driveChar;
sl@0: 	TEST2(RFs::DriveToChar(driveNumber, driveChar), KErrNone);
sl@0: 	TBuf<KDatabaseNamePos> drvBuf;
sl@0: 	drvBuf.Append(driveChar);
sl@0: 	drvBuf.Append(':');
sl@0: 	dbName.Copy(drvBuf);
sl@0: 	dbName.Append(KDb1Name().Mid(KDatabaseNamePos));
sl@0: 	err = TheDbs.CopyDatabase(dbName, KDb3Name, KSecureDbUid);
sl@0: 	TEST2(err, KErrNotReady);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Source database name - only with a drive letter and \":\"\n"));
sl@0: 	err = TheDbs.CopyDatabase(drvBuf, KDb3Name, KSecureDbUid);
sl@0: 	TEST2(err, KErrNotReady);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Source database name - only with a drive letter\n"));
sl@0: 	drvBuf.SetLength(1);
sl@0: 	err = TheDbs.CopyDatabase(drvBuf, KDb3Name, KSecureDbUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Null destination database name\n"));
sl@0: 	err = TheDbs.CopyDatabase(KDb1Name, KNullDesC, KSecureDbUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Destination database name with not presented drive number\n"));
sl@0: 	drvBuf.Append(':');
sl@0: 	dbName.Copy(drvBuf);
sl@0: 	dbName.Append(KDb3Name().Mid(KDatabaseNamePos));
sl@0: 	err = TheDbs.CopyDatabase(KDb1Name, dbName, KSecureDbUid);
sl@0: 	TEST2(err, KErrNotReady);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Destination database - ROM drive\n"));
sl@0: 	TDriveNumber romDriveNumber = ::FirstROMDriveNumber();
sl@0: 	TEST2(RFs::DriveToChar(romDriveNumber, driveChar), KErrNone);
sl@0: 	drvBuf[0] = static_cast <TText> (driveChar);
sl@0: 	dbName.Copy(drvBuf);
sl@0: 	dbName.Append(KDb3Name().Mid(KDatabaseNamePos));
sl@0: 	err = TheDbs.CopyDatabase(KDb1Name, dbName, KSecureDbUid);
sl@0: 	TEST2(err, KErrAccessDenied);
sl@0: 
sl@0: 	TheTest.Printf(_L("--A source database with a valid name, but not presented in the system\n"));
sl@0: 	_LIT(KMissingDb, "C:asdhasfsudfygusdfuierfb.db");
sl@0: 	err = TheDbs.CopyDatabase(KMissingDb, KDb3Name, KSecureDbUid);
sl@0: 	TEST2(err, KErrNotFound);
sl@0: 
sl@0: 	TheTest.Printf(_L("--A test with an open source database\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	TheDb2 = TDBSCUtils::CreateDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	err = TheDbs.CopyDatabase(KDb1Name, KDb3Name, KSecureDbUid);
sl@0: 	TheDb2.Close();
sl@0: 	TEST2(err, KErrInUse);
sl@0: 
sl@0: 	TheTest.Printf(_L("--An atempt to copy over an existing database\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb2Name);
sl@0: 	TheDb1 = TDBSCUtils::CreateDatabase(TheDbs, KSecureDbUid, KDb2Name);
sl@0: 	TheDb1.Close();
sl@0: 	err = TheDbs.CopyDatabase(KDb1Name, KDb2Name, KSecureDbUid);
sl@0: 	TEST2(err, KErrAlreadyExists);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Too long destination database name > KDbMaxName symbols\n"));
sl@0: 	_LIT(KTooLongDbName, "A_0123456789_0123456789_0123456789_0123456789_0123456789_0123456789_0123456789.db");
sl@0: 	err = TheDbs.CopyDatabase(KDb1Name, KTooLongDbName, KSecureDbUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Null UID\n"));
sl@0: 	err = TheDbs.CopyDatabase(KDb1Name, KDb3Name, KNullUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Invalid UID\n"));
sl@0: 	const TUid KInvalidUid = {0x490122};
sl@0: 	err = TheDbs.CopyDatabase(KDb1Name, KDb3Name, KInvalidUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--An attempt to copy a database with the path specified in the name\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb2Name);
sl@0: 	_LIT(KSrcDbName2, "C:\\a.Db");
sl@0: 	_LIT(KDestDbName2, "C:\\b.dB");
sl@0: 	err = TheDbs.CopyDatabase(KSrcDbName2, KDestDbName2, KSecureDbUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 	}
sl@0: 
sl@0: /**
sl@0: @SYMTestCaseID SYSLIB-DBMS-CT-0006
sl@0: @SYMTestCaseDesc Test RDbs::Delete(const TDesC&, TUid) - deleting secure shared database .
sl@0: @SYMTestPriority High
sl@0: @SYMTestActions  A call with valid arguments and result check
sl@0:                  A call with an invalid UID.
sl@0: 				 A call with an invalid database name.
sl@0: 				 An attempt to delete an opened database.
sl@0: 				 An attempt to delete a database, which security policy cannot be satisfied.
sl@0: 				 An attempt to delete a database with path specified in the database name.
sl@0: 				 An attempt to delete non-existing database.
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 DeleteDatabaseTestL()
sl@0: 	{
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	TheDb1 = TDBSCUtils::CreateDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	TheDb1.Close();
sl@0: 
sl@0: 	TheTest.Printf(_L("--Simple delete database test\n"));
sl@0: 	TInt err = TheDbs.DeleteDatabase(KDb1Name, KSecureDbUid);
sl@0: 	TEST2(err, KErrNone);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Null UID\n"));
sl@0: 	err = TheDbs.DeleteDatabase(KDb1Name, KNullUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Invalid UID\n"));
sl@0: 	const TUid KInvalidUid = {0x490122};
sl@0: 	err = TheDbs.DeleteDatabase(KDb1Name, KInvalidUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Null database name\n"));
sl@0: 	err = TheDbs.DeleteDatabase(KNullDesC, KSecureDbUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Non-existing database - no drive letter (the name is invalid)\n"));
sl@0: 	_LIT(KTooLongDbName, "A_0123456789_0123456789_0123456789_0123456789_0123456789_0123456789_0123456789.db");
sl@0: 	err = TheDbs.DeleteDatabase(KTooLongDbName, KSecureDbUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 	_LIT(KInvDbName1, "UI789.db");
sl@0: 	err = TheDbs.DeleteDatabase(KInvDbName1, KSecureDbUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Non-existing database - valid db name\n"));
sl@0: 	_LIT(KMissingDbName1, "C:A0192345.db");
sl@0: 	err = TheDbs.DeleteDatabase(KMissingDbName1, KSecureDbUid);
sl@0: 	TEST2(err, KErrNotFound);
sl@0: 
sl@0: 	TheTest.Printf(_L("--An attempt to delete a database with the path specified in the name\n"));
sl@0: 	_LIT(KMissingDbName2, "C:\\TEMP\\A0192345.db");
sl@0: 	err = TheDbs.DeleteDatabase(KMissingDbName2, KSecureDbUid);
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--An attempt to delete a database, which security policy cannot be satisfied by the current test application\n"));
sl@0: 	err = TheDbs.DeleteDatabase(KProtDb1CName, KSecureDbUid2);
sl@0: 	TEST2(err, KErrPermissionDenied);
sl@0: 
sl@0: 	TheTest.Printf(_L("--An attempt to delete an open database\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	TheDb1 = TDBSCUtils::CreateDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	err = TheDbs.DeleteDatabase(KDb1Name, KSecureDbUid);
sl@0: 	TEST2(err, KErrInUse);
sl@0: 	TheDb1.Close();
sl@0: 	}
sl@0: 
sl@0: /**
sl@0: @SYMTestCaseID SYSLIB-DBMS-CT-0007
sl@0: @SYMTestCaseDesc Test RDbNamedDatabase::Create(RDbs&, const TDesC&, const TDesC&) -
sl@0:                  secure shared database creation.
sl@0: @SYMTestPriority High
sl@0: @SYMTestActions  A call with valid arguments and result check
sl@0:                  An attempt to create already existing database.
sl@0: 				 An attempt to create already existing and opened database.
sl@0: 				 RDbNamedDatabase::Create() called with an invalid format string.
sl@0: 				 RDbNamedDatabase::Create() called with a database name containing '\' symbols.
sl@0: 				 An attempt to create a database, which security policy cannot be satisfied.
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 CreateDatabaseL()
sl@0: 	{
sl@0: 	TheTest.Printf(_L("--Simple create database test\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	TBuf<32> format;
sl@0: 	format.Copy(KSecure);
sl@0: 	format.Append(KSecureDbUid.Name());
sl@0: 	TInt err = TheDb1.Create(TheDbs, KDb1Name, format);
sl@0: 	TEST2(err, KErrNone);
sl@0: 
sl@0: 	TheTest.Printf(_L("--An atempt to recreate an open database\n"));
sl@0: 	err = TheDb1.Create(TheDbs, KDb1Name, format);
sl@0: 	TEST2(err, KErrAlreadyExists);
sl@0: 	TheDb1.Close();
sl@0: 
sl@0: 	TheTest.Printf(_L("--An atempt to recreate an existing database\n"));
sl@0: 	err = TheDb1.Create(TheDbs, KDb1Name, format);
sl@0: 	TEST2(err, KErrAlreadyExists);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Format string with \"SECURE\" keyword and some other words too\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	format.Copy(_L("A "));
sl@0: 	format.Append(KSecure);
sl@0: 	format.Append(_L(" B"));
sl@0: 	format.Append(KSecureDbUid.Name());
sl@0: 	err = TheDb1.Create(TheDbs, KDb1Name, format);
sl@0: 	TheDb1.Close();
sl@0: 	TEST2(err, KErrNotSupported);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Format string with \"SeCuRe\" keyword\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	format.Copy(_L("SeCuRe"));
sl@0: 	format.Append(KSecureDbUid.Name());
sl@0: 	err = TheDb1.Create(TheDbs, KDb1Name, format);
sl@0: 	TheDb1.Close();
sl@0: 	TEST2(err, KErrNone);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Format string with \"SECURED\" keyword\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	format.Copy(_L("SECURED"));
sl@0: 	format.Append(KSecureDbUid.Name());
sl@0: 	err = TheDb1.Create(TheDbs, KDb1Name, format);
sl@0: 	TheDb1.Close();
sl@0: 	TEST2(err, KErrNotSupported);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Format string with a null uid\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	format.Copy(_L("SECURE"));
sl@0: 	format.Append(KNullUid.Name());
sl@0: 	err = TheDb1.Create(TheDbs, KDb1Name, format);
sl@0: 	TheDb1.Close();
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Format string with an invalid uid\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	format.Copy(_L("SECURE"));
sl@0: 	const TUid KInvalidUid = {0x490122};
sl@0: 	format.Append(KInvalidUid.Name());
sl@0: 	err = TheDb1.Create(TheDbs, KDb1Name, format);
sl@0: 	TheDb1.Close();
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Format string with a uid only\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	format.Copy(KSecureDbUid.Name());
sl@0: 	err = TheDb1.Create(TheDbs, KDb1Name, format);
sl@0: 	TheDb1.Close();
sl@0: 	TEST2(err, KErrNotSupported);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Blank format string\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	format.Zero();
sl@0: 	err = TheDb1.Create(TheDbs, KDb1Name, format);
sl@0: 	TheDb1.Close();
sl@0: 	TEST2(err, KErrNotSupported);
sl@0: 
sl@0: 	TheTest.Printf(_L("--Valid format string + database name with a path\n"));
sl@0: 	TDBSCUtils::DeleteDatabase(TheDbs, KSecureDbUid, KDb1Name);
sl@0: 	format.Copy(KSecure);
sl@0: 	format.Append(KSecureDbUid.Name());
sl@0: 	_LIT(KSrcDbName2, "C:\\a.Db");
sl@0: 	err = TheDb1.Create(TheDbs, KSrcDbName2, format);
sl@0: 	TheDb1.Close();
sl@0: 	TEST2(err, KErrArgument);
sl@0: 
sl@0: 	TheTest.Printf(_L("--An attempt to create a database, which security policy cannot be satisfied by the current test application\n"));
sl@0: 	format.Copy(KSecure);
sl@0: 	format.Append(KSecureDbUid2.Name());
sl@0: 	err = TheDb1.Create(TheDbs, KProtDb2CName, format);
sl@0: 	TheDb1.Close();
sl@0: 	TEST2(err, KErrPermissionDenied);
sl@0: 	}
sl@0: 
sl@0: static void INC057327L()
sl@0:     {
sl@0:      TRAPD(err,delete TheDbs.DatabaseNamesL(EDriveZ, TUid::Uid(0x12344321)));
sl@0:      TheTest(err == KErrNone);
sl@0:     }
sl@0: 
sl@0: static void DoRunL()
sl@0: 	{
sl@0: 	TheTest.Start(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0003 Get database/table policies "));
sl@0: 	::GetPolicyTestL();
sl@0: 
sl@0: 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0004 Get databases list "));
sl@0: 	::GetDatabaseListTestL();
sl@0: 
sl@0: 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0005 Copy database "));
sl@0: 	::CopyDatabaseTestL();
sl@0: 
sl@0: 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0006 Delete database "));
sl@0: 	::DeleteDatabaseTestL();
sl@0: 
sl@0: 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-DBMS-CT-0007 Create database "));
sl@0: 	::CreateDatabaseL();
sl@0: 
sl@0: 	TheTest.Next(_L("Database security"));
sl@0: 	::DoDbTestL();
sl@0: 
sl@0: 	TheTest.Next(_L("Table security"));
sl@0: 	::DoTblTestL();
sl@0: 
sl@0: 	TheTest.Next(_L("Test for INC057327"));
sl@0: 	::INC057327L();
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: 	TRAP(err, ::DoRunL());
sl@0: 	TEST2(err, KErrNone);
sl@0: 
sl@0: 	::DeleteDatabases();
sl@0: 	TheDbs.Close();
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:     }