persistentstorage/sql/TEST/t_sqlcorrupt.cpp
changeset 51 7d4490026038
parent 29 cce6680bbf1c
child 55 44f437012c90
--- a/persistentstorage/sql/TEST/t_sqlcorrupt.cpp	Thu Aug 12 11:53:23 2010 +0100
+++ b/persistentstorage/sql/TEST/t_sqlcorrupt.cpp	Mon Sep 27 11:59:56 2010 +0100
@@ -16,6 +16,9 @@
 #include <e32test.h>
 #include <bautils.h>
 #include <sqldb.h>
+#include <stdlib.h>
+#include "sqlite3.h"
+#include "SqliteSymbian.h"
 
 ///////////////////////////////////////////////////////////////////////////////////////
 
@@ -67,6 +70,27 @@
 
 ///////////////////////////////////////////////////////////////////////////////////////
 
+RSqlSecurityPolicy CreateTestSecurityPolicy()
+	{
+	RSqlSecurityPolicy policy;
+	TInt err = policy.Create(TSecurityPolicy::EAlwaysPass);
+	TEST2(err, KErrNone);
+
+	err = policy.SetDbPolicy(RSqlSecurityPolicy::ESchemaPolicy, TSecurityPolicy::EAlwaysPass);
+	TEST2(err, KErrNone);
+	err = policy.SetDbPolicy(RSqlSecurityPolicy::EWritePolicy, TSecurityPolicy::EAlwaysPass);
+	TEST2(err, KErrNone);
+	err = policy.SetDbPolicy(RSqlSecurityPolicy::EReadPolicy, TSecurityPolicy::EAlwaysPass);
+	TEST2(err, KErrNone);
+
+	err = policy.SetPolicy(RSqlSecurityPolicy::ETable, _L("A"), RSqlSecurityPolicy::EWritePolicy, TSecurityPolicy::EAlwaysPass);
+	TEST2(err, KErrNone);
+	err = policy.SetPolicy(RSqlSecurityPolicy::ETable, _L("A"), RSqlSecurityPolicy::EReadPolicy, TSecurityPolicy::EAlwaysPass);
+	TEST2(err, KErrNone);
+	
+	return policy;
+	}
+
 enum TDbEncoding
 	{
 	EDbEncUtf16,
@@ -77,22 +101,8 @@
 	{
 	(void)RSqlDatabase::Delete(KDbName);
 	
-	RSqlSecurityPolicy policy;
-	TInt err = policy.Create(TSecurityPolicy::EAlwaysPass);
-	TEST2(err, KErrNone);
-	
-	err = policy.SetDbPolicy(RSqlSecurityPolicy::ESchemaPolicy, TSecurityPolicy::EAlwaysPass);
-	TEST2(err, KErrNone);
-	err = policy.SetDbPolicy(RSqlSecurityPolicy::EWritePolicy, TSecurityPolicy::EAlwaysPass);
-	TEST2(err, KErrNone);
-	err = policy.SetDbPolicy(RSqlSecurityPolicy::EReadPolicy, TSecurityPolicy::EAlwaysPass);
-	TEST2(err, KErrNone);
-	
-	err = policy.SetPolicy(RSqlSecurityPolicy::ETable, _L("A"), RSqlSecurityPolicy::EWritePolicy, TSecurityPolicy::EAlwaysPass);
-	TEST2(err, KErrNone);
-	err = policy.SetPolicy(RSqlSecurityPolicy::ETable, _L("A"), RSqlSecurityPolicy::EReadPolicy, TSecurityPolicy::EAlwaysPass);
-	TEST2(err, KErrNone);
-	
+	RSqlSecurityPolicy policy = CreateTestSecurityPolicy();
+	TInt err = KErrNone;
 	if(aEncoding == EDbEncUtf16)
 		{
 		err = TheDb.Create(KDbName, policy);
@@ -124,58 +134,63 @@
 	//
 	TBuf8<KCorruptBlockLen> invalidData;
 	invalidData.SetLength(KCorruptBlockLen);
-	invalidData.Fill(TChar(0xCC));
-	//
-	for(TInt i=0;i<KIterationCnt;++i)
+	TChar invalidChar[] = {TChar((TUint)0xCC), TChar(0x00), TChar((TUint)-1), TChar(0x1D)};
+	for(TInt j=0;j<(sizeof(invalidChar)/sizeof(invalidChar[0]));++j)
 		{
-		TheTest.Printf(_L("% 4d\r"), i + 1);
-		//Corrupt the database
-		err = fm->Copy(KFullDbName2, KFullDbName);
-		TEST2(err, KErrNone);
-		RFile file;
-		err = file.Open(TheFs, KFullDbName, EFileRead | EFileWrite);
-		TEST2(err, KErrNone);
-		err = file.Write(i * KCorruptBlockLen, invalidData);
-		TEST2(err, KErrNone);
-		file.Close();
-		//Try to open the database and read the record
-		TBool testPassed = EFalse;
-		err = TheDb.Open(KDbName);
-		if(err == KErrNone)
+		invalidData.Fill(invalidChar[j]);
+		TheTest.Printf(_L("Invalid char: %X\r\n"), (TUint)(invalidChar[j]));
+		for(TInt i=0;i<KIterationCnt;++i)
 			{
-			RSqlStatement stmt;
-			err = stmt.Prepare(TheDb, _L("SELECT I FROM A"));
+			TheTest.Printf(_L("% 4d\r"), i + 1);
+			//Corrupt the database
+			err = fm->Copy(KFullDbName2, KFullDbName);
+			TEST2(err, KErrNone);
+			RFile file;
+			err = file.Open(TheFs, KFullDbName, EFileRead | EFileWrite);
+			TEST2(err, KErrNone);
+			TInt fpos = i * KCorruptBlockLen;
+			err = file.Write(fpos, invalidData);
+			TEST2(err, KErrNone);
+			file.Close();
+			//Try to open the database and read the record
+			TBool testPassed = EFalse;
+			err = TheDb.Open(KDbName);
 			if(err == KErrNone)
 				{
-				err = stmt.Next();
-				if(err == KSqlAtRow)
+				RSqlStatement stmt;
+				err = stmt.Prepare(TheDb, _L("SELECT I FROM A"));
+				if(err == KErrNone)
 					{
-					TInt val = stmt.ColumnInt(0);
-					if(val == 10)
+					err = stmt.Next();
+					if(err == KSqlAtRow)
 						{
-						testPassed = ETrue;
-						err = KErrNone;
+						TInt val = stmt.ColumnInt(0);
+						if(val == 10)
+							{
+							testPassed = ETrue;
+							err = KErrNone;
+							}
+						else
+							{
+							err = KErrGeneral;
+							}
 						}
-					else
-						{
-						err = KErrGeneral;
-						}
+					stmt.Close();
 					}
-				stmt.Close();
 				}
-			}
 
-		TheDb.Close();
-		(void)RSqlDatabase::Delete(KDbName);
-		TheTest.Printf(_L("Iteration % 4d, err=%d\r\n"), i + 1, err);
-		if(!testPassed)
-			{
-			TEST(err != KErrNone);
-			}
-		}//end of - for(TInt i=0;i<KIterationCnt;++i)
-
+			TheDb.Close();
+			(void)RSqlDatabase::Delete(KDbName);
+			TheTest.Printf(_L("Iteration % 4d, err=%d\r\n"), i + 1, err);
+			if(!testPassed)
+				{
+				TEST(err != KErrNone);
+				}
+			}//end of - for(TInt i=0;i<KIterationCnt;++i)
+		TheTest.Printf(_L("\r\n"));
+		}
+	(void)fm->Delete(KFullDbName2);
 	delete fm;
-	TheTest.Printf(_L("\r\n"));
 	}
 
 /**
@@ -208,6 +223,198 @@
 	DoCorruptedSecureDbTest(EDbEncUtf8);
 	}
 
+const TInt KDbPolicyTypeTooSmall = 1;
+const TInt KDbPolicyTypeTooBig = 2;
+const TInt KDefaultPolicyWithObjName = 3;
+const TInt KDbPolicyWithObjName = 4;
+const TInt KInvObjPolicyWithObjName = 5;
+const TInt KDefaultPolicyMoved = 6;
+const TInt KDuplicatedDbPolicy = 7;
+const TInt KTablePolicyTypeTooSmall = 8;
+const TInt KTablePolicyTypeTooBig = 9;
+const TInt KTablePolicyNameInvalid = 10;
+const TInt KTwoDefaultPolicies = 11;
+
+void CorruptDbPolicy(TInt aType)
+	{
+	TBuf8<200> dbName;
+	dbName.Copy(KFullDbName());
+	sqlite3* dbHandle = NULL;
+	TInt err = sqlite3_open((const char*)(dbName.PtrZ()), &dbHandle);
+	TEST2(err, SQLITE_OK);
+	switch(aType)
+		{
+		case KDbPolicyTypeTooSmall: //Invalid database poicy type - less than the schema policy type
+			err = sqlite3_exec(dbHandle, "UPDATE symbian_security SET PolicyType=-10 WHERE ObjectType=-1 AND PolicyType=0", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		case KDbPolicyTypeTooBig: //Invalid database poicy type - bigger than the write policy type
+			err = sqlite3_exec(dbHandle, "UPDATE symbian_security SET PolicyType=10 WHERE ObjectType=-1 AND PolicyType=0", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		case KDefaultPolicyWithObjName: //Default database policy with valid object name 
+			err = sqlite3_exec(dbHandle, "UPDATE symbian_security SET ObjectName='aaaa' WHERE ObjectType=-2", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		case KDbPolicyWithObjName: //Database policy with valid object name 
+			err = sqlite3_exec(dbHandle, "UPDATE symbian_security SET ObjectName='aaaa' WHERE ObjectType=-1", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		case KInvObjPolicyWithObjName: //Invalid object type is with valid object name
+			err = sqlite3_exec(dbHandle, "UPDATE symbian_security SET ObjectType=5, ObjectName='aaaa' WHERE ObjectType=0", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		case KDefaultPolicyMoved: //The default security policy is the last in the table
+			err = sqlite3_exec(dbHandle, "DELETE FROM symbian_security WHERE ObjectType=-2", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			err = sqlite3_exec(dbHandle, "INSERT INTO symbian_security VALUES(20,-2,'',0, x'1122334455667788')", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		case KDuplicatedDbPolicy: //Two database policies of the same type
+			err = sqlite3_exec(dbHandle, "INSERT INTO symbian_security VALUES(9,-1,'',1, x'1122334455667788')", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		case KTablePolicyTypeTooSmall: //Invalid table poicy type - less than the read policy type
+			err = sqlite3_exec(dbHandle, "UPDATE symbian_security SET PolicyType=-10 WHERE ObjectType=0 AND PolicyType=1", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		case KTablePolicyTypeTooBig: //Invalid table poicy type - less than the write policy type
+			err = sqlite3_exec(dbHandle, "UPDATE symbian_security SET PolicyType=10 WHERE ObjectType=0 AND PolicyType=2", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		case KTablePolicyNameInvalid:
+			err = sqlite3_exec(dbHandle, "UPDATE symbian_security SET ObjectName='' WHERE ObjectType=0 AND PolicyType=2", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		case KTwoDefaultPolicies:
+			err = sqlite3_exec(dbHandle, "INSERT INTO symbian_security VALUES(9,-2,'',1, x'1122334455667788')", NULL, 0, NULL);
+			TEST2(err, SQLITE_OK);
+			break;
+		default:
+			TEST(0);
+			break;
+		}
+	sqlite3_close(dbHandle);
+	}
+
+/**
+@SYMTestCaseID          PDS-SQL-CT-4240
+@SYMTestCaseDesc        Invalid settings in symbian_security table.
+@SYMTestPriority        High
+@SYMTestActions         The test creates a secure test database. Then the test runs a set of test 
+						 iterations. On each itertaion the test makes onle of the stored security 
+						 policies invalied (symbian_security table). Then the test attempts to open 
+						 the database and checks the behaviour of the SQL server - whether an error
+						 will be reproted back or not.
+@SYMTestExpectedResults Test must not fail
+*/  
+void BadDbPolicyTest()
+	{
+	sqlite3SymbianLibInit();    
+	
+	RSqlSecurityPolicy policy = CreateTestSecurityPolicy();
+	//
+	(void)RSqlDatabase::Delete(KDbName);
+	TInt err = TheDb.Create(KDbName, policy);
+	TEST2(err, KErrNone);
+	err = TheDb.Exec(_L("CREATE TABLE A(I INTEGER); INSERT INTO A VALUES(10)"));
+	TEST(err >= 0);
+	TheDb.Close();
+	policy.Close();
+	//
+	CFileMan* fm = NULL;
+	TRAP(err, fm = CFileMan::NewL(TheFs));
+	TEST2(err, KErrNone);
+	//Make a copy of the database
+	err = fm->Copy(KFullDbName, KFullDbName2);
+	TEST2(err, KErrNone);
+	//Invalid database policy - policy type value less than the schema policy type value
+	CorruptDbPolicy(KDbPolicyTypeTooSmall);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrGeneral);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//Invalid database policy - policy type value bigger than the write policy type value
+	CorruptDbPolicy(KDbPolicyTypeTooBig);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrGeneral);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//Invalid database policy - the default database policy is with valid object name
+	CorruptDbPolicy(KDefaultPolicyWithObjName);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrNone);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//Invalid database policy - database policy is with valid object name
+	CorruptDbPolicy(KDbPolicyWithObjName);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrNone);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//Invalid database policy - invalid object type is with valid object name
+	CorruptDbPolicy(KInvObjPolicyWithObjName);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrGeneral);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//Invalid database policy - the default security policy is the last in the table
+	CorruptDbPolicy(KDefaultPolicyMoved);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrNone);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//Invalid database policy - duplicated database policy
+	CorruptDbPolicy(KDuplicatedDbPolicy);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrGeneral);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//Invalid table policy - policy type value less than the read policy type value
+	CorruptDbPolicy(KTablePolicyTypeTooSmall);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrGeneral);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//Invalid table policy - policy type value bigger than the write policy type value
+	CorruptDbPolicy(KTablePolicyTypeTooBig);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrGeneral);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//Invalid table policy - emtpy string as a table name 
+	CorruptDbPolicy(KTablePolicyNameInvalid);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrGeneral);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//Two default policies
+	CorruptDbPolicy(KTwoDefaultPolicies);
+	err = TheDb.Open(KDbName);
+	TheDb.Close();
+	TEST2(err, KErrGeneral);
+	err = fm->Copy(KFullDbName2, KFullDbName);
+	TEST2(err, KErrNone);
+	//
+	(void)RSqlDatabase::Delete(KDbName);
+	(void)fm->Delete(KFullDbName2);
+	delete fm;
+	
+	sqlite3SymbianLibFinalize();
+	CloseSTDLIB();
+	}
+
+
 void CreateTestEnv()
     {
     TInt err = TheFs.Connect();
@@ -227,6 +434,9 @@
 	
 	TheTest.Next(_L("@SYMTestCaseID:PDS-SQL-CT-4203 Corrupted UTF8 encoded secure database test"));
 	CorruptedSecureDbTest8();
+	
+	TheTest.Next(_L("@SYMTestCaseID:PDS-SQL-CT-4240 Secure database with bad policy test"));
+	BadDbPolicyTest();
 	}
 
 TInt E32Main()