summaryrefslogtreecommitdiffstats
path: root/source4
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2009-12-15 22:26:39 +0100
committerKarolin Seeger <kseeger@samba.org>2009-12-21 10:55:05 +0100
commite5f37cd4579be66187ed9a416e8cdff0cbda0406 (patch)
tree6331366999502caf0a2615be66e0c89213870129 /source4
parentcf8907ced2481857f7388cb0517eb93901ef5ada (diff)
downloadsamba-e5f37cd4579be66187ed9a416e8cdff0cbda0406.tar.gz
samba-e5f37cd4579be66187ed9a416e8cdff0cbda0406.tar.xz
samba-e5f37cd4579be66187ed9a416e8cdff0cbda0406.zip
s4-smbtorture: run GetPrinterDriver2 tests against each printer's driver.
Guenther (cherry picked from commit 308b50a7bb07a7db6d2119f9ff08f33fce922562) (cherry picked from commit ea7442720fbde39817abf9a6f312a940d634e6d8)
Diffstat (limited to 'source4')
-rw-r--r--source4/torture/rpc/spoolss.c62
1 files changed, 45 insertions, 17 deletions
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index 772ca09f134..91364541d0c 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -860,6 +860,11 @@ static bool test_EnumPrinters(struct torture_context *tctx,
return true;
}
+static bool test_GetPrinterDriver2(struct torture_context *tctx,
+ struct dcerpc_pipe *p,
+ struct policy_handle *handle,
+ const char *driver_name);
+
static bool test_GetPrinter(struct torture_context *tctx,
struct dcerpc_pipe *p,
struct policy_handle *handle)
@@ -895,6 +900,12 @@ static bool test_GetPrinter(struct torture_context *tctx,
torture_assert_werr_ok(tctx, r.out.result, "GetPrinter failed");
CHECK_NEEDED_SIZE_LEVEL(spoolss_PrinterInfo, r.out.info, r.in.level, lp_iconv_convenience(tctx->lp_ctx), needed, 4);
+
+ if ((r.in.level == 2) && r.out.info->info2.drivername && strlen(r.out.info->info2.drivername)) {
+ torture_assert(tctx,
+ test_GetPrinterDriver2(tctx, p, handle, r.out.info->info2.drivername),
+ "failed to call test_GetPrinterDriver2");
+ }
}
return true;
@@ -2965,38 +2976,55 @@ static bool test_GetPrinterDriver2(struct torture_context *tctx,
const char *driver_name)
{
struct spoolss_GetPrinterDriver2 r;
+ uint16_t levels[] = {1, 2, 3, 4, 5, 6, 8, 101 };
uint32_t needed;
uint32_t server_major_version;
uint32_t server_minor_version;
+ int i;
r.in.handle = handle;
- r.in.architecture = "W32X86";
- r.in.level = 1;
- r.in.buffer = NULL;
- r.in.offered = 0;
- r.in.client_major_version = 0;
+ r.in.architecture = SPOOLSS_ARCHITECTURE_NT_X86;
+ r.in.client_major_version = 3;
r.in.client_minor_version = 0;
r.out.needed = &needed;
r.out.server_major_version = &server_major_version;
r.out.server_minor_version = &server_minor_version;
- torture_comment(tctx, "Testing GetPrinterDriver2 level %d\n", r.in.level);
+ for (i=0;i<ARRAY_SIZE(levels);i++) {
+
+ r.in.buffer = NULL;
+ r.in.offered = 0;
+ r.in.level = levels[i];
+
+ torture_comment(tctx, "Testing GetPrinterDriver2(%s) level %d\n",
+ driver_name, r.in.level);
- torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_GetPrinterDriver2(p, tctx, &r),
- "failed to call GetPrinterDriver2");
- if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
- DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
- data_blob_clear(&blob);
- r.in.buffer = &blob;
- r.in.offered = needed;
torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_GetPrinterDriver2(p, tctx, &r),
"failed to call GetPrinterDriver2");
- }
+ if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
+ DATA_BLOB blob = data_blob_talloc(tctx, NULL, needed);
+ data_blob_clear(&blob);
+ r.in.buffer = &blob;
+ r.in.offered = needed;
+ torture_assert_ntstatus_ok(tctx, dcerpc_spoolss_GetPrinterDriver2(p, tctx, &r),
+ "failed to call GetPrinterDriver2");
+ }
- torture_assert_werr_ok(tctx, r.out.result,
- "failed to call GetPrinterDriver2");
+ if (W_ERROR_EQUAL(r.out.result, WERR_INVALID_LEVEL)) {
+ switch (r.in.level) {
+ case 101:
+ case 8:
+ continue;
+ default:
+ break;
+ }
+ }
- CHECK_NEEDED_SIZE_LEVEL(spoolss_DriverInfo, r.out.info, r.in.level, lp_iconv_convenience(tctx->lp_ctx), needed, 4);
+ torture_assert_werr_ok(tctx, r.out.result,
+ "failed to call GetPrinterDriver2");
+
+ CHECK_NEEDED_SIZE_LEVEL(spoolss_DriverInfo, r.out.info, r.in.level, lp_iconv_convenience(tctx->lp_ctx), needed, 4);
+ }
return true;
}