The branch, master has been updated
       via  09ea04a... s4-smbtorture: add extended SetValue test to RPC-WINREG.
       via  3a8d85d... s4-smbtorture: more work on test_key_value() RPC-WINREG 
test.
      from  b789814... s3: Make init_smb_request return bool

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 09ea04a7f8edc407761450d30fe9a54cac0d7133
Author: Günther Deschner <[email protected]>
Date:   Thu Mar 11 18:52:38 2010 +0100

    s4-smbtorture: add extended SetValue test to RPC-WINREG.
    
    Really looks like a blob based database frontend.
    
    As it seems, we can set *any* type of data with *any* content on Windows 
and get
    the exact same data back.
    
    Guenther

commit 3a8d85da688bc681e8d80ecde75ea318615fe659
Author: Günther Deschner <[email protected]>
Date:   Thu Mar 11 18:37:02 2010 +0100

    s4-smbtorture: more work on test_key_value() RPC-WINREG test.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source4/torture/rpc/spoolss.c |   16 ++--
 source4/torture/rpc/winreg.c  |  167 +++++++++++++++++++++++++++++++++++++----
 2 files changed, 159 insertions(+), 24 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index c66ca84..d5dfee9 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -3340,14 +3340,14 @@ static bool test_winreg_CloseKey(struct torture_context 
*tctx,
        return true;
 }
 
-static bool test_winreg_QueryValue(struct torture_context *tctx,
-                                  struct dcerpc_pipe *p,
-                                  struct policy_handle *handle,
-                                  const char *value_name,
-                                  enum winreg_Type *type_p,
-                                  uint32_t *data_size_p,
-                                  uint32_t *data_length_p,
-                                  uint8_t **data_p)
+bool test_winreg_QueryValue(struct torture_context *tctx,
+                           struct dcerpc_pipe *p,
+                           struct policy_handle *handle,
+                           const char *value_name,
+                           enum winreg_Type *type_p,
+                           uint32_t *data_size_p,
+                           uint32_t *data_length_p,
+                           uint8_t **data_p)
 {
        struct winreg_QueryValue r;
        enum winreg_Type type = REG_NONE;
diff --git a/source4/torture/rpc/winreg.c b/source4/torture/rpc/winreg.c
index 9ed0c7b..486826c 100644
--- a/source4/torture/rpc/winreg.c
+++ b/source4/torture/rpc/winreg.c
@@ -25,6 +25,8 @@
 #include "librpc/gen_ndr/ndr_security.h"
 #include "libcli/security/security.h"
 #include "torture/rpc/rpc.h"
+#include "param/param.h"
+#include "lib/registry/registry.h"
 
 #define TEST_KEY_BASE "smbtorture test"
 #define TEST_KEY1 TEST_KEY_BASE "\\spottyfoot"
@@ -1441,7 +1443,8 @@ static bool test_SetValue(struct dcerpc_pipe *p,
        struct winreg_SetValue r;
        struct winreg_String name;
 
-       torture_comment(tctx, "Testing SetValue(%s)\n", value_name);
+       torture_comment(tctx, "Testing SetValue(%s), type: %s, offered: 
0x%08x)\n",
+               value_name, str_regtype(type), size);
 
        init_winreg_String(&name, value_name);
 
@@ -1854,23 +1857,84 @@ static bool test_key(struct dcerpc_pipe *p, struct 
torture_context *tctx,
        return true;
 }
 
-static bool test_key_value(struct dcerpc_pipe *p,
-                          struct torture_context *tctx,
-                          struct policy_handle *handle)
+static bool test_SetValue_simple(struct dcerpc_pipe *p,
+                                struct torture_context *tctx,
+                                struct policy_handle *handle)
 {
        const char *value_name = TEST_VALUE;
-       enum winreg_Type type = REG_DWORD;
        uint32_t value = 0x12345678;
+       const char *string = "torture";
+       DATA_BLOB blob;
+       enum winreg_Type types[] = {
+               REG_DWORD,
+               REG_BINARY,
+               REG_SZ,
+               REG_MULTI_SZ
+       };
+       int t;
+
+       torture_comment(tctx, "Testing SetValue (standard formats)\n");
+
+       for (t=0; t < ARRAY_SIZE(types); t++) {
+
+               enum winreg_Type w_type;
+               uint32_t w_size, w_length;
+               uint8_t *w_data;
+
+               switch (types[t]) {
+               case REG_DWORD:
+                       blob = data_blob_talloc_zero(tctx, 4);
+                       SIVAL(blob.data, 0, value);
+                       break;
+               case REG_BINARY:
+                       blob = data_blob_string_const("binary_blob");
+                       break;
+               case REG_SZ:
+                       torture_assert(tctx,
+                               convert_string_talloc_convenience(tctx, 
lp_iconv_convenience(tctx->lp_ctx),
+                                                                 CH_UNIX, 
CH_UTF16,
+                                                                 string,
+                                                                 
strlen(string)+1,
+                                                                 (void 
**)&blob.data,
+                                                                 &blob.length,
+                                                                 false), "");
+                       break;
+               case REG_MULTI_SZ:
+                       torture_assert(tctx,
+                               convert_string_talloc_convenience(tctx, 
lp_iconv_convenience(tctx->lp_ctx),
+                                                                 CH_UNIX, 
CH_UTF16,
+                                                                 string,
+                                                                 
strlen(string)+1,
+                                                                 (void 
**)&blob.data,
+                                                                 &blob.length,
+                                                                 false), "");
+                       torture_assert(tctx, data_blob_realloc(tctx, &blob, 
blob.length + 2), "");
+                       memset(&blob.data[blob.length - 2], '\0', 2);
+                       break;
+               default:
+                       break;
+               }
 
-       DATA_BLOB blob = data_blob_talloc_zero(tctx, 4);
-       SIVAL(blob.data, 0, value);
+               torture_assert(tctx,
+                       test_SetValue(p, tctx, handle, value_name, types[t], 
blob.data, blob.length),
+                       "test_SetValue failed");
+               torture_assert(tctx,
+                       test_QueryValue_full(p, tctx, handle, value_name, true),
+                       talloc_asprintf(tctx, "test_QueryValue_full for %s 
value failed", value_name));
+               torture_assert(tctx,
+                       test_winreg_QueryValue(tctx, p, handle, value_name, 
&w_type, &w_size, &w_length, &w_data),
+                       "test_winreg_QueryValue failed");
+               torture_assert(tctx,
+                       test_DeleteValue(p, tctx, handle, value_name),
+                       "test_DeleteValue failed");
 
-       torture_assert(tctx, test_SetValue(p, tctx, handle, value_name, type, 
blob.data, blob.length),
-               "test_SetValue failed");
-       torture_assert(tctx, test_QueryValue_full(p, tctx, handle, value_name, 
true),
-               talloc_asprintf(tctx, "test_QueryValue_full for %s value 
failed", value_name));
-       torture_assert(tctx, test_DeleteValue(p, tctx, handle, value_name),
-               "test_DeleteValue failed");
+               torture_assert_int_equal(tctx, w_type, types[t], "winreg type 
mismatch");
+               torture_assert_int_equal(tctx, w_size, blob.length, "winreg 
size mismatch");
+               torture_assert_int_equal(tctx, w_length, blob.length, "winreg 
length mismatch");
+               torture_assert_mem_equal(tctx, w_data, blob.data, blob.length, 
"winreg buffer mismatch");
+       }
+
+       torture_comment(tctx, "Testing SetValue (standard formats) 
succeeded\n");
 
        return true;
 }
@@ -1951,6 +2015,70 @@ static bool test_Open_Security(struct torture_context 
*tctx,
        return ret;
 }
 
+static bool test_SetValue_extended(struct dcerpc_pipe *p,
+                                  struct torture_context *tctx,
+                                  struct policy_handle *handle)
+{
+       const char *value_name = TEST_VALUE;
+       enum winreg_Type types[] = {
+               REG_NONE,
+               REG_SZ,
+               REG_EXPAND_SZ,
+               REG_BINARY,
+               REG_DWORD,
+               REG_DWORD_BIG_ENDIAN,
+               REG_LINK,
+               REG_MULTI_SZ,
+               REG_RESOURCE_LIST,
+               REG_FULL_RESOURCE_DESCRIPTOR,
+               REG_RESOURCE_REQUIREMENTS_LIST,
+               REG_QWORD,
+               12,
+               13,
+               14,
+               55,
+               123456,
+               653210
+       };
+       const char *str = "abcdefghijklmnopqrstuvwxzy";
+       int t, s;
+
+       torture_comment(tctx, "Testing SetValue (extended formats)\n");
+
+       for (t=0; t < ARRAY_SIZE(types); t++) {
+       for (s=0; s < strlen(str); s++) {
+
+               enum winreg_Type w_type;
+               uint32_t w_size, w_length;
+               uint8_t *w_data;
+
+               const char *string = talloc_strndup(tctx, str, s);
+               DATA_BLOB blob = data_blob_string_const(string);
+
+               torture_assert(tctx,
+                       test_SetValue(p, tctx, handle, value_name, types[t], 
blob.data, blob.length),
+                       "test_SetValue failed");
+
+               torture_assert(tctx,
+                       test_winreg_QueryValue(tctx, p, handle, value_name, 
&w_type, &w_size, &w_length, &w_data),
+                       "test_winreg_QueryValue failed");
+
+               torture_assert(tctx,
+                       test_DeleteValue(p, tctx, handle, value_name),
+                       "test_DeleteValue failed");
+
+               torture_assert_int_equal(tctx, w_type, types[t], "winreg type 
mismatch");
+               torture_assert_int_equal(tctx, w_size, blob.length, "winreg 
size mismatch");
+               torture_assert_int_equal(tctx, w_length, blob.length, "winreg 
length mismatch");
+               torture_assert_mem_equal(tctx, w_data, blob.data, blob.length, 
"winreg buffer mismatch");
+       }
+       }
+
+       torture_comment(tctx, "Testing SetValue (extended formats) 
succeeded\n");
+
+       return true;
+}
+
 #define KEY_CURRENT_VERSION "SOFTWARE\\MICROSOFT\\WINDOWS NT\\CURRENTVERSION"
 #define VALUE_CURRENT_VERSION "CurrentVersion"
 
@@ -2011,9 +2139,16 @@ static bool test_Open(struct torture_context *tctx, 
struct dcerpc_pipe *p,
                torture_fail(tctx,
                             "CreateKey failed (OpenKey after Create didn't 
work)\n");
 
-       if (created && !test_key_value(p, tctx, &newhandle)) {
-               torture_fail(tctx,
-                            "test_key_value failed\n");
+       if (created) {
+               torture_assert(tctx, test_SetValue_simple(p, tctx, &newhandle),
+                       "simple SetValue test failed");
+               if (!test_SetValue_extended(p, tctx, &newhandle)) {
+                       if (torture_setting_bool(tctx, "samba3", false)) {
+                               torture_warning(tctx, "extended SetValue test 
failed");
+                       } else {
+                               torture_fail(tctx, "extended SetValue test 
failed");
+                       }
+               }
        }
 
        if (created && !test_CloseKey(p, tctx, &newhandle))


-- 
Samba Shared Repository

Reply via email to