Added test functions for fsrtl lib
[reactos.git] / reactos / ntoskrnl / tests / fsrtl.c
index 6624646..fa39d71 100644 (file)
@@ -42,6 +42,8 @@ BOOLEAN FsRtlTest_StartTest() {
     PLARGE_INTEGER ValidDataLength;\r
     PLARGE_INTEGER   FileSize;\r
 \r
+    PDEVICE_OBJECT pRelatedDo = NULL;\r
+    \r
     /* Allocate a 100KB buffer to do IOs */\r
     Buffer = ExAllocatePool(PagedPool,100*_1KB);\r
     \r
@@ -275,6 +277,188 @@ BOOLEAN FsRtlTest_StartTest() {
         Fh = NULL;\r
      }\r
 \r
+    /*  ------------------------------------------------------------------------\r
+            TESTING:\r
+                BOOLEAN\r
+                NTAPI\r
+                FsRtlPrepareMdlWriteDev(IN PFILE_OBJECT FileObject,\r
+                                        IN PLARGE_INTEGER FileOffset,\r
+                                        IN ULONG Length,\r
+                                        IN ULONG LockKey,\r
+                                        OUT PMDL *MdlChain,\r
+                                        OUT PIO_STATUS_BLOCK IoStatus,\r
+                                        IN PDEVICE_OBJECT DeviceObject)\r
+\r
+        ------------------------------------------------------------------------  */\r
+\r
+    /* We are going to repeat the same bunch of tests but with Wait = FALSE. So we exercise the second part of the function. */\r
+    FsRtlTest_OpenTestFile(&Fh, &Pfo);\r
+\r
+    /* Extract the test variable from the FCB struct */\r
+    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)Pfo->FsContext;\r
+    AllocationSize = &FcbHeader->AllocationSize;\r
+    ValidDataLength = &FcbHeader->ValidDataLength;\r
+    FileSize = &FcbHeader->FileSize;\r
+    \r
+    /* Try to cache without caching having been initialized. This should fail.*/\r
+    Length = 10*_1KB;\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - No cache map test. Wait = FALSE",\r
+        !FsRtlPrepareMdlWriteDev(Pfo,AllocationSize,Length,0,MdlChain,&IoStatus,NULL));\r
+        \r
+    /* We are going to build a 100k file */\r
+    /* This will inititate caching and build some size */\r
+    Offset.QuadPart = 0;\r
+    Length = 100*_1KB;\r
+    Return = FsRltTest_WritefileZw(Fh,&Offset,Length, Buffer, &IoStatus);\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Building 100k filesize. Wait = FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
+    Return = TRUE;\r
+\r
+    /* Extending the file by 1/2 sector, 256 bytes. */\r
+    Offset.QuadPart = 0x7fffffffffff;\r
+    Length = 0x100;\r
+    Return = FsRltTest_WritefileZw(Fh,NULL,Length, Buffer, &IoStatus);\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Extending by 1/2 sector. Wait = FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
+    Return = TRUE;\r
+\r
+\r
+    pRelatedDo = IoGetRelatedDeviceObject(Pfo);\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Did we get related DO ?",pRelatedDo);\r
+    \r
+    \r
+    /* Append to the file past the allocation size*/\r
+    Offset.QuadPart = FileSize->QuadPart;\r
+    OldSize.QuadPart = FileSize->QuadPart;\r
+    Length = (ULONG) (AllocationSize->QuadPart -ValidDataLength->QuadPart);\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Testing extending past allocation size.",\r
+        !FsRtlPrepareMdlWriteDev(Pfo,&Offset,Length+1,0,&MdlChain,&IoStatus,pRelatedDo));\r
+        \r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Testing extending not past allocation size.",\r
+          FsRtlPrepareMdlWriteDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,pRelatedDo));\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Check filesize",(FileSize->QuadPart = (OldSize.QuadPart+Length)));\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Release the MDL.",FsRtlMdlWriteCompleteDev(Pfo,&Offset,MdlChain,pRelatedDo));\r
+        \r
+    \r
+    /* Try do write a 65kb IO and check that if fails. Maximum IO size for thus function is 64KB */\r
+    Offset.QuadPart = 0;\r
+    MdlChain = NULL;\r
+    Length = 65*_1KB;\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - 65KB IO Test.",\r
+        FsRtlPrepareMdlWriteDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,pRelatedDo));\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Release the MDL.",FsRtlMdlWriteCompleteDev(Pfo,&Offset,MdlChain,pRelatedDo));\r
+     \r
+     /* Try do write a 64kb IO. Maximum IO size for thus function is 64KB */\r
+    Length = 64*_1KB;\r
+    MdlChain = NULL;\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - 64KB IO Test.",\r
+        FsRtlPrepareMdlWriteDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,NULL))\r
+    FSRTL_TEST("FsRtlPrepareMdlWriteDev() - Release the MDL.",FsRtlMdlWriteCompleteDev(Pfo,&Offset,MdlChain,NULL));\r
+     \r
+     /* Test the fast Io not possible flag */\r
+   FcbHeader->IsFastIoPossible = FastIoIsNotPossible;\r
+   FSRTL_TEST("FsRtlPrepareMdlWriteDev() - FastIo is not possible flag.",\r
+       !FsRtlPrepareMdlWriteDev(Pfo,&Offset,Length,0,&MdlChain,&IoStatus,NULL))\r
+        \r
+    if (Pfo) \r
+    {\r
+        ObDereferenceObject(Pfo);\r
+        Pfo = NULL;\r
+    }\r
+\r
+    if (Fh)\r
+    {\r
+        ZwClose(Fh);\r
+        Fh = NULL;\r
+     }\r
+\r
+    /*  ------------------------------------------------------------------------\r
+            TESTING:\r
+                BOOLEAN\r
+                NTAPI\r
+                FsRtlPrepareMdlWrite(   IN PFILE_OBJECT FileObject,\r
+                                        IN PLARGE_INTEGER FileOffset,\r
+                                        IN ULONG Length,\r
+                                        IN ULONG LockKey,\r
+                                        OUT PMDL *MdlChain,\r
+                                        OUT PIO_STATUS_BLOCK IoStatus,\r
+                                        IN PDEVICE_OBJECT DeviceObject)\r
+\r
+        ------------------------------------------------------------------------  */\r
+\r
+    /* We are going to repeat the same bunch of tests but with Wait = FALSE. So we exercise the second part of the function. */\r
+    FsRtlTest_OpenTestFile(&Fh, &Pfo);\r
+\r
+    /* Extract the test variable from the FCB struct */\r
+    FcbHeader = (PFSRTL_COMMON_FCB_HEADER)Pfo->FsContext;\r
+    AllocationSize = &FcbHeader->AllocationSize;\r
+    ValidDataLength = &FcbHeader->ValidDataLength;\r
+    FileSize = &FcbHeader->FileSize;\r
+    \r
+    /* Try to cache without caching having been initialized. This should fail.*/\r
+    Length = 10*_1KB;\r
+    FSRTL_TEST("FsRtlPrepareMdlWrite() - No cache map test. Wait = FALSE",\r
+        !FsRtlPrepareMdlWrite(Pfo,AllocationSize,Length,0,MdlChain,&IoStatus));\r
+        \r
+    /* We are going to build a 100k file */\r
+    /* This will inititate caching and build some size */\r
+    Offset.QuadPart = 0;\r
+    Length = 100*_1KB;\r
+    Return = FsRltTest_WritefileZw(Fh,&Offset,Length, Buffer, &IoStatus);\r
+    FSRTL_TEST("FsRtlPrepareMdlWrite() - Building 100k filesize. Wait = FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
+    Return = TRUE;\r
+\r
+    /* Extending the file by 1/2 sector, 256 bytes. */\r
+    Offset.QuadPart = 0x7fffffffffff;\r
+    Length = 0x100;\r
+    Return = FsRltTest_WritefileZw(Fh,NULL,Length, Buffer, &IoStatus);\r
+    FSRTL_TEST("FsRtlPrepareMdlWrite() - Extending by 1/2 sector. Wait = FALSE",(NT_SUCCESS(Return) && NT_SUCCESS(IoStatus.Status ) && IoStatus.Information == Length));\r
+    Return = TRUE;\r
+\r
+\r
+    /* Append to the file past the allocation size*/\r
+    MdlChain = NULL;\r
+    Offset.QuadPart = FileSize->QuadPart;\r
+    OldSize.QuadPart = FileSize->QuadPart;\r
+    Length = (ULONG) (AllocationSize->QuadPart -ValidDataLength->QuadPart);\r
+    FSRTL_TEST("FsRtlPrepareMdlWrite() - Testing extending past allocation size.",\r
+        !FsRtlPrepareMdlWrite(Pfo,&Offset,Length+1,0,&MdlChain,&IoStatus));\r
+        \r
+    FSRTL_TEST("FsRtlPrepareMdlWrite() - Testing extending not past allocation size.",\r
+          FsRtlPrepareMdlWrite(Pfo,&Offset,Length,0,&MdlChain,&IoStatus));\r
+    FSRTL_TEST("FsRtlPrepareMdlWrite() - Check filesize",(FileSize->QuadPart = (OldSize.QuadPart+Length)));\r
+    FSRTL_TEST("FsRtlPrepareMdlWrite() - Release the MDL.",FsRtlMdlWriteComplete(Pfo,&Offset,MdlChain));\r
+        \r
+    \r
+    /* Try do write a 65kb IO and check that if fails. Maximum IO size for thus function is 64KB */\r
+    Offset.QuadPart = 0;\r
+    MdlChain = NULL;\r
+    Length = 65*_1KB;\r
+    FSRTL_TEST("FsRtlPrepareMdlWrite() - 65KB IO Test.",\r
+        !FsRtlPrepareMdlWrite(Pfo,&Offset,Length,0,&MdlChain,&IoStatus));\r
+    //FSRTL_TEST("FsRtlPrepareMdlWrite() - Release the MDL.",FsRtlMdlWriteComplete(Pfo,&Offset,MdlChain));\r
+     \r
+     /* Try do write a 64kb IO. Maximum IO size for thus function is 64KB */\r
+    Length = 64*_1KB;\r
+    MdlChain = NULL;\r
+    FSRTL_TEST("FsRtlPrepareMdlWrite() - 64KB IO Test.",\r
+        FsRtlPrepareMdlWrite(Pfo,&Offset,Length,0,&MdlChain,&IoStatus))\r
+    FSRTL_TEST("FsRtlPrepareMdlWrite() - Release the MDL.",FsRtlMdlWriteComplete(Pfo,&Offset,MdlChain));\r
+     \r
+     /* Test the fast Io not possible flag */\r
+   FcbHeader->IsFastIoPossible = FastIoIsNotPossible;\r
+   FSRTL_TEST("FsRtlPrepareMdlWrite() - FastIo is not possible flag.",\r
+       !FsRtlPrepareMdlWrite(Pfo,&Offset,Length,0,&MdlChain,&IoStatus))\r
+        \r
+    if (Pfo) \r
+    {\r
+        ObDereferenceObject(Pfo);\r
+        Pfo = NULL;\r
+    }\r
+\r
+    if (Fh)\r
+    {\r
+        ZwClose(Fh);\r
+        Fh = NULL;\r
+     }\r
     \r
     /*  ------------------------------------------------------------------------------------------\r
         TESTING:\r