Huw Davies : ole32/tests: Exercise the HGLOBAL marshaller over a range of block sizes.

Alexandre Julliard julliard at winehq.org
Wed May 20 08:29:32 CDT 2009


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue May 19 15:55:51 2009 +0100

ole32/tests: Exercise the HGLOBAL marshaller over a range of block sizes.

---

 dlls/ole32/tests/usrmarshal.c |   81 ++++++++++++++++++++++++-----------------
 1 files changed, 47 insertions(+), 34 deletions(-)

diff --git a/dlls/ole32/tests/usrmarshal.c b/dlls/ole32/tests/usrmarshal.c
index 5c83ddc..ed18ac5 100644
--- a/dlls/ole32/tests/usrmarshal.c
+++ b/dlls/ole32/tests/usrmarshal.c
@@ -162,7 +162,7 @@ static void test_marshal_HGLOBAL(void)
     MIDL_STUB_MESSAGE stub_msg;
     RPC_MESSAGE rpc_msg;
     unsigned char *buffer;
-    ULONG size;
+    ULONG size, block_size;
     HGLOBAL hglobal;
     HGLOBAL hglobal2;
     unsigned char *wirehglobal;
@@ -188,39 +188,52 @@ static void test_marshal_HGLOBAL(void)
     init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL);
     HGLOBAL_UserFree(&umcb.Flags, &hglobal2);
 
-    hglobal = GlobalAlloc(0, 4);
-    buffer = GlobalLock(hglobal);
-    for (i = 0; i < 4; i++)
-        buffer[i] = i;
-    GlobalUnlock(hglobal);
-    init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL);
-    size = HGLOBAL_UserSize(&umcb.Flags, 0, &hglobal);
-    /* native is poorly programmed and allocates 4/8 bytes more than it needs to
-     * here - Wine doesn't have to emulate that */
-    ok((size == 24) || broken(size == 28) || broken(size == 32), "Size should be 24, instead of %d\n", size);
-    buffer = HeapAlloc(GetProcessHeap(), 0, size);
-    init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL);
-    HGLOBAL_UserMarshal(&umcb.Flags, buffer, &hglobal);
-    wirehglobal = buffer;
-    ok(*(ULONG *)wirehglobal == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(ULONG *)wirehglobal);
-    wirehglobal += sizeof(ULONG);
-    ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0x4 should be HGLOBAL\n");
-    wirehglobal += sizeof(ULONG);
-    ok(*(ULONG *)wirehglobal == 4, "buffer+0x8 should be size of HGLOBAL instead of %d\n", *(ULONG *)wirehglobal);
-    wirehglobal += sizeof(ULONG);
-    ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0xc should be HGLOBAL\n");
-    wirehglobal += sizeof(ULONG);
-    ok(*(ULONG *)wirehglobal == 4, "buffer+0x10 should be size of HGLOBAL instead of %d\n", *(ULONG *)wirehglobal);
-    wirehglobal += sizeof(ULONG);
-    for (i = 0; i < 4; i++)
-        ok(wirehglobal[i] == i, "buffer+0x%x should be %d\n", 0x10 + i, i);
-    init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL);
-    HGLOBAL_UserUnmarshal(&umcb.Flags, buffer, &hglobal2);
-    ok(hglobal2 != NULL, "Didn't unmarshal properly\n");
-    HeapFree(GetProcessHeap(), 0, buffer);
-    init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL);
-    HGLOBAL_UserFree(&umcb.Flags, &hglobal2);
-    GlobalFree(hglobal);
+
+    for(block_size = 0; block_size <= 17; block_size++)
+    {
+        ULONG actual_size, expected_size;
+
+        hglobal = GlobalAlloc(0, block_size);
+        buffer = GlobalLock(hglobal);
+        for (i = 0; i < block_size; i++)
+            buffer[i] = i;
+        GlobalUnlock(hglobal);
+        actual_size = GlobalSize(hglobal);
+        expected_size = actual_size + 5 * sizeof(DWORD);
+        trace("%d: actual size %d\n", block_size, actual_size);
+        init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL);
+        size = HGLOBAL_UserSize(&umcb.Flags, 0, &hglobal);
+        /* native is poorly programmed and allocates 4/8 bytes more than it needs to
+         * here - Wine doesn't have to emulate that */
+        ok(size == expected_size ||
+           broken(size == expected_size + 4) ||
+           broken(size == expected_size + 8),
+           "%d: got size %d\n", block_size, size);
+        buffer = HeapAlloc(GetProcessHeap(), 0, size);
+        init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL);
+        HGLOBAL_UserMarshal(&umcb.Flags, buffer, &hglobal);
+        wirehglobal = buffer;
+        ok(*(ULONG *)wirehglobal == WDT_REMOTE_CALL, "Context should be WDT_REMOTE_CALL instead of 0x%08x\n", *(ULONG *)wirehglobal);
+        wirehglobal += sizeof(ULONG);
+        ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0x4 should be HGLOBAL\n");
+        wirehglobal += sizeof(ULONG);
+        ok(*(ULONG *)wirehglobal == actual_size, "%d: buffer+0x8 %08x\n", block_size, *(ULONG *)wirehglobal);
+        wirehglobal += sizeof(ULONG);
+        ok(*(ULONG *)wirehglobal == (ULONG)(ULONG_PTR)hglobal, "buffer+0xc should be HGLOBAL\n");
+        wirehglobal += sizeof(ULONG);
+        ok(*(ULONG *)wirehglobal == actual_size, "%d: buffer+0x10 %08x\n", block_size, *(ULONG *)wirehglobal);
+        wirehglobal += sizeof(ULONG);
+        for (i = 0; i < block_size; i++)
+            ok(wirehglobal[i] == i, "buffer+0x%x should be %d\n", 0x10 + i, i);
+
+        init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, buffer, size, MSHCTX_LOCAL);
+        HGLOBAL_UserUnmarshal(&umcb.Flags, buffer, &hglobal2);
+        ok(hglobal2 != NULL, "Didn't unmarshal properly\n");
+        HeapFree(GetProcessHeap(), 0, buffer);
+        init_user_marshal_cb(&umcb, &stub_msg, &rpc_msg, NULL, 0, MSHCTX_LOCAL);
+        HGLOBAL_UserFree(&umcb.Flags, &hglobal2);
+        GlobalFree(hglobal);
+    }
 }
 
 static HENHMETAFILE create_emf(void)




More information about the wine-cvs mailing list