--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/filesystem/fat/t_raw.cpp Thu Dec 17 09:24:54 2009 +0200
@@ -0,0 +1,359 @@
+// Copyright (c) 1996-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:
+// f32test\server\t_raw.cpp
+//
+//
+
+#define __E32TEST_EXTENSION__
+
+#include <f32file.h>
+#include <e32test.h>
+#include "t_server.h"
+
+#include "fs_utils.h"
+#include "fat_utils.h"
+using namespace Fat_Test_Utils;
+
+
+GLDEF_D RTest test(_L("T_RAW"));
+
+LOCAL_D TInt gDrive;
+
+LOCAL_C void Test1()
+//
+// Test all methods
+//
+ {
+
+ test.Start(_L("Test all methods"));
+ RRawDisk rd;
+ TInt r=rd.Open(TheFs,gDrive);
+ test(r==KErrNone);
+ TBuf8<16> buf;
+ r=rd.Read(0,buf);
+ test(r==KErrNone);
+ r=rd.Write(0,buf);
+ test(r==KErrNone);
+ rd.Close();
+ test.End();
+ }
+
+LOCAL_C void Test2()
+//
+// Test cannot open a RRawDisk while other resources are open on it.
+//
+ {
+
+ MakeFile(_L("TRAW.TST"));
+ MakeDir(_L("\\F32-TST\\TRAW\\TRAWTEST\\"));
+
+ RFile f;
+ TInt r=f.Open(TheFs,_L("TRAW.TST"),EFileWrite);
+ test(r==KErrNone);
+ RRawDisk rd;
+ r=rd.Open(TheFs,gDrive);
+ test(r==KErrInUse);
+ f.Close();
+ r=rd.Open(TheFs,gDrive);
+ test(r==KErrNone);
+ rd.Close();
+
+ TFileName fileName;
+ r=f.Temp(TheFs,_L(""),fileName,EFileWrite);
+ test(r==KErrNone);
+ r=rd.Open(TheFs,gDrive);
+ test(r==KErrInUse);
+ f.Close();
+ r=rd.Open(TheFs,gDrive);
+ test(r==KErrNone);
+ rd.Close();
+
+ RDir d;
+ r=d.Open(TheFs,_L("TRAWTEST"),KEntryAttNormal);
+ test(r==KErrNone);
+ r=rd.Open(TheFs,gDrive);
+ test(r==KErrInUse);
+ d.Close();
+ r=rd.Open(TheFs,gDrive);
+ test(r==KErrNone);
+ rd.Close();
+
+ RFormat fmt;
+ TInt count;
+ r=fmt.Open(TheFs,gSessionPath,EQuickFormat,count);
+ test(r==KErrNone);
+ r=rd.Open(TheFs,gDrive); // Raw disk access ok during formatting
+ test.Printf(_L("open rd when fmt opn r=%d"),r);
+ test(r==KErrInUse);
+ fmt.Close();
+ r=rd.Open(TheFs,gDrive);
+ test.Printf(_L("open rd when fmt closed r=%d"),r);
+ test(r==KErrNone);
+ RRawDisk rd2;
+ r=rd2.Open(TheFs,gDrive); //should only have one Raw object open
+ test(r==KErrInUse);
+ rd2.Close();
+ rd.Close();
+ }
+
+LOCAL_C void Test3()
+//
+// Test cannot open resources on a disk while raw access is taking place
+//
+ {
+
+ MakeFile(_L("TRAW.TST"));
+ MakeDir(_L("TRAW"));
+
+ RRawDisk rd;
+ TInt r=rd.Open(TheFs,gDrive);
+ test(r==KErrNone);
+
+ RFile f;
+ TFileName fileName;
+ r=f.Open(TheFs,_L("TRAW.TST"),EFileWrite);
+ test(r==KErrInUse);
+ r=f.Temp(TheFs,_L(""),fileName,EFileWrite);
+ test(r==KErrInUse);
+
+ RDir d;
+ r=d.Open(TheFs,_L("TRAW"),KEntryAttNormal);
+ test(r==KErrInUse);
+
+ RFormat fmt;
+ TInt count;
+ r=fmt.Open(TheFs,gSessionPath,EQuickFormat,count);
+ if (r != KErrInUse)
+ test.Printf(_L("Error %d. Sess = %S"), r, &gSessionPath);
+ test(r==KErrInUse);
+
+ CDir* dir=(CDir*)0x05;
+ r=TheFs.GetDir(_L("\\F32-TST\\*.*"),KEntryAttNormal,ESortNone,dir);
+ test(r==KErrInUse);
+ test(dir==NULL);
+
+ RRawDisk rd2;
+ r=rd2.Open(TheFs,gDrive);
+ test(r==KErrInUse);
+
+// fmt.Close();
+ rd.Close();
+// rd2.Close();
+ }
+
+LOCAL_C void Test4()
+//
+// Test Read and Write
+//
+ {
+
+ TBuf8<32> contents=_L8("This File says BOO");
+ MakeFile(_L("TRAW.TST"),contents);
+
+ RRawDisk rd;
+ TInt r=rd.Open(TheFs,gDrive);
+ test(r==KErrNone);
+
+ TBuf8<32> textBuf;
+ TInt64 pos=0;
+
+ test.Printf(_L("doing rawread"));
+ FOREVER
+ {
+ r=rd.Read(pos,textBuf);
+ if (r!=KErrNone)
+ {
+ test.Printf(_L("ERROR: RawDisk read returned %d at pos %ld"),r, pos);
+ test(0);
+ //test.Getch();
+ break;
+ }
+ if ((pos % (1024*1024)) == 0)
+ test.Printf(_L("Read position 0x%x \r"), pos);
+ textBuf.SetLength(contents.Length());
+ if (textBuf==contents)
+ break;
+ pos+=512;
+ }
+ test.Printf(_L("\n"));
+
+ TBuf8<32> contents2=_L8("This File says MOO");
+ r=rd.Write(pos,contents2);
+ test(r==KErrNone);
+ rd.Close();
+
+ RFile f;
+ r=f.Open(TheFs,_L("TRAW.TST"),EFileRead);
+ test(r==KErrNone);
+ r=f.Read(textBuf);
+ test(r==KErrNone);
+ test(textBuf==contents2);
+ f.Close();
+ }
+
+enum TTestCommands
+ {
+ EThreadForgetToCloseSession,
+ EThreadForgetToCloseRaw,
+ EThreadHang
+ };
+
+RSemaphore gSemaphore;
+
+TInt MyThreadFunction(TAny* aThreadCommand)
+//
+// Do nasty things
+//
+ {
+
+ RRawDisk rd;
+ RFs fs;
+ TInt r=fs.Connect();
+ if (r!=KErrNone)
+ goto Error;
+ r=rd.Open(fs,gDrive);
+ if (r!=KErrNone)
+ goto Error;
+
+ switch((TTestCommands)(TInt)aThreadCommand)
+ {
+ case EThreadForgetToCloseSession:
+ return(KErrNone);
+
+ case EThreadForgetToCloseRaw:
+ break;
+
+ case EThreadHang:
+ gSemaphore.Signal();
+ FOREVER{};
+
+ default:
+ goto Error;
+ }
+ fs.Close();
+ return(KErrNone);
+
+Error:
+ User::Panic(_L("Shouldn't be here!"),0);
+ return(KErrNone);
+ }
+
+LOCAL_C void Test5()
+//
+// Test thread panics
+//
+ {
+
+ test.Next(_L("Test thread panics"));
+ MakeFile(_L("TEST.FILE"));
+
+ RThread thread;
+ TInt r=thread.Create(_L("MyThread"),MyThreadFunction,0x1000,0x1000,0x1000,(TAny*)EThreadForgetToCloseSession);
+ test(r==KErrNone);
+ TRequestStatus reqStat;
+ thread.Logon(reqStat);
+ thread.Resume();
+ User::WaitForRequest(reqStat);
+ CLOSE_AND_WAIT(thread);
+
+ // We know the disconnect has been sent to the file server by this point
+ // but we don't know it has been processed.
+ // Connect and disconnect a session here to make sure.
+ FsBarrier();
+
+ RFile f;
+ r=f.Open(TheFs,_L("TEST.FILE"),EFileWrite);
+ test(r==KErrNone);
+ f.Close();
+
+ r=thread.Create(_L("MyThread"),MyThreadFunction,0x1000,0x1000,0x1000,(TAny*)EThreadForgetToCloseRaw);
+ test(r==KErrNone);
+ thread.Logon(reqStat);
+ thread.Resume();
+ User::WaitForRequest(reqStat);
+ CLOSE_AND_WAIT(thread);
+
+ // We know the disconnect has been sent to the file server by this point
+ // but we don't know it has been processed.
+ // Connect and disconnect a session here to make sure.
+ FsBarrier();
+
+ r=f.Open(TheFs,_L("TEST.FILE"),EFileWrite);
+ test(r==KErrNone);
+ f.Close();
+
+ r=gSemaphore.CreateGlobal(_L("MySemaphore"),0);
+ test(r==KErrNone);
+ r=thread.Create(_L("MyThread"),MyThreadFunction,0x1000,0x1000,0x1000,(TAny*)EThreadHang);
+ test(r==KErrNone);
+ thread.Resume();
+ gSemaphore.Wait();
+ gSemaphore.Close();
+
+ r=f.Open(TheFs,_L("TEST.FILE"),EFileWrite);
+ test(r==KErrInUse);
+ TBool jit = User::JustInTime();
+ User::SetJustInTime(EFalse);
+ thread.Kill(KErrGeneral);
+ CLOSE_AND_WAIT(thread);
+ User::SetJustInTime(jit);
+
+ // We know the disconnect has been sent to the file server by this point
+ // but we don't know it has been processed.
+ // Connect and disconnect a session here to make sure.
+ FsBarrier();
+
+ r=f.Open(TheFs,_L("TEST.FILE"),EFileWrite);
+ test(r==KErrNone);
+ f.Close();
+ }
+
+
+GLDEF_C void CallTestsL()
+//
+// Do all tests
+//
+ {
+
+ //-- set up console output
+ Fat_Test_Utils::SetConsole(test.Console());
+
+ TInt r=TheFs.CharToDrive(gSessionPath[0],gDrive);
+ test(r==KErrNone);
+
+ PrintDrvInfo(TheFs, gDrive);
+
+ //-- check if this is FAT
+ if(!Is_Fat(TheFs, gDrive))
+ {
+ test.Printf(_L("Skipping. This test requires FAT drive.\n"));
+ return;
+ }
+
+ //-- format the drive.
+ r = FormatFatDrive(TheFs, gDrive, ETrue);
+ test_KErrNone(r);
+
+ CreateTestDirectory(_L("\\F32-TST\\TRAW\\"));
+
+ Test1();
+ Test2();
+ Test3();
+
+ Test4(); // (silly test) Not valid on LFFS
+
+ Test5();
+
+ DeleteTestDirectory();
+ }