summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/torture/rap/printing.c110
1 files changed, 98 insertions, 12 deletions
diff --git a/source4/torture/rap/printing.c b/source4/torture/rap/printing.c
index 72adb40c68..e18378d5c2 100644
--- a/source4/torture/rap/printing.c
+++ b/source4/torture/rap/printing.c
@@ -34,15 +34,17 @@
#define TORTURE_PRINT_FILE "torture_print_file"
-static bool test_raw_print(struct torture_context *tctx,
- struct smbcli_state *cli)
+static bool print_printjob(struct torture_context *tctx,
+ struct smbcli_tree *tree)
{
int fnum;
DATA_BLOB data;
ssize_t size_written;
const char *str;
- fnum = smbcli_open(cli->tree, TORTURE_PRINT_FILE, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE);
+ torture_comment(tctx, "creating printjob %s\n", TORTURE_PRINT_FILE);
+
+ fnum = smbcli_open(tree, TORTURE_PRINT_FILE, O_RDWR|O_CREAT|O_TRUNC, DENY_NONE);
if (fnum == -1) {
torture_fail(tctx, "failed to open file");
}
@@ -51,18 +53,24 @@ static bool test_raw_print(struct torture_context *tctx,
data = data_blob_string_const(str);
- size_written = smbcli_write(cli->tree, fnum, 0, data.data, 0, data.length);
+ size_written = smbcli_write(tree, fnum, 0, data.data, 0, data.length);
if (size_written != data.length) {
torture_fail(tctx, "failed to write file");
}
torture_assert_ntstatus_ok(tctx,
- smbcli_close(cli->tree, fnum),
+ smbcli_close(tree, fnum),
"failed to close file");
return true;
}
+static bool test_raw_print(struct torture_context *tctx,
+ struct smbcli_state *cli)
+{
+ return print_printjob(tctx, cli->tree);
+}
+
static bool test_netprintqenum(struct torture_context *tctx,
struct smbcli_state *cli)
{
@@ -267,6 +275,36 @@ static bool test_netprintq(struct torture_context *tctx,
return true;
}
+static bool test_netprintjobenum_args(struct torture_context *tctx,
+ struct smbcli_state *cli,
+ const char *PrintQueueName,
+ uint16_t level,
+ uint16_t *count_p,
+ union rap_printj_info **info_p)
+{
+ struct rap_NetPrintJobEnum r;
+
+ r.in.PrintQueueName = PrintQueueName;
+ r.in.bufsize = 8192;
+ r.in.level = level;
+
+ torture_comment(tctx,
+ "Testing rap_NetPrintJobEnum(%s) level %d\n", r.in.PrintQueueName, r.in.level);
+
+ torture_assert_ntstatus_ok(tctx,
+ smbcli_rap_netprintjobenum(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r),
+ "smbcli_rap_netprintjobenum failed");
+
+ if (count_p) {
+ *count_p = r.out.count;
+ }
+ if (info_p) {
+ *info_p = r.out.info;
+ }
+
+ return true;
+}
+
static bool test_netprintjobenum_one(struct torture_context *tctx,
struct smbcli_state *cli,
const char *PrintQueueName)
@@ -551,13 +589,61 @@ static bool test_netprintdestgetinfo(struct torture_context *tctx,
static bool test_rap_print(struct torture_context *tctx,
struct smbcli_state *cli)
{
- /*
- pause printer
- print printfile
- enumjobs printer
- delete job
- start printer
- */
+ struct rap_NetPrintQEnum r;
+ int i;
+
+ r.in.level = 5;
+ r.in.bufsize = 8192;
+
+ torture_assert_ntstatus_ok(tctx,
+ smbcli_rap_netprintqenum(cli->tree, lp_iconv_convenience(tctx->lp_ctx), tctx, &r),
+ "failed to enum printq");
+
+ for (i=0; i < r.out.count; i++) {
+
+ const char *printqname = r.out.info[i].info5.PrintQueueName;
+ struct smbcli_tree *res_queue = NULL;
+ uint16_t num_jobs;
+ union rap_printj_info *job_info;
+ int j;
+
+ torture_assert(tctx,
+ test_netprintq_pause(tctx, cli, printqname),
+ "failed to set printjobs on print queue");
+
+ torture_assert_ntstatus_ok(tctx,
+ torture_second_tcon(tctx, cli->session, printqname, &res_queue),
+ "failed to open 2nd connection");
+
+ torture_assert(tctx,
+ print_printjob(tctx, res_queue),
+ "failed to print job on 2nd connection");
+
+ talloc_free(res_queue);
+
+ torture_assert(tctx,
+ test_netprintjobenum_args(tctx, cli, printqname, 1,
+ &num_jobs, &job_info),
+ "failed to enum printjobs on print queue");
+
+ for (j=0; j < num_jobs; j++) {
+
+ uint16_t job_id = job_info[j].info1.JobID;
+
+ torture_assert(tctx,
+ test_netprintjobgetinfo_byid(tctx, cli, job_id),
+ "failed to getinfo on new printjob");
+
+ torture_assert(tctx,
+ test_netprintjob_delete(tctx, cli, job_id),
+ "failed to delete job");
+ }
+
+ torture_assert(tctx,
+ test_netprintq_resume(tctx, cli, printqname),
+ "failed to resume print queue");
+
+ }
return true;
}