Commit 056dbb04 authored by Zhiyi Zhang's avatar Zhiyi Zhang Committed by Alexandre Julliard

rpcrt4/tests: Add I_RpcBindingInqLocalClientPID() tests.

parent e613992c
......@@ -40,10 +40,11 @@
#define INT_CODE 4198
static const char *progname;
static const char *progname, *client_test_name;
static BOOL old_windows_version;
static HANDLE stop_event, stop_wait_event;
static PROCESS_INFORMATION client_info;
static void (WINAPI *pNDRSContextMarshall2)(RPC_BINDING_HANDLE, NDR_SCONTEXT, void*, NDR_RUNDOWN, void*, ULONG);
static NDR_SCONTEXT (WINAPI *pNDRSContextUnmarshall2)(RPC_BINDING_HANDLE, void*, ULONG, void*, ULONG);
......@@ -147,6 +148,7 @@ static int (__cdecl *sum_array_ptr)(int (*a)[2]);
static ctx_handle_t (__cdecl *get_handle)(void);
static void (__cdecl *get_handle_by_ptr)(ctx_handle_t *r);
static void (__cdecl *test_handle)(ctx_handle_t ctx_handle);
static void (__cdecl *test_I_RpcBindingInqLocalClientPID)(unsigned int protseq, RPC_BINDING_HANDLE binding);
#define SERVER_FUNCTIONS \
X(int_return) \
......@@ -240,7 +242,8 @@ static void (__cdecl *test_handle)(ctx_handle_t ctx_handle);
X(sum_array_ptr) \
X(get_handle) \
X(get_handle_by_ptr) \
X(test_handle)
X(test_handle) \
X(test_I_RpcBindingInqLocalClientPID)
/* type check statements generated in header file */
fnprintf *p_printf = printf;
......@@ -1122,6 +1125,88 @@ void __cdecl s_test_handle(ctx_handle_t ctx_handle)
ok(ctx_handle == (ctx_handle_t)0xdeadbeef, "Unexpected ctx_handle %p\n", ctx_handle);
}
struct test_thread_params
{
unsigned int protseq;
RPC_BINDING_HANDLE binding;
};
static DWORD CALLBACK test_I_RpcBindingInqLocalClientPID_thread_func(void *args)
{
struct test_thread_params *params = (struct test_thread_params *)args;
RPC_STATUS status;
ULONG pid;
winetest_push_context("%s", client_test_name);
status = I_RpcBindingInqLocalClientPID(NULL, &pid);
todo_wine
ok(status == RPC_S_NO_CALL_ACTIVE, "Got unexpected %ld.\n", status);
/* Other protocol sequences throw exceptions */
if (params->protseq == RPC_PROTSEQ_LRPC)
{
status = I_RpcBindingInqLocalClientPID(params->binding, &pid);
todo_wine
ok(status == RPC_S_OK, "Got unexpected %ld.\n", status);
todo_wine
ok(pid == client_info.dwProcessId, "Got unexpected pid.\n");
}
winetest_pop_context();
return 0;
}
void __cdecl s_test_I_RpcBindingInqLocalClientPID(unsigned int protseq, RPC_BINDING_HANDLE binding)
{
struct test_thread_params params;
RPC_STATUS status;
HANDLE thread;
ULONG pid;
winetest_push_context("%s", client_test_name);
/* Crash on Windows */
if (0)
{
status = I_RpcBindingInqLocalClientPID(NULL, NULL);
ok(status == RPC_S_INVALID_ARG, "Got unexpected %ld.\n", status);
status = I_RpcBindingInqLocalClientPID(binding, NULL);
ok(status == RPC_S_INVALID_ARG, "Got unexpected %ld.\n", status);
}
status = I_RpcBindingInqLocalClientPID(NULL, &pid);
if (protseq == RPC_PROTSEQ_LRPC)
{
todo_wine
ok(status == RPC_S_OK, "Got unexpected %ld.\n", status);
todo_wine
ok(pid == client_info.dwProcessId, "Got unexpected pid.\n");
}
else
{
ok(status == RPC_S_INVALID_BINDING, "Got unexpected %ld.\n", status);
}
if (protseq == RPC_PROTSEQ_LRPC) /* Other protocol sequences throw exceptions */
{
status = I_RpcBindingInqLocalClientPID(binding, &pid);
todo_wine
ok(status == RPC_S_OK, "Got unexpected %ld.\n", status);
todo_wine
ok(pid == client_info.dwProcessId, "Got unexpected pid.\n");
}
params.protseq = protseq;
params.binding = binding;
thread = CreateThread(NULL, 0, test_I_RpcBindingInqLocalClientPID_thread_func, &params, 0, NULL);
WaitForSingleObject(thread, INFINITE);
CloseHandle(thread);
winetest_pop_context();
}
void __RPC_USER ctx_handle_t_rundown(ctx_handle_t ctx_handle)
{
ok(ctx_handle == (ctx_handle_t)0xdeadbeef, "Unexpected ctx_handle %p\n", ctx_handle);
......@@ -1137,17 +1222,17 @@ static void
run_client(const char *test)
{
char cmdline[MAX_PATH];
PROCESS_INFORMATION info;
STARTUPINFOA startup;
memset(&startup, 0, sizeof startup);
startup.cb = sizeof startup;
client_test_name = test;
make_cmdline(cmdline, test);
ok(CreateProcessA(NULL, cmdline, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n");
wait_child_process( info.hProcess );
ok(CloseHandle(info.hProcess), "CloseHandle\n");
ok(CloseHandle(info.hThread), "CloseHandle\n");
ok(CreateProcessA(NULL, cmdline, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &client_info), "CreateProcess\n");
wait_child_process(client_info.hProcess);
ok(CloseHandle(client_info.hProcess), "CloseHandle\n");
ok(CloseHandle(client_info.hThread), "CloseHandle\n");
}
static void
......@@ -1964,6 +2049,7 @@ client(const char *test)
run_tests();
authinfo_test(RPC_PROTSEQ_TCP, 0);
test_I_RpcBindingInqLocalClientPID(RPC_PROTSEQ_TCP, IMixedServer_IfHandle);
test_is_server_listening2(IMixedServer_IfHandle, RPC_S_OK, RPC_S_ACCESS_DENIED);
ok(RPC_S_OK == RpcStringFreeA(&binding), "RpcStringFree\n");
......@@ -1976,6 +2062,7 @@ client(const char *test)
set_auth_info(IMixedServer_IfHandle);
authinfo_test(RPC_PROTSEQ_TCP, 1);
test_I_RpcBindingInqLocalClientPID(RPC_PROTSEQ_TCP, IMixedServer_IfHandle);
test_is_server_listening(IMixedServer_IfHandle, RPC_S_ACCESS_DENIED);
ok(RPC_S_OK == RpcStringFreeA(&binding), "RpcStringFree\n");
......@@ -1988,6 +2075,7 @@ client(const char *test)
run_tests(); /* can cause RPC_X_BAD_STUB_DATA exception */
authinfo_test(RPC_PROTSEQ_LRPC, 0);
test_I_RpcBindingInqLocalClientPID(RPC_PROTSEQ_LRPC, IMixedServer_IfHandle);
test_is_server_listening(IMixedServer_IfHandle, RPC_S_OK);
ok(RPC_S_OK == RpcStringFreeA(&binding), "RpcStringFree\n");
......@@ -2000,6 +2088,7 @@ client(const char *test)
run_tests();
authinfo_test(RPC_PROTSEQ_LRPC, 0);
test_I_RpcBindingInqLocalClientPID(RPC_PROTSEQ_LRPC, IMixedServer_IfHandle);
todo_wine
test_is_server_listening(IMixedServer_IfHandle, RPC_S_NOT_LISTENING);
......@@ -2016,6 +2105,7 @@ client(const char *test)
set_auth_info(IMixedServer_IfHandle);
authinfo_test(RPC_PROTSEQ_LRPC, 1);
test_I_RpcBindingInqLocalClientPID(RPC_PROTSEQ_LRPC, IMixedServer_IfHandle);
test_is_server_listening(IMixedServer_IfHandle, RPC_S_OK);
ok(RPC_S_OK == RpcStringFreeA(&binding), "RpcStringFree\n");
......@@ -2029,6 +2119,7 @@ client(const char *test)
test_is_server_listening(IMixedServer_IfHandle, RPC_S_OK);
run_tests();
authinfo_test(RPC_PROTSEQ_NMP, 0);
test_I_RpcBindingInqLocalClientPID(RPC_PROTSEQ_NMP, IMixedServer_IfHandle);
test_is_server_listening(IMixedServer_IfHandle, RPC_S_OK);
stop();
test_is_server_listening(IMixedServer_IfHandle, RPC_S_NOT_LISTENING);
......@@ -2046,6 +2137,7 @@ client(const char *test)
test_is_server_listening(IInterpServer_IfHandle, RPC_S_OK);
run_tests();
authinfo_test(RPC_PROTSEQ_NMP, 0);
test_I_RpcBindingInqLocalClientPID(RPC_PROTSEQ_NMP, IInterpServer_IfHandle);
test_is_server_listening(IInterpServer_IfHandle, RPC_S_OK);
ok(RPC_S_OK == RpcStringFreeA(&binding), "RpcStringFree\n");
......
......@@ -485,4 +485,6 @@ cpp_quote("#endif")
ctx_handle_t get_handle();
void get_handle_by_ptr([out] ctx_handle_t *r);
void test_handle(ctx_handle_t ctx_handle);
void test_I_RpcBindingInqLocalClientPID([in] unsigned int protseq, [in] handle_t binding);
}
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