s4:torture: Share test iremotewinspool functions
authorJustin Stephenson <jstephen@redhat.com>
Thu, 23 Aug 2018 17:16:40 +0000 (13:16 -0400)
committerBjoern Jacke <bjacke@samba.org>
Mon, 28 Jan 2019 14:44:18 +0000 (15:44 +0100)
Create iremotewinspool_common.c and iremotewinspool_common.h to make
test functions available for additional tests

Signed-off-by: Justin Stephenson <jstephen@redhat.com>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Bjoern Jacke <bjacke@samba.org>
source4/torture/rpc/iremotewinspool.c
source4/torture/rpc/iremotewinspool_common.c [new file with mode: 0644]
source4/torture/rpc/iremotewinspool_common.h [new file with mode: 0644]
source4/torture/wscript_build

index b4dbe71160e555ca53082c44226b26e08c6b042b..03613b443e3f0760771bd4c081eaf5d0fa8a302b 100644 (file)
 #include "librpc/gen_ndr/ndr_spoolss_c.h"
 #include "torture/rpc/torture_rpc.h"
 #include "libcli/registry/util_reg.h"
-
-struct test_iremotewinspool_context {
-       struct GUID object_uuid;
-       struct dcerpc_pipe *iremotewinspool_pipe;
-       struct policy_handle server_handle;
-       const char *environment;
-};
-
-enum client_os_version
-{
-       WIN_2000,
-       WIN_VISTA,
-       WIN_SERVER_2008,
-       WIN_7,
-       WIN_SERVER_2008R2,
-       WIN_8,
-       WIN_SERVER_2012,
-       WIN_10,
-       WIN_SERVER_2016
-};
-
-static struct spoolss_UserLevel1 test_get_client_info(struct torture_context *tctx,
-                                                     enum client_os_version os,
-                                                     enum spoolss_MajorVersion major_number,
-                                                     enum spoolss_MinorVersion minor_number)
-{
-       struct spoolss_UserLevel1 level1;
-
-       level1.size     = 28;
-       level1.client   = talloc_asprintf(tctx, "\\\\%s", "mthelena");
-       level1.user     = "GD";
-       level1.processor = PROCESSOR_ARCHITECTURE_AMD64;
-       level1.major    = major_number;
-       level1.minor    = minor_number;
-
-       switch (os) {
-               case WIN_SERVER_2016:
-               case WIN_10:
-                       level1.build = 10586;
-                       break;
-               case WIN_SERVER_2012:
-               case WIN_8:
-                       level1.build = 9200;
-                       break;
-               case WIN_SERVER_2008R2:
-               case WIN_7:
-                       level1.build = 7007;
-                       break;
-               case WIN_SERVER_2008:
-               case WIN_VISTA:
-                       level1.build = 6000;
-                       break;
-               case WIN_2000:
-                       level1.build = 1382;
-                       break;
-               default:
-                       level1.build = 7007;
-       }
-
-       return level1;
-}
-
-static bool test_AsyncOpenPrinter_byprinter(struct torture_context *tctx,
-                                           struct test_iremotewinspool_context *ctx,
-                                           struct dcerpc_pipe *p,
-                                           const char *printer_name,
-                                           struct spoolss_UserLevel1 cinfo,
-                                           struct policy_handle *handle)
-{
-       struct dcerpc_binding_handle *b = p->binding_handle;
-       struct spoolss_DevmodeContainer devmode_ctr;
-       struct spoolss_UserLevelCtr client_info_ctr;
-       uint32_t access_mask = SERVER_ALL_ACCESS;
-       struct winspool_AsyncOpenPrinter r;
-
-       ZERO_STRUCT(devmode_ctr);
-
-       client_info_ctr.level = 1;
-       client_info_ctr.user_info.level1 = &cinfo;
-
-       r.in.pPrinterName       = printer_name;
-       r.in.pDatatype          = NULL;
-       r.in.pDevModeContainer  = &devmode_ctr;
-       r.in.AccessRequired     = access_mask;
-       r.in.pClientInfo        = &client_info_ctr;
-       r.out.pHandle           = handle;
-
-       torture_assert_ntstatus_ok(tctx,
-               dcerpc_winspool_AsyncOpenPrinter_r(b, tctx, &r),
-               "AsyncOpenPrinter failed");
-       torture_assert_werr_ok(tctx, r.out.result,
-               "AsyncOpenPrinter failed");
-
-       return true;
-}
-
-static bool test_AsyncClosePrinter_byhandle(struct torture_context *tctx,
-                                           struct test_iremotewinspool_context *ctx,
-                                           struct dcerpc_pipe *p,
-                                           struct policy_handle *handle)
-{
-       struct dcerpc_binding_handle *b = p->binding_handle;
-
-       struct winspool_AsyncClosePrinter r;
-
-       r.in.phPrinter = handle;
-       r.out.phPrinter = handle;
-
-       torture_assert_ntstatus_ok(tctx,
-               dcerpc_winspool_AsyncClosePrinter_r(b, tctx, &r),
-               "AsyncClosePrinter failed");
-       torture_assert_werr_ok(tctx, r.out.result,
-               "AsyncClosePrinter failed");
-
-       return true;
-}
-
-static bool test_AsyncGetPrinterData_checktype(struct torture_context *tctx,
-                                              struct dcerpc_binding_handle *b,
-                                              struct policy_handle *handle,
-                                              const char *value_name,
-                                              enum winreg_Type *expected_type,
-                                              enum winreg_Type *type_p,
-                                              uint8_t **data_p,
-                                              uint32_t *needed_p)
-{
-       struct winspool_AsyncGetPrinterData r;
-       enum winreg_Type type;
-       uint32_t needed;
-
-       r.in.hPrinter = *handle;
-       r.in.pValueName = value_name;
-       r.in.nSize = 0;
-       r.out.pType = &type;
-       r.out.pData = talloc_zero_array(tctx, uint8_t, r.in.nSize);
-       r.out.pcbNeeded = &needed;
-
-       torture_comment(tctx, "Testing AsyncGetPrinterData(%s)\n",
-               r.in.pValueName);
-
-       torture_assert_ntstatus_ok(tctx,
-               dcerpc_winspool_AsyncGetPrinterData_r(b, tctx, &r),
-               "AsyncGetPrinterData failed");
-
-       if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
-               if (expected_type) {
-                       torture_assert_int_equal(tctx, type, *expected_type, "unexpected type");
-               }
-               r.in.nSize = needed;
-               r.out.pData = talloc_zero_array(tctx, uint8_t, r.in.nSize);
-
-               torture_assert_ntstatus_ok(tctx,
-                       dcerpc_winspool_AsyncGetPrinterData_r(b, tctx, &r),
-                       "AsyncGetPrinterData failed");
-       }
-
-       torture_assert_werr_ok(tctx, r.out.result,
-               "AsyncGetPrinterData failed");
-
-       if (type_p) {
-               *type_p = type;
-       }
-
-       if (data_p) {
-               *data_p = r.out.pData;
-       }
-
-       if (needed_p) {
-               *needed_p = needed;
-       }
-
-       return true;
-}
-
-static bool test_AsyncGetPrinterData_args(struct torture_context *tctx,
-                                         struct dcerpc_binding_handle *b,
-                                         struct policy_handle *handle,
-                                         const char *value_name,
-                                         enum winreg_Type *type_p,
-                                         uint8_t **data_p,
-                                         uint32_t *needed_p)
-{
-       return test_AsyncGetPrinterData_checktype(tctx, b, handle,
-                                                 value_name,
-                                                 NULL,
-                                                 type_p, data_p, needed_p);
-}
-
-static bool test_get_environment(struct torture_context *tctx,
-                                struct dcerpc_binding_handle *b,
-                                struct policy_handle *handle,
-                                const char **architecture)
-{
-       DATA_BLOB blob;
-       enum winreg_Type type;
-       uint8_t *data;
-       uint32_t needed;
-
-       torture_assert(tctx,
-               test_AsyncGetPrinterData_args(tctx, b, handle, "Architecture", &type, &data, &needed),
-               "failed to get Architecture");
-
-       torture_assert_int_equal(tctx, type, REG_SZ, "unexpected type");
-
-       blob = data_blob_const(data, needed);
-
-       torture_assert(tctx,
-               pull_reg_sz(tctx, &blob, architecture),
-               "failed to pull environment");
-
-       return true;
-}
+#include "torture/rpc/iremotewinspool_common.h"
 
 static bool torture_rpc_iremotewinspool_setup_common(struct torture_context *tctx,
                                                     struct test_iremotewinspool_context *t)
diff --git a/source4/torture/rpc/iremotewinspool_common.c b/source4/torture/rpc/iremotewinspool_common.c
new file mode 100644 (file)
index 0000000..e692f27
--- /dev/null
@@ -0,0 +1,188 @@
+#include "includes.h"
+#include "torture/torture.h"
+#include "librpc/gen_ndr/ndr_winspool.h"
+#include "librpc/gen_ndr/ndr_winspool_c.h"
+#include "librpc/gen_ndr/ndr_spoolss_c.h"
+#include "torture/rpc/torture_rpc.h"
+#include "libcli/registry/util_reg.h"
+#include "torture/rpc/iremotewinspool_common.h"
+
+struct spoolss_UserLevel1 test_get_client_info(struct torture_context *tctx,
+                                                     enum client_os_version os,
+                                                     enum spoolss_MajorVersion major_number,
+                                                     enum spoolss_MinorVersion minor_number)
+{
+       struct spoolss_UserLevel1 level1;
+
+       level1.size     = 28;
+       level1.client   = talloc_asprintf(tctx, "\\\\%s", "mthelena");
+       level1.user     = "GD";
+       level1.processor = PROCESSOR_ARCHITECTURE_AMD64;
+       level1.major    = major_number;
+       level1.minor    = minor_number;
+
+       if (os == WIN_SERVER_2016 || os == WIN_10) {
+               level1.build = 10586;
+       } else if (os == WIN_SERVER_2012 || os == WIN_8) {
+               level1.build = 9200;
+       } else if (os == WIN_SERVER_2008R2 || os == WIN_7) {
+               level1.build = 7007;
+       } else if (os == WIN_SERVER_2008 || os == WIN_VISTA) {
+               level1.build = 6000;
+       } else if (os == WIN_2000) {
+               level1.build = 1382;
+       }
+
+       return level1;
+}
+
+bool test_AsyncOpenPrinter_byprinter(struct torture_context *tctx,
+                                           struct test_iremotewinspool_context *ctx,
+                                           struct dcerpc_pipe *p,
+                                           const char *printer_name,
+                                           struct spoolss_UserLevel1 cinfo,
+                                           struct policy_handle *handle)
+{
+       struct dcerpc_binding_handle *b = p->binding_handle;
+       struct spoolss_DevmodeContainer devmode_ctr;
+       struct spoolss_UserLevelCtr client_info_ctr;
+       uint32_t access_mask = SERVER_ALL_ACCESS;
+       struct winspool_AsyncOpenPrinter r;
+
+       ZERO_STRUCT(devmode_ctr);
+
+       client_info_ctr.level = 1;
+       client_info_ctr.user_info.level1 = &cinfo;
+
+       r.in.pPrinterName       = printer_name;
+       r.in.pDatatype          = NULL;
+       r.in.pDevModeContainer  = &devmode_ctr;
+       r.in.AccessRequired     = access_mask;
+       r.in.pClientInfo        = &client_info_ctr;
+       r.out.pHandle           = handle;
+
+       torture_assert_ntstatus_ok(tctx,
+               dcerpc_winspool_AsyncOpenPrinter_r(b, tctx, &r),
+               "AsyncOpenPrinter failed");
+       torture_assert_werr_ok(tctx, r.out.result,
+               "AsyncOpenPrinter failed");
+
+       return true;
+}
+
+bool test_get_environment(struct torture_context *tctx,
+                                struct dcerpc_binding_handle *b,
+                                struct policy_handle *handle,
+                                const char **architecture)
+{
+       DATA_BLOB blob;
+       enum winreg_Type type;
+       uint8_t *data;
+       uint32_t needed;
+
+       torture_assert(tctx,
+               test_AsyncGetPrinterData_args(tctx, b, handle, "Architecture", &type, &data, &needed),
+               "failed to get Architecture");
+
+       torture_assert_int_equal(tctx, type, REG_SZ, "unexpected type");
+
+       blob = data_blob_const(data, needed);
+
+       torture_assert(tctx,
+               pull_reg_sz(tctx, &blob, architecture),
+               "failed to pull environment");
+
+       return true;
+}
+
+bool test_AsyncClosePrinter_byhandle(struct torture_context *tctx,
+                                           struct test_iremotewinspool_context *ctx,
+                                           struct dcerpc_pipe *p,
+                                           struct policy_handle *handle)
+{
+       struct dcerpc_binding_handle *b = p->binding_handle;
+
+       struct winspool_AsyncClosePrinter r;
+
+       r.in.phPrinter = handle;
+       r.out.phPrinter = handle;
+
+       torture_assert_ntstatus_ok(tctx,
+               dcerpc_winspool_AsyncClosePrinter_r(b, tctx, &r),
+               "AsyncClosePrinter failed");
+       torture_assert_werr_ok(tctx, r.out.result,
+               "AsyncClosePrinter failed");
+
+       return true;
+}
+
+static bool test_AsyncGetPrinterData_checktype(struct torture_context *tctx,
+                                              struct dcerpc_binding_handle *b,
+                                              struct policy_handle *handle,
+                                              const char *value_name,
+                                              enum winreg_Type *expected_type,
+                                              enum winreg_Type *type_p,
+                                              uint8_t **data_p,
+                                              uint32_t *needed_p)
+{
+       struct winspool_AsyncGetPrinterData r;
+       enum winreg_Type type;
+       uint32_t needed;
+
+       r.in.hPrinter = *handle;
+       r.in.pValueName = value_name;
+       r.in.nSize = 0;
+       r.out.pType = &type;
+       r.out.pData = talloc_zero_array(tctx, uint8_t, r.in.nSize);
+       r.out.pcbNeeded = &needed;
+
+       torture_comment(tctx, "Testing AsyncGetPrinterData(%s)\n",
+               r.in.pValueName);
+
+       torture_assert_ntstatus_ok(tctx,
+               dcerpc_winspool_AsyncGetPrinterData_r(b, tctx, &r),
+               "AsyncGetPrinterData failed");
+
+       if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) {
+               if (expected_type) {
+                       torture_assert_int_equal(tctx, type, *expected_type, "unexpected type");
+               }
+               r.in.nSize = needed;
+               r.out.pData = talloc_zero_array(tctx, uint8_t, r.in.nSize);
+
+               torture_assert_ntstatus_ok(tctx,
+                       dcerpc_winspool_AsyncGetPrinterData_r(b, tctx, &r),
+                       "AsyncGetPrinterData failed");
+       }
+
+       torture_assert_werr_ok(tctx, r.out.result,
+               "AsyncGetPrinterData failed");
+
+       if (type_p) {
+               *type_p = type;
+       }
+
+       if (data_p) {
+               *data_p = r.out.pData;
+       }
+
+       if (needed_p) {
+               *needed_p = needed;
+       }
+
+       return true;
+}
+
+bool test_AsyncGetPrinterData_args(struct torture_context *tctx,
+                                         struct dcerpc_binding_handle *b,
+                                         struct policy_handle *handle,
+                                         const char *value_name,
+                                         enum winreg_Type *type_p,
+                                         uint8_t **data_p,
+                                         uint32_t *needed_p)
+{
+       return test_AsyncGetPrinterData_checktype(tctx, b, handle,
+                                                 value_name,
+                                                 NULL,
+                                                 type_p, data_p, needed_p);
+}
diff --git a/source4/torture/rpc/iremotewinspool_common.h b/source4/torture/rpc/iremotewinspool_common.h
new file mode 100644 (file)
index 0000000..868d142
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   iremotewinspool rpc test operations
+
+   Copyright (C) 2018 Justin Stephenson
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "torture/rpc/torture_rpc.h"
+
+struct test_iremotewinspool_context {
+       struct GUID object_uuid;
+       struct dcerpc_pipe *iremotewinspool_pipe;
+       struct policy_handle server_handle;
+       const char *environment;
+};
+
+enum client_os_version
+{
+       WIN_2000,
+       WIN_VISTA,
+       WIN_SERVER_2008,
+       WIN_7,
+       WIN_SERVER_2008R2,
+       WIN_8,
+       WIN_SERVER_2012,
+       WIN_10,
+       WIN_SERVER_2016
+};
+
+struct spoolss_UserLevel1 test_get_client_info(struct torture_context *tctx,
+                                                     enum client_os_version os,
+                                                     enum spoolss_MajorVersion major_number,
+                                                     enum spoolss_MinorVersion minor_number);
+
+bool test_AsyncOpenPrinter_byprinter(struct torture_context *tctx,
+                                           struct test_iremotewinspool_context *ctx,
+                                           struct dcerpc_pipe *p,
+                                           const char *printer_name,
+                                           struct spoolss_UserLevel1 cinfo,
+                                           struct policy_handle *handle);
+
+bool test_get_environment(struct torture_context *tctx,
+                                struct dcerpc_binding_handle *b,
+                                struct policy_handle *handle,
+                                const char **architecture);
+
+bool test_AsyncClosePrinter_byhandle(struct torture_context *tctx,
+                                           struct test_iremotewinspool_context *ctx,
+                                           struct dcerpc_pipe *p,
+                                           struct policy_handle *handle);
+
+bool test_AsyncGetPrinterData_args(struct torture_context *tctx,
+                                         struct dcerpc_binding_handle *b,
+                                         struct policy_handle *handle,
+                                         const char *value_name,
+                                         enum winreg_Type *type_p,
+                                         uint8_t **data_p,
+                                         uint32_t *needed_p);
index 8d46d7355bc49159b8e4923d853db474e8a85d2c..c97b7ae034ba36f4f694c23beeef20a3d9c71a0d 100644 (file)
@@ -76,6 +76,11 @@ bld.SAMBA_SUBSYSTEM('TORTURE_NDR',
        enabled=bld.PYTHON_BUILD_IS_ENABLED()
        )
 
+bld.SAMBA_SUBSYSTEM('IREMOTEWINSPOOL_COMMON',
+                    source='rpc/iremotewinspool_common.c',
+                    deps='talloc',
+                    enabled=bld.PYTHON_BUILD_IS_ENABLED())
+
 torture_rpc_backupkey = ''
 if bld.AD_DC_BUILD_IS_ENABLED():
     if bld.CONFIG_SET('HAVE_GNUTLS_3_4_7'):
@@ -185,6 +190,7 @@ bld.SAMBA_MODULE('torture_rpc',
                       RPC_NDR_WITNESS
                       RPC_NDR_BACKUPKEY
                       RPC_NDR_WINSPOOL
+                      IREMOTEWINSPOOL_COMMON
                       ''' % samba_net + ntvfs_specific['deps'],
                  internal_module=True,
                  enabled=bld.PYTHON_BUILD_IS_ENABLED())