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 <e32std.h>
sl@0: #include <e32hal.h>
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: 	}