Author: akhaldi Date: Sun Jul 3 11:33:21 2016 New Revision: 71780
URL: http://svn.reactos.org/svn/reactos?rev=71780&view=rev Log: [MSVCRT_WINETEST] Sync with Wine Staging 1.9.11. CORE-11368
Modified: trunk/rostests/winetests/msvcrt/cpp.c trunk/rostests/winetests/msvcrt/file.c trunk/rostests/winetests/msvcrt/heap.c trunk/rostests/winetests/msvcrt/misc.c trunk/rostests/winetests/msvcrt/string.c
Modified: trunk/rostests/winetests/msvcrt/cpp.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msvcrt/cpp.c?rev... ============================================================================== --- trunk/rostests/winetests/msvcrt/cpp.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msvcrt/cpp.c [iso-8859-1] Sun Jul 3 11:33:21 2016 @@ -1109,10 +1109,8 @@ for (i = 0; i < num_test; i++) { name = p__unDName(0, demangle[i].mangled, 0, pmalloc, pfree, 0x2800); - if (demangle[i].test_in_wine) - ok(name != NULL && !strcmp(name,demangle[i].result), "Got name "%s" for %d\n", name, i); - else - todo_wine ok(name != NULL && !strcmp(name,demangle[i].result), "Got name %s for %d\n", name, i); + todo_wine_if (!demangle[i].test_in_wine) + ok(name != NULL && !strcmp(name,demangle[i].result), "Got name "%s" for %d\n", name, i); if(name) pfree(name); }
Modified: trunk/rostests/winetests/msvcrt/file.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msvcrt/file.c?re... ============================================================================== --- trunk/rostests/winetests/msvcrt/file.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msvcrt/file.c [iso-8859-1] Sun Jul 3 11:33:21 2016 @@ -1350,55 +1350,6 @@ "Wrong write result in child process on %d (%s)\n", fd, strerror(errno)); }
-static void test_file_refcount_child(void) -{ - static const char buffer1[] = "test1"; - static const char buffer2[] = "test2"; - static const char buffer3[] = "test3"; - static const char buffer4[] = "test4"; - HANDLE f0, f1, f2, h0, h1, h2; - DWORD written, flags, ret; - - f0 = (HANDLE)_get_osfhandle(STDIN_FILENO); - f1 = (HANDLE)_get_osfhandle(STDOUT_FILENO); - f2 = (HANDLE)_get_osfhandle(STDERR_FILENO); - ok(f0 == f1, "expected same handles, got %p, %p\n", f0, f1); - ok(f1 == f2, "expected same handles, got %p, %p\n", f1, f2); - - h0 = GetStdHandle(STD_INPUT_HANDLE); - h1 = GetStdHandle(STD_OUTPUT_HANDLE); - h2 = GetStdHandle(STD_ERROR_HANDLE); - ok(h0 == h1, "expected same handles, got %p, %p\n", h0, h1); - ok(h1 == h2, "expected same handles, got %p, %p\n", h1, h2); - ok(f0 == h0, "expected same handles, got %p, %p\n", f0, h0); - - ret = GetHandleInformation(h1, &flags); - ok(ret, "GetHandleInformation failed\n"); - ret = WriteFile(h1, buffer1, strlen(buffer1), &written, 0); - ok(ret, "WriteFile failed\n"); - - ret = fclose(stdout); - ok(ret == 0, "fclose failed\n"); - ret = GetHandleInformation(h1, &flags); - ok(ret, "GetHandleInformation failed\n"); - ret = WriteFile(h1, buffer2, strlen(buffer2), &written, 0); - ok(ret, "WriteFile failed\n"); - - ret = fclose(stdout); - ok(ret != 0, "fclose should fail\n"); - ret = GetHandleInformation(h1, &flags); - ok(ret, "GetHandleInformation failed\n"); - ret = WriteFile(h1, buffer3, strlen(buffer3), &written, 0); - ok(ret, "WriteFile failed\n"); - - ret = fclose(stderr); - ok(ret == 0, "fclose failed\n"); - ret = GetHandleInformation(h1, &flags); - ok(!ret, "GetHandleInformation should fail\n"); - ret = WriteFile(h1, buffer4, strlen(buffer4), &written, 0); - ok(!ret, "WriteFile should fail\n"); -} - static void create_io_inherit_block( STARTUPINFOA *startup, unsigned int count, const HANDLE *handles ) { static BYTE block[1024]; @@ -1470,36 +1421,6 @@
CloseHandle( hErrorFile ); DeleteFileA( "fdopen.err" ); -} - -static void test_file_refcount( STARTUPINFOA *startup, char *cmdline, const char *descr ) -{ - const char *data; - HANDLE hMixFile; - SECURITY_ATTRIBUTES sa; - PROCESS_INFORMATION proc; - - /* make file handle inheritable */ - sa.nLength = sizeof(sa); - sa.lpSecurityDescriptor = NULL; - sa.bInheritHandle = TRUE; - - hMixFile = CreateFileA( "fdopen.mix", GENERIC_READ|GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, CREATE_ALWAYS, 0, NULL ); - startup->dwFlags = STARTF_USESTDHANDLES; - startup->hStdInput = hMixFile; - startup->hStdOutput = hMixFile; - startup->hStdError = hMixFile; - - CreateProcessA( NULL, cmdline, NULL, NULL, TRUE, - CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS, NULL, NULL, startup, &proc ); - winetest_wait_child_process( proc.hProcess ); - - data = read_file( hMixFile ); - ok( !strcmp( data, "test1test2test3" ), "%s: Wrong error data (%s)\n", descr, data ); - - CloseHandle( hMixFile ); - DeleteFileA( "fdopen.mix" ); }
static void test_file_inherit( const char* selfname ) @@ -1595,12 +1516,6 @@ test_stdout_handle( &startup, cmdline, handles[1], TRUE, "large size block" ); CloseHandle( handles[1] ); DeleteFileA("fdopen.tst"); - - /* test refcount of handles */ - create_io_inherit_block( &startup, 0, NULL ); - sprintf(cmdline, "%s file refcount", selfname); - test_file_refcount( &startup, cmdline, "file refcount" ); - DeleteFileA("fdopen.tst"); }
static void test_tmpnam( void ) @@ -2347,8 +2262,8 @@ fpos_t pos, pos2;
fd = fileno(file); - inbuffer = calloc(bufsize + 1, 1); - outbuffer = calloc(bufsize + 1, 1); + inbuffer = calloc(1, bufsize + 1); + outbuffer = calloc(1, bufsize + 1); _snprintf(outbuffer, bufsize + 1, "0,1,2,3,4,5,6,7,8,9");
for (size = bufsize + 1; size >= bufsize - 1; size--) { @@ -2412,6 +2327,65 @@ 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); + ret1 = close(fd1); + ok(!ret1, "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; @@ -2430,8 +2404,6 @@ test_file_inherit_child_no(arg_v[3]); else if (strcmp(arg_v[2], "pipes") == 0) test_pipes_child(arg_c, arg_v); - else if (strcmp(arg_v[2], "refcount") == 0) - test_file_refcount_child(); else ok(0, "invalid argument '%s'\n", arg_v[2]); return; @@ -2480,6 +2452,7 @@ 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
Modified: trunk/rostests/winetests/msvcrt/heap.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msvcrt/heap.c?re... ============================================================================== --- trunk/rostests/winetests/msvcrt/heap.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msvcrt/heap.c [iso-8859-1] Sun Jul 3 11:33:21 2016 @@ -456,6 +456,29 @@ free(mem); }
+static void test_calloc(void) +{ + void *ptr; + + ptr = calloc(1, 0); + ok(ptr != NULL, "got %p\n", ptr); + free(ptr); + + ptr = calloc(0, 0); + ok(ptr != NULL, "got %p\n", ptr); + free(ptr); + + ptr = calloc(0, 1); + ok(ptr != NULL, "got %p\n", ptr); + free(ptr); + + errno = 0; + ptr = calloc(~(size_t)0 / 2, ~(size_t)0 / 2); + ok(ptr == NULL || broken(ptr != NULL) /* winxp sp0 */, "got %p\n", ptr); + ok(errno == ENOMEM || broken(errno == 0) /* winxp, win2k3 */, "got errno %d\n", errno); + free(ptr); +} + START_TEST(heap) { void *mem; @@ -480,4 +503,5 @@
test_aligned(); test_sbheap(); -} + test_calloc(); +}
Modified: trunk/rostests/winetests/msvcrt/misc.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msvcrt/misc.c?re... ============================================================================== --- trunk/rostests/winetests/msvcrt/misc.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msvcrt/misc.c [iso-8859-1] Sun Jul 3 11:33:21 2016 @@ -180,13 +180,9 @@ ok(!strcmp(out.str, I10_OUTPUT_tests[i].out.str), "%d: out.str = %s\n", i, out.str);
j = strlen(I10_OUTPUT_tests[i].remain); - if(j && I10_OUTPUT_tests[i].remain[j-1]=='9') - todo_wine ok(!strncmp(out.str+out.len+1, I10_OUTPUT_tests[i].remain, j), - "%d: &out.str[%d] = %.25s...\n", i, out.len+1, out.str+out.len+1); - else + todo_wine_if(j && I10_OUTPUT_tests[i].remain[j-1]=='9') ok(!strncmp(out.str+out.len+1, I10_OUTPUT_tests[i].remain, j), "%d: &out.str[%d] = %.25s...\n", i, out.len+1, out.str+out.len+1); -
for(j=out.len+strlen(I10_OUTPUT_tests[i].remain)+1; j<sizeof(out.str); j++) if(out.str[j] != '#')
Modified: trunk/rostests/winetests/msvcrt/string.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msvcrt/string.c?... ============================================================================== --- trunk/rostests/winetests/msvcrt/string.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msvcrt/string.c [iso-8859-1] Sun Jul 3 11:33:21 2016 @@ -74,6 +74,7 @@ static int (__cdecl *pwcstombs_s)(size_t*,char*,size_t,const wchar_t*,size_t); static int (__cdecl *pmbstowcs_s)(size_t*,wchar_t*,size_t,const char*,size_t); static size_t (__cdecl *p_mbsrtowcs)(wchar_t*, const char**, size_t, mbstate_t*); +static int (__cdecl *p_mbsrtowcs_s)(size_t*,wchar_t*,size_t,const char**,size_t,mbstate_t*); static size_t (__cdecl *pwcsrtombs)(char*, const wchar_t**, size_t, int*); static errno_t (__cdecl *p_gcvt_s)(char*,size_t,double,int); static errno_t (__cdecl *p_itoa_s)(int,char*,size_t,int); @@ -1947,6 +1948,11 @@ }
pmbstr = mHiragana; + ret = p_mbsrtowcs(NULL, &pmbstr, 6, NULL); + ok(ret == 2, "mbsrtowcs did not return 2\n"); + ok(pmbstr == mHiragana, "pmbstr = %p, expected %p\n", pmbstr, mHiragana); + + pmbstr = mHiragana; ret = p_mbsrtowcs(wOut, &pmbstr, 6, NULL); ok(ret == 2, "mbsrtowcs did not return 2\n"); ok(!memcmp(wOut, wHiragana, sizeof(wHiragana)), "wOut = %s\n", wine_dbgstr_w(wOut)); @@ -1965,6 +1971,54 @@ ret = p_mbsrtowcs(wOut, NULL, 6, &state); ok(ret == -1, "mbsrtowcs did not return -1\n"); ok(errno == EINVAL, "Expected errno to be EINVAL, got %d\n", errno); + + if(!p_mbsrtowcs_s) { + setlocale(LC_ALL, "C"); + win_skip("mbsrtowcs_s not available\n"); + return; + } + + pmbstr = mHiragana; + err = p_mbsrtowcs_s(&ret, NULL, 0, NULL, 6, NULL); + ok(ret == -1, "mbsrtowcs_s did not return -1\n"); + ok(err == EINVAL, "err = %d\n", err); + err = p_mbsrtowcs_s(&ret, NULL, 1, &pmbstr, 6, NULL); + ok(ret == -1, "mbsrtowcs_s did not return -1\n"); + ok(err == EINVAL, "err = %d\n", err); + err = p_mbsrtowcs_s(&ret, wOut, 0, &pmbstr, 6, NULL); + ok(ret == -1, "mbsrtowcs_s did not return -1\n"); + ok(err == EINVAL, "err = %d\n", err); + + pmbstr = mHiragana; + errno = 0; + err = p_mbsrtowcs_s(&ret, NULL, 0, &pmbstr, 6, NULL); + ok(ret == 3, "mbsrtowcs_s did not return 3\n"); + ok(err == 0, "err = %d\n", err); + ok(pmbstr == mHiragana, "pmbstr = %p, expected %p\n", pmbstr, mHiragana); + ok(errno == 0, "errno = %d\n", errno); + + pmbstr = mHiragana; + err = p_mbsrtowcs_s(&ret, wOut, 1, &pmbstr, 6, NULL); + ok(ret == 2, "mbsrtowcs_s did not return 2\n"); + ok(err == 0, "err = %d\n", err); + ok(!wOut[0], "wOut[0] = '%c'\n", wOut[0]); + ok(pmbstr == mHiragana+2, "pmbstr = %p, expected %p\n", pmbstr, mHiragana+2); + ok(errno == 0, "errno = %d\n", errno); + + pmbstr = mHiragana; + err = p_mbsrtowcs_s(&ret, wOut, 2, &pmbstr, 6, NULL); + ok(ret == 3, "mbsrtowcs_s did not return 3\n"); + ok(err == 0, "err = %d\n", err); + ok(!wOut[0], "wOut[0] = '%c'\n", wOut[0]); + ok(pmbstr == mHiragana+4, "pmbstr = %p, expected %p\n", pmbstr, mHiragana+4); + ok(errno == 0, "errno = %d\n", errno); + + pmbstr = mHiragana; + err = p_mbsrtowcs_s(&ret, wOut, 3, &pmbstr, 6, NULL); + ok(ret == 3, "mbsrtowcs_s did not return 3\n"); + ok(err == 0, "err = %d\n", err); + ok(!pmbstr, "pmbstr != NULL\n"); + ok(errno == 0, "errno = %d\n", errno);
setlocale(LC_ALL, "C"); } @@ -3106,6 +3160,7 @@ p_mbrlen = (void*)GetProcAddress(hMsvcrt, "mbrlen"); p_mbrtowc = (void*)GetProcAddress(hMsvcrt, "mbrtowc"); p_mbsrtowcs = (void*)GetProcAddress(hMsvcrt, "mbsrtowcs"); + p_mbsrtowcs_s = (void*)GetProcAddress(hMsvcrt, "mbsrtowcs_s"); p__atodbl_l = (void*)GetProcAddress(hMsvcrt, "_atodbl_l"); p__atof_l = (void*)GetProcAddress(hMsvcrt, "_atof_l"); p__strtod_l = (void*)GetProcAddress(hMsvcrt, "_strtod_l");