oleaut32: Add a test for BSTR cache. Take 3.

Dmitry Timoshkov dmitry at baikal.ru
Mon Jun 4 22:13:28 CDT 2012


This version of the patch fully initializes tested strings in all cases.

This test imitates what pretty large and complex application does, and shows
that BSTR cache in Wine corrupts most of cached BSTR entries.
---
 dlls/oleaut32/tests/vartype.c |   96 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/dlls/oleaut32/tests/vartype.c b/dlls/oleaut32/tests/vartype.c
index 58b30b1..501828b 100644
--- a/dlls/oleaut32/tests/vartype.c
+++ b/dlls/oleaut32/tests/vartype.c
@@ -6072,6 +6072,101 @@ static void test_ChangeType_keep_dst(void)
      SysFreeString(bstr);
 }
 
+static int cache_entry(BSTR bstr, BSTR *cache, int cache_size)
+{
+    int i;
+
+    for (i = 0; i < cache_size; i++)
+    {
+        if (bstr == cache[i]) return i;
+    }
+
+    return -1;
+}
+
+static void test_ole_string_cache(void)
+{
+    BSTR bstr[256];
+    WCHAR str[256];
+    int i, j;
+    int good_length_entries, good_string_entries;
+
+    for (i = 0; i < sizeof(bstr)/sizeof(bstr[0]); i++)
+    {
+        int entry;
+
+        for (j = 0; j < i; j++) str[j] = '0' + i % 10;
+        bstr[i] = SysAllocStringLen(str, i);
+        ok(bstr[i] != NULL, "SysAllocString failed\n");
+
+        entry = cache_entry(bstr[i], bstr, i);
+        ok(entry == -1, "bstr[%d] found in cache, index %d\n", i, entry);
+    }
+
+    for (i = 0; i < sizeof(bstr)/sizeof(bstr[0]); i++)
+    {
+        INTERNAL_BSTR *data = Get(bstr[i]);
+
+        for (j = 0; j < i; j++) str[j] = '0' + i % 10;
+
+        ok(data->dwLen == i * sizeof(WCHAR), "%d: expected %d, got %d\n",
+           i, i * sizeof(WCHAR), data->dwLen);
+        ok(!memcmp(data->szString, str, i * sizeof(WCHAR)), "%d: expected %s, got %s\n",
+           i, wine_dbgstr_wn(str, i), wine_dbgstr_w(data->szString));
+    }
+
+    good_length_entries = good_string_entries = 0;
+
+    for (i = 0; i < sizeof(bstr)/sizeof(bstr[0]); i++)
+    {
+        int entry;
+        BSTR new_bstr;
+        INTERNAL_BSTR *data = Get(bstr[i]);
+
+        SysFreeString(bstr[i]);
+
+        for (j = 0; j < i; j++) str[j] = 'a';
+        new_bstr = SysAllocStringLen(str, i);
+        ok(new_bstr != NULL, "SysAllocString failed\n");
+
+        entry = cache_entry(new_bstr, bstr, sizeof(bstr)/sizeof(bstr[0]));
+        ok(entry >= 0, "new_bstr with length %d is not in cache\n", i);
+
+        for (j = 0; j < i; j++) str[j] = '0' + i % 10;
+
+        if (data->dwLen == i * sizeof(WCHAR))
+            good_length_entries++;
+        if (!memcmp(data->szString, str, i * sizeof(WCHAR)))
+            good_string_entries++;
+
+        SysFreeString(new_bstr);
+    }
+
+    trace("good_length_entries %d, good_string_entries %d\n", good_length_entries, good_string_entries);
+    ok(good_length_entries >= 190, "good_length_entries %d out of 256\n", good_length_entries);
+todo_wine
+    ok(good_string_entries >= 190, "good_string_entries %d out of 256\n", good_string_entries);
+
+    good_length_entries = good_string_entries = 0;
+
+    for (i = 0; i < sizeof(bstr)/sizeof(bstr[0]); i++)
+    {
+        INTERNAL_BSTR *data = Get(bstr[i]);
+
+        for (j = 0; j < i; j++) str[j] = '0' + i % 10;
+
+        if (data->dwLen == i * sizeof(WCHAR))
+            good_length_entries++;
+        if (!memcmp(data->szString, str, i * sizeof(WCHAR)))
+            good_string_entries++;
+    }
+
+    trace("good_length_entries %d, good_string_entries %d\n", good_length_entries, good_string_entries);
+    ok(good_length_entries >= 95, "good_length_entries %d out of 256\n", good_length_entries);
+todo_wine
+    ok(good_string_entries >= 190, "good_string_entries %d out of 256\n", good_string_entries);
+}
+
 START_TEST(vartype)
 {
   hOleaut32 = GetModuleHandleA("oleaut32.dll");
@@ -6348,6 +6443,7 @@ START_TEST(vartype)
   test_SysReAllocStringLen();
   test_BstrCopy();
   test_VarBstrCat();
+  test_ole_string_cache();
 
   test_IUnknownClear();
   test_IUnknownCopy();
-- 
1.7.10.1




More information about the wine-patches mailing list