Commit a504a79d authored by Juan Lang's avatar Juan Lang Committed by Alexandre Julliard

rpcrt4: Add tests for UuidCreate.

parent a9b2ee2a
......@@ -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)&and;
src - (LPBYTE)&guid < sizeof(guid); src++, dst++)
*dst &= *src;
for (src = (LPBYTE)&guid, dst = (LPBYTE)&or;
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();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment