Juan Lang : rpcrt4: Add tests for UuidCreate.
Alexandre Julliard
julliard at winehq.org
Tue Oct 14 08:30:18 CDT 2008
Module: wine
Branch: master
Commit: a504a79d65b2bd886ec645a882b278e46f38c690
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a504a79d65b2bd886ec645a882b278e46f38c690
Author: Juan Lang <juan.lang at gmail.com>
Date: Mon Oct 13 13:06:12 2008 -0700
rpcrt4: Add tests for UuidCreate.
---
dlls/rpcrt4/tests/rpc.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 69 insertions(+), 0 deletions(-)
diff --git a/dlls/rpcrt4/tests/rpc.c b/dlls/rpcrt4/tests/rpc.c
index 763d387..61155bd 100644
--- a/dlls/rpcrt4/tests/rpc.c
+++ b/dlls/rpcrt4/tests/rpc.c
@@ -761,6 +761,74 @@ static void test_RpcStringBindingFromBinding(void)
ok(status == RPC_S_OK, "RpcBindingFree failed with error %lu\n", status);
}
+static char *printGuid(char *buf, const UUID *guid)
+{
+ sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
+ guid->Data1, guid->Data2, guid->Data3, guid->Data4[0], guid->Data4[1],
+ guid->Data4[2], guid->Data4[3], guid->Data4[4], guid->Data4[5],
+ guid->Data4[6], guid->Data4[7]);
+ return buf;
+}
+
+static void test_UuidCreate(void)
+{
+ UUID guid;
+ BYTE version;
+
+ UuidCreate(&guid);
+ version = (guid.Data3 & 0xf000) >> 12;
+ todo_wine
+ ok(version == 4 || broken(version == 1), "unexpected version %d\n",
+ version);
+ if (version == 4)
+ {
+ static UUID v4and = { 0, 0, 0x4000, { 0x80,0,0,0,0,0,0,0 } };
+ static UUID v4or = { 0xffffffff, 0xffff, 0x4fff,
+ { 0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff } };
+ UUID and, or;
+ RPC_STATUS rslt;
+ int i;
+ char buf[39];
+
+ memcpy(&and, &guid, sizeof(guid));
+ memcpy(&or, &guid, sizeof(guid));
+ /* Generate a bunch of UUIDs and mask them. By the end, we expect
+ * every randomly generated bit to have been zero at least once,
+ * resulting in no bits set in the and mask except those which are not
+ * randomly generated: the version number and the topmost bits of the
+ * Data4 field (treated as big-endian.) Similarly, we expect only
+ * the bits which are not randomly set to be cleared in the or mask.
+ */
+ for (i = 0; i < 1000; i++)
+ {
+ LPBYTE src, dst;
+
+ UuidCreate(&guid);
+ for (src = (LPBYTE)&guid, dst = (LPBYTE)∧
+ src - (LPBYTE)&guid < sizeof(guid); src++, dst++)
+ *dst &= *src;
+ for (src = (LPBYTE)&guid, dst = (LPBYTE)∨
+ src - (LPBYTE)&guid < sizeof(guid); src++, dst++)
+ *dst |= *src;
+ }
+ ok(UuidEqual(&and, &v4and, &rslt),
+ "unexpected bits set in V4 UUID: %s\n", printGuid(buf, &and));
+ ok(UuidEqual(&or, &v4or, &rslt),
+ "unexpected bits set in V4 UUID: %s\n", printGuid(buf, &or));
+ }
+ else
+ {
+ /* Older versions of Windows generate V1 UUIDs. For these, there are
+ * many stable bits, including at least the MAC address if one is
+ * present. Just check that Data4[0]'s most significant bits are
+ * set as expected.
+ */
+ todo_wine
+ ok((guid.Data4[0] & 0xc0) == 0x80,
+ "unexpected value in Data4[0]: %02x\n", guid.Data4[0] & 0xc0);
+ }
+}
+
START_TEST( rpc )
{
static unsigned char ncacn_np[] = "ncacn_np";
@@ -779,4 +847,5 @@ START_TEST( rpc )
test_endpoint_mapper(ncacn_np, np_address, np_endpoint);
test_endpoint_mapper(ncalrpc, NULL, lrpc_endpoint);
test_RpcStringBindingFromBinding();
+ test_UuidCreate();
}
More information about the wine-cvs
mailing list