commsconfig/commsdatabaseshim/TE_commdb/src/step_059_xx.cpp
changeset 72 ae47d0499bee
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsconfig/commsdatabaseshim/TE_commdb/src/step_059_xx.cpp	Mon Sep 06 13:49:23 2010 +0100
@@ -0,0 +1,329 @@
+//
+// Copyright (c) 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:
+//
+//
+// 
+ 
+// EPOC includes
+#include <e32base.h>
+#include <commdb.h>
+#include <d32comm.h>
+#include <cdbstore.h>
+
+// Test system includes
+#include "Teststepcommdb.h"
+#include "comms-infras/commdb/protection/protectdb.h"
+#include "comms-infras/commdb/protection/protectcpdb.h"
+#include <cdbpreftable.h>
+
+#include "step_059_xx.h"
+
+#define ACCESS_TYPE_TABLE		_S("AccessTypeTable")
+#define TABLE_ACC_NAME          _S("TableName")
+#define TABLE_ACC_TYPE          _S("AccessType")
+
+/////////////////////
+//	Test step 059.01
+/////////////////////
+
+//TestProtectRecords
+CCommDbTest059_01::CCommDbTest059_01()
+{
+	// store the name of this test case
+	SetTestStepName(_L("step_059_01"));
+}
+
+CCommDbTest059_01::~CCommDbTest059_01()
+{
+	delete iTheDb;
+}
+
+TVerdict CCommDbTest059_01::doTestStepPreambleL()
+	{	
+	iTheDb = CCommsDatabase::NewL(EDatabaseTypeIAP);
+        SetTestStepResult(EPass);	return TestStepResult();
+	}
+
+enum TVerdict CCommDbTest059_01::doTestStepL( void )
+	{
+	INFO_PRINTF1(_L("Combinational test (Only for Conn Pref)"));
+	SetTestStepResult(EPass);
+
+// Try a combination of operations on a table, as follows:
+// 1) protect record
+// 2) attempt update to protected record
+// 3) attempt update to unprotected record
+// 4) attempt delete of unprotected record
+// 5) protect table
+// 6) attempt record insertion
+// 7) attempt protected record deletion & update
+// 8) attempt unprotected record deletion and update
+// 9) unprotect table
+// 10) attempt record insertion
+// 11) attempt record deletion
+// 12) attempt update to protected record
+// 13) attempt update to unprotected record
+// 15) unprotect record
+// 15) attempt update to formerly unprotected record
+// 16) attempt update to unprotected record
+//
+	CCommsDbProtectConnectPrefTableView* table = (CCommsDbProtectConnectPrefTableView *)iTheDb->OpenConnectionPrefTableLC();
+			
+	TESTL(iTheDb->BeginTransaction()==KErrNone);
+
+	if(table->GotoFirstRecord()==KErrNone)
+		{
+		// Add another record to the table (so there should be 3)
+		InsertRecordL(table,KErrNone);
+
+		TESTL(table->GotoFirstRecord()==KErrNone);
+		TESTL(table->GotoNextRecord()==KErrNone);
+
+		// 1) Protect the second record
+		CheckRecordAccessL(table,RDbRowSet::EUpdatable); 
+		ProtectRecordL(table,KErrNone);
+		CheckRecordAccessL(table,RDbRowSet::EReadOnly); 
+		
+		// 2) Check record cannot be updated
+		UpdateRecordL(table,KErrAccessDenied);
+
+		// Go to the first record (unprotected)
+
+		TESTL(table->GotoFirstRecord()==KErrNone);
+		CheckRecordAccessL(table,RDbRowSet::EUpdatable); 
+
+		// 3) Check it can be updated
+		UpdateRecordL(table,KErrNone);
+
+		// 4) Check it can be deleted
+		DeleteRecordL(table,KErrNone);
+
+		//(which means that the new first record should be protected.....)
+		TESTL(table->GotoFirstRecord()==KErrNone);
+		CheckRecordAccessL(table,RDbRowSet::EReadOnly); 
+
+		// 5) Unprotect the first record which should be protected
+		CheckRecordAccessL(table,RDbRowSet::EReadOnly); 
+		UnprotectRecordL(table,KErrNone);
+		CheckRecordAccessL(table,RDbRowSet::EUpdatable); 
+		
+		// 6) Attempt update to formerly protected record (should succeed)
+		UpdateRecordL(table,KErrNone);
+		
+		// End the transaction, as a protect table is a separate one.
+		TESTL(iTheDb->CommitTransaction()==KErrNone);
+
+		// 7) Protect the table
+		TESTL(table->ProtectTable()==KErrNone);
+
+		TESTL(iTheDb->BeginTransaction()==KErrNone);
+
+		// 8) Check a record can't be inserted
+		InsertRecordL(table,KErrAccessDenied);
+
+		// 9) Check a record can't be deleted or updated
+		DeleteRecordL(table,KErrAccessDenied);
+		UpdateRecordL(table,KErrAccessDenied);
+		
+		// End the transaction, as unprotect table is a separate one.
+		TESTL(iTheDb->CommitTransaction()==KErrNone);
+
+		// 10) Unprotect the table
+		TESTL(table->UnprotectTable()==KErrNone);
+	
+		table->GotoFirstRecord();
+		TESTL(iTheDb->BeginTransaction()==KErrNone);
+		// 11) Check a record can be inserted
+		InsertRecordL(table,KErrNone);
+
+		// 12) Check an unprotected record can be deleted, but a protected one can't
+		// Again, yes it can so don't test this here.
+		DeleteRecordL(table,KErrNone);
+
+		// 13) Check the unprotected record can be updated
+		// Delete a record so there's only one left. Otherwise an update now will
+		// fail validation due to duplicate records.
+		TESTL(table->GotoFirstRecord()==KErrNone);
+		DeleteRecordL(table,KErrNone);
+		TESTL(table->GotoFirstRecord()==KErrNone);
+		UpdateRecordL(table,KErrNone);
+		
+		// 14) Finally check that last record can be deleted
+		TESTL(table->GotoFirstRecord()==KErrNone);
+		DeleteRecordL(table,KErrNone);
+		}
+	TESTL(iTheDb->CommitTransaction()==KErrNone);
+
+	SetTestStepResult(EPass);	INFO_PRINTF1(_L("\t\tSUCCESS"));
+
+	CleanupStack::PopAndDestroy(); 
+	return TestStepResult();
+	}
+
+
+
+/////////////////////
+//	Test step 060.01
+/////////////////////
+
+///Panic Test
+CCommDbTest060_01::CCommDbTest060_01()
+{
+	// store the name of this test case
+	SetTestStepName(_L("step_060_01"));
+
+}
+
+CCommDbTest060_01::~CCommDbTest060_01()
+	{
+	delete iTheDb;
+	}
+
+TVerdict CCommDbTest060_01::doTestStepPreambleL()
+	{	
+	iTheDb = CCommsDatabase::NewL(EDatabaseTypeIAP);
+        SetTestStepResult(EPass);	return TestStepResult();
+	}
+
+enum TVerdict CCommDbTest060_01::doTestStepL( void )
+	{
+	SetTestStepResult(EFail);
+	//turn-off JIT debugging...
+//	User::SetJustInTime(EFalse);
+
+	// Use the same table as step_055_01
+	CCommsDbProtectTableView* table = NULL;
+	table = (CCommsDbProtectTableView *)iTheDb->OpenTableLC(TPtrC(DIAL_OUT_ISP));
+
+	CheckTableIsNotProtectedL(table);
+
+	// Protection uses transaction, transaction within transaction is not allowed
+	// this test ensures that the ProtectTable code handles this correctly
+	if (table->GotoFirstRecord() == KErrNone)
+		{
+	    if (iTheDb->BeginTransaction() == KErrNone)
+			{
+			// Set protection from within a transaction
+			TESTL(table->ProtectTable()==KErrNone);
+	
+			CheckTableIsProtectedL(table);
+			SetTestStepResult(EPass);			INFO_PRINTF1(_L("\t\tSUCCESS"));
+				
+			iTheDb->RollbackTransaction();
+			}
+		}
+	CleanupStack::PopAndDestroy(table);
+	
+	return TestStepResult();
+	}
+
+///////////////////////////////////////////
+//	Test step 060.02
+//This test case is for testing the fix for 
+//DEF035522: CommDb protection is easily circumvented using public APIs
+////////////////////////////////////////////
+
+///Panic Test
+CCommDbTest060_02::CCommDbTest060_02()
+{
+	// store the name of this test case
+	SetTestStepName(_L("step_060_02"));
+
+}
+
+CCommDbTest060_02::~CCommDbTest060_02()
+{
+
+}
+
+enum TVerdict CCommDbTest060_02::doTestStepL( void )
+	{
+
+	SetTestStepResult(EPass);	CCommsDatabase* db = CCommsDatabase::NewL();
+	CleanupStack::PushL(db);
+	//Protect ISP the table
+	INFO_PRINTF1(_L("Protect ISP table"));
+	TRAPD(protect, ProtectISPTableL(db));
+	if( protect != KErrNone)
+		{
+		INFO_PRINTF1(_L("Failed to protect ISP table"));
+         SetTestStepResult(EFail);		return TestStepResult();
+		}
+	//try to remove the protection using public APIs
+	INFO_PRINTF1(_L("Try to remove the protection using public APIs"));
+	TRAPD(unprotect, RemoveProtectionL(db));
+	//Should return KErrNotFound
+	if (unprotect != KErrNotFound)
+		{
+		INFO_PRINTF1(_L("Protection settings broken using public APIs"));
+         SetTestStepResult(EFail);		return TestStepResult();
+		}
+	INFO_PRINTF1(_L("Table is well protected!! "));
+	CleanupStack::PopAndDestroy(db);
+	return TestStepResult();
+	}
+
+void CCommDbTest060_02::ProtectISPTableL(CCommsDatabase* aDb)
+//
+//  Protect the DialOutISP table using the hidden APIs
+//
+	{
+
+	CCommsDbProtectTableView* view = (CCommsDbProtectTableView*) aDb->OpenTableLC(TPtrC(DIAL_OUT_ISP));
+    if(view->GotoFirstRecord() == KErrNone)
+		{
+		User::LeaveIfError(view->ProtectTable());
+		}
+
+	CleanupStack::PopAndDestroy(view);
+	}
+
+
+void CCommDbTest060_02::RemoveProtectionL(CCommsDatabase* aDb)
+//
+//  Use the public CommDb APIs to modify the AccessTypeTable
+//
+	{
+	
+	aDb->ShowHiddenRecords();
+	//should fail here as its trying to open ACCESS_TYPE_TABLE
+	//leaves with KErrNotFound
+	CCommsDbTableView* view = aDb->OpenTableLC(TPtrC(ACCESS_TYPE_TABLE));
+	
+	//Shouldn't get here..
+	INFO_PRINTF1(_L("Contents of Access Type table:"));
+	while (view->GotoNextRecord() == KErrNone)
+		{
+		// display the current access settings
+		TBuf<KCommsDbSvrMaxFieldLength> name;
+		view->ReadTextL(TPtrC(TABLE_ACC_NAME), name);
+
+		TUint32 accessType;
+		view->ReadUintL(TPtrC(TABLE_ACC_TYPE), accessType);
+
+		RDebug::Print(_L("Table: '%S'\tAccess type: %d"), &name, accessType);
+
+		// now set the access type to 'updateable'
+		view->UpdateRecord();
+		view->WriteUintL(TPtrC(TABLE_ACC_TYPE), (TUint32)RDbRowSet::EUpdatable);
+		view->PutRecordChanges();
+
+		// display the new access settings
+		view->ReadUintL(TPtrC(TABLE_ACC_TYPE), accessType);
+		INFO_PRINTF3(_L("Table: '%S'\tNew access type: %d"), &name, accessType);
+		}
+
+	CleanupStack::PopAndDestroy(view);
+	}