diff --git a/dlls/msvcp110/tests/msvcp110.c b/dlls/msvcp110/tests/msvcp110.c index 36e929f11ff..550246a7f23 100644 --- a/dlls/msvcp110/tests/msvcp110.c +++ b/dlls/msvcp110/tests/msvcp110.c @@ -33,7 +33,9 @@ typedef unsigned char MSVCP_bool; static int (__cdecl *p_tr2_sys__Make_dir)(char const*); static MSVCP_bool (__cdecl *p_tr2_sys__Remove_dir)(char const*); static __int64 (__cdecl *p_tr2_sys__Last_write_time)(char const*); +static __int64 (__cdecl *p_tr2_sys__Last_write_time_wchar)(WCHAR const*); static void (__cdecl *p_tr2_sys__Last_write_time_set)(char const*, __int64); +static void (__cdecl *p_tr2_sys__Last_write_time_set_wchar)(WCHAR const*, __int64); static HMODULE msvcp; #define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y) @@ -54,8 +56,12 @@ static BOOL init(void) "?_Remove_dir@sys@tr2@std@@YA_NPEBD@Z"); SET(p_tr2_sys__Last_write_time, "?_Last_write_time@sys@tr2@std@@YA_JPEBD@Z"); + SET(p_tr2_sys__Last_write_time_wchar, + "?_Last_write_time@sys@tr2@std@@YA_JPEB_W@Z"); SET(p_tr2_sys__Last_write_time_set, "?_Last_write_time@sys@tr2@std@@YAXPEBD_J@Z"); + SET(p_tr2_sys__Last_write_time_set_wchar, + "?_Last_write_time@sys@tr2@std@@YAXPEB_W_J@Z"); } else { SET(p_tr2_sys__Make_dir, "?_Make_dir@sys@tr2@std@@YAHPBD@Z"); @@ -63,8 +69,12 @@ static BOOL init(void) "?_Remove_dir@sys@tr2@std@@YA_NPBD@Z"); SET(p_tr2_sys__Last_write_time, "?_Last_write_time@sys@tr2@std@@YA_JPBD@Z"); + SET(p_tr2_sys__Last_write_time_wchar, + "?_Last_write_time@sys@tr2@std@@YA_JPB_W@Z"); SET(p_tr2_sys__Last_write_time_set, "?_Last_write_time@sys@tr2@std@@YAXPBD_J@Z"); + SET(p_tr2_sys__Last_write_time_set_wchar, + "?_Last_write_time@sys@tr2@std@@YAXPB_W_J@Z"); } return TRUE; } @@ -74,6 +84,8 @@ static void test_tr2_sys__Last_write_time(void) HANDLE file; int ret; FILETIME lwt; + static const WCHAR fileW[] = {'t','r','2','_','t','e','s','t','_','d','i','r','/','f','1',0}; + static const WCHAR not_existW[] = {'n','o','t','_','e','x','i','s','t',0}; __int64 last_write_time, newtime, margin_of_error = 10 * TICKSPERSEC; ret = p_tr2_sys__Make_dir("tr2_test_dir"); ok(ret == 1, "test_tr2_sys__Make_dir(): expect 1 got %d\n", ret); @@ -84,10 +96,15 @@ static void test_tr2_sys__Last_write_time(void) last_write_time = p_tr2_sys__Last_write_time("tr2_test_dir/f1"); newtime = last_write_time + 222222; p_tr2_sys__Last_write_time_set("tr2_test_dir/f1", newtime); - ok(last_write_time != p_tr2_sys__Last_write_time("tr2_test_dir/f1"), - "last_write_time should have changed: %s\n", + newtime = p_tr2_sys__Last_write_time("tr2_test_dir/f1"); + ok(last_write_time != newtime, "last_write_time should have changed: %s\n", wine_dbgstr_longlong(last_write_time)); + last_write_time = p_tr2_sys__Last_write_time_wchar(fileW); + ok(last_write_time == newtime, + "last_write_time and last_write_time_wchar returned different times (%s != %s)\n", + wine_dbgstr_longlong(last_write_time), wine_dbgstr_longlong(newtime)); + /* test the formula */ file = CreateFileA("tr2_test_dir/f1", 0, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); @@ -115,7 +132,7 @@ static void test_tr2_sys__Last_write_time(void) "don't fit the formula, last_write_time is %s\n", wine_dbgstr_longlong(last_write_time)); newtime = 123456789; - p_tr2_sys__Last_write_time_set("tr2_test_dir/f1", newtime); + p_tr2_sys__Last_write_time_set_wchar(fileW, newtime); newtime = p_tr2_sys__Last_write_time("tr2_test_dir/f1"); file = CreateFileA("tr2_test_dir/f1", 0, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); @@ -132,13 +149,23 @@ static void test_tr2_sys__Last_write_time(void) last_write_time = p_tr2_sys__Last_write_time("not_exist"); ok(errno == 0xdeadbeef, "tr2_sys__Last_write_time(): errno expect 0xdeadbeef, got %d\n", errno); ok(last_write_time == 0, "expect 0 got %s\n", wine_dbgstr_longlong(last_write_time)); + last_write_time = p_tr2_sys__Last_write_time_wchar(not_existW); + ok(errno == 0xdeadbeef, "tr2_sys__Last_write_time_wchar(): errno expect 0xdeadbeef, got %d\n", errno); + ok(last_write_time == 0, "expect 0 got %s\n", wine_dbgstr_longlong(last_write_time)); last_write_time = p_tr2_sys__Last_write_time(NULL); ok(last_write_time == 0, "expect 0 got %s\n", wine_dbgstr_longlong(last_write_time)); + last_write_time = p_tr2_sys__Last_write_time_wchar(NULL); + ok(last_write_time == 0, "expect 0 got %s\n", wine_dbgstr_longlong(last_write_time)); - p_tr2_sys__Last_write_time_set("not_exist", newtime); errno = 0xdeadbeef; + p_tr2_sys__Last_write_time_set("not_exist", newtime); + ok(errno == 0xdeadbeef, "tr2_sys__Last_write_time(): errno expect 0xdeadbeef, got %d\n", errno); + p_tr2_sys__Last_write_time_set_wchar(not_existW, newtime); + ok(errno == 0xdeadbeef, "tr2_sys__Last_write_time(): errno expect 0xdeadbeef, got %d\n", errno); p_tr2_sys__Last_write_time_set(NULL, newtime); ok(errno == 0xdeadbeef, "tr2_sys__Last_write_time(): errno expect 0xdeadbeef, got %d\n", errno); + p_tr2_sys__Last_write_time_set_wchar(NULL, newtime); + ok(errno == 0xdeadbeef, "tr2_sys__Last_write_time(): errno expect 0xdeadbeef, got %d\n", errno); ok(DeleteFileA("tr2_test_dir/f1"), "expect tr2_test_dir/f1 to exist\n"); ret = p_tr2_sys__Remove_dir("tr2_test_dir"); diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c index d7b82a3aaed..852ab9987c7 100644 --- a/dlls/msvcp120/tests/msvcp120.c +++ b/dlls/msvcp120/tests/msvcp120.c @@ -265,6 +265,7 @@ static enum file_type (__cdecl *p_tr2_sys__Stat_wchar)(WCHAR const*, int *); static enum file_type (__cdecl *p_tr2_sys__Lstat)(char const*, int *); static enum file_type (__cdecl *p_tr2_sys__Lstat_wchar)(WCHAR const*, int *); static __int64 (__cdecl *p_tr2_sys__Last_write_time)(char const*); +static __int64 (__cdecl *p_tr2_sys__Last_write_time_wchar)(WCHAR const*); static void (__cdecl *p_tr2_sys__Last_write_time_set)(char const*, __int64); static void* (__cdecl *p_tr2_sys__Open_dir)(char*, char const*, int *, enum file_type*); static char* (__cdecl *p_tr2_sys__Read_dir)(char*, void*, enum file_type*); @@ -513,6 +514,8 @@ static BOOL init(void) "?_Lstat@sys@tr2@std@@YA?AW4file_type@123@PEB_WAEAH@Z"); SET(p_tr2_sys__Last_write_time, "?_Last_write_time@sys@tr2@std@@YA_JPEBD@Z"); + SET(p_tr2_sys__Last_write_time_wchar, + "?_Last_write_time@sys@tr2@std@@YA_JPEB_W@Z"); SET(p_tr2_sys__Last_write_time_set, "?_Last_write_time@sys@tr2@std@@YAXPEBD_J@Z"); SET(p_tr2_sys__Open_dir, @@ -638,6 +641,8 @@ static BOOL init(void) "?_Lstat@sys@tr2@std@@YA?AW4file_type@123@PB_WAAH@Z"); SET(p_tr2_sys__Last_write_time, "?_Last_write_time@sys@tr2@std@@YA_JPBD@Z"); + SET(p_tr2_sys__Last_write_time_wchar, + "?_Last_write_time@sys@tr2@std@@YA_JPB_W@Z"); SET(p_tr2_sys__Last_write_time_set, "?_Last_write_time@sys@tr2@std@@YAXPBD_J@Z"); SET(p_tr2_sys__Open_dir, @@ -1727,6 +1732,7 @@ static void test_tr2_sys__Last_write_time(void) HANDLE file; int ret; __int64 last_write_time, newtime; + static const WCHAR fileW[] = {'t','r','2','_','t','e','s','t','_','d','i','r','/','f','1',0}; ret = p_tr2_sys__Make_dir("tr2_test_dir"); ok(ret == 1, "tr2_sys__Make_dir() expect 1 got %d\n", ret); @@ -1735,6 +1741,9 @@ static void test_tr2_sys__Last_write_time(void) CloseHandle(file); last_write_time = p_tr2_sys__Last_write_time("tr2_test_dir/f1"); + newtime = p_tr2_sys__Last_write_time_wchar(fileW); + ok(last_write_time == newtime, "last_write_time = %s, newtime = %s\n", + wine_dbgstr_longlong(last_write_time), wine_dbgstr_longlong(newtime)); newtime = last_write_time + 123456789; p_tr2_sys__Last_write_time_set("tr2_test_dir/f1", newtime); todo_wine ok(last_write_time == p_tr2_sys__Last_write_time("tr2_test_dir/f1"), diff --git a/dlls/msvcp140/tests/msvcp140.c b/dlls/msvcp140/tests/msvcp140.c index aefec6be4f7..03350d3b475 100644 --- a/dlls/msvcp140/tests/msvcp140.c +++ b/dlls/msvcp140/tests/msvcp140.c @@ -25,6 +25,12 @@ #include "wine/test.h" #include "winbase.h" +#define SECSPERDAY 86400 +/* 1601 to 1970 is 369 years plus 89 leap days */ +#define SECS_1601_TO_1970 ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY) +#define TICKSPERSEC 10000000 +#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC) + #define DEFINE_EXPECT(func) \ static BOOL expect_ ## func = FALSE, called_ ## func = FALSE @@ -170,6 +176,8 @@ static void (__cdecl *p_Close_dir)(void*); static MSVCP_bool (__cdecl *p_Current_get)(WCHAR *); static MSVCP_bool (__cdecl *p_Current_set)(WCHAR const *); static ULONGLONG (__cdecl *p_File_size)(WCHAR const *); +static __int64 (__cdecl *p_Last_write_time)(WCHAR const*); +static void (__cdecl *p_Set_last_write_time)(WCHAR const*, __int64); static int (__cdecl *p_Link)(WCHAR const*, WCHAR const*); static enum file_type (__cdecl *p_Lstat)(WCHAR const *, int *); static int (__cdecl *p_Make_dir)(WCHAR const*); @@ -254,6 +262,8 @@ static BOOL init(void) SET(p_Current_get, "_Current_get"); SET(p_Current_set, "_Current_set"); SET(p_File_size, "_File_size"); + SET(p_Last_write_time, "_Last_write_time"); + SET(p_Set_last_write_time, "_Set_last_write_time"); SET(p_Link, "_Link"); SET(p_Lstat, "_Lstat"); SET(p_Make_dir, "_Make_dir"); @@ -1181,6 +1191,96 @@ static void test_Rename(void) ok(SetCurrentDirectoryW(current_path), "SetCurrentDirectoryW failed\n"); } +static void test_Last_write_time(void) +{ + HANDLE file; + int ret; + FILETIME lwt; + __int64 last_write_time, newtime, margin_of_error = 10 * TICKSPERSEC; + static const WCHAR test_dirW[] = {'w','i','n','e','_','t','e','s','t','_','d','i','r',0}; + static const WCHAR f1W[] = + {'w','i','n','e','_','t','e','s','t','_','d','i','r','\\','f','1',0}; + static const WCHAR not_existW[] = + {'w','i','n','e','_','t','e','s','t','_','d','i','r','\\','n','o','t','_','e','x','i','s','t',0}; + WCHAR temp_path[MAX_PATH], origin_path[MAX_PATH]; + + GetCurrentDirectoryW(ARRAY_SIZE(origin_path), origin_path); + GetTempPathW(ARRAY_SIZE(temp_path), temp_path); + ok(SetCurrentDirectoryW(temp_path), "SetCurrentDirectoryW to temp_path failed\n"); + + ret = p_Make_dir(test_dirW); + ok(ret == 1, "_Make_dir() expect 1 got %d\n", ret); + + file = CreateFileW(f1W, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + ok(file != INVALID_HANDLE_VALUE, "create file failed: INVALID_HANDLE_VALUE\n"); + CloseHandle(file); + + last_write_time = p_Last_write_time(f1W); + newtime = last_write_time + 222222; + p_Set_last_write_time(f1W, newtime); + ok(last_write_time != p_Last_write_time(f1W), + "last_write_time should have changed: %s\n", + wine_dbgstr_longlong(last_write_time)); + + /* test the formula */ + file = CreateFileW(f1W, 0, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + ok(file != INVALID_HANDLE_VALUE, "create file failed: INVALID_HANDLE_VALUE\n"); + ok(GetFileTime(file, 0, 0, &lwt), "GetFileTime failed\n"); + CloseHandle(file); + last_write_time = (((__int64)lwt.dwHighDateTime)<< 32) + lwt.dwLowDateTime; + last_write_time -= TICKS_1601_TO_1970; + ok(newtime-margin_of_error<=last_write_time && last_write_time<=newtime+margin_of_error, + "don't fit the formula, last_write_time is %s expected %s\n", + wine_dbgstr_longlong(newtime), wine_dbgstr_longlong(last_write_time)); + + newtime = 0; + p_Set_last_write_time(f1W, newtime); + newtime = p_Last_write_time(f1W); + file = CreateFileW(f1W, 0, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + ok(file != INVALID_HANDLE_VALUE, "create file failed: INVALID_HANDLE_VALUE\n"); + ok(GetFileTime(file, 0, 0, &lwt), "GetFileTime failed\n"); + CloseHandle(file); + last_write_time = (((__int64)lwt.dwHighDateTime)<< 32) + lwt.dwLowDateTime; + last_write_time -= TICKS_1601_TO_1970; + ok(newtime-margin_of_error<=last_write_time && last_write_time<=newtime+margin_of_error, + "don't fit the formula, last_write_time is %s expected %s\n", + wine_dbgstr_longlong(newtime), wine_dbgstr_longlong(last_write_time)); + + newtime = 123456789; + p_Set_last_write_time(f1W, newtime); + newtime = p_Last_write_time(f1W); + file = CreateFileW(f1W, 0, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); + ok(file != INVALID_HANDLE_VALUE, "create file failed: INVALID_HANDLE_VALUE\n"); + ok(GetFileTime(file, 0, 0, &lwt), "GetFileTime failed\n"); + CloseHandle(file); + last_write_time = (((__int64)lwt.dwHighDateTime)<< 32) + lwt.dwLowDateTime; + last_write_time -= TICKS_1601_TO_1970; + ok(newtime-margin_of_error<=last_write_time && last_write_time<=newtime+margin_of_error, + "don't fit the formula, last_write_time is %s expected %s\n", + wine_dbgstr_longlong(newtime), wine_dbgstr_longlong(last_write_time)); + + errno = 0xdeadbeef; + last_write_time = p_Last_write_time(not_existW); + ok(errno == 0xdeadbeef, "_Set_last_write_time(): errno expect 0xdeadbeef, got %d\n", errno); + ok(last_write_time == -1, "expect -1 got %s\n", wine_dbgstr_longlong(last_write_time)); + last_write_time = p_Last_write_time(NULL); + ok(last_write_time == -1, "expect -1 got %s\n", wine_dbgstr_longlong(last_write_time)); + + errno = 0xdeadbeef; + p_Set_last_write_time(not_existW, newtime); + ok(errno == 0xdeadbeef, "_Set_last_write_time(): errno expect 0xdeadbeef, got %d\n", errno); + p_Set_last_write_time(NULL, newtime); + ok(errno == 0xdeadbeef, "_Set_last_write_time(): errno expect 0xdeadbeef, got %d\n", errno); + + ok(DeleteFileW(f1W), "expect wine_test_dir/f1 to exist\n"); + ret = p_Remove_dir(test_dirW); + ok(ret == 1, "p_Remove_dir(): expect 1 got %d\n", ret); + ok(SetCurrentDirectoryW(origin_path), "SetCurrentDirectoryW to origin_path failed\n"); +} + START_TEST(msvcp140) { if(!init()) return; @@ -1201,5 +1301,6 @@ START_TEST(msvcp140) test_Unlink(); test_Temp_get(); test_Rename(); + test_Last_write_time(); FreeLibrary(msvcp); }