From: Aida JonikienÄ— aidas957@gmail.com
--- .../tests/msvcp140_atomic_wait.c | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+)
diff --git a/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c b/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c index 882e07c48db..edfe2114d68 100644 --- a/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c +++ b/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c @@ -28,6 +28,30 @@ typedef struct SRWLOCK srwlock; } shared_mutex;
+typedef enum _std_tzdb_error { + success = 0, + win_error = 1, + icu_error = 2, +} __std_tzdb_error; + +typedef struct { + __std_tzdb_error err; + + const char* version; + size_t num_timezones; + const char** names; + const char** links; +} __std_tzdb_time_zones_info; + +typedef struct { + uint16_t year; + uint16_t month; + uint16_t day; + uint16_t hour; + uint16_t negative; + uint16_t reserved; +} __std_tzdb_leap_info; + static unsigned int (__stdcall *p___std_parallel_algorithms_hw_threads)(void);
static void (__stdcall *p___std_bulk_submit_threadpool_work)(PTP_WORK, size_t); @@ -40,6 +64,11 @@ static void (__stdcall *p___std_atomic_notify_one_direct)(void*); static shared_mutex* (__stdcall *p___std_acquire_shared_mutex_for_instance)(void*); static void (__stdcall *p___std_release_shared_mutex_for_instance)(void*);
+static __std_tzdb_time_zones_info* (__stdcall *p___std_tzdb_get_time_zones)(void); +static void (__stdcall *p___std_tzdb_delete_time_zones)(__std_tzdb_time_zones_info*); +static __std_tzdb_leap_info* (__stdcall *p___std_tzdb_get_leap_seconds)(size_t, size_t*); +static void (__stdcall *p___std_tzdb_delete_leap_seconds)(__std_tzdb_leap_info*); + #define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0) static HMODULE init(void) @@ -60,6 +89,11 @@ static HMODULE init(void) SET(p___std_atomic_notify_one_direct, "__std_atomic_notify_one_direct"); SET(p___std_acquire_shared_mutex_for_instance, "__std_acquire_shared_mutex_for_instance"); SET(p___std_release_shared_mutex_for_instance, "__std_release_shared_mutex_for_instance"); + + SETNOFAIL(p___std_tzdb_get_time_zones, "__std_tzdb_get_time_zones"); + SETNOFAIL(p___std_tzdb_delete_time_zones, "__std_tzdb_delete_time_zones"); + SETNOFAIL(p___std_tzdb_get_leap_seconds, "__std_tzdb_get_leap_seconds"); + SETNOFAIL(p___std_tzdb_delete_leap_seconds, "__std_tzdb_delete_leap_seconds"); return msvcp; }
@@ -269,6 +303,54 @@ static void test___std_acquire_shared_mutex_for_instance(void) p___std_release_shared_mutex_for_instance(NULL); }
+static void test_tzdb(void) +{ + __std_tzdb_time_zones_info *info = NULL; + __std_tzdb_leap_info *info2 = NULL; + size_t size = 0; + + if (!p___std_tzdb_get_time_zones) + { + win_skip("tzdb functions are not available\n"); + return; + } + + info = p___std_tzdb_get_time_zones(); + ok(info != NULL, "Expected a non-NULL pointer\n"); + if (info) + { + ok(info->err == success, "Expected success error, got %d\n", info->err); + + p___std_tzdb_delete_time_zones(info); + ok(info != NULL, "Expected a non-NULL info pointer after deletion\n"); + ok(info->version != NULL, "Expected a non-NULL version pointer after deletion\n"); + ok(info->names != NULL, "Expected a non-NULL names pointer after deletion\n"); + ok(info->links != NULL, "Expected a non-NULL links pointer after deletion\n"); + ok(info->names[0] != NULL, "Expected a non-NULL names[0] pointer after deletion\n"); + ok(info->links[0] != NULL, "Expected a non-NULL links[0] pointer after deletion\n"); + } + p___std_tzdb_delete_time_zones(NULL); /* This call shouldn't cause a crash. */ + + if (0) /* Crashes on Windows. */ + { + info2 = p___std_tzdb_get_leap_seconds(0, NULL); + ok(info2 == NULL, "Expected a NULL pointer\n"); + } + + info2 = p___std_tzdb_get_leap_seconds(0, &size); + ok(info2 == NULL, "Expected a NULL pointer\n"); + ok(size == 0, "Expected size to be 0\n"); + + /* This function fails without LeapSecondInformation key being present (which is the case on TestBot VMs). + * (Source: https://github.com/microsoft/STL/blob/main/stl/src/tzdb.cpp#L600) */ + /* TODO: Find a working test environment that makes the function succeed and do the testing there. */ + info2 = p___std_tzdb_get_leap_seconds(256, &size); + ok(info2 == NULL, "Expected a NULL pointer\n"); + ok(size == 0, "Expected size to be 0\n"); + + p___std_tzdb_delete_leap_seconds(NULL); /* This call shouldn't cause a crash. */ +} + START_TEST(msvcp140_atomic_wait) { HMODULE msvcp; @@ -281,5 +363,6 @@ START_TEST(msvcp140_atomic_wait) test_threadpool_work(); test___std_atomic_wait_direct(); test___std_acquire_shared_mutex_for_instance(); + test_tzdb(); FreeLibrary(msvcp); }