kerneltest/e32test/pccd/t_multislot.cpp
changeset 9 96e5fb8b040d
child 6 0173bcd7697c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/pccd/t_multislot.cpp	Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,165 @@
+/*
+* Copyright (c) 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:
+*
+*/
+#include <e32test.h>
+#include <f32file.h>
+
+static RTest test(_L("Testing t_multislot"));
+_LIT(KYes, "yes");
+_LIT(KNo, "no");
+static RFs fs;
+
+// this function was copied from t_sdpartition.cpp
+TInt FindMmcLocalDriveNumber(TChar aDriveChar, TInt& aLocalDriveNum, TInt aDriveNum)
+	{
+	TInt r = fs.CharToDrive(aDriveChar, aDriveNum);
+	test(r==KErrNone);
+
+	TDriveInfo driveInfo;
+    r = fs.Drive(driveInfo, aDriveNum);
+    test(r==KErrNone);
+
+
+	TVolumeInfo vi;
+	r = fs.Volume(vi, aDriveNum);
+    test(r==KErrNone);
+
+
+	TMediaSerialNumber serialNum;
+	r = fs.GetMediaSerialNumber(serialNum, aDriveNum);
+    test(r==KErrNone);
+
+
+    test.Printf(_L("Drive %C size %ld\n"), (char) aDriveChar, vi.iSize);
+	TInt len = serialNum.Length();
+	test.Printf(_L("Serial number (len %d) :"), len);
+	TInt n;
+	for (n=0; n<len; n+=16)
+		{
+		TBuf16<16*3 +1> buf;
+		for (TInt m=n; m<n+16; m++)
+			{
+			TBuf16<3> hexBuf;
+			hexBuf.Format(_L("%02X "),serialNum[m]);
+			buf.Append(hexBuf);
+			}
+		buf.Append(_L("\n"));
+		test.Printf(buf);
+		}
+
+	TBusLocalDrive drv;
+	TBool chg(EFalse);
+	aLocalDriveNum = -1;
+	TInt serialNumbersMatched = 0;
+	for (n=0; n<KMaxLocalDrives; n++)
+		{
+		r = drv.Connect(n, chg); //for user area
+//RDebug::Print(_L("TBusLocalDrive::Connect(%d) %d"), n, r);
+
+		if(r != KErrNone)
+			{
+			test.Printf(_L("drive %d: TBusLocalDrive::Connect() failed %d\n"), n, r);
+			continue;
+			}	
+
+	    TLocalDriveCapsV5Buf capsBuf;
+	    TLocalDriveCapsV5& caps = capsBuf();
+		r = drv.Caps(capsBuf);
+		if(r != KErrNone)
+			{
+			test.Printf(_L("drive %d: TBusLocalDrive::Caps() failed %d\n"), n, r);
+			continue;
+			}	
+
+//RDebug::Print(_L("areaSize %ld cardCapacity %ld"), caps.iSize, caps.iFormatInfo.iCapacity);
+
+		TPtrC8 localSerialNum(caps.iSerialNum, caps.iSerialNumLength);
+		if (serialNum.Compare(localSerialNum) == 0)
+			{
+			serialNumbersMatched++;
+			TBool sizeMatch = (vi.iSize < caps.iSize);
+			test.Printf(_L("drive %d: Serial number match, size match: %S\n"), n, sizeMatch?&KYes:&KNo);
+			if (sizeMatch)
+				{
+				aLocalDriveNum = n;
+				drv.Disconnect();
+				break;
+				}
+			}
+		drv.Disconnect();
+		}
+
+
+	return aLocalDriveNum == -1?KErrNotFound:KErrNone;
+	}
+
+
+// Manual test - requires user to move a card between two physical slots
+extern TInt E32Main()
+	{
+	test.Start(_L("T_MULTISLOT Test"));
+	test(fs.Connect()==KErrNone);
+	
+	// Get the list of removable drive driver-letters
+	TDriveList driveList;
+	test(fs.DriveList(driveList,KDriveAttRemovable)==KErrNone);
+	
+	
+	TInt length=driveList.Length();
+	TBool pass = EFalse;
+	
+	// i is drive letter (as int)
+	// for every removable media logical drive
+	for(TInt i=0; i<length; i++)
+		{
+		if(driveList[i] == 0)
+			{
+			continue;
+			}
+
+		TChar driveChar = i+'A';
+		test.Next(_L("Testing Logical Drive"));
+		
+
+		TInt FirstlocDrvNum = KErrNotFound;
+		TInt SecondlocDrvNum = KErrNotFound;
+		TInt driveNum = -1;
+		driveNum = i+'A';
+		test.Printf(_L("Logical Drive : %d"), driveNum);
+		
+		// Get local drive number by gettin ghr Serial number fo the card (RFs call), then 
+		// enumerating the TBusLocalDrives and finding one that matches.
+		test(FindMmcLocalDriveNumber(driveChar,FirstlocDrvNum,driveNum)==KErrNone);
+		// Got first local drive number, now move card into second slot.
+		test.Printf(_L("<Move MMC Card to second slot, then press any key>"));
+		test.Getch();
+		// Get second local drive number for same logical drive (should be different local drive number).
+		test(FindMmcLocalDriveNumber(driveChar,SecondlocDrvNum,driveNum)==KErrNone);
+		if(FirstlocDrvNum!=SecondlocDrvNum)
+			{
+			pass=ETrue;
+			break;
+			}
+		// else perhaps this wasn't a multislot drive
+		}
+	test(pass);
+	test.End();
+	test.Close();
+	
+	fs.Close();
+	return KErrNone;
+	}
+