mirror of
https://github.com/reactos/reactos.git
synced 2025-06-01 15:38:37 +00:00
- Sync rpcrt4_winetest too.
svn path=/trunk/; revision=37231
This commit is contained in:
parent
87658f5321
commit
7dd446c187
5 changed files with 111 additions and 13 deletions
|
@ -432,6 +432,7 @@ static IPSFactoryBuffer *test_NdrDllGetClassObject(void)
|
|||
{
|
||||
IPSFactoryBuffer *ppsf = NULL;
|
||||
const CLSID PSDispatch = {0x20420, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}};
|
||||
const CLSID CLSID_Unknown = {0x45678, 0x1234, 0x6666, {0xff, 0x67, 0x45, 0x98, 0x76, 0x12, 0x34, 0x56}};
|
||||
HRESULT r;
|
||||
HMODULE hmod = LoadLibraryA("rpcrt4.dll");
|
||||
void *CStd_QueryInterface = GetProcAddress(hmod, "CStdStubBuffer_QueryInterface");
|
||||
|
@ -445,6 +446,11 @@ static IPSFactoryBuffer *test_NdrDllGetClassObject(void)
|
|||
void *CStd_DebugServerQueryInterface = GetProcAddress(hmod, "CStdStubBuffer_DebugServerQueryInterface");
|
||||
void *CStd_DebugServerRelease = GetProcAddress(hmod, "CStdStubBuffer_DebugServerRelease");
|
||||
|
||||
r = NdrDllGetClassObject(&PSDispatch, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
|
||||
&CLSID_Unknown, &PSFactoryBuffer);
|
||||
ok(r == CLASS_E_CLASSNOTAVAILABLE, "NdrDllGetClassObject with unknown clsid should have returned CLASS_E_CLASSNOTAVAILABLE instead of 0x%x\n", r);
|
||||
ok(ppsf == NULL, "NdrDllGetClassObject should have set ppsf to NULL on failure\n");
|
||||
|
||||
r = NdrDllGetClassObject(&PSDispatch, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
|
||||
&PSDispatch, &PSFactoryBuffer);
|
||||
|
||||
|
@ -518,6 +524,13 @@ static IPSFactoryBuffer *test_NdrDllGetClassObject(void)
|
|||
#undef VTBL_TEST_ZERO
|
||||
|
||||
ok(PSFactoryBuffer.RefCount == 1, "ref count %d\n", PSFactoryBuffer.RefCount);
|
||||
IPSFactoryBuffer_Release(ppsf);
|
||||
|
||||
r = NdrDllGetClassObject(&IID_if3, &IID_IPSFactoryBuffer, (void**)&ppsf, proxy_file_list,
|
||||
NULL, &PSFactoryBuffer);
|
||||
ok(r == S_OK, "ret %08x\n", r);
|
||||
ok(ppsf != NULL, "ppsf == NULL\n");
|
||||
|
||||
return ppsf;
|
||||
}
|
||||
|
||||
|
|
|
@ -1191,11 +1191,17 @@ static void test_client_init(void)
|
|||
TEST_ZERO(fHasExtensions, "%d");
|
||||
TEST_ZERO(fHasNewCorrDesc, "%d");
|
||||
TEST_ZERO(fIsIn, "%d");
|
||||
TEST_ZERO(fIsOut, "%d");
|
||||
ok(stubMsg.fIsOut == 0 ||
|
||||
stubMsg.fIsOut == -1, /* XP-SP3 */
|
||||
"fIsOut should have been set to 0 or -1 instead of %d\n", stubMsg.fIsOut);
|
||||
TEST_ZERO(fIsOicf, "%d");
|
||||
TEST_ZERO(fBufferValid, "%d");
|
||||
TEST_ZERO(fHasMemoryValidateCallback, "%d");
|
||||
TEST_ZERO(fInFree, "%d");
|
||||
ok(stubMsg.fHasMemoryValidateCallback == 0 ||
|
||||
stubMsg.fHasMemoryValidateCallback == -1, /* XP-SP3 */
|
||||
"fHasMemoryValidateCallback should have been set to 0 or -1 instead of %d\n", stubMsg.fHasMemoryValidateCallback);
|
||||
ok(stubMsg.fInFree == 0 ||
|
||||
stubMsg.fInFree == -1, /* XP-SP3 */
|
||||
"fInFree should have been set to 0 or -1 instead of %d\n", stubMsg.fInFree);
|
||||
TEST_ZERO(fNeedMCCP, "%d");
|
||||
ok(stubMsg.fUnused == 0 ||
|
||||
stubMsg.fUnused == -2, /* Vista */
|
||||
|
@ -1302,11 +1308,17 @@ todo_wine
|
|||
TEST_ZERO(fHasExtensions, "%d");
|
||||
TEST_ZERO(fHasNewCorrDesc, "%d");
|
||||
TEST_ZERO(fIsIn, "%d");
|
||||
TEST_ZERO(fIsOut, "%d");
|
||||
ok(stubMsg.fIsOut == 0 ||
|
||||
stubMsg.fIsOut == -1, /* XP-SP3 */
|
||||
"fIsOut should have been set to 0 or -1 instead of %d\n", stubMsg.fIsOut);
|
||||
TEST_ZERO(fIsOicf, "%d");
|
||||
trace("fBufferValid = %d\n", stubMsg.fBufferValid);
|
||||
TEST_ZERO(fHasMemoryValidateCallback, "%d");
|
||||
TEST_ZERO(fInFree, "%d");
|
||||
ok(stubMsg.fHasMemoryValidateCallback == 0 ||
|
||||
stubMsg.fHasMemoryValidateCallback == -1, /* XP-SP3 */
|
||||
"fHasMemoryValidateCallback should have been set to 0 or -1 instead of %d\n", stubMsg.fHasMemoryValidateCallback);
|
||||
ok(stubMsg.fInFree == 0 ||
|
||||
stubMsg.fInFree == -1, /* XP-SP3 */
|
||||
"fInFree should have been set to 0 or -1 instead of %d\n", stubMsg.fInFree);
|
||||
TEST_ZERO(fNeedMCCP, "%d");
|
||||
ok(stubMsg.fUnused == 0 ||
|
||||
stubMsg.fUnused == -2, /* Vista */
|
||||
|
|
|
@ -385,7 +385,9 @@ static void test_towers(void)
|
|||
ok(ret == RPC_S_OK, "TowerConstruct failed with error %ld\n", ret);
|
||||
ret = TowerExplode(tower, NULL, NULL, NULL, NULL, &address);
|
||||
ok(ret == RPC_S_OK, "TowerExplode failed with error %ld\n", ret);
|
||||
ok(!strcmp(address, "0.0.0.0"), "address was \"%s\" instead of \"0.0.0.0\"\n", address);
|
||||
ok(!strcmp(address, "0.0.0.0") ||
|
||||
broken(!strcmp(address, "255.255.255.255")),
|
||||
"address was \"%s\" instead of \"0.0.0.0\"\n", address);
|
||||
|
||||
I_RpcFree(address);
|
||||
I_RpcFree(tower);
|
||||
|
@ -666,6 +668,7 @@ static void test_I_RpcExceptionFilter(void)
|
|||
ok(retval == EXCEPTION_CONTINUE_SEARCH, "I_RpcExceptionFilter(0x%x) should have returned %d instead of %d\n",
|
||||
exception, EXCEPTION_CONTINUE_SEARCH, retval);
|
||||
break;
|
||||
case STATUS_GUARD_PAGE_VIOLATION:
|
||||
case STATUS_IN_PAGE_ERROR:
|
||||
case STATUS_HANDLE_NOT_CLOSABLE:
|
||||
trace("I_RpcExceptionFilter(0x%x) returned %d\n", exception, retval);
|
||||
|
@ -759,6 +762,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";
|
||||
|
@ -777,4 +848,5 @@ START_TEST( rpc )
|
|||
test_endpoint_mapper(ncacn_np, np_address, np_endpoint);
|
||||
test_endpoint_mapper(ncalrpc, NULL, lrpc_endpoint);
|
||||
test_RpcStringBindingFromBinding();
|
||||
test_UuidCreate();
|
||||
}
|
||||
|
|
|
@ -990,27 +990,27 @@ us_t_UserFree(ULONG *flags, us_t *pus)
|
|||
ULONG __RPC_USER
|
||||
bstr_t_UserSize(ULONG *flags, ULONG start, bstr_t *b)
|
||||
{
|
||||
return start + FIELD_OFFSET(wire_bstr_t, data[(*b)[-1]]);
|
||||
return start + FIELD_OFFSET(user_bstr_t, data[(*b)[-1]]);
|
||||
}
|
||||
|
||||
unsigned char * __RPC_USER
|
||||
bstr_t_UserMarshal(ULONG *flags, unsigned char *buffer, bstr_t *b)
|
||||
{
|
||||
wire_bstr_t *wb = (wire_bstr_t *) buffer;
|
||||
wire_bstr_t wb = (wire_bstr_t) buffer;
|
||||
wb->n = (*b)[-1];
|
||||
memcpy(&wb->data, *b, wb->n * sizeof wb->data[0]);
|
||||
return buffer + FIELD_OFFSET(wire_bstr_t, data[wb->n]);
|
||||
return buffer + FIELD_OFFSET(user_bstr_t, data[wb->n]);
|
||||
}
|
||||
|
||||
unsigned char * __RPC_USER
|
||||
bstr_t_UserUnmarshal(ULONG *flags, unsigned char *buffer, bstr_t *b)
|
||||
{
|
||||
wire_bstr_t *wb = (wire_bstr_t *) buffer;
|
||||
wire_bstr_t wb = (wire_bstr_t) buffer;
|
||||
short *data = HeapAlloc(GetProcessHeap(), 0, (wb->n + 1) * sizeof *data);
|
||||
data[0] = wb->n;
|
||||
memcpy(&data[1], wb->data, wb->n * sizeof data[1]);
|
||||
*b = &data[1];
|
||||
return buffer + FIELD_OFFSET(wire_bstr_t, data[wb->n]);
|
||||
return buffer + FIELD_OFFSET(user_bstr_t, data[wb->n]);
|
||||
}
|
||||
|
||||
void __RPC_USER
|
||||
|
|
|
@ -299,8 +299,9 @@ cpp_quote("#endif")
|
|||
{
|
||||
short n;
|
||||
[size_is(n)] short data[];
|
||||
} wire_bstr_t;
|
||||
} user_bstr_t;
|
||||
|
||||
typedef [unique] user_bstr_t *wire_bstr_t;
|
||||
typedef [wire_marshal(wire_bstr_t)] short *bstr_t;
|
||||
unsigned hash_bstr(bstr_t s);
|
||||
|
||||
|
|
Loading…
Reference in a new issue