// 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();
}