Hua Meng : msvcp120: Add test for Concurrent_vector_copy.

Alexandre Julliard julliard at winehq.org
Fri Jun 15 15:41:00 CDT 2018


Module: wine
Branch: master
Commit: b6c7b2d322e0cd61eaeaac0d936dfc78c850f61b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b6c7b2d322e0cd61eaeaac0d936dfc78c850f61b

Author: Hua Meng <161220092 at smail.nju.edu.cn>
Date:   Sat Jun 16 00:07:04 2018 +0800

msvcp120: Add test for Concurrent_vector_copy.

Signed-off-by: Hua Meng <161220092 at smail.nju.edu.cn>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcp120/tests/msvcp120.c | 50 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 49 insertions(+), 1 deletion(-)

diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c
index 1247222..c34bd65 100644
--- a/dlls/msvcp120/tests/msvcp120.c
+++ b/dlls/msvcp120/tests/msvcp120.c
@@ -26,6 +26,7 @@
 
 DWORD expect_idx;
 static int vector_alloc_count;
+static int vector_elem_count;
 
 #define DEFINE_EXPECT(func) \
     BOOL expect_ ## func, called_ ## func
@@ -38,6 +39,7 @@ struct expect_struct {
     DEFINE_EXPECT(queue_char__Assign_and_destroy_item);
     DEFINE_EXPECT(concurrent_vector_int_alloc);
     DEFINE_EXPECT(concurrent_vector_int_destroy);
+    DEFINE_EXPECT(concurrent_vector_int_copy);
 };
 
 #define SET_EXPECT(func) \
@@ -110,6 +112,8 @@ static void * (WINAPI *call_thiscall_func1)( void *func, void *this );
 static void * (WINAPI *call_thiscall_func2)( void *func, void *this, const void *a );
 static void * (WINAPI *call_thiscall_func3)( void *func, void *this, const void *a,
         const void *b );
+static void * (WINAPI *call_thiscall_func4)( void *func, void *this, const void *a,
+        const void *b, const void *c );
 
 static void init_thiscall_thunk(void)
 {
@@ -123,18 +127,22 @@ static void init_thiscall_thunk(void)
     call_thiscall_func1 = (void *)thunk;
     call_thiscall_func2 = (void *)thunk;
     call_thiscall_func3 = (void *)thunk;
+    call_thiscall_func4 = (void *)thunk;
 }
 
 #define call_func1(func,_this) call_thiscall_func1(func,_this)
 #define call_func2(func,_this,a) call_thiscall_func2(func,_this,(const void*)(a))
 #define call_func3(func,_this,a,b) call_thiscall_func3(func,_this,(const void*)(a),\
         (const void*)(b))
+#define call_func4(func,_this,a,b,c) call_thiscall_func4(func,_this,(const void*)(a),\
+        (const void*)(b),(const void*)(c))
 #else
 
 #define init_thiscall_thunk()
 #define call_func1(func,_this) func(_this)
 #define call_func2(func,_this,a) func(_this,a)
 #define call_func3(func,_this,a,b) func(_this,a,b)
+#define call_func4(func,_this,a,b,c) func(_this,a,b,c)
 #endif /* __i386__ */
 
 static inline float __port_infinity(void)
@@ -382,6 +390,8 @@ static void* (__thiscall *p_vector_base_v4__Internal_push_back)(
         vector_base_v4*, size_t, size_t*);
 static size_t (__thiscall *p_vector_base_v4__Internal_clear)(
         vector_base_v4*, void (__cdecl*)(void*, size_t));
+static void (__thiscall *p_vector_base_v4__Internal_copy)(
+        vector_base_v4*, vector_base_v4*, size_t, void (__cdecl*)(void*, const void*, size_t));
 
 static HMODULE msvcp;
 #define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y)
@@ -524,6 +534,8 @@ static BOOL init(void)
                 "?_Internal_push_back at _Concurrent_vector_base_v4@details at Concurrency@@IEAAPEAX_KAEA_K at Z");
         SET(p_vector_base_v4__Internal_clear,
                 "?_Internal_clear at _Concurrent_vector_base_v4@details at Concurrency@@IEAA_KP6AXPEAX_K at Z@Z");
+        SET(p_vector_base_v4__Internal_copy,
+                "?_Internal_copy at _Concurrent_vector_base_v4@details at Concurrency@@IEAAXAEBV123 at _KP6AXPEAXPEBX1@Z at Z");
     } else {
         SET(p_tr2_sys__File_size,
                 "?_File_size at sys@tr2 at std@@YA_KPBD at Z");
@@ -635,6 +647,8 @@ static BOOL init(void)
                 "?_Internal_push_back at _Concurrent_vector_base_v4@details at Concurrency@@IAEPAXIAAI at Z");
         SET(p_vector_base_v4__Internal_clear,
                 "?_Internal_clear at _Concurrent_vector_base_v4@details at Concurrency@@IAEIP6AXPAXI at Z@Z");
+        SET(p_vector_base_v4__Internal_copy,
+                "?_Internal_copy at _Concurrent_vector_base_v4@details at Concurrency@@IAEXABV123 at IP6AXPAXPBXI@Z at Z");
 #else
         SET(p__Thrd_current,
                 "_Thrd_current");
@@ -674,6 +688,8 @@ static BOOL init(void)
                 "?_Internal_push_back at _Concurrent_vector_base_v4@details at Concurrency@@IAAPAXIAAI at Z");
         SET(p_vector_base_v4__Internal_clear,
                 "?_Internal_clear at _Concurrent_vector_base_v4@details at Concurrency@@IAAIP6AXPAXI at Z@Z");
+        SET(p_vector_base_v4__Internal_copy,
+                "?_Internal_copy at _Concurrent_vector_base_v4@details at Concurrency@@IAAXABV123 at IP6AXPAXPBXI@Z at Z");
 #endif
     }
     SET(p__Thrd_equal,
@@ -2459,6 +2475,8 @@ static void* __cdecl concurrent_vector_int_alloc(vector_base_v4 *this, size_t n)
 static void __cdecl concurrent_vector_int_destroy(void *ptr, size_t n)
 {
     CHECK_EXPECT2(concurrent_vector_int_destroy);
+    ok(vector_elem_count >= n, "invalid destroy\n");
+    vector_elem_count -= n;
     memset(ptr, 0xff, sizeof(int)*n);
 }
 
@@ -2484,6 +2502,13 @@ static void concurrent_vector_int_dtor(vector_base_v4 *this)
     call_func1(p_vector_base_v4_dtor, this);
 }
 
+static void __cdecl concurrent_vector_int_copy(void *dst, const void *src, size_t n)
+{
+    CHECK_EXPECT2(concurrent_vector_int_copy);
+    vector_elem_count += n;
+    memcpy(dst, src, n*sizeof(int));
+}
+
 static void test_queue_base_v4(void)
 {
     queue_base_v4 queue;
@@ -2677,7 +2702,7 @@ static void test_queue_base_v4(void)
 
 static void test_vector_base_v4(void)
 {
-    vector_base_v4 vector;
+    vector_base_v4 vector, v2;
     size_t idx, size;
     int *data;
 
@@ -2695,6 +2720,7 @@ static void test_vector_base_v4(void)
     CHECK_CALLED(concurrent_vector_int_alloc);
     ok(data != NULL, "_Internal_push_back returned NULL\n");
     ok(idx == 0, "idx got %ld expected %d\n", (long)idx, 0);
+    vector_elem_count++;
     *data = 1;
     ok(data == vector.storage[0], "vector.storage[0] got %p expected %p\n",
             vector.storage[0], data);
@@ -2709,6 +2735,7 @@ static void test_vector_base_v4(void)
     data = call_func3(p_vector_base_v4__Internal_push_back, &vector, sizeof(int), &idx);
     ok(data != NULL, "_Internal_push_back returned NULL\n");
     ok(idx == 1, "idx got %ld expected 1\n", (long)idx);
+    vector_elem_count++;
     *data = 2;
     ok(vector.first_block == 1, "vector.first_block got %ld expected 1\n",
             (long)vector.first_block);
@@ -2723,6 +2750,7 @@ static void test_vector_base_v4(void)
     CHECK_CALLED(concurrent_vector_int_alloc);
     ok(data != NULL, "_Internal_push_back returned NULL\n");
     ok(idx == 2, "idx got %ld expected 2\n", (long)idx);
+    vector_elem_count++;
     *data = 3;
     ok(vector.first_block == 1, "vector.first_block got %ld expected 1\n",
             (long)vector.first_block);
@@ -2735,6 +2763,7 @@ static void test_vector_base_v4(void)
     data = call_func3(p_vector_base_v4__Internal_push_back, &vector, sizeof(int), &idx);
     ok(data != NULL, "_Internal_push_back returned NULL\n");
     ok(idx == 3, "idx got %ld expected 3\n", (long)idx);
+    vector_elem_count++;
     *data = 4;
     size = (size_t)call_func1(p_vector_base_v4__Internal_capacity, &vector);
     ok(size == 4, "size of vector got %ld expected 4\n", (long)size);
@@ -2744,10 +2773,28 @@ static void test_vector_base_v4(void)
     CHECK_CALLED(concurrent_vector_int_alloc);
     ok(data != NULL, "_Internal_push_back returned NULL\n");
     ok(idx == 4, "idx got %ld expected 2\n", (long)idx);
+    vector_elem_count++;
     *data = 5;
     size = (size_t)call_func1(p_vector_base_v4__Internal_capacity, &vector);
     ok(size == 8, "size of vector got %ld expected 8\n", (long)size);
 
+    concurrent_vector_int_ctor(&v2);
+    SET_EXPECT(concurrent_vector_int_alloc);
+    SET_EXPECT(concurrent_vector_int_copy);
+    call_func4(p_vector_base_v4__Internal_copy, &v2, &vector,
+            sizeof(int), concurrent_vector_int_copy);
+    CHECK_CALLED(concurrent_vector_int_alloc);
+    CHECK_CALLED(concurrent_vector_int_copy);
+    ok(v2.first_block == 3, "v2.first_block got %ld expected 3\n",
+            (long)v2.first_block);
+    ok(v2.early_size == 5, "v2.early_size got %ld expected 5\n",
+            (long)v2.early_size);
+
+    SET_EXPECT(concurrent_vector_int_destroy);
+    size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
+            &v2, concurrent_vector_int_destroy);
+    concurrent_vector_int_dtor(&v2);
+
     SET_EXPECT(concurrent_vector_int_destroy);
     size = (size_t)call_func2(p_vector_base_v4__Internal_clear,
             &vector, concurrent_vector_int_destroy);
@@ -2759,6 +2806,7 @@ static void test_vector_base_v4(void)
             (long)vector.early_size);
     concurrent_vector_int_dtor(&vector);
 
+    ok(!vector_elem_count, "vector_elem_count = %d, expected 0\n", vector_elem_count);
     ok(!vector_alloc_count, "vector_alloc_count = %d, expected 0\n", vector_alloc_count);
 }
 




More information about the wine-cvs mailing list