diff --git a/build/VStudio/testing/winfsp-tests.vcxproj b/build/VStudio/testing/winfsp-tests.vcxproj index 9251d9ae..15a0daa8 100644 --- a/build/VStudio/testing/winfsp-tests.vcxproj +++ b/build/VStudio/testing/winfsp-tests.vcxproj @@ -176,6 +176,8 @@ TurnOffAllWarnings TurnOffAllWarnings + + diff --git a/build/VStudio/testing/winfsp-tests.vcxproj.filters b/build/VStudio/testing/winfsp-tests.vcxproj.filters index 4bd992f1..b70b6055 100644 --- a/build/VStudio/testing/winfsp-tests.vcxproj.filters +++ b/build/VStudio/testing/winfsp-tests.vcxproj.filters @@ -28,6 +28,12 @@ Source + + Source + + + Source + diff --git a/tst/winfsp-tests/create-test.c b/tst/winfsp-tests/create-test.c new file mode 100644 index 00000000..356b97c4 --- /dev/null +++ b/tst/winfsp-tests/create-test.c @@ -0,0 +1,29 @@ +#include +#include +#include "memfs.h" + +void *memfs_start(ULONG Flags); +void memfs_stop(void *data); + +extern int WinFspDiskTests; +extern int WinFspNetTests; + +void create_dotest(ULONG Flags) +{ + void *memfs = memfs_start(Flags); + + memfs_stop(memfs); +} + +void create_test(void) +{ + if (WinFspDiskTests) + create_dotest(MemfsDisk); + if (WinFspNetTests) + create_dotest(MemfsNet); +} + +void create_tests(void) +{ + TEST(create_test); +} diff --git a/tst/winfsp-tests/memfs-test.c b/tst/winfsp-tests/memfs-test.c new file mode 100644 index 00000000..74d662c1 --- /dev/null +++ b/tst/winfsp-tests/memfs-test.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include "memfs.h" + +extern int WinFspDiskTests; +extern int WinFspNetTests; + +struct memfs_data +{ + MEMFS *Memfs; + HANDLE Thread; +}; + +static unsigned __stdcall memfs_thread(void *Memfs0) +{ + MEMFS *Memfs = Memfs0; + return FspFileSystemLoop(MemfsFileSystem(Memfs)); +} + +void *memfs_start(ULONG Flags) +{ + struct memfs_data *data; + MEMFS *Memfs; + HANDLE Thread; + NTSTATUS Result; + + data = malloc(sizeof *data); + ASSERT(0 != data); + + Result = MemfsCreate(Flags, 1000, 65500, &Memfs); + ASSERT(NT_SUCCESS(Result)); + ASSERT(0 != Memfs); + + Thread = (HANDLE)_beginthreadex(0, 0, memfs_thread, Memfs, 0, 0); + ASSERT(0 != Thread); + + data->Memfs = Memfs; + data->Thread = Thread; + + return data; +} + +void memfs_stop(void *data) +{ + MEMFS *Memfs = ((struct memfs_data *)data)->Memfs; + HANDLE Thread = ((struct memfs_data *)data)->Thread; + DWORD ExitCode; + + FspFileSystemSetDispatcherResult(MemfsFileSystem(Memfs), STATUS_CANCELLED); + + WaitForSingleObject(Thread, INFINITE); + GetExitCodeThread(Thread, &ExitCode); + CloseHandle(Thread); + + ASSERT(STATUS_CANCELLED == ExitCode); + + MemfsDelete(Memfs); +} + +void memfs_dotest(ULONG Flags) +{ + void *memfs = memfs_start(Flags); + + memfs_stop(memfs); +} + +void memfs_test(void) +{ + if (WinFspDiskTests) + memfs_dotest(MemfsDisk); + if (WinFspNetTests) + memfs_dotest(MemfsNet); +} + +void memfs_tests(void) +{ + TEST(memfs_test); +} diff --git a/tst/winfsp-tests/memfs.cpp b/tst/winfsp-tests/memfs.cpp index a05b35e4..0a9c0772 100644 --- a/tst/winfsp-tests/memfs.cpp +++ b/tst/winfsp-tests/memfs.cpp @@ -419,3 +419,8 @@ VOID MemfsDelete(MEMFS *Memfs) free(Memfs); } + +FSP_FILE_SYSTEM *MemfsFileSystem(MEMFS *Memfs) +{ + return Memfs->FileSystem; +} diff --git a/tst/winfsp-tests/memfs.h b/tst/winfsp-tests/memfs.h index 87ac6323..08d3c451 100644 --- a/tst/winfsp-tests/memfs.h +++ b/tst/winfsp-tests/memfs.h @@ -26,6 +26,7 @@ enum NTSTATUS MemfsCreate(ULONG Flags, ULONG MaxFileNodes, ULONG MaxFileSize, MEMFS **PMemfs); VOID MemfsDelete(MEMFS *Memfs); +FSP_FILE_SYSTEM *MemfsFileSystem(MEMFS *Memfs); #ifdef __cplusplus } diff --git a/tst/winfsp-tests/winfsp-tests.c b/tst/winfsp-tests/winfsp-tests.c index cde6c340..1c74147a 100644 --- a/tst/winfsp-tests/winfsp-tests.c +++ b/tst/winfsp-tests/winfsp-tests.c @@ -8,6 +8,8 @@ int main(int argc, char *argv[]) TESTSUITE(path_tests); TESTSUITE(mount_tests); TESTSUITE(timeout_tests); + TESTSUITE(memfs_tests); + TESTSUITE(create_tests); tlib_run_tests(argc, argv); return 0;