[PATCH v2 2/5] ntdll/tests: Test ReadFile() completion status with FILE_SKIP_COMPLETION_PORT_ON_SUCCESS.
Paul Gofman
gofmanp at gmail.com
Wed Feb 20 11:33:54 CST 2019
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
v2:
- no changes.
dlls/ntdll/tests/file.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index e210a6e280..1c1143fdab 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -3403,6 +3403,7 @@ static void _test_completion_flags(unsigned line, HANDLE handle, DWORD expected_
static void test_file_completion_information(void)
{
+ DECLSPEC_ALIGN(TEST_OVERLAPPED_READ_SIZE) static unsigned char aligned_buf[TEST_OVERLAPPED_READ_SIZE];
static const char buf[] = "testdata";
FILE_IO_COMPLETION_NOTIFICATION_INFORMATION info;
OVERLAPPED ov, *pov;
@@ -3546,6 +3547,40 @@ static void test_file_completion_information(void)
else
win_skip("WriteFile never returned TRUE\n");
+ CloseHandle(port);
+ CloseHandle(h);
+
+ if (!(h = create_temp_file(FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING)))
+ return;
+
+ port = CreateIoCompletionPort(h, NULL, 0xdeadbeef, 0);
+ ok(port != NULL, "CreateIoCompletionPort failed, error %u.\n", GetLastError());
+
+ info.Flags = FILE_SKIP_COMPLETION_PORT_ON_SUCCESS;
+ status = pNtSetInformationFile(h, &io, &info, sizeof(info), FileIoCompletionNotificationInformation);
+ ok(status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %#x.\n", status);
+ test_completion_flags(h, FILE_SKIP_COMPLETION_PORT_ON_SUCCESS);
+
+ ret = WriteFile(h, aligned_buf, sizeof(aligned_buf), &num_bytes, &ov);
+ if (!ret && GetLastError() == ERROR_IO_PENDING)
+ {
+ ret = GetOverlappedResult(h, &ov, &num_bytes, TRUE);
+ ok(ret, "GetOverlappedResult failed, error %u.\n", GetLastError());
+ ok(num_bytes == sizeof(aligned_buf), "expected sizeof(aligned_buf), got %u.\n", num_bytes);
+ ret = GetQueuedCompletionStatus(port, &num_bytes, &key, &pov, 1000);
+ ok(ret, "GetQueuedCompletionStatus failed, error %u.\n", GetLastError());
+ }
+ ok(num_bytes == sizeof(aligned_buf), "expected sizeof(buf), got %u.\n", num_bytes);
+
+ SetLastError(0xdeadbeef);
+ ret = ReadFile(h, aligned_buf, sizeof(aligned_buf), &num_bytes, &ov);
+ ok(!ret && GetLastError() == ERROR_IO_PENDING, "Unexpected result, ret %#x, error %u.\n",
+ ret, GetLastError());
+ ret = GetOverlappedResult(h, &ov, &num_bytes, TRUE);
+ ok(ret, "GetOverlappedResult failed, error %u.\n", GetLastError());
+ ret = GetQueuedCompletionStatus(port, &num_bytes, &key, &pov, 1000);
+ todo_wine ok(ret, "GetQueuedCompletionStatus failed, error %u.\n", GetLastError());
+
CloseHandle(ov.hEvent);
CloseHandle(port);
CloseHandle(h);
--
2.20.1
More information about the wine-devel
mailing list