Rob Shearman : rpcrt4: Add test for using a conformant varying structure with pointers.

Alexandre Julliard julliard at winehq.org
Mon Jun 23 07:36:04 CDT 2008


Module: wine
Branch: master
Commit: f82488823bc904a199327b7f3031046d2a01799b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f82488823bc904a199327b7f3031046d2a01799b

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Mon Jun 23 09:25:25 2008 +0100

rpcrt4: Add test for using a conformant varying structure with pointers.

---

 dlls/rpcrt4/tests/server.c   |   35 +++++++++++++++++++++++++++++++++--
 dlls/rpcrt4/tests/server.idl |    9 +++++++++
 2 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/dlls/rpcrt4/tests/server.c b/dlls/rpcrt4/tests/server.c
index 6c0527f..91c87bf 100644
--- a/dlls/rpcrt4/tests/server.c
+++ b/dlls/rpcrt4/tests/server.c
@@ -654,6 +654,24 @@ s_get_numbers(int length, int size, pints_t n[])
 }
 
 void
+s_get_numbers_struct(numbers_struct_t **ns)
+{
+    int i;
+    *ns = midl_user_allocate(FIELD_OFFSET(numbers_struct_t, numbers[5]));
+    if (!*ns) return;
+    (*ns)->length = 5;
+    (*ns)->size = 5;
+    for (i = 0; i < (*ns)->length; i++)
+    {
+        (*ns)->numbers[i].pi = NULL;
+        (*ns)->numbers[i].ppi = NULL;
+        (*ns)->numbers[i].pppi = NULL;
+    }
+    (*ns)->numbers[0].pi = midl_user_allocate(sizeof(*(*ns)->numbers[i].pi));
+    *(*ns)->numbers[0].pi = 5;
+}
+
+void
 s_stop(void)
 {
   ok(RPC_S_OK == RpcMgmtStopServerListening(NULL), "RpcMgmtStopServerListening\n");
@@ -1096,6 +1114,7 @@ array_tests(void)
   doub_carr_t *dc;
   int *pi;
   pints_t api[5];
+  numbers_struct_t *ns;
 
   ok(cstr_length(str1, sizeof str1) == strlen(str1), "RPC cstr_length\n");
 
@@ -1177,12 +1196,24 @@ array_tests(void)
   api[0].pi = pi;
   get_5numbers(1, api);
   ok(api[0].pi == pi, "RPC varying array [out] pointer changed from %p to %p\n", pi, api[0].pi);
-  ok(*api[0].pi == 0, "pi unmarshalled incorrectly %d\n", *pi);
+  ok(*api[0].pi == 0, "pi unmarshalled incorrectly %d\n", *api[0].pi);
 
   api[0].pi = pi;
   get_numbers(1, 1, api);
   ok(api[0].pi == pi, "RPC conformant varying array [out] pointer changed from %p to %p\n", pi, api[0].pi);
-  ok(*api[0].pi == 0, "pi unmarshalled incorrectly %d\n", *pi);
+  ok(*api[0].pi == 0, "pi unmarshalled incorrectly %d\n", *api[0].pi);
+
+  ns = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, FIELD_OFFSET(numbers_struct_t, numbers[5]));
+  ns->length = 5;
+  ns->size = 5;
+  ns->numbers[0].pi = pi;
+  get_numbers_struct(&ns);
+  todo_wine {
+  ok(ns->numbers[0].pi == pi, "RPC conformant varying struct embedded pointer changed from %p to %p\n", pi, ns->numbers[0].pi);
+  }
+  ok(*ns->numbers[0].pi == 5, "pi unmarshalled incorrectly %d\n", *ns->numbers[0].pi);
+
+  HeapFree(GetProcessHeap(), 0, ns);
   HeapFree(GetProcessHeap(), 0, pi);
 }
 
diff --git a/dlls/rpcrt4/tests/server.idl b/dlls/rpcrt4/tests/server.idl
index 33e3a48..378b205 100644
--- a/dlls/rpcrt4/tests/server.idl
+++ b/dlls/rpcrt4/tests/server.idl
@@ -319,8 +319,17 @@ cpp_quote("#endif")
      type as a return value.  */
   s123_t *get_s123(void);
 
+  typedef struct
+  {
+    unsigned int length;
+    unsigned int size;
+    [size_is(size), length_is(length)] pints_t numbers[];
+  } numbers_struct_t;
+
   void get_5numbers([in] int count, [out, length_is(count)] pints_t pn[5]);
   void get_numbers([in] int length, [in] int size, [out, length_is(length), size_is(size)] pints_t pn[]);
+  void get_numbers_struct([out] numbers_struct_t **ns);
+
   str_t get_filename(void);
   void context_handle_test(void);
   void stop(void);




More information about the wine-cvs mailing list