Zhiyi Zhang : rpcrt4/tests: Add I_RpcBindingInqLocalClientPID() tests.
Alexandre Julliard
julliard at winehq.org
Mon Jul 18 15:47:02 CDT 2022
Module: wine
Branch: master
Commit: 056dbb04dea4d0b990e0177f63475165f56ba8da
URL: https://gitlab.winehq.org/wine/wine/-/commit/056dbb04dea4d0b990e0177f63475165f56ba8da
Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date: Mon May 23 17:46:03 2022 +0800
rpcrt4/tests: Add I_RpcBindingInqLocalClientPID() tests.
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
dlls/rpcrt4/tests/server.c | 106 ++++++++++++++++++++++++++++++++++++++++---
dlls/rpcrt4/tests/server.idl | 2 +
2 files changed, 101 insertions(+), 7 deletions(-)
diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c
index 253fd817a48..7fdb076bc73 100644
--- a/dlls/rpcrt4/tests/server.c
+++ b/dlls/rpcrt4/tests/server.c
@@ -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, ¶ms, 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");
diff --git a/dlls/rpcrt4/tests/server.idl b/dlls/rpcrt4/tests/server.idl
index 4d945dcca3e..8de5dce5d4e 100644
--- a/dlls/rpcrt4/tests/server.idl
+++ b/dlls/rpcrt4/tests/server.idl
@@ -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);
}
More information about the wine-cvs
mailing list