Re: ntdll: Strengthen current tests and add new tests for asynchronous I/O.
Woops, ignore this patch. Its got a couple things wrong with it. I'll send a fix later on. -Zac Zac Brown wrote:
Strengthen current tests and add new tests for asynchronous I/O. Missing test for empty messages as well as thoroughly testing input and output of read/write commands.
-Zac Brown
------------------------------------------------------------------------
From d2a3cbaf6d71c3b0bcfa39afcf854de7e5daa5bb Mon Sep 17 00:00:00 2001 From: Zac Brown <zac(a)zacbrown.org> Date: Thu, 29 May 2008 13:34:50 -0700 Subject: [PATCH] Strengthen current tests and add new tests for asynchronous I/O.
--- dlls/ntdll/tests/file.c | 103 ++++++++++++++++++++++++++++++++++++----------- 1 files changed, 79 insertions(+), 24 deletions(-)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index d824530..e3cbf77 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -2,6 +2,7 @@ * * Copyright 2007 Jeff Latimer * Copyright 2007 Andrey Turkin + * Copyright 2008 Google (Zac Brown) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -65,6 +66,7 @@ static inline BOOL is_signaled( HANDLE obj ) }
#define PIPENAME "\\\\.\\pipe\\ntdll_tests_file.c" +#define TEST_BUF_LEN 10
static BOOL create_pipe( HANDLE *read, HANDLE *write, ULONG flags, ULONG size ) { @@ -114,7 +116,10 @@ static BOOL get_msg(HANDLE h) { LARGE_INTEGER timeout = {{-10000000*3}}; DWORD res = pNtRemoveIoCompletion( h, &completionKey, &completionValue, &ioSb, &timeout); - ok( res == STATUS_SUCCESS, "NtRemoveIoCompletion failed: %x\n", res ); + if (res == STATUS_TIMEOUT) + ok( res == STATUS_TIMEOUT, "NtRemoveIoCompletion should have timed out, got: %x\n", res ); + else + ok( res == STATUS_SUCCESS, "NtRemoveIoCompletion failed: %x\n", res ); if (res != STATUS_SUCCESS) { completionKey = completionValue = 0; @@ -507,6 +512,7 @@ static void test_iocp_fileio(HANDLE h) FILE_COMPLETION_INFORMATION fci = {h, CKEY_SECOND}; HANDLE hPipeSrv, hPipeClt; NTSTATUS res; + BOOL rw_res;
hPipeSrv = CreateNamedPipeA( pipe_name, PIPE_ACCESS_INBOUND, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 4, 1024, 1024, 1000, NULL ); ok( hPipeSrv != INVALID_HANDLE_VALUE, "Cannot create named pipe\n" ); @@ -533,49 +539,97 @@ static void test_iocp_fileio(HANDLE h) if (hPipeClt != INVALID_HANDLE_VALUE) { OVERLAPPED o = {0,}; - BYTE buf[3]; + BYTE buf_send[TEST_BUF_LEN]; + BYTE buf_rcv[TEST_BUF_LEN]; DWORD read; long count; + unsigned int i;
NTSTATUS res = pNtSetInformationFile( hPipeSrv, &iosb, &fci, sizeof(fci), FileCompletionInformation ); ok( res == STATUS_SUCCESS, "NtSetInformationFile failed: %x\n", res ); ok( U(iosb).Status == STATUS_SUCCESS, "iosb.Status invalid: %x\n", U(iosb).Status );
- count = get_pending_msgs(h); - ok( !count, "Unexpected msg count: %ld\n", count ); - ReadFile( hPipeSrv, buf, 3, &read, &o); - count = get_pending_msgs(h); - ok( !count, "Unexpected msg count: %ld\n", count ); - WriteFile( hPipeClt, buf, 3, &read, NULL ); - - if (get_msg(h)) + /* Try messages of differing lengths and values, checking that they match. */ + for( i = 1; i < 10; i++ ) { - ok( completionKey == CKEY_SECOND, "Invalid completion key: %lx\n", completionKey ); - ok( ioSb.Information == 3, "Invalid ioSb.Information: %ld\n", ioSb.Information ); - ok( U(ioSb).Status == STATUS_SUCCESS, "Invalid ioSb.Status: %x\n", U(ioSb).Status); - ok( completionValue == (ULONG_PTR)&o, "Invalid completion value: %lx\n", completionValue ); + memset( buf_send, 0, TEST_BUF_LEN ); + memset( buf_rcv, 0, TEST_BUF_LEN ); + memset( buf_send, i, i ); + + /* Try reading before writing */ + count = get_pending_msgs(h); + ok( !count, "Unexpected msg count: %ld\n", count ); + rw_res = ReadFile( hPipeSrv, buf_rcv, i, &read, &o ); + ok( rw_res == FALSE, "Unexpected success of ReadFile\n" ); + ok( GetLastError() == ERROR_IO_PENDING, "Expected error of ERROR_IO_PENDING, got %d\n", GetLastError() ); + count = get_pending_msgs(h); + ok( !count, "Unexpected msg count: %ld\n", count ); + rw_res = WriteFile( hPipeClt, buf_send, i, &read, NULL ); + ok( rw_res == TRUE, "Unexpected fail of WriteFile\n" ); + if (get_msg(h)) + { + ok( completionKey == CKEY_SECOND, "Invalid completion key: %lx\n", completionKey ); + ok( ioSb.Information == i, "Invalid ioSb.Information: %ld\n", ioSb.Information ); + ok( U(ioSb).Status == STATUS_SUCCESS, "Invalid ioSb.Status: %x\n", U(ioSb).Status); + ok( completionValue == (ULONG_PTR)&o, "Invalid completion value: %lx\n", completionValue ); + ok( !memcmp( buf_send, buf_rcv, TEST_BUF_LEN ), "Receive buffer (%x %x %x) did not match send buffer (%x %x %x)\n", + buf_rcv[0], buf_rcv[1], buf_rcv[2], buf_send[0], buf_send[1], buf_send[2] ); + } + count = get_pending_msgs(h); + ok( !count, "Unexpected msg count: %ld\n", count ); + + /* Try writing before reading */ + rw_res = WriteFile( hPipeClt, buf_send, i, &read, NULL ); + ok( rw_res == TRUE, "Unexpected fail of WriteFile\n" ); + count = get_pending_msgs(h); + ok( !count, "Unexpected msg count: %ld\n", count ); + rw_res = ReadFile( hPipeSrv, buf_rcv, i, &read, &o ); + ok( rw_res == TRUE, "Unexpected fail of ReadFile\n" ); + if (get_msg(h)) + { + ok( completionKey == CKEY_SECOND, "Invalid completion key: %lx\n", completionKey ); + ok( ioSb.Information == i, "Invalid ioSb.Information: %ld\n", ioSb.Information ); + ok( U(ioSb).Status == STATUS_SUCCESS, "Invalid ioSb.Status: %x\n", U(ioSb).Status); + ok( completionValue == (ULONG_PTR)&o, "Invalid completion value: %lx\n", completionValue ); + ok( !memcmp( buf_send, buf_rcv, TEST_BUF_LEN ), "Receive buffer (%x %x %x) did not match send buffer (%x %x %x)\n", + buf_rcv[0], buf_rcv[1], buf_rcv[2], buf_send[0], buf_send[1], buf_send[2] ); + } + count = get_pending_msgs(h); + ok( !count, "Unexpected msg count: %ld\n", count ); } - count = get_pending_msgs(h); - ok( !count, "Unexpected msg count: %ld\n", count );
- WriteFile( hPipeClt, buf, 2, &read, NULL ); + /* Try sending a message of length zero. */ count = get_pending_msgs(h); ok( !count, "Unexpected msg count: %ld\n", count ); - ReadFile( hPipeSrv, buf, 2, &read, &o); + rw_res = WriteFile( hPipeClt, buf_send, 0, &read, NULL ); + ok( rw_res == TRUE, "Unexpected fail of WriteFile\n" ); count = get_pending_msgs(h); - ok( count == 1, "Unexpected msg count: %ld\n", count ); + ok( !count, "Unexpected msg count: %ld\n", count ); + rw_res = ReadFile( hPipeSrv, buf_rcv, TEST_BUF_LEN, &read, &o ); + /* This passes on XP but not in wine. */ + todo_wine ok( rw_res == TRUE, "Unexpected fail of ReadFile\n" ); if (get_msg(h)) { ok( completionKey == CKEY_SECOND, "Invalid completion key: %lx\n", completionKey ); - ok( ioSb.Information == 2, "Invalid ioSb.Information: %ld\n", ioSb.Information ); + ok( ioSb.Information == 0, "Invalid ioSb.Information: %ld\n", ioSb.Information ); ok( U(ioSb).Status == STATUS_SUCCESS, "Invalid ioSb.Status: %x\n", U(ioSb).Status); ok( completionValue == (ULONG_PTR)&o, "Invalid completion value: %lx\n", completionValue ); } + count = get_pending_msgs(h); + ok( !count, "Unexpected msg count: %ld\n", count );
- ReadFile( hPipeSrv, buf, sizeof(buf), &read, &o); - CloseHandle( hPipeSrv ); + rw_res = ReadFile( hPipeSrv, buf_rcv, TEST_BUF_LEN, &read, &o); + ok( rw_res == FALSE, "Unexpected success of ReadFile\n" ); + ok( GetLastError() == ERROR_IO_PENDING, "Expected error of ERROR_IO_PENDING, got %d\n", GetLastError() ); + rw_res = CloseHandle( hPipeSrv ); + ok( rw_res == TRUE, "Unexpected fail of CloseHandle\n" ); count = get_pending_msgs(h); - ok( count == 1, "Unexpected msg count: %ld\n", count ); + /* + * Wine reports 1 extra message. This is probably due to the server + * reporting that a message is in the queue from sending an empty message above. + * The offending code is suspected to be in ntdll/file.c in the NtReadFile function. + */ + todo_wine ok( count == 1, "Unexpected msg count: %ld\n", count ); if (get_msg(h)) { ok( completionKey == CKEY_SECOND, "Invalid completion key: %lx\n", completionKey ); @@ -586,7 +640,8 @@ static void test_iocp_fileio(HANDLE h) } }
- CloseHandle( hPipeClt ); + rw_res = CloseHandle( hPipeClt ); + ok( rw_res == TRUE, "Unexpected fail of CloseHandle\n" ); }
static void test_iocompletion(void)
------------------------------------------------------------------------
participants (1)
-
Zac Brown