--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commsconfig/commsdatabaseshim/ts_commdb/Teststepcommdb.cpp Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,642 @@
+// Copyright (c) 2001-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:
+// This contains CTestCase which is the base class for all the TestCase DLLs
+//
+//
+
+// EPOC includes
+#include <e32base.h>
+#include <commdb.h>
+#include <f32file.h>
+// Test system includes
+
+#ifdef SYMBIAN_OLD_EXPORT_LOCATION
+#include <comms-infras/commdb/protection/protectdb.h>
+#include <comms-infras/commdb/protection/protectcpdb.h>
+#else
+//these headers are user includes in the new env.
+#include "protectdb.h"
+#include "protectcpdb.h"
+#endif
+
+#include <cdbpreftable.h>
+#include "CDBSTD.H"
+#include <networking/log.h>
+#include <networking/teststep.h>
+#include "Teststepcommdb.h"
+#include <networking/testsuite.h>
+#include "TestSuiteCommdb.h"
+
+
+// constructor
+CTestStepCommDb::CTestStepCommDb()
+ {
+ iRemoteObjects = EFalse;
+ }
+
+// destructor
+CTestStepCommDb::~CTestStepCommDb()
+ {
+ popAndDestroyDatabaseObjects();
+ }
+
+// file copy
+void CTestStepCommDb::copyFileL(const TDesC& anOld,const TDesC& aNew)
+ {
+ // create a fileserver
+ RFs fileSystem;
+
+ // connect to file server
+ User::LeaveIfError(fileSystem.Connect());
+ CleanupClosePushL(fileSystem);
+
+ // create a file manager
+ CFileMan * fileMan = CFileMan::NewL(fileSystem);
+ CleanupStack::PushL(fileMan);
+
+ // parse the filenames
+ TParse source;
+ User::LeaveIfError(source.Set(anOld, NULL, NULL));
+
+ // parse the filenames
+ TParse target;
+ User::LeaveIfError(target.Set(aNew, NULL, NULL));
+
+ // do the copy
+ User::LeaveIfError(fileMan->Copy(source.FullName(), target.FullName(), CFileMan::EOverWrite));
+
+ // make read/write
+ User::LeaveIfError(fileSystem.SetAtt(source.FullName(),NULL, KEntryAttReadOnly));
+
+ // clean up
+ CleanupStack::PopAndDestroy(fileMan);
+ CleanupStack::PopAndDestroy(&fileSystem);
+ }
+
+void CTestStepCommDb::deleteFileL(const TDesC& aFileName)
+ {
+ // create a fileserver
+ RFs fileSystem;
+
+ User::LeaveIfError(fileSystem.Connect());
+ CleanupClosePushL(fileSystem);
+
+ Log(_L("Set file to read-write in order to delete"));
+
+ // Remove read only flag
+ TInt ret = fileSystem.SetAtt(aFileName, 0, KEntryAttReadOnly);
+ if (ret == KErrNotFound)
+ {
+ // If file already removed then no need to delete it
+ Log(_L("File not found"));
+ CleanupStack::PopAndDestroy(&fileSystem);
+ return;
+ }
+ User::LeaveIfError(ret);
+
+ // Delete file
+ User::LeaveIfError(fileSystem.Delete(aFileName));
+ Log(_L("deleted file"));
+
+ // clean up
+ CleanupStack::PopAndDestroy(&fileSystem);
+ }
+
+void CTestStepCommDb::DeleteCurrentDatabaseL()
+ {
+ RDbs rDbs;
+
+// User::LeaveIfError(rDbs.Connect());
+ TInt ret(KErrNone);
+ ret = rDbs.Connect();
+ if(ret!=KErrNone)
+ {
+ Log(_L("CTestStepCommDb::DeleteCurrentDatabaseL : rDbs.Connect FAILED with %d"),ret );
+ User::Leave(ret);
+ }
+
+ CleanupClosePushL(rDbs);
+ TName commDb(KCDrive);
+ commDb.Append(KDbBaseName);
+ TUid KCommsDbFileUid = { 0x10004e1d };
+ // May need to make several
+ // attempts if it is transiently locked; report these and if
+ // not successful after a number of attempts report this and abort
+ TInt remainingTries = 5;
+// TInt ret (KErrNone);
+ while(remainingTries-- > 0)
+ {
+ ret = rDbs.DeleteDatabase(commDb, KCommsDbFileUid);
+ if(ret == KErrNone || ret == KErrPathNotFound || ret == KErrNotFound)
+ {
+ ret = KErrNone;
+ break;
+ }
+ else
+ {
+ Log(_L("CTestStepCommDb::DeleteCurrentDatabaseL : rDbs.DeleteDatabase FAILED to delete %S %S with %d"),&KCDrive,&KDbBaseName,ret);
+ }
+ }
+ User::LeaveIfError(ret);
+ CleanupStack::PopAndDestroy(&rDbs);
+ }
+
+void CTestStepCommDb::CopyDatabaseL(const TDesC& aSource)
+ {
+ RFs fs;
+ User::LeaveIfError(fs.Connect());
+ CleanupClosePushL(fs);
+
+ RDbs rDbs;
+ User::LeaveIfError(rDbs.Connect());
+ CleanupClosePushL(rDbs);
+ const TUid KCommsDbFileUid = {0x10004e1d};
+
+ TInt remainingTries = 5;
+ TInt ret (KErrNone);
+ DeleteCurrentDatabaseL();
+ while(remainingTries-- > 0)
+ {
+ ret = rDbs.CopyDatabase(aSource, KDbFileName, KCommsDbFileUid);
+ if(ret == KErrNone || ret == KErrPathNotFound || ret == KErrNotFound)
+ {
+ break;
+ }
+ }
+ User::LeaveIfError(ret);
+ CleanupStack::PopAndDestroy(&rDbs);
+ CleanupStack::PopAndDestroy(&fs);
+ }
+
+
+TInt CTestStepCommDb::copyTestDatabase( TDatabaseNumber aDbNumber )
+ {
+ (void)aDbNumber;
+ return KErrNone;
+ }
+
+TInt CTestStepCommDb::copyDatabaseToDefault( TDatabaseNumber aDbNumber )
+ {
+ (void)aDbNumber;
+ return KErrNone;
+ }
+
+TBool CTestStepCommDb::openDbAndViewL( const TDesC16& aTable )
+ {
+ TBool created = EFalse;
+
+ //Only create Db and view objects if they're not already created
+ if ( ! iTheDb )
+ {
+ iTheDb=CCommsDatabase::NewL();
+ created = ETrue;
+ }
+
+ if ( !iTheView )
+ {
+ iTheView=iTheDb->OpenTableLC( aTable );
+ CleanupStack::Pop(); //no need to put it on the cleanup stack
+ }
+
+ return created;
+ }
+
+TVerdict CTestStepCommDb::doTestStepPostambleL()
+ {
+ if ( iTheView )
+ {
+ delete iTheView;
+ iTheView = 0;
+ }
+
+ if ( iTheDb )
+ {
+ delete iTheDb;
+ iTheDb = 0;
+ }
+
+ return EPass;
+ }
+
+
+
+void CTestStepCommDb::popAndDestroyDatabaseObjects()
+ {
+ // doTestStepPostambleL();
+ }
+
+TBool CTestStepCommDb::openDbL()
+ {
+
+ TBool created = EFalse;
+
+ if ( !iTheDb )
+ {
+ //Only open the Db if its not already open
+ TRAPD(ret,iTheDb=CCommsDatabase::NewL());
+ if(ret!=KErrNone)
+ {
+ Log(_L("CTestStepCommDb::openDbL : CCommsDatabase::NewL LEFT with %d"),ret);
+ User::Leave(ret);
+ }
+ created = ETrue;
+ }
+ return created;
+
+ }
+
+void CTestStepCommDb::setRemoteDatabaseObjects( CCommsDatabase* aDb, CCommsDbTableView* aDbView )
+ {
+ if ( !iTheDb )
+ {
+ //make sure that no-one else has already set the objects
+ iTheDb = aDb;
+ iTheView = aDbView;
+ iRemoteObjects = ETrue;
+ }
+ }
+
+
+void CTestStepCommDb::clearRemoteDatabaseObjects()
+ {
+ if( iRemoteObjects )
+ {
+ //Only clear objects if they were previously set remotly
+ iTheDb = 0;
+ iTheView = 0;
+ }
+ }
+
+TInt CTestStepCommDb::executeStepL()
+ {
+ return KErrGeneral;
+ }
+
+
+TInt CTestStepCommDb::executeStep(CTestStepCommDb& aTestStep)
+ {
+ TInt r,ret= KErrNone;
+
+ TRAP( r, ret = aTestStep.executeStepL() );
+
+ if ( r != KErrNone )
+ ret = r;
+
+ return ret;
+ }
+
+TInt CTestStepCommDb::executeStep( )
+ {
+ TInt ret=0;
+
+ TRAPD( r, ret = executeStepL() );
+
+ if ( r != KErrNone )
+ ret = r;
+
+ return ret;
+ }
+
+//
+//This heap failure member function is used when a test step needs a Database and a View
+//object.
+//
+TInt CTestStepCommDb::doTestStepWithHeapFailureL( CTestStepCommDb& aTestStep, TInt aReturnValue)
+ {
+ TInt ret=0;
+
+ for (TInt i=1; i< KHeapFailure ; i++)
+ {
+ aTestStep.doTestStepPreambleL();
+
+ __UHEAP_FAILNEXT(i);
+
+ ret = aTestStep.executeStep();
+
+ __UHEAP_RESET;
+
+ aTestStep.doTestStepPostambleL();
+
+ if ( ret == KErrNoMemory )
+ {
+ //The heap failure has been trapped correctly
+ continue;
+ }
+ else if ( ret == aReturnValue )
+ {
+ //Test step normal behaviour
+ TPtrC ExpectedErrortxt = CLog::EpocErrorToText(ret);
+ Log(_L("%s PASSED heap failure test, i = %d return code==%S"),
+ aTestStep.iTestStepName.PtrZ(), i, &ExpectedErrortxt );
+
+ break;
+ }
+ else
+ {
+ // test step has not returned the exepected error value ( which was either KErrNoMemory or aReturnValue )
+ TPtrC unexpectedErrortxt = CLog::EpocErrorToText(ret);
+ TPtrC Error = CLog::EpocErrorToText(aReturnValue);
+ Log(_L("%s *FAILED* heap failure test, i=%d return code:%S expected:%S"),
+ aTestStep.iTestStepName.PtrZ(), i, &unexpectedErrortxt, &Error );
+ iTestStepResult = EFail;
+ break;
+ }
+
+ }
+
+ return KErrNone;
+ }
+
+void CTestStepCommDb::CheckTableIsProtectedL(CCommsDbProtectTableView* aTable)
+ {
+
+ TESTL(iTheDb->BeginTransaction()==KErrNone);
+
+ if(aTable->GotoFirstRecord()==KErrNone)
+ {
+ // Check settings on Record
+ RDbRowSet::TAccess tableAccess = RDbRowSet::EUpdatable;
+ TInt ret = aTable->GetTableAccess(tableAccess);
+ TESTL(ret == KErrNone);
+ TESTL(tableAccess == RDbRowSet::EReadOnly);
+
+ // Test that first record cannot be updated
+ TRAP(ret,UpdateRecordL(aTable,KErrAccessDenied));
+ TESTL(ret == KErrNone);
+
+ // Test that cannot delete first record
+ TRAP(ret,DeleteRecordL(aTable,KErrAccessDenied));
+ TESTL(ret == KErrNone);
+
+ // Test that cannot insert new record
+ TRAP(ret,InsertRecordL(aTable,KErrAccessDenied));
+ TESTL(ret == KErrNone);
+
+ aTable->GotoFirstRecord();
+ }
+ TESTL(iTheDb->CommitTransaction()==KErrNone);
+ }
+
+
+void CTestStepCommDb::CheckTableIsProtectedL(CCommsDbProtectConnectPrefTableView* aTable)
+ {
+
+ TESTL(iTheDb->BeginTransaction()==KErrNone);
+ if(aTable->GotoFirstRecord()==KErrNone)
+ {
+ // Check settings on Record
+ RDbRowSet::TAccess tableAccess = RDbRowSet::EUpdatable;
+ TInt ret = aTable->GetTableAccess(tableAccess);
+ TESTL(ret == KErrNone);
+ TESTL(tableAccess == RDbRowSet::EReadOnly);
+
+ // Test that first record cannot be updated
+ TRAP(ret,UpdateRecordL(aTable,KErrAccessDenied));
+ TESTL(ret == KErrNone);
+
+ // Test that cannot delete first record
+ TRAP(ret,DeleteRecordL(aTable,KErrAccessDenied));
+ TESTL(ret == KErrNone);
+
+ // Test that cannot insert new record
+ TRAP(ret,InsertRecordL(aTable,KErrAccessDenied));
+ TESTL(ret == KErrNone);
+
+ aTable->GotoFirstRecord();
+ }
+ TESTL(iTheDb->CommitTransaction()==KErrNone);
+ }
+
+void CTestStepCommDb::CheckTableIsNotProtectedL(CCommsDbProtectTableView* aTable)
+ {
+ TESTL(iTheDb->BeginTransaction()==KErrNone);
+ if(aTable->GotoFirstRecord()==KErrNone)
+ {
+ // Check settings on Table
+ RDbRowSet::TAccess tableAccess = RDbRowSet::EReadOnly;
+ TInt ret = aTable->GetTableAccess(tableAccess);
+ TESTL(ret == KErrNone);
+ TESTL(tableAccess == RDbRowSet::EUpdatable);
+
+ // Test can update first record
+ TRAP(ret,UpdateRecordL(aTable,KErrNone));
+ TESTL(ret == KErrNone);
+
+ // Test that can delete record
+ TRAP(ret,DeleteRecordL(aTable,KErrNone));
+ TESTL(ret == KErrNone);
+
+ // Test that can insert new record
+ TRAP(ret,InsertRecordL(aTable,KErrNone));
+ TESTL(ret == KErrNone);
+
+ aTable->GotoFirstRecord();
+ }
+ TESTL(iTheDb->CommitTransaction()==KErrNone);
+ }
+
+void CTestStepCommDb::CheckTableIsNotProtectedL(CCommsDbProtectConnectPrefTableView* aTable)
+ {
+ TESTL(iTheDb->BeginTransaction()==KErrNone);
+ if(aTable->GotoFirstRecord()==KErrNone)
+ {
+ // Check settings on Table
+ RDbRowSet::TAccess tableAccess = RDbRowSet::EReadOnly;
+ TInt ret = aTable->GetTableAccess(tableAccess);
+ TESTL(ret == KErrNone);
+ TESTL(tableAccess == RDbRowSet::EUpdatable);
+
+ // Test can update first record
+ TRAP(ret,UpdateRecordL(aTable,KErrNone));
+ TESTL(ret == KErrNone);
+
+ // Test that can delete record
+ TRAP(ret,DeleteRecordL(aTable,KErrNone));
+ TESTL(ret == KErrNone);
+
+ // Test that can insert new record
+ TRAP(ret,InsertRecordL(aTable,KErrNone));
+ TESTL(ret == KErrNone);
+
+ aTable->GotoFirstRecord();
+ }
+ TESTL(iTheDb->CommitTransaction()==KErrNone);
+ }
+
+void CTestStepCommDb::GoToPositionL(CCommsDbProtectTableView* aTable,TInt aPos)
+ {
+ TESTL(aTable->GotoFirstRecord()==KErrNone);
+ for (TInt i = 0; i < aPos; i++)
+ {
+ TESTL(aTable->GotoNextRecord()==KErrNone);
+ }
+ }
+
+void CTestStepCommDb::ProtectRecordL(CCommsDbProtectTableView* aTable, TInt aResult)
+ {
+ TESTL(aTable->ProtectRecord()==aResult);
+ }
+
+void CTestStepCommDb::ProtectRecordL(CCommsDbProtectConnectPrefTableView* aTable, TInt aResult)
+ {
+ TESTL(aTable->ProtectRecord()==aResult);
+ }
+
+void CTestStepCommDb::UnprotectRecordL(CCommsDbProtectTableView* aTable, TInt aResult)
+ {
+ TESTL(aTable->UnprotectRecord()==aResult);
+ }
+
+void CTestStepCommDb::UnprotectRecordL(CCommsDbProtectConnectPrefTableView* aTable, TInt aResult)
+ {
+ TESTL(aTable->UnprotectRecord()==aResult);
+ }
+
+void CTestStepCommDb::UpdateRecordL(CCommsDbProtectTableView* aTable, TInt aResult)
+ {
+
+ TESTL(aTable->UpdateRecord()==aResult);
+ if (aResult == KErrNone)
+ {
+ ModifyRecordL(aTable);
+ TESTL(aTable->PutRecordChanges()==KErrNone);
+ }
+ }
+
+void CTestStepCommDb::UpdateRecordL(CCommsDbProtectConnectPrefTableView* aTable, TInt aExpectedResult)
+ {
+
+ TUint32 Ranking;
+ CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref RecordData;
+
+ TInt ErrVal = ChangeCPRankingL(aTable, Ranking); // Try modifying a field.
+
+ TESTL(ErrVal == aExpectedResult);
+
+ if (ErrVal == KErrNone)
+ {
+ // The change was allowed, so check it actually happened.
+ aTable->ReadConnectionPreferenceL(RecordData);
+ TESTL(Ranking == RecordData.iRanking);
+ }
+ }
+
+void CTestStepCommDb::DeleteRecordL(CCommsDbProtectTableView* aTable, TInt aResult)
+ {
+ TESTL(aTable->DeleteRecord()==aResult);
+ }
+
+void CTestStepCommDb::DeleteRecordL(CCommsDbProtectConnectPrefTableView* aTable, TInt aExpectedResult)
+ {
+ TRAPD(ErrVal, aTable->DeleteConnectionPreferenceL());
+ TESTL(ErrVal == aExpectedResult);
+ }
+
+void CTestStepCommDb::InsertRecordL(CCommsDbProtectTableView* aTable, TInt aExpectedResult)
+ {
+ TUint32 recordId;
+ TInt ret = aTable->InsertRecord(recordId);
+ TESTL(ret==aExpectedResult||ret==KErrAlreadyExists); //for some tables insertion fails
+ //because they can only have
+ //one record (i.e. DEFAULT_GPRS)
+ if (ret == KErrNone)
+ {
+ PopulateInsertedRecordL(aTable);
+ TESTL(aTable->PutRecordChanges()==KErrNone);
+ }
+ }
+
+void CTestStepCommDb::InsertRecordL(CCommsDbProtectConnectPrefTableView* aTable, TInt aExpectedResult)
+ {
+ CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref PrefData1, PrefData2;
+
+ PrefData1.iRanking = 0;
+ PrefData1.iDirection = ECommDbConnectionDirectionOutgoing;
+ PrefData1.iDialogPref = ECommDbDialogPrefWarn;
+ PrefData1.iBearer.iBearerSet = ECommDbBearerCSD;
+ PrefData1.iBearer.iIapId = 1;
+
+ TRAPD(ErrVal, aTable->InsertConnectionPreferenceL(PrefData1));
+ TESTL(ErrVal==aExpectedResult); //for some tables insertion fails
+ //because they can only have
+ //one record (i.e. DEFAULT_GPRS)
+ if (ErrVal == KErrNone)
+ {
+ aTable->ReadConnectionPreferenceL(PrefData2);
+ TESTL(PrefData1 == PrefData2);
+ }
+ }
+
+
+#define TEST_FCN(_F_) {TRAPD(ret,_F_); TESTL(ret == KErrNone);}
+
+void CTestStepCommDb::ModifyRecordL(CCommsDbProtectTableView* aTable)
+//
+// Modify some field in current record
+//
+ {
+ TEST_FCN(aTable->WriteTextL(TPtrC(COMMDB_NAME),_L("test")));
+ }
+// Extract the protection state for the current record,
+// and leave if it's not the state expected
+void CTestStepCommDb::CheckRecordAccessL(CCommsDbProtectConnectPrefTableView* aTable, TInt aExpectedAccess)
+ {
+ TInt FoundAccess;
+ // Set the state to one not expected, so it will fail if not explicitly changed
+ if (aExpectedAccess == RDbRowSet::EUpdatable)
+ FoundAccess = RDbRowSet::EReadOnly;
+ else
+ FoundAccess = RDbRowSet::EUpdatable;
+
+ TESTL(aTable->GetRecordAccess(FoundAccess) == KErrNone);
+ TESTL(aExpectedAccess == FoundAccess);
+ }
+void CTestStepCommDb::PopulateInsertedRecordL(CCommsDbProtectTableView* aTable)
+//
+// Populate minimal set of fields in current newly inserted record.
+//
+ {
+ TBuf<50> tableName;
+ aTable->GetTableName(tableName);
+
+ if (tableName == TPtrC(DIAL_OUT_ISP))
+ {
+ TEST_FCN(aTable->WriteTextL(TPtrC(COMMDB_NAME),_L("Inserted Service")));
+ TEST_FCN(aTable->WriteBoolL(TPtrC(ISP_DIAL_RESOLUTION),ETrue));
+ TEST_FCN(aTable->WriteBoolL(TPtrC(ISP_USE_LOGIN_SCRIPT),EFalse));
+ TEST_FCN(aTable->WriteBoolL(TPtrC(ISP_PROMPT_FOR_LOGIN),ETrue));
+ TEST_FCN(aTable->WriteBoolL(TPtrC(ISP_IF_PROMPT_FOR_AUTH),ETrue));
+ TEST_FCN(aTable->WriteBoolL(TPtrC(ISP_IP_ADDR_FROM_SERVER),ETrue));
+ TEST_FCN(aTable->WriteBoolL(TPtrC(ISP_IP_DNS_ADDR_FROM_SERVER),ETrue));
+ TEST_FCN(aTable->WriteBoolL(TPtrC(ISP_IP6_DNS_ADDR_FROM_SERVER),ETrue));
+ }
+
+ // EXTEND OR MODIFY this function if want to use different table
+ }
+// Just a utility function - for checking the protection of the Connection Preferences
+// table and its records, we just try changing the ranking field of the first one.
+TInt CTestStepCommDb::ChangeCPRankingL(CCommsDbProtectConnectPrefTableView* aTable, TUint32& Ranking)
+ {
+ CCommsDbConnectionPrefTableView::TCommDbIapConnectionPref RecordData;
+
+ aTable->ReadConnectionPreferenceL(RecordData);
+ if(RecordData.iRanking == 1)
+ Ranking = 0;
+ else
+ Ranking = 1;
+ TRAPD(ErrVal, aTable->ChangeConnectionPreferenceRankL(Ranking));
+ return(ErrVal);
+ }
+
+#undef TEST_FCN