kerneltest/e32test/pccd/t_pccd3.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 29 743008598095
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "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:
// e32test\pccd\t_pccd3.cpp
// 
//

#include <e32test.h>
#include <e32svr.h>
#include <e32hal.h>
#include <e32uid.h>
#include <d_pccdif.h>
#include <hal.h>
#define TEST_NOTIFIER

LOCAL_D RTest test(_L("T_PCCD3"));
LOCAL_D TBool SimpleCDScheme;
LOCAL_D TInt TotalSockets;
LOCAL_D RPcCardCntrlIf PccdDrv[KMaxPBusSockets];

const TSocket KSocket=0;
const TInt KFunc=0;


#ifdef TEST_NOTIFIER
LOCAL_C void theMediaChangeNotifierTests()
//
// Test UserSvr::MediaChangeNotify() and UserSvr::ForceRemountMedia().
//
	{

	test.Next(_L("The media change notifier(s)"));

	// Test requesting on a non-removable device
	TRequestStatus rs[KMaxPBusSockets];
	test(UserSvr::MediaChangeNotify(EFixedMedia0,&rs[0])==KErrNotSupported);

#ifndef _DEBUG
	test(UserSvr::MediaChangeNotify(ERemovableMedia0,&rs[0])==KErrInUse);
#else
	test.Printf( _L("<<<THIS WILL BREAK F32 MEDIA CHANGE NOTIFICATION>>>\r\n"));
	TInt socket;
	TMediaDevice md;
	for (socket=0;socket<TotalSockets;socket++)
		{
		// Register the notifier on all sockets here - out of the main loop to 
		// test operation with multiple outstanding requests on different sockets
		md=(TMediaDevice)(ERemovableMedia0+socket);
		test(UserSvr::MediaChangeNotify(md,&rs[socket])==KErrNone);
		}

	for (socket=0;socket<TotalSockets;socket++)
		{
		md=(TMediaDevice)(ERemovableMedia0+socket);
		// Perform the entire test twice
		for (TInt cycleCount=1;cycleCount<=2;cycleCount++)
			{
			if (cycleCount>1)
				{
				// Second time around we need to make a request 
				test(UserSvr::MediaChangeNotify(md,&rs[socket])==KErrNone);
				}
			UserSvr::ForceRemountMedia(md); 	// Generate media change	
			User::WaitForRequest(rs[socket]);			// From door open
			test(rs[socket].Int()==KErrNone);
			test.Printf( _L("Media change notify on Socket %d\r\n"),socket);
			if (!SimpleCDScheme)
				{
				// For CD scheme, the open/close occur too close together to
				// detect separately
				test(UserSvr::MediaChangeNotify(md,&rs[socket])==KErrNone);
				User::WaitForRequest(rs[socket]);		// From door close again
				test(rs[socket].Int()==KErrNone);
				test.Printf( _L("Media change notify on Socket %d\r\n"),socket);
				}
			}
		}

	// Test requesting on an invalid socket for this platform
	if (TotalSockets<KMaxPBusSockets)
		test(UserSvr::MediaChangeNotify((TMediaDevice)(ERemovableMedia0+TotalSockets),&rs[0])==KErrGeneral);
	#endif
	}

#else
LOCAL_C void theMediaChangeNotifierTests()
//
// Test UserSvr::MediaChangeNotify() and UserSvr::ForceRemountMedia().
//
	{

	test.Next(_L("The media change notifier(s)"));

	// Test requesting on a non-removable device
	TRequestStatus rs;
	test(UserSvr::MediaChangeNotify(EFixedMedia0,&rs)==KErrNotSupported);

#ifndef _DEBUG
	test(UserSvr::MediaChangeNotify(ERemovableMedia0,&rs)==KErrInUse);
#else
	test.Printf( _L("<<<MEDIA CHANGE NOTIFICATION TESTS DISABLED>>>\r\n"),i);
#endif
	}
#endif

LOCAL_C void thePccdControllerMediaChangeEventTests()
//
// Test registering on media change events
//
	{

	test.Next(_L("PC Card Controller - Media change notification"));
	if (SimpleCDScheme)
		{
		TRequestStatus rs[KMaxPBusSockets];
		TInt i;
		for (i=0;i<TotalSockets;i++)
			test(PccdDrv[i].RegisterEvent(EPcCardEvMediaChange,&rs[i])==KErrNone);

		for (i=0;i<TotalSockets;i++)
			{
			test.Printf( _L("<<<Insert the card in socket %d >>>\r\n"),i);
			User::WaitForRequest(rs[i]);
			test(rs[i].Int()==KErrNone);
			}
		}

	else
		{
		TRequestStatus rs;
		test(PccdDrv[0].RegisterEvent(EPcCardEvMediaChange,&rs)==KErrNone);

#if defined (__WINS__)
		test.Printf( _L("<<<Hit F5>>>\r\n"));
#else
		test.Printf( _L("<<<Open and close CF card door>>>\r\n"));
		test.Printf( _L("<<<Machine will turn off as soon as door is opened>>>\r\n"));
#endif
		User::WaitForRequest(rs);
		test(rs.Int()==KErrNone);
#if defined (__WINS__)
		// Delay power off until after F5 key up event. Key up doesn't occur when in standby.
		// Without this the power-on test fails because the simulated door state is stuck open.
		User::After(500000);
#endif
		}
	}

LOCAL_C void thePccdControllerPowerEventTests()
//
// Test registering on power events
//
	{

	test.Next(_L("PC Card Controller - Power-off notification."));
	RTimer timer;
	TRequestStatus prs, trs;
	test(timer.CreateLocal()==KErrNone);
	test(PccdDrv[0].RegisterEvent(EPcCardEvPwrDown,&prs)==KErrNone);
	TTime tim;
	tim.HomeTime();
	tim+=TTimeIntervalSeconds(8);
	timer.At(trs,tim);
	UserHal::SwitchOff();
	User::WaitForRequest(prs);
	test(prs.Int()==KErrNone);
	User::WaitForRequest(trs);
	test(trs.Int()==KErrNone);

	test.Next(_L("PC Card Controller - Power-on notification."));
	test(PccdDrv[0].RegisterEvent(EPcCardEvPwrUp,&prs)==KErrNone);
	tim.HomeTime();
	tim+=TTimeIntervalSeconds(8);
	timer.At(trs,tim);
	UserHal::SwitchOff();
	User::WaitForRequest(prs);
	test(prs.Int()==KErrNone);
	User::WaitForRequest(trs);
	test(trs.Int()==KErrNone);
	}

LOCAL_C void thePccdControllerStatusChangeEventTests()
//
// Test registering on status change events
//
	{

	TRequestStatus rs;
	if (!SimpleCDScheme)
		{
		// We're going to ask tester to remove CF card in order to generate a card status change 
		// notification. However, on P2s this involves opening the CF card door first. Because of
		// the media notifier (F32), opening door gives us a spurious RegisterEvent() notification.
		test.Printf( _L("<<<Open (don't close) media door>>>\r\n"));
		test(PccdDrv[0].RegisterEvent(EPcCardEvMediaChange,&rs)==KErrNone);
		User::WaitForRequest(rs);
		test(rs.Int()==KErrNone); 
		}

	TInt i;
	for (i=(TotalSockets-1);i>=0;i--)
		{
		test.Next(_L("Card status change notification - card removal"));
		test(PccdDrv[i].RegisterEvent(EPcCardEvIndChange,&rs)==KErrNone);
		test.Printf( _L("<<<Remove the card from socket %d>>>\r\n"),i);
		User::WaitForRequest(rs);
		test(rs.Int()==KErrNone);

		test.Next(_L("Card status change notification - card insertion"));
		User::After(200000);	// 0.2s
		TInt j=(i>0)?(i-1):i;
		test(PccdDrv[j].RegisterEvent(EPcCardEvIndChange,&rs)==KErrNone);
		test.Printf( _L("<<<Insert the card back into socket %d>>>\r\n"),j);
		User::WaitForRequest(rs);
		test(rs.Int()==KErrNone);
		}

	if (!SimpleCDScheme)
		{
		test.Printf( _L("<<<Close) CF card door>>>\r\n"));
		test(PccdDrv[0].RegisterEvent(EPcCardEvPwrUp,&rs)==KErrNone);
		User::WaitForRequest(rs);
		test(rs.Int()==KErrNone); 
		}
	}

LOCAL_C void thePccdControllerCardReadyEventTests()
//
// Test registering on ready events (tests 1 socket only!!!!).
//
	{

	test.Next(_L("Card ready notification"));
	TRequestStatus rs;
	TInt r;
	r=PccdDrv[0].RegisterEvent(EPcCardEvRdyChange,&rs);
	if (r==KErrNotSupported)
		{
		test.Printf( _L("<<<Not supported on this platform>>>\r\n"));
		return;
		}
	test(r==KErrNone);

	TPcCardStatus s;
	TSocketSignals ind;
	test(PccdDrv[0].SocketInfo(s,ind)==KErrNone);
	test(s==EPcCardNotReady);
	test(ind.iCardDetected);
	
	TRequestStatus prs;
	PccdDrv[0].PwrUp(&prs);
	User::WaitForRequest(rs);
	test(rs.Int()==KErrNone);
	User::WaitForRequest(prs);
	test(rs.Int()==KErrNone);
	}

GLDEF_C TInt E32Main()
	{

	TInt r;
#if defined (__WINS__)
	// Connect to all the local drives first as will be the case in ARM
	TBusLocalDrive Drive[KMaxLocalDrives];
	TBool ChangedFlag[KMaxLocalDrives];
	TInt j;
	for (j=0;j<KMaxLocalDrives;j++)
		Drive[j].Connect(j,ChangedFlag[j]);
#endif

	test.Title();
//
	test.Start(_L("Read machine info."));
	// Find out what sort of media change architecture we have. How many sockets
	// there are and whether we have a full blown media door scheme or just a system 
	// using the PC Card CD signals. The later information we can't read from the
	// machine info, the test program just has to be updated with the machine name of 
	// any machine which employs the CD scheme.
	SimpleCDScheme=EFalse;
	TInt muid=0;
	r=HAL::Get(HAL::EMachineUid, muid);
	test(r==KErrNone);
	if (muid==HAL::EMachineUid_Brutus)
		SimpleCDScheme=ETrue;
	TDriveInfoV1Buf dinfo;
	UserHal::DriveInfo(dinfo);
	TotalSockets=dinfo().iTotalSockets;

	if (SimpleCDScheme)
		test.Printf( _L("<<<Remove all PC/CF cards - hit a key>>>\r\n"));
	else
		{
		if (TotalSockets>0)
			test.Printf( _L("<<<Insert the card in socket %d - hit a key>>>\r\n"),(TotalSockets-1));
		}
	test.Getch();

	test.Next(_L("Load/open logical devices"));
	r=User::LoadLogicalDevice(_L("D_PCCDIF"));
	test(r==KErrNone||r==KErrAlreadyExists);
	TInt i;
	for (i=0;i<TotalSockets;i++)
		{
		r=PccdDrv[i].Open(i,PccdDrv[i].VersionRequired());
		test(r==KErrNone);
		}

	// Test UserSvr::MediaChangeNotify() and UserSvr::ForceRemountMedia().
	theMediaChangeNotifierTests();

	// Test registering on PC Card Controller events
	thePccdControllerMediaChangeEventTests();
	thePccdControllerPowerEventTests();
#if defined(__EPOC32__)
	thePccdControllerStatusChangeEventTests();
	thePccdControllerCardReadyEventTests();
#endif

	test.Next(_L("Close/free devices"));
	for (i=0;i<TotalSockets;i++)
		PccdDrv[i].Close();
	r=User::FreeLogicalDevice(_L("PccdIf"));
	test(r==KErrNone);

	test.End();

#if defined (__WINS__)
	for (i=0;i<KMaxLocalDrives;i++)
		Drive[i].Disconnect();
#endif
	return(0);
	}