Piotr Caban : oleaut32/tests: Add tests for safearray unmarshaling into passed variant.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jan 14 11:10:26 CST 2016


Module: wine
Branch: master
Commit: 6183f4fc7d4c38477960337c290a30b79ecbf1b8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6183f4fc7d4c38477960337c290a30b79ecbf1b8

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Jan 13 09:50:55 2016 +0100

oleaut32/tests: Add tests for safearray unmarshaling into passed variant.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/oleaut32/tests/usrmarshal.c | 60 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 59 insertions(+), 1 deletion(-)

diff --git a/dlls/oleaut32/tests/usrmarshal.c b/dlls/oleaut32/tests/usrmarshal.c
index 88a0731..24b382c 100644
--- a/dlls/oleaut32/tests/usrmarshal.c
+++ b/dlls/oleaut32/tests/usrmarshal.c
@@ -769,7 +769,7 @@ static void test_marshal_VARIANT(void)
     BSTR b;
     WCHAR str[] = {'m','a','r','s','h','a','l',' ','t','e','s','t',0};
     SAFEARRAYBOUND sab;
-    LPSAFEARRAY lpsa;
+    LPSAFEARRAY lpsa, lpsa2, lpsa_copy;
     DECIMAL dec, dec2;
     HeapUnknown *heap_unknown;
     DWORD expected;
@@ -1336,6 +1336,64 @@ static void test_marshal_VARIANT(void)
     }
     VARIANT_UserFree(&umcb.Flags, &v2);
     HeapFree(GetProcessHeap(), 0, oldbuffer);
+
+    /*** ARRAY BYREF ***/
+    VariantInit(&v);
+    V_VT(&v) = VT_UI4 | VT_ARRAY | VT_BYREF;
+    V_ARRAYREF(&v) = &lpsa;
+    lpsa->fFeatures |= FADF_STATIC;
+
+    rpcMsg.BufferLength = stubMsg.BufferLength = VARIANT_UserSize(&umcb.Flags, 0, &v);
+    expected = 152;
+    ok(stubMsg.BufferLength == expected || stubMsg.BufferLength == expected + 16, /* win64 */
+       "size %u instead of %u\n", stubMsg.BufferLength, expected);
+    buffer = rpcMsg.Buffer = stubMsg.Buffer = stubMsg.BufferStart = alloc_aligned(stubMsg.BufferLength, &oldbuffer);
+    stubMsg.BufferEnd = stubMsg.Buffer + stubMsg.BufferLength;
+    next = VARIANT_UserMarshal(&umcb.Flags, buffer, &v);
+    ok(next == buffer + expected, "got %p expect %p\n", next, buffer + expected);
+    wirev = (DWORD*)buffer;
+
+    wirev = check_variant_header(wirev, &v, expected);
+    ok(*wirev == 4, "wv[5] %08x\n", *wirev);
+    wirev++;
+    ok(*wirev, "wv[6] %08x\n", *wirev); /* win2k: this is lpsa. winxp: this is (char*)lpsa + 1 */
+    wirev++;
+    check_safearray(wirev, lpsa);
+    lpsa_copy = lpsa2 = SafeArrayCreate(VT_I8, 1, &sab);
+    /* set FADF_STATIC feature to make sure lpsa2->pvData pointer changes if new data buffer is allocated */
+    lpsa2->fFeatures |= FADF_STATIC;
+    mem = lpsa2->pvData;
+    V_VT(&v2) = VT_UI4 | VT_ARRAY | VT_BYREF;
+    V_ARRAYREF(&v2) = &lpsa2;
+    stubMsg.Buffer = buffer;
+    next = VARIANT_UserUnmarshal(&umcb.Flags, buffer, &v2);
+    ok(next == buffer + expected, "got %p expect %p\n", next, buffer + expected);
+    ok(V_VT(&v) == V_VT(&v2), "got vt %d expect %d\n", V_VT(&v), V_VT(&v2));
+    todo_wine ok(lpsa2 == lpsa_copy, "safearray should be reused\n");
+    todo_wine ok(mem == lpsa2->pvData, "safearray data should be reused\n");
+    if(lpsa2 != lpsa_copy)
+    {
+        lpsa_copy->fFeatures &= ~FADF_STATIC;
+        SafeArrayDestroy(lpsa_copy);
+    }
+    ok(SafeArrayGetDim(*V_ARRAYREF(&v)) == SafeArrayGetDim(*V_ARRAYREF(&v2)), "array dims differ\n");
+    SafeArrayGetLBound(*V_ARRAYREF(&v), 1, &bound);
+    SafeArrayGetLBound(*V_ARRAYREF(&v2), 1, &bound2);
+    ok(bound == bound2, "array lbounds differ\n");
+    SafeArrayGetUBound(*V_ARRAYREF(&v), 1, &bound);
+    SafeArrayGetUBound(*V_ARRAYREF(&v2), 1, &bound2);
+    ok(bound == bound2, "array ubounds differ\n");
+    if (pSafeArrayGetVartype)
+    {
+        pSafeArrayGetVartype(*V_ARRAYREF(&v), &vt);
+        pSafeArrayGetVartype(*V_ARRAYREF(&v2), &vt2);
+        ok(vt == vt2, "array vts differ %x %x\n", vt, vt2);
+    }
+    lpsa2->fFeatures &= ~FADF_STATIC;
+    hr = SafeArrayDestroy(*V_ARRAYREF(&v2));
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    HeapFree(GetProcessHeap(), 0, oldbuffer);
+    lpsa->fFeatures &= ~FADF_STATIC;
     hr = SafeArrayDestroy(lpsa);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 




More information about the wine-cvs mailing list