Module: wine Branch: master Commit: 96d476584e771bb352c8b8a84ff51f67a63f0d1e URL: http://source.winehq.org/git/wine.git/?a=commit;h=96d476584e771bb352c8b8a84f...
Author: Piotr Caban piotr@codeweavers.com Date: Fri Feb 19 18:43:31 2016 +0100
msvcrt/tests: Add close tests on file descriptors that use the same HANDLE.
Based on Qian Hong patch.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/msvcrt/tests/file.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+)
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index ba8c3e3..dbb6cef 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -2327,6 +2327,64 @@ static void test_write_flush(void) free(tempf); }
+static void test_close(void) +{ + ioinfo *stdout_info, stdout_copy, *stderr_info, stderr_copy; + int fd1, fd2, ret1, ret2, ret3, ret4; + DWORD flags; + HANDLE h; + + /* test close on fds that use the same handle */ + h = CreateFileA("fdopen.tst", GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL); + ok(h != INVALID_HANDLE_VALUE, "error opening fdopen.tst file\n"); + + fd1 = _open_osfhandle((intptr_t)h, 0); + ok(fd1 != -1, "_open_osfhandle failed (%d)\n", errno); + fd2 = _open_osfhandle((intptr_t)h, 0); + ok(fd2 != -1, "_open_osfhandle failed (%d)\n", errno); + ok(fd1 != fd2, "fd1 == fd2\n"); + + ok((HANDLE)_get_osfhandle(fd1) == h, "handles mismatch (%p != %p)\n", + (HANDLE)_get_osfhandle(fd1), h); + ok((HANDLE)_get_osfhandle(fd2) == h, "handles mismatch (%p != %p)\n", + (HANDLE)_get_osfhandle(fd2), h); + ok(!close(fd1), "close(fd1) failed (%d)\n", errno); + ok(!GetHandleInformation(h, &flags), "GetHandleInformation succeeded\n"); + ok(close(fd2), "close(fd2) succeeded\n"); + + /* test close on stdout and stderr that use the same handle */ + h = CreateFileA("fdopen.tst", GENERIC_READ|GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL); + ok(h != INVALID_HANDLE_VALUE, "error opening fdopen.tst file\n"); + + /* tests output will not be visible from now on */ + stdout_info = &__pioinfo[STDOUT_FILENO/MSVCRT_FD_BLOCK_SIZE][STDOUT_FILENO%MSVCRT_FD_BLOCK_SIZE]; + stderr_info = &__pioinfo[STDERR_FILENO/MSVCRT_FD_BLOCK_SIZE][STDERR_FILENO%MSVCRT_FD_BLOCK_SIZE]; + stdout_copy = *stdout_info; + stderr_copy = *stderr_info; + stdout_info->handle = h; + stderr_info->handle = h; + + ret1 = close(STDOUT_FILENO); + ret2 = GetHandleInformation(h, &flags); + ret3 = close(STDERR_FILENO); + ret4 = GetHandleInformation(h, &flags); + + *stdout_info = stdout_copy; + *stderr_info = stderr_copy; + SetStdHandle(STD_OUTPUT_HANDLE, stdout_info->handle); + SetStdHandle(STD_ERROR_HANDLE, stderr_info->handle); + /* stdout and stderr restored */ + + ok(!ret1, "close(STDOUT_FILENO) failed\n"); + ok(ret2, "GetHandleInformation failed\n"); + ok(!ret3, "close(STDERR_FILENO) failed\n"); + ok(!ret4, "GetHandleInformation succeeded\n"); + + DeleteFileA( "fdopen.tst" ); +} + START_TEST(file) { int arg_c; @@ -2393,6 +2451,7 @@ START_TEST(file) test_mktemp(); test__open_osfhandle(); test_write_flush(); + test_close();
/* Wait for the (_P_NOWAIT) spawned processes to finish to make sure the report * file contains lines in the correct order