sl@0: // Copyright (c) 1996-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: // Test Wserv password features sl@0: // sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include "W32STD.H" sl@0: #include "../tlib/testbase.h" sl@0: #include "TMAN.H" sl@0: sl@0: //#define LOG_TESTS sl@0: sl@0: #define THE_PASSWORD _L("pass") sl@0: sl@0: enum TPasswordState sl@0: { sl@0: ENotStarted, sl@0: EWaitForSwitchOff, sl@0: EWaitForEnter, sl@0: EWaitForA, sl@0: EWaitForSwitchOff2, sl@0: EWaitForSwitchOff3, sl@0: EWaitForSwitchOff4, sl@0: EWaitForSwitchOff5, sl@0: EWaitForEnter2, sl@0: EPasswordFinished, sl@0: }; sl@0: sl@0: class CPasswordTest; sl@0: sl@0: class CPasswordWindowGroup : public CTWindowGroup sl@0: { sl@0: public: sl@0: CPasswordWindowGroup(CTClient *aClient, CPasswordTest *aTest); sl@0: void ConstructL(); sl@0: void PasswordL(const TTime &aTime); sl@0: void KeyL(const TKeyEvent &aKey,const TTime &aTime); sl@0: void SwitchOn(const TTime &aTime); sl@0: private: sl@0: CPasswordTest *iTest; sl@0: }; sl@0: sl@0: class CPasswordWindowGroup2 : public CTWindowGroup sl@0: { sl@0: public: sl@0: CPasswordWindowGroup2(CTClient *aClient, CPasswordTest *aTest); sl@0: void ConstructL(); sl@0: void KeyL(const TKeyEvent &aKey,const TTime &aTime); sl@0: private: sl@0: CPasswordTest *iTest; sl@0: }; sl@0: sl@0: class CPasswordWindow : public CTWin sl@0: { sl@0: public: sl@0: CPasswordWindow(CPasswordTest *aTest); sl@0: void Draw(); sl@0: private: sl@0: CPasswordTest *iTest; sl@0: }; sl@0: sl@0: class CPasswordTest : public CTestBase sl@0: { sl@0: public: sl@0: CPasswordTest(); sl@0: ~CPasswordTest(); sl@0: TestState DoTestL(); sl@0: void ConstructL(); sl@0: void Fail(TInt aWhere); sl@0: void EnterKeyPressed(TPasswordState aNewState); sl@0: void SwitchOn(); sl@0: void TestComplete(TPasswordState aNewState); sl@0: void PasswordMsgReceivedL(); sl@0: TPasswordState PasswordState() const; sl@0: void SetPassState(TPasswordState aPassState); sl@0: void StartMainPasswordTestL(); sl@0: void StartOnceADayPasswordTestL(); sl@0: void TurnOffAndOn(); sl@0: private: sl@0: CPasswordWindowGroup *iGroup; sl@0: CPasswordWindowGroup2 *iGroup2; sl@0: CPasswordWindow *iPassWin; sl@0: CTBlankWindow *iBlankWin; sl@0: TSize iWinSize; sl@0: TInt iState; sl@0: TPasswordState iPassState; sl@0: TBool iPasswordTestFailed; sl@0: }; sl@0: sl@0: GLDEF_C CTestBase *CreatePasswordTest() sl@0: { sl@0: return(new(ELeave) CPasswordTest()); sl@0: } sl@0: sl@0: // sl@0: sl@0: CPasswordWindowGroup::CPasswordWindowGroup(CTClient *aClient, CPasswordTest *aTest) : sl@0: CTWindowGroup(aClient), sl@0: iTest(aTest) sl@0: { sl@0: __DECLARE_NAME(_S("CPasswordWindowGroup")); sl@0: } sl@0: sl@0: void CPasswordWindowGroup::ConstructL() sl@0: { sl@0: CTWindowGroup::ConstructL(); sl@0: GroupWin()->EnableOnEvents(); sl@0: } sl@0: sl@0: void CPasswordWindowGroup::SwitchOn(const TTime &) sl@0: { sl@0: iTest->SwitchOn(); sl@0: } sl@0: sl@0: void CPasswordWindowGroup::KeyL(const TKeyEvent &aKey,const TTime &) sl@0: { sl@0: if (aKey.iCode==EKeyEscape) sl@0: iTest->TestComplete(EPasswordFinished); sl@0: switch(iTest->PasswordState()) sl@0: { sl@0: case EWaitForEnter: sl@0: if (aKey.iCode==EKeyEnter) sl@0: iTest->EnterKeyPressed(EWaitForA); sl@0: break; sl@0: case EWaitForEnter2: sl@0: if (aKey.iCode==EKeyEnter) sl@0: iTest->TestComplete(EPasswordFinished); sl@0: break; sl@0: default:; sl@0: } sl@0: } sl@0: sl@0: void CPasswordWindowGroup::PasswordL(const TTime &) sl@0: { sl@0: iTest->TestL(iGroupWin.OrdinalPosition()==0); sl@0: iTest->PasswordMsgReceivedL(); sl@0: } sl@0: sl@0: // sl@0: sl@0: CPasswordWindowGroup2::CPasswordWindowGroup2(CTClient *aClient, CPasswordTest *aTest) : sl@0: CTWindowGroup(aClient), sl@0: iTest(aTest) sl@0: { sl@0: __DECLARE_NAME(_S("CPasswordWindowGroup")); sl@0: } sl@0: sl@0: void CPasswordWindowGroup2::ConstructL() sl@0: { sl@0: CTWindowGroup::ConstructL(); sl@0: iGroupWin.CaptureKey('a',0,0); sl@0: } sl@0: sl@0: void CPasswordWindowGroup2::KeyL(const TKeyEvent &aKey,const TTime &) sl@0: { sl@0: if (iTest->PasswordState()!=EPasswordFinished) sl@0: { sl@0: if (iTest->PasswordState()!=EWaitForA) sl@0: { sl@0: #if defined(LOG_TESTS) sl@0: TLogMessageText buf; sl@0: _LIT(KBadKey,"Bad Key Code=%d(%c) Scan=%d(%c) Rep=%d"); sl@0: buf.AppendFormat(KBadKey,aKey.iCode,aKey.iCode,aKey.iScanCode,aKey.iScanCode,aKey.iRepeats); sl@0: Client()->LogMessage(buf); sl@0: #endif sl@0: if (aKey.iRepeats==0) sl@0: iTest->Fail(1); sl@0: } sl@0: else sl@0: { sl@0: if (aKey.iCode!='a') sl@0: iTest->Fail(2); sl@0: iTest->TestComplete(EWaitForSwitchOff2); sl@0: } sl@0: } sl@0: } sl@0: sl@0: // sl@0: sl@0: CPasswordWindow::CPasswordWindow(CPasswordTest *aTest) : sl@0: iTest(aTest) sl@0: { sl@0: } sl@0: sl@0: void CPasswordWindow::Draw() sl@0: { sl@0: iGc->Clear(); sl@0: switch(iTest->PasswordState()) sl@0: { sl@0: case EWaitForSwitchOff: sl@0: iGc->DrawText(_L("Please wait, turning off & on [1]"),TPoint(10,20)); sl@0: break; sl@0: case EWaitForSwitchOff2: sl@0: iGc->DrawText(_L("Please wait, turning off & on [2]"),TPoint(10,20)); sl@0: break; sl@0: case EWaitForSwitchOff3: sl@0: iGc->DrawText(_L("Please wait, turning off & on [3]"),TPoint(10,20)); sl@0: break; sl@0: case EWaitForSwitchOff4: sl@0: iGc->DrawText(_L("Please wait, turning off & on [4]"),TPoint(10,20)); sl@0: break; sl@0: case EWaitForSwitchOff5: sl@0: iGc->DrawText(_L("Please wait, turning off & on [5]"),TPoint(10,20)); sl@0: break; sl@0: case EWaitForEnter: sl@0: iGc->DrawText(_L("Try the key of death, then..."),TPoint(10,20)); sl@0: iGc->DrawText(_L("Press 'a', then..."),TPoint(10,40)); sl@0: iGc->DrawText(_L("Press Enter"),TPoint(10,60)); sl@0: break; sl@0: case EWaitForEnter2: sl@0: iGc->DrawText(_L("Press Enter"),TPoint(10,20)); sl@0: break; sl@0: case EWaitForA: sl@0: iGc->DrawText(_L("Press 'a'"),TPoint(10,20)); sl@0: case EPasswordFinished: sl@0: break; sl@0: default:; sl@0: } sl@0: } sl@0: sl@0: // sl@0: sl@0: CPasswordTest::CPasswordTest() : CTestBase(_L("Password")) sl@0: {} sl@0: sl@0: CPasswordTest::~CPasswordTest() sl@0: { sl@0: delete iBlankWin; sl@0: delete iPassWin; sl@0: delete iGroup; sl@0: delete iGroup2; sl@0: } sl@0: sl@0: #if defined(LOG_TESTS) sl@0: void CPasswordTest::Fail(TInt aWhere) sl@0: #else sl@0: void CPasswordTest::Fail(TInt /*aWhere*/) sl@0: #endif sl@0: { sl@0: #if defined(LOG_TESTS) sl@0: TLogMessageText buf; sl@0: _LIT(KFailed,"Password Failed at %d (%d,%d)"); sl@0: buf.AppendFormat(KFailed,aWhere,iState,iPassState); sl@0: Client()->LogMessage(buf); sl@0: #endif sl@0: iPasswordTestFailed=ETrue; sl@0: Request(); sl@0: } sl@0: sl@0: void CPasswordTest::TurnOffAndOn() sl@0: { sl@0: /*#if defined(LOG_TESTS) sl@0: TLogMessageText buf; sl@0: _LIT(KSettingTime,"Setting Off Timer"); sl@0: buf.Append(KSettingTime); sl@0: Client()->LogMessage(buf); sl@0: #endif*/ sl@0: RTimer timer; sl@0: timer.CreateLocal(); sl@0: TTime time; sl@0: time.HomeTime(); sl@0: time+=TTimeIntervalSeconds(7); // For some reason the O/S won't switch off for less than 6 seconds sl@0: TRequestStatus status; sl@0: timer.At(status,time); sl@0: UserHal::SwitchOff(); sl@0: User::WaitForRequest(status); sl@0: #if !defined(__WINS__) sl@0: TRawEvent event; sl@0: event.Set(TRawEvent::ESwitchOn); sl@0: UserSvr::AddEvent(event); sl@0: #endif sl@0: /*#if defined(LOG_TESTS) sl@0: TLogMessageText buf; sl@0: _LIT(KTimerOff,"Timer Gone Off (P=%d,S=%d)"); sl@0: buf.AppendFormat(KTimerOff,iState,iPassState); sl@0: Client()->LogMessage(buf); sl@0: #endif*/ sl@0: } sl@0: sl@0: TPasswordState CPasswordTest::PasswordState() const sl@0: { sl@0: return(iPassState); sl@0: } sl@0: sl@0: void CPasswordTest::SetPassState(TPasswordState aPassState) sl@0: { sl@0: iPassState=aPassState; sl@0: iPassWin->DrawNow(); sl@0: Client()->iWs.Flush(); sl@0: /*#if defined(LOG_TESTS) sl@0: TLogMessageText buf; sl@0: _LIT(PassTestState,"Password Test(%d), State=%d"); sl@0: buf.AppendFormat(PassTestState,iState,aPassState); sl@0: Client()->LogMessage(buf); sl@0: #endif*/ sl@0: switch(aPassState) sl@0: { sl@0: case EWaitForSwitchOff: sl@0: case EWaitForSwitchOff2: sl@0: case EWaitForSwitchOff3: sl@0: case EWaitForSwitchOff4: sl@0: case EWaitForSwitchOff5: sl@0: TurnOffAndOn(); sl@0: break; sl@0: default:; sl@0: } sl@0: } sl@0: sl@0: void CPasswordTest::SwitchOn() sl@0: { sl@0: /*#if defined(LOG_TESTS) sl@0: TLogMessageText buf; sl@0: _LIT(KTimerOff,"Switch On (P=%d,S=%d)"); sl@0: buf.AppendFormat(KTimerOff,iState,iPassState); sl@0: Client()->LogMessage(buf); sl@0: #endif*/ sl@0: switch (iPassState) sl@0: { sl@0: case EWaitForSwitchOff: sl@0: SetPassState(EWaitForEnter); sl@0: break; sl@0: case EWaitForSwitchOff2: sl@0: SetPassState(EWaitForSwitchOff3); sl@0: break; sl@0: case EWaitForSwitchOff3: sl@0: SetPassState(EWaitForSwitchOff4); sl@0: break; sl@0: case EWaitForSwitchOff4: sl@0: { sl@0: SetPassState(EWaitForSwitchOff5); sl@0: TTime time; sl@0: time.HomeTime(); sl@0: time+=TTimeIntervalHours(24); sl@0: User::SetHomeTime(time); sl@0: } sl@0: break; sl@0: case EWaitForSwitchOff5: sl@0: SetPassState(EWaitForEnter2); sl@0: break; sl@0: default:; sl@0: } sl@0: } sl@0: sl@0: void CPasswordTest::PasswordMsgReceivedL() sl@0: { sl@0: TestL(iPassWin->BaseWin()->OrdinalPosition()==0); sl@0: if (iPassState==EWaitForSwitchOff3 || iPassState==EWaitForSwitchOff4) sl@0: Fail(3); sl@0: } sl@0: sl@0: void CPasswordTest::EnterKeyPressed(TPasswordState aNewState) sl@0: { sl@0: iPassWin->BaseWin()->SetOrdinalPosition(-1); sl@0: SetPassState(aNewState); sl@0: Client()->iWs.PasswordEntered(); sl@0: } sl@0: sl@0: void CPasswordTest::TestComplete(TPasswordState aNewState) sl@0: { sl@0: Request(); sl@0: SetPassState(aNewState); sl@0: iPassState=aNewState; sl@0: } sl@0: sl@0: void CPasswordTest::ConstructL() sl@0: { sl@0: iGroup2=new(ELeave) CPasswordWindowGroup2(Client(),this); sl@0: iGroup2->ConstructL(); sl@0: iGroup=new(ELeave) CPasswordWindowGroup(Client(),this); sl@0: iGroup->ConstructL(); sl@0: iPassWin=new(ELeave) CPasswordWindow(this); sl@0: iPassWin->ConstructL(*iGroup); sl@0: iPassWin->AssignGC(*Client()->iGc); sl@0: iPassWin->Activate(); sl@0: iBlankWin=new(ELeave) CTBlankWindow(); sl@0: iBlankWin->ConstructL(*iGroup); sl@0: iBlankWin->SetVisible(EFalse); sl@0: iBlankWin->Activate(); sl@0: iState=ENotStarted; sl@0: } sl@0: sl@0: void CPasswordTest::StartMainPasswordTestL() sl@0: { sl@0: if (iPassWin->BaseWin()->PasswordWindow(EPasswordAlways)!=KErrNone) sl@0: { sl@0: DisplayDialog(_L("Can't do password tests"),_L("Password window"),_L("already exists"), Client()->iGroup->GroupWin()); sl@0: AbortL(); sl@0: } sl@0: SetPassState(EWaitForSwitchOff); sl@0: } sl@0: sl@0: void CPasswordTest::StartOnceADayPasswordTestL() sl@0: { sl@0: TestL(iPassWin->BaseWin()->PasswordWindow(EPasswordOnceADay)==KErrNone); sl@0: } sl@0: sl@0: TestState CPasswordTest::DoTestL() sl@0: { sl@0: if (iPasswordTestFailed) sl@0: TestL(ETrue); sl@0: switch(iState) sl@0: { sl@0: case 0: sl@0: LogSubTest(_L("Password 1"),1); sl@0: StartMainPasswordTestL(); sl@0: iState++; sl@0: return(EContinue); sl@0: case 1: sl@0: LogSubTest(_L("Password 2"),2); sl@0: StartOnceADayPasswordTestL(); sl@0: iState++; sl@0: return(EContinue); sl@0: default: sl@0: return(EFinished); sl@0: } sl@0: }