2 Unix SMB/CIFS implementation.
3 test suite for spoolss rpc operations
5 Copyright (C) Guenther Deschner 2009-2010
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 /****************************************************************************
22 ****************************************************************************/
28 /****************************************************************************
29 ****************************************************************************/
31 static BOOL test_OpenPrinter(struct torture_context *tctx,
35 torture_comment(tctx, "Testing OpenPrinter(%s)", printername);
37 if (!OpenPrinter(printername, handle, NULL)) {
39 sprintf(tmp, "failed to open printer %s, error was: 0x%08x\n",
40 printername, GetLastError());
41 torture_fail(tctx, tmp);
47 /****************************************************************************
48 ****************************************************************************/
50 static BOOL test_ClosePrinter(struct torture_context *tctx,
53 torture_comment(tctx, "Testing ClosePrinter");
55 if (!ClosePrinter(handle)) {
57 sprintf(tmp, "failed to close printer, error was: %s\n",
58 errstr(GetLastError()));
59 torture_fail(tctx, tmp);
66 /****************************************************************************
67 ****************************************************************************/
69 static BOOL test_EnumPrinters(struct torture_context *tctx,
72 DWORD levels[] = { 1, 2, 5 };
73 DWORD success[] = { 1, 1, 1 };
75 DWORD flags = PRINTER_ENUM_NAME;
78 for (i=0; i < ARRAY_SIZE(levels); i++) {
85 torture_comment(tctx, "Testing EnumPrinters level %d", levels[i]);
87 EnumPrinters(flags, servername, levels[i], NULL, 0, &needed, &returned);
89 if (err == ERROR_INSUFFICIENT_BUFFER) {
91 buffer = malloc(needed);
92 torture_assert(tctx, buffer, "malloc failed");
93 if (!EnumPrinters(flags, servername, levels[i], buffer, needed, &needed, &returned)) {
98 sprintf(tmp, "EnumPrinters failed level %d on [%s] (buffer size = %d), error: %s\n",
99 levels[i], servername, needed, errstr(err));
101 torture_fail(tctx, tmp);
103 torture_warning(tctx, tmp);
108 print_printer_info_bylevel(levels[i], buffer, returned);
118 /****************************************************************************
119 ****************************************************************************/
121 static BOOL test_EnumDrivers(struct torture_context *tctx,
125 DWORD levels[] = { 1, 2, 3, 4, 5, 6 };
126 DWORD success[] = { 1, 1, 1, 1, 1, 1 };
128 LPBYTE buffer = NULL;
130 for (i=0; i < ARRAY_SIZE(levels); i++) {
137 torture_comment(tctx, "Testing EnumPrinterDrivers level %d", levels[i]);
139 EnumPrinterDrivers(servername, architecture, levels[i], NULL, 0, &needed, &returned);
140 err = GetLastError();
141 if (err == ERROR_INSUFFICIENT_BUFFER) {
143 buffer = malloc(needed);
144 torture_assert(tctx, buffer, "malloc failed");
145 if (!EnumPrinterDrivers(servername, architecture, levels[i], buffer, needed, &needed, &returned)) {
146 err = GetLastError();
150 sprintf(tmp, "EnumPrinterDrivers failed level %d on [%s] (buffer size = %d), error: %s\n",
151 levels[i], servername, needed, errstr(err));
153 torture_fail(tctx, tmp);
155 torture_warning(tctx, tmp);
166 /****************************************************************************
167 ****************************************************************************/
169 static BOOL test_EnumForms(struct torture_context *tctx,
173 DWORD levels[] = { 1, 2 };
174 DWORD success[] = { 1, 0 };
176 LPBYTE buffer = NULL;
178 for (i=0; i < ARRAY_SIZE(levels); i++) {
185 torture_comment(tctx, "Testing EnumForms level %d", levels[i]);
187 EnumForms(handle, levels[i], NULL, 0, &needed, &returned);
188 err = GetLastError();
189 if (err == ERROR_INSUFFICIENT_BUFFER) {
191 buffer = malloc(needed);
192 torture_assert(tctx, buffer, "malloc failed");
193 if (!EnumForms(handle, levels[i], buffer, needed, &needed, &returned)) {
194 err = GetLastError();
198 sprintf(tmp, "EnumForms failed level %d on [%s] (buffer size = %d), error: %s\n",
199 levels[i], servername, needed, errstr(err));
201 torture_fail(tctx, tmp);
203 torture_warning(tctx, tmp);
214 /****************************************************************************
215 ****************************************************************************/
217 static BOOL test_EnumPorts(struct torture_context *tctx,
220 DWORD levels[] = { 1, 2 };
221 DWORD success[] = { 1, 1 };
223 LPBYTE buffer = NULL;
225 for (i=0; i < ARRAY_SIZE(levels); i++) {
232 torture_comment(tctx, "Testing EnumPorts level %d", levels[i]);
234 EnumPorts(servername, levels[i], NULL, 0, &needed, &returned);
235 err = GetLastError();
236 if (err == ERROR_INSUFFICIENT_BUFFER) {
238 buffer = malloc(needed);
239 torture_assert(tctx, buffer, "malloc failed");
240 if (!EnumPorts(servername, levels[i], buffer, needed, &needed, &returned)) {
241 err = GetLastError();
245 sprintf(tmp, "EnumPorts failed level %d on [%s] (buffer size = %d), error: %s\n",
246 levels[i], servername, needed, errstr(err));
248 torture_fail(tctx, tmp);
250 torture_warning(tctx, tmp);
261 /****************************************************************************
262 ****************************************************************************/
264 static BOOL test_EnumMonitors(struct torture_context *tctx,
267 DWORD levels[] = { 1, 2 };
268 DWORD success[] = { 1, 1 };
270 LPBYTE buffer = NULL;
272 for (i=0; i < ARRAY_SIZE(levels); i++) {
279 torture_comment(tctx, "Testing EnumMonitors level %d", levels[i]);
281 EnumMonitors(servername, levels[i], NULL, 0, &needed, &returned);
282 err = GetLastError();
283 if (err == ERROR_INSUFFICIENT_BUFFER) {
285 buffer = malloc(needed);
286 torture_assert(tctx, buffer, "malloc failed");
287 if (!EnumMonitors(servername, levels[i], buffer, needed, &needed, &returned)) {
288 err = GetLastError();
292 sprintf(tmp, "EnumMonitors failed level %d on [%s] (buffer size = %d), error: %s\n",
293 levels[i], servername, needed, errstr(err));
295 torture_fail(tctx, tmp);
297 torture_warning(tctx, tmp);
308 /****************************************************************************
309 ****************************************************************************/
311 static BOOL test_EnumPrintProcessors(struct torture_context *tctx,
315 DWORD levels[] = { 1 };
316 DWORD success[] = { 1 };
318 LPBYTE buffer = NULL;
320 for (i=0; i < ARRAY_SIZE(levels); i++) {
327 torture_comment(tctx, "Testing EnumPrintProcessors level %d", levels[i]);
329 EnumPrintProcessors(servername, architecture, levels[i], NULL, 0, &needed, &returned);
330 err = GetLastError();
331 if (err == ERROR_INSUFFICIENT_BUFFER) {
333 buffer = malloc(needed);
334 torture_assert(tctx, buffer, "malloc failed");
335 if (!EnumPrintProcessors(servername, architecture, levels[i], buffer, needed, &needed, &returned)) {
336 err = GetLastError();
340 sprintf(tmp, "EnumPrintProcessors failed level %d on [%s] (buffer size = %d), error: %s\n",
341 levels[i], servername, needed, errstr(err));
343 torture_fail(tctx, tmp);
345 torture_warning(tctx, tmp);
356 /****************************************************************************
357 ****************************************************************************/
359 static BOOL test_EnumPrintProcessorDatatypes(struct torture_context *tctx,
362 DWORD levels[] = { 1 };
363 DWORD success[] = { 1 };
365 LPBYTE buffer = NULL;
367 for (i=0; i < ARRAY_SIZE(levels); i++) {
374 torture_comment(tctx, "Testing EnumPrintProcessorDatatypes level %d", levels[i]);
376 EnumPrintProcessorDatatypes(servername, "winprint", levels[i], NULL, 0, &needed, &returned);
377 err = GetLastError();
378 if (err == ERROR_INSUFFICIENT_BUFFER) {
380 buffer = malloc(needed);
381 torture_assert(tctx, buffer, "malloc failed");
382 if (!EnumPrintProcessorDatatypes(servername, "winprint", levels[i], buffer, needed, &needed, &returned)) {
383 err = GetLastError();
387 sprintf(tmp, "EnumPrintProcessorDatatypes failed level %d on [%s] (buffer size = %d), error: %s\n",
388 levels[i], servername, needed, errstr(err));
390 torture_fail(tctx, tmp);
392 torture_warning(tctx, tmp);
403 /****************************************************************************
404 ****************************************************************************/
406 static BOOL test_EnumPrinterKey(struct torture_context *tctx,
416 torture_comment(tctx, "Testing EnumPrinterKey(%s)", key);
418 err = EnumPrinterKey(handle, key, NULL, 0, &needed);
419 if (err == ERROR_MORE_DATA) {
420 buffer = (LPTSTR)malloc(needed);
421 torture_assert(tctx, buffer, "malloc failed");
422 err = EnumPrinterKey(handle, key, buffer, needed, &needed);
425 sprintf(tmp, "EnumPrinterKey(%s) failed on [%s] (buffer size = %d), error: %s\n",
426 key, servername, needed, errstr(err));
427 torture_fail(tctx, tmp);
431 print_printer_keys(buffer);
439 /****************************************************************************
440 ****************************************************************************/
442 static BOOL test_GetPrinter(struct torture_context *tctx,
446 DWORD levels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
447 DWORD success[] = { 1, 1, 1, 1, 1, 1, 1, 1 };
449 LPBYTE buffer = NULL;
451 for (i=0; i < ARRAY_SIZE(levels); i++) {
457 torture_comment(tctx, "Testing GetPrinter level %d", levels[i]);
459 GetPrinter(handle, levels[i], NULL, 0, &needed);
460 err = GetLastError();
461 if (err == ERROR_INSUFFICIENT_BUFFER) {
463 buffer = malloc(needed);
464 torture_assert(tctx, buffer, "malloc failed");
465 if (!GetPrinter(handle, levels[i], buffer, needed, &needed)) {
466 err = GetLastError();
470 sprintf(tmp, "GetPrinter failed level %d on [%s] (buffer size = %d), error: %s\n",
471 levels[i], printername, needed, errstr(err));
473 torture_fail(tctx, tmp);
475 torture_warning(tctx, tmp);
486 /****************************************************************************
487 ****************************************************************************/
489 static BOOL test_GetPrinterDriver(struct torture_context *tctx,
494 DWORD levels[] = { 1, 2, 3, 4, 5, 6, 8 };
495 DWORD success[] = { 1, 1, 1, 1, 1, 1, 1 };
497 LPBYTE buffer = NULL;
499 for (i=0; i < ARRAY_SIZE(levels); i++) {
505 torture_comment(tctx, "Testing GetPrinterDriver level %d", levels[i]);
507 GetPrinterDriver(handle, architecture, levels[i], NULL, 0, &needed);
508 err = GetLastError();
509 if (err == ERROR_INSUFFICIENT_BUFFER) {
511 buffer = malloc(needed);
512 torture_assert(tctx, buffer, "malloc failed");
513 if (!GetPrinterDriver(handle, architecture, levels[i], buffer, needed, &needed)) {
514 err = GetLastError();
518 sprintf(tmp, "GetPrinterDriver failed level %d on [%s] (buffer size = %d), error: %s\n",
519 levels[i], printername, needed, errstr(err));
521 torture_fail(tctx, tmp);
523 torture_warning(tctx, tmp);
535 /****************************************************************************
536 ****************************************************************************/
538 static BOOL test_EnumJobs(struct torture_context *tctx,
542 DWORD levels[] = { 1, 2, 3, 4 };
543 DWORD success[] = { 1, 1, 1, 1 };
545 LPBYTE buffer = NULL;
547 for (i=0; i < ARRAY_SIZE(levels); i++) {
554 torture_comment(tctx, "Testing EnumJobs level %d", levels[i]);
556 EnumJobs(handle, 0, 100, levels[i], NULL, 0, &needed, &returned);
557 err = GetLastError();
558 if (err == ERROR_INSUFFICIENT_BUFFER) {
560 buffer = malloc(needed);
561 torture_assert(tctx, buffer, "malloc failed");
562 if (!EnumJobs(handle, 0, 100, levels[i], buffer, needed, &needed, &returned)) {
563 err = GetLastError();
567 sprintf(tmp, "EnumJobs failed level %d on [%s] (buffer size = %d), error: %s\n",
568 levels[i], printername, needed, errstr(err));
570 torture_fail(tctx, tmp);
572 torture_warning(tctx, tmp);
583 /****************************************************************************
584 ****************************************************************************/
586 static BOOL test_OnePrinter(struct torture_context *tctx,
593 torture_comment(tctx, "Testing Printer %s", printername);
595 ret &= test_OpenPrinter(tctx, printername, &handle);
596 ret &= test_GetPrinter(tctx, printername, handle);
597 ret &= test_GetPrinterDriver(tctx, printername, architecture, handle);
598 ret &= test_EnumForms(tctx, printername, handle);
599 ret &= test_EnumJobs(tctx, printername, handle);
600 ret &= test_EnumPrinterKey(tctx, printername, handle, "");
601 ret &= test_EnumPrinterKey(tctx, printername, handle, "PrinterDriverData");
602 ret &= test_ClosePrinter(tctx, handle);
607 /****************************************************************************
608 ****************************************************************************/
610 static BOOL test_EachPrinter(struct torture_context *tctx,
619 DWORD flags = PRINTER_ENUM_NAME;
620 PPRINTER_INFO_1 buffer = NULL;
623 torture_comment(tctx, "Testing EnumPrinters level %d", 1);
625 EnumPrinters(flags, servername, 1, NULL, 0, &needed, &returned);
626 err = GetLastError();
627 if (err == ERROR_INSUFFICIENT_BUFFER) {
629 buffer = (PPRINTER_INFO_1)malloc(needed);
630 torture_assert(tctx, buffer, "malloc failed");
631 if (!EnumPrinters(flags, servername, 1, (LPBYTE)buffer, needed, &needed, &returned)) {
632 err = GetLastError();
636 sprintf(tmp, "EnumPrinters failed level %d on [%s] (buffer size = %d), error: %s\n",
637 1, servername, needed, errstr(err));
638 torture_fail(tctx, tmp);
641 for (i=0; i < returned; i++) {
642 ret &= test_OnePrinter(tctx, buffer[i].pName, architecture);
650 /****************************************************************************
651 ****************************************************************************/
653 static BOOL test_GetPrintProcessorDirectory(struct torture_context *tctx,
657 DWORD levels[] = { 1 };
658 DWORD success[] = { 1 };
660 LPBYTE buffer = NULL;
662 for (i=0; i < ARRAY_SIZE(levels); i++) {
668 torture_comment(tctx, "Testing GetPrintProcessorDirectory level %d", levels[i]);
670 GetPrintProcessorDirectory(servername, architecture, levels[i], NULL, 0, &needed);
671 err = GetLastError();
672 if (err == ERROR_INSUFFICIENT_BUFFER) {
674 buffer = malloc(needed);
675 torture_assert(tctx, buffer, "malloc failed");
676 if (!GetPrintProcessorDirectory(servername, architecture, levels[i], buffer, needed, &needed)) {
677 err = GetLastError();
681 sprintf(tmp, "GetPrintProcessorDirectory failed level %d on [%s] (buffer size = %d), error: %s\n",
682 levels[i], servername, needed, errstr(err));
684 torture_fail(tctx, tmp);
686 torture_warning(tctx, tmp);
697 /****************************************************************************
698 ****************************************************************************/
700 static BOOL test_GetPrinterDriverDirectory(struct torture_context *tctx,
704 DWORD levels[] = { 1 };
705 DWORD success[] = { 1 };
707 LPBYTE buffer = NULL;
709 for (i=0; i < ARRAY_SIZE(levels); i++) {
715 torture_comment(tctx, "Testing GetPrinterDriverDirectory level %d", levels[i]);
717 GetPrinterDriverDirectory(servername, architecture, levels[i], NULL, 0, &needed);
718 err = GetLastError();
719 if (err == ERROR_INSUFFICIENT_BUFFER) {
721 buffer = malloc(needed);
722 torture_assert(tctx, buffer, "malloc failed");
723 if (!GetPrinterDriverDirectory(servername, architecture, levels[i], buffer, needed, &needed)) {
724 err = GetLastError();
728 sprintf(tmp, "GetPrinterDriverDirectory failed level %d on [%s] (buffer size = %d), error: %s\n",
729 levels[i], servername, needed, errstr(err));
731 torture_fail(tctx, tmp);
733 torture_warning(tctx, tmp);
745 /****************************************************************************
746 ****************************************************************************/
748 int main(int argc, char *argv[])
752 LPSTR architecture = "Windows NT x86";
753 HANDLE server_handle;
754 struct torture_context *tctx;
757 fprintf(stderr, "usage: %s <servername> [print]\n", argv[0]);
761 tctx = malloc(sizeof(struct torture_context));
763 fprintf(stderr, "out of memory\n");
766 memset(tctx, '\0', sizeof(*tctx));
768 servername = argv[1];
771 if (strcmp(argv[2], "print") == 0) {
776 ret &= test_EnumPrinters(tctx, servername);
777 ret &= test_EnumDrivers(tctx, servername, architecture);
778 ret &= test_OpenPrinter(tctx, servername, &server_handle);
779 /* ret &= test_EnumPrinterKey(tctx, servername, server_handle, ""); */
780 ret &= test_EnumForms(tctx, servername, server_handle);
781 ret &= test_ClosePrinter(tctx, server_handle);
782 ret &= test_EnumPorts(tctx, servername);
783 ret &= test_EnumMonitors(tctx, servername);
784 ret &= test_EnumPrintProcessors(tctx, servername, architecture);
785 ret &= test_EnumPrintProcessorDatatypes(tctx, servername);
786 ret &= test_GetPrintProcessorDirectory(tctx, servername, architecture);
787 ret &= test_GetPrinterDriverDirectory(tctx, servername, architecture);
788 ret &= test_EachPrinter(tctx, servername, architecture);
791 if (tctx->last_reason) {
792 fprintf(stderr, "failed: %s\n", tctx->last_reason);
798 printf("%s run successfully\n", argv[0]);