diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/simtsy/test/Te_Sim/Te_SimPhBkSmartCardTest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/simtsy/test/Te_Sim/Te_SimPhBkSmartCardTest.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,652 @@ +// Copyright (c) 2005-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 "Te_SimPhBkSmartCardTest.h" + +CSimPhBkSmartCardTest::CSimPhBkSmartCardTest() + { + SetTestStepName(_L("SmartCardTest")); + } + +TVerdict CSimPhBkSmartCardTest::doTestStepL() + { + INFO_PRINTF1(_L("BeginPhBkSmartCardTest")); + + CreateConfigFileL(_L("c:\\config3.txt")); + SetTestNumberL(10); + + RMobilePhone::TAID smartCardAppID; + TUint count,smartCardIndex; + TRequestStatus reqStatus; + + INFO_PRINTF1(_L("")); + INFO_PRINTF1(_L("SmartCard test")); + TInt ret = iPhone.Open(iTelServer,KPhoneName); + INFO_PRINTF2(_L("Result: %d"),ret); + TESTL(ret == KErrNone); + INFO_PRINTF1(_L("Opened phone object")); + + // EnumerateSmartCardApplications + INFO_PRINTF1(_L("EnumerateSmartCardApplications test")); + enum {KSmartCardApps=10}; + iPhone.EnumerateSmartCardApplications(reqStatus, count); + User::WaitForRequest(reqStatus); + TESTL(count==KSmartCardApps); + CHECKPOINTL(reqStatus, KErrNone, CHP_APPS_CASE("O.1")); + + // GetSmartCardApplicationInfo + INFO_PRINTF1(_L("GetSmartCardApplicationInfo test")); + // Structured data to read in application info + RMobilePhone::TSmartCardApplicationInfoV5 smartCardAppInfo; + RMobilePhone::TSmartCardApplicationInfoV5Pckg smartCardAppInfoPckg(smartCardAppInfo); + + // first application + smartCardIndex=0; + iPhone.GetSmartCardApplicationInfo(reqStatus, smartCardIndex, smartCardAppInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINTL(reqStatus, KErrNone, CHP_APPS_CASE("O.2")); + // Test the contents of structured data + TESTL(smartCardAppInfo.iAID.Compare(_L8("SCApp1")) == KErrNone); + TESTL(smartCardAppInfo.iLabel.Compare(_L8("SmartCardApp1")) == KErrNone); + + // fifth application - USim Application + smartCardIndex=4; + iPhone.GetSmartCardApplicationInfo(reqStatus, smartCardIndex, smartCardAppInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.3")); + TESTL(smartCardAppInfo.iAID.Compare(_L8("USimApp1")) == KErrNone); + TESTL(smartCardAppInfo.iLabel.Compare(_L8("USimApplication1")) == KErrNone); + + // last application in array + smartCardIndex=9; + iPhone.GetSmartCardApplicationInfo(reqStatus, smartCardIndex, smartCardAppInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.4")); + TESTL(smartCardAppInfo.iAID.Compare(_L8("SCAppThatIsTooLo")) == KErrNone); + TESTL(smartCardAppInfo.iLabel.Compare(_L8("SmartCardAppThatIsMuchMuchMuchTo")) == KErrNone); + + // Out of range application + smartCardIndex=10; + iPhone.GetSmartCardApplicationInfo(reqStatus, smartCardIndex, smartCardAppInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNotFound, CHP_APPS_CASE("O.5")); + + // NotifySmartCardApplicationInfoChange + /* Activate application in order to terminate it later */ + smartCardAppID=_L8("SCApp2"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + INFO_PRINTF1(_L("NotifySmartCardApplicationInfoChange test")); + RMobilePhone::TSmartCardApplicationEvent event; + /* Second application is terminated with an event in config.txt + This is time dependent */ + iPhone.NotifySmartCardApplicationInfoChange(reqStatus, smartCardAppID, event); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.6")); + TESTL(smartCardAppID==_L8("SCApp2")); + TESTL(event==RMobilePhone::EScApplicationTerminated); + + // First application will be activated + smartCardAppID=_L8("SCApp1"); + iPhone.NotifySmartCardApplicationInfoChange(reqStatus, smartCardAppID, event); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.7")); + TESTL(smartCardAppID==_L8("SCApp1")); + TESTL(event==RMobilePhone::EScApplicationActivated); + + // Notification for activation on already activated first application + iPhone.NotifySmartCardApplicationInfoChange(reqStatus, smartCardAppID, event); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.8")); + TESTL(smartCardAppID==_L8("SCApp1")); + TESTL(event==RMobilePhone::EScApplicationActivated); + + // Terminate first application + smartCardAppID=_L8("SCApp1"); + iPhone.NotifySmartCardApplicationInfoChange(reqStatus, smartCardAppID, event); + User::WaitForRequest(reqStatus); // Wait for notification of change + CHECKPOINTL(reqStatus, KErrNone, CHP_APPS_CASE("O.9")); + TESTL(smartCardAppID==_L8("SCApp1")); + TESTL(event==RMobilePhone::EScApplicationTerminated); + + // GetCurrentActiveUSIMApplication + smartCardAppID=_L8(""); + INFO_PRINTF1(_L("GetCurrentActiveUSIMApplication test")); + // There should be no active application at this point + iPhone.GetCurrentActiveUSimApplication(reqStatus, smartCardAppID); + User::WaitForRequest(reqStatus); // Wait for notification of change + CHECKPOINTL(reqStatus, KErrMMEtelScApplicationNotActive, CHP_APPS_CASE("O.10")); + TESTL(smartCardAppID==_L8("")); + + // Wait for event to activate second application + smartCardAppID=_L8("USimApp2"); + iPhone.NotifySmartCardApplicationInfoChange(reqStatus, smartCardAppID, event); + User::WaitForRequest(reqStatus); // Wait for notification of change + CHECKPOINTL(reqStatus, KErrNone, CHP_APPS_CASE("O.11")); + TESTL(smartCardAppID==_L8("USimApp2")); + TESTL(event==RMobilePhone::EScApplicationActivated); + + // There should be an active application at this point + iPhone.GetCurrentActiveUSimApplication(reqStatus, smartCardAppID); + User::WaitForRequest(reqStatus); // Wait for notification of change + CHECKPOINTL(reqStatus, KErrNone, CHP_APPS_CASE("O.12")); + TESTL(smartCardAppID==_L8("USimApp2")); + + // At this point there should be one active application, the USIM app, USimApp2 + // SetSmartCardApplicationStatus + INFO_PRINTF1(_L("SetSmartCardApplicationStatus test")); + // Try and activate a second USIM application + smartCardAppID=_L8("USimApp1"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrAlreadyExists, CHP_APPS_CASE("O.13")); + + // Set other smart card apps to active + smartCardAppID=_L8("SCApp3"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + // Set third smart card app to active + smartCardAppID=_L8("SCApp4"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + // Set fourth smart card app to active + smartCardAppID=_L8("SCApp5"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + /* Set fifth smart card app to active + This should return with error code as it surpasses the max set in the config file */ + smartCardAppID=_L8("SCApp6"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScMaxApplicationsActive, CHP_APPS_CASE("O.14")); + + /* Attempt to status of a AID that does not exist */ + smartCardAppID=_L8("NotFound"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScTerminate); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNotFound, CHP_APPS_CASE("O.15")); + + smartCardAppID=_L8("NotFound"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNotFound, CHP_APPS_CASE("O.16")); + + // Set fourth smart card app to active when already active + smartCardAppID=_L8("SCApp5"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.17")); + + INFO_PRINTF1(_L("GetScFileInfo test")); + /* Attempt to get info on a file from an application that is not found */ + RMobilePhone::TScFilePath filePath; + RMobilePhone::TScFileInfoV5 scFileInfo; + RMobilePhone::TScFileInfoV5Pckg scFileInfoPckg(scFileInfo); + + filePath.iAID = _L8("App2"); + filePath.iPath = _L8("7FFF6F3C"); + iPhone.GetScFileInfo(reqStatus, filePath, scFileInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNotFound, CHP_APPS_CASE("O.18")); + + /* Attempt to get info on a file from an application that has not started */ + filePath.iAID = _L8("SCApp1"); + filePath.iPath = _L8("7FFF6F3C"); + iPhone.GetScFileInfo(reqStatus, filePath, scFileInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScApplicationNotActive, CHP_APPS_CASE("O.19")); + + /* Attempt to get info on a file from an application that has been terminated */ + smartCardAppID=_L8("SCApp3"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScTerminate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + filePath.iAID = _L8("SCApp3"); + filePath.iPath = _L8("7FFF6F3C"); + iPhone.GetScFileInfo(reqStatus, filePath, scFileInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScApplicationNotActive, CHP_APPS_CASE("O.20")); + + smartCardAppID=_L8("SCApp4"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScTerminate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + smartCardAppID=_L8("SCApp5"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScTerminate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + /* Attempt to set SCApp5 to inactive when it already is inactive */ + smartCardAppID=_L8("SCApp5"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScTerminate); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScApplicationNotActive, CHP_APPS_CASE("O.21")); + + smartCardAppID=_L8("USimApp2"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScTerminate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + filePath.iAID = _L8("SCApp1"); + filePath.iPath = _L8("7FFF6F3C"); + smartCardAppID = _L8("SCApp1"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + /* Attempt to get info on a pre-configured Linear Fixed Record based file */ + iPhone.GetScFileInfo(reqStatus, filePath, scFileInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.22")); + TESTL(scFileInfo.iFileID == (0x6F3C)); + TESTL(scFileInfo.iNumberRecords == 2); + TESTL(scFileInfo.iRecordLength == 5); + TESTL(scFileInfo.iType == RMobilePhone::ELinearFixed); + TESTL(scFileInfo.iTotalLength == 10); + + /* Attempt to get info on a pre-configured Cyclical Record based file, testing same filename + in different application */ + filePath.iAID = _L8("SCApp2"); + smartCardAppID = _L8("SCApp2"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + filePath.iAID = _L8("SCApp2"); + iPhone.GetScFileInfo(reqStatus, filePath, scFileInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.23")); + TESTL(scFileInfo.iFileID == (0x6F3C)); + TESTL(scFileInfo.iNumberRecords == 1); + TESTL(scFileInfo.iRecordLength == 5); + TESTL(scFileInfo.iType == RMobilePhone::ECyclic); + TESTL(scFileInfo.iTotalLength == 5); + + /* Attempt to get info on a pre-configured Transparent Record based file, testing same filename + in different application */ + smartCardAppID=_L8("SCApp4"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + filePath.iAID = _L8("SCApp4"); + iPhone.GetScFileInfo(reqStatus, filePath, scFileInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.24")); + TESTL(scFileInfo.iFileID == (0x6F3C)); + TESTL(scFileInfo.iNumberRecords == 0); + TESTL(scFileInfo.iRecordLength == 0); + TESTL(scFileInfo.iType == RMobilePhone::ETransparent); + TESTL(scFileInfo.iTotalLength == 10); + + /* Simple interaction test with smart card not owned by application */ + filePath.iAID = _L8(""); + filePath.iPath = _L8("3FFF6F3C"); + iPhone.GetScFileInfo(reqStatus, filePath, scFileInfoPckg); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.25")); + TESTL(scFileInfo.iFileID == (0x6F3C)); + TESTL(scFileInfo.iNumberRecords == 1); + TESTL(scFileInfo.iRecordLength == 5); + TESTL(scFileInfo.iType == RMobilePhone::ELinearFixed); + TESTL(scFileInfo.iTotalLength == 5); + + INFO_PRINTF1(_L("ReadSCFile test")); + /* Test ReadSCFile on Linear Fixed file with specified iAID, iPath first record */ + RMobilePhone::TScFilePathWithAccessOffsets offsets; + TBuf8<25> readBuffer; + TBuf8<4> testBuffer; // buffer too small for a record + + offsets.iAID = _L8("SCApp1"); + offsets.iPath = _L8("7FFF6F3C"); + offsets.iType = RMobilePhone::ELinearFixed; + offsets.iCount = 1; // number of records to read + offsets.iStartOffset = 1; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.26")); + TESTL(readBuffer == _L8("HELLO")); + + /* Test ReadSCFile, second record */ + offsets.iStartOffset = 2; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.27")); + TESTL(readBuffer == _L8("WORLD")); + + /* Test ReadSCFile, out of range record */ + offsets.iStartOffset = 0; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrMMEtelScRecordNotFound); + + /* Test ReadSCFile, out of range record */ + offsets.iStartOffset = 10; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScRecordNotFound, CHP_APPS_CASE("O.28")); + + /* Test ReadSCFile, buffer too small */ + offsets.iStartOffset = 1; + iPhone.ReadScFile(reqStatus, offsets, testBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrOverflow, CHP_APPS_CASE("O.29")); + + /* Simple ReadScFile test with smart card not owned by application */ + offsets.iAID = _L8(""); + offsets.iPath = _L8("3FFF6F3C"); + offsets.iCount = 1; // number of records to read + offsets.iStartOffset = 1; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.30")); + TESTL(readBuffer == _L8("HELLO")); + + /* Test ReadSCFile on Cyclical file with specified iAID but without application active */ + offsets.iAID = _L8("SCApp3"); + offsets.iType = RMobilePhone::ECyclic; + offsets.iCount = 1; // number of records to read + offsets.iStartOffset = 1; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScApplicationNotActive, CHP_APPS_CASE("O.31")); + + smartCardAppID=_L8("SCApp3"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + /* Test ReadSCFile, with incorrect path */ + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScFileNotFound, CHP_APPS_CASE("O.32")); + + /* Test ReadSCFile on Cyclical file with specified iAID, iPath last record written */ + offsets.iPath = _L8("7FFF6F3C"); // set correct path + + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.33")); + TESTL(readBuffer == _L8("WORLD")); + + /* Test ReadSCFile, second record, actually oldest record */ + offsets.iStartOffset = 2; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.34")); + TESTL(readBuffer == _L8("HELLO")); + + /* Test ReadSCFile, out of range record */ + offsets.iStartOffset = 0; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrMMEtelScRecordNotFound); + + /* Test ReadSCFile, out of range record */ + offsets.iStartOffset = 10; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScRecordNotFound, CHP_APPS_CASE("O.35")); + + /* Test ReadSCFile, buffer too small */ + offsets.iStartOffset = 1; + iPhone.ReadScFile(reqStatus, offsets, testBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrOverflow, CHP_APPS_CASE("O.36")); + + /* Test ReadSCFile on Transparent file with specified iAID, iPath first 4 bytes */ + offsets.iAID = _L8("SCApp4"); + offsets.iType = RMobilePhone::ETransparent; + offsets.iCount = 4; // number of bytes to read + offsets.iStartOffset = 0; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.37")); + TESTL(readBuffer == _L8("HELL")); + + /* Test ReadSCFile, 5 bytes in for 5 bytes */ + offsets.iCount = 5; // number of bytes to read + offsets.iStartOffset = 5; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.38")); + TESTL(readBuffer == _L8("WORLD")); + + /* Test ReadSCFile, buffer too small */ + offsets.iStartOffset = 1; + iPhone.ReadScFile(reqStatus, offsets, testBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrOverflow, CHP_APPS_CASE("O.39")); + + /* Test ReadSCFile, out of range record */ + offsets.iStartOffset = 11; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScReferencedDataNotFound, CHP_APPS_CASE("O.40")); + + /* Test ReadSCFile, 5 bytes in for 10 bytes, beyond end of file */ + offsets.iCount = 10; // number of bytes to read + offsets.iStartOffset = 5; + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScEofReached, CHP_APPS_CASE("O.41")); + + INFO_PRINTF1(_L("UpdateSCFile test")); + /* Test UpdateSCFile on Linear Fixed file with specified iAID, write first record */ + TBuf8<25> writeBuffer; + + /* Simple UpdateSCFile test with smart card not owned by application */ + writeBuffer = _L8("EARTH"); + offsets.iAID = _L8(""); + offsets.iPath = _L8("3FFF6F3C"); + offsets.iType = RMobilePhone::ELinearFixed; + offsets.iCount = 1; // number of records to read + offsets.iStartOffset = 1; + iPhone.UpdateScFile(reqStatus, offsets, writeBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrNone); + + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.42")); + TESTL(readBuffer == _L8("EARTH")); + + offsets.iAID = _L8("SCApp1"); + offsets.iPath = _L8("7FFF6F3C"); + offsets.iCount = 1; // number of records to write + offsets.iStartOffset = 1; // record number to write + writeBuffer = _L8("GOODB"); + + iPhone.UpdateScFile(reqStatus, offsets, writeBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrNone); + + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.43")); + TESTL(readBuffer == _L8("GOODB")); + + /* Test UpdateSCFile on Linear Fixed file with specified iAID, write 2nd record */ + offsets.iStartOffset = 2; // record number to write + writeBuffer = _L8("EARTH"); + + iPhone.UpdateScFile(reqStatus, offsets, writeBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrNone); + + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.44")); + TESTL(readBuffer == _L8("EARTH")); + + /* Test UpdateSCFile, out of range record */ + offsets.iStartOffset = 0; + iPhone.UpdateScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrMMEtelScRecordNotFound); + + /* Test UpdateSCFile, out of range record */ + offsets.iStartOffset = 10; + iPhone.UpdateScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScRecordNotFound, CHP_APPS_CASE("O.45")); + + /* Test UpdateSCFile on Linear Fixed file, buffer too small */ + offsets.iStartOffset = 1; + iPhone.UpdateScFile(reqStatus, offsets, testBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScWrongLength, CHP_APPS_CASE("O.46")); + + /* Test UpdateSCFile on Cyclic file with specified iAID, write oldest record at 1st position */ + offsets.iAID = _L8("SCApp3"); + offsets.iType = RMobilePhone::ECyclic; + writeBuffer = _L8("GOODB"); + + iPhone.UpdateScFile(reqStatus, offsets, writeBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrNone); + + offsets.iStartOffset = 1; // record number to read (lastest written record) + + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.47")); + TESTL(readBuffer == _L8("GOODB")); + + /* Test UpdateSCFile on Cyclic file with specified iAID, write oldest record, now at 2nd position */ + writeBuffer = _L8("EARTH"); + + iPhone.UpdateScFile(reqStatus, offsets, writeBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrNone); + + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.48")); + TESTL(readBuffer == _L8("EARTH")); + + /* Test UpdateSCFile on Cyclic file with specified iAID, write oldest record, now at back at 1st position */ + writeBuffer = _L8("HELLO"); + + iPhone.UpdateScFile(reqStatus, offsets, writeBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrNone); + + offsets.iStartOffset = 2; // record number to read (oldest record) + + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.49")); + TESTL(readBuffer == _L8("EARTH")); + + /* Test UpdateSCFile on Cyclic file, buffer too small */ + offsets.iStartOffset = 1; + iPhone.UpdateScFile(reqStatus, offsets, testBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScWrongLength, CHP_APPS_CASE("O.50")); + + /* Test UpdateSCFile on Transparent file with specified iAID, write from beginning */ + offsets.iAID = _L8("SCApp4"); + offsets.iType = RMobilePhone::ETransparent; + writeBuffer = _L8("GOODB"); + offsets.iCount = 5; // number of bytes to write + offsets.iStartOffset = 0; // From position 0 + + iPhone.UpdateScFile(reqStatus, offsets, writeBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrNone); + + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.51")); + TESTL(readBuffer == _L8("GOODB")); + + /* Test UpdateSCFile on Transparent file with specified iAID, write from half way through */ + writeBuffer = _L8("EARTH"); + offsets.iCount = 5; // number of bytes to write + offsets.iStartOffset = 5; // From position 0 + + iPhone.UpdateScFile(reqStatus, offsets, writeBuffer); + User::WaitForRequest(reqStatus); + TESTL(reqStatus == KErrNone); + + offsets.iCount = 10; // number of bytes to write + offsets.iStartOffset = 0; // From position 0 + + iPhone.ReadScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrNone, CHP_APPS_CASE("O.52")); + TESTL(readBuffer == _L8("GOODBEARTH")); + + /* Test UpdateSCFile, buffer too small */ + offsets.iStartOffset = 1; + iPhone.UpdateScFile(reqStatus, offsets, testBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrArgument, CHP_APPS_CASE("O.53")); + + /* Test UpdateSCFile, out of range record */ + offsets.iStartOffset = 11; + iPhone.UpdateScFile(reqStatus, offsets, readBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScReferencedDataNotFound, CHP_APPS_CASE("O.54")); + + /* Test UpdateSCFile, writing beyond range of file */ + offsets.iStartOffset = 1; + offsets.iCount = 11; // number of bytes to write + iPhone.UpdateScFile(reqStatus, offsets, testBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrArgument, CHP_APPS_CASE("O.55")); + + /* Test UpdateSCFile on Linear file with specified iAID but without application active */ + smartCardAppID=_L8("SCApp1"); + offsets.iAID = _L8("SCApp1"); + offsets.iType = RMobilePhone::ELinearFixed; + offsets.iCount = 1; // number of records to write + offsets.iStartOffset = 1; // record number to write + writeBuffer = _L8("GOODB"); + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScTerminate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + iPhone.UpdateScFile(reqStatus, offsets, writeBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScApplicationNotActive, CHP_APPS_CASE("O.56")); + + iPhone.SetSmartCardApplicationStatus(reqStatus,smartCardAppID,RMobilePhone::EScApplicationActivate); + User::WaitForRequest(reqStatus); + TESTL(reqStatus==KErrNone); + + /* Test UpdateSCFile, with incorrect path */ + offsets.iPath = _L8("3FFF6F3C"); + iPhone.UpdateScFile(reqStatus, offsets, writeBuffer); + User::WaitForRequest(reqStatus); + CHECKPOINT_EXL(reqStatus==KErrMMEtelScFileNotFound, CHP_APPS_CASE("O.57")); + + iPhone.Close(); + ASSERT(RThread().RequestCount()==0); + + return TestStepResult(); + } +