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, &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");
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