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,
33 LPPRINTER_DEFAULTS defaults,
36 torture_comment(tctx, "Testing OpenPrinter(%s)", printername);
38 if (!OpenPrinter(printername, handle, defaults)) {
40 sprintf(tmp, "failed to open printer %s, error was: 0x%08x\n",
41 printername, GetLastError());
42 torture_fail(tctx, tmp);
48 /****************************************************************************
49 ****************************************************************************/
51 static BOOL test_ClosePrinter(struct torture_context *tctx,
54 torture_comment(tctx, "Testing ClosePrinter");
56 if (!ClosePrinter(handle)) {
58 sprintf(tmp, "failed to close printer, error was: %s\n",
59 errstr(GetLastError()));
60 torture_fail(tctx, tmp);
67 /****************************************************************************
68 ****************************************************************************/
70 static BOOL test_EnumPrinters(struct torture_context *tctx,
73 DWORD levels[] = { 1, 2, 5 };
74 DWORD success[] = { 1, 1, 1 };
76 DWORD flags = PRINTER_ENUM_NAME;
79 for (i=0; i < ARRAY_SIZE(levels); i++) {
86 torture_comment(tctx, "Testing EnumPrinters level %d", levels[i]);
88 EnumPrinters(flags, servername, levels[i], NULL, 0, &needed, &returned);
90 if (err == ERROR_INSUFFICIENT_BUFFER) {
92 buffer = malloc(needed);
93 torture_assert(tctx, buffer, "malloc failed");
94 if (!EnumPrinters(flags, servername, levels[i], buffer, needed, &needed, &returned)) {
99 sprintf(tmp, "EnumPrinters failed level %d on [%s] (buffer size = %d), error: %s\n",
100 levels[i], servername, needed, errstr(err));
102 torture_fail(tctx, tmp);
104 torture_warning(tctx, tmp);
109 print_printer_info_bylevel(levels[i], buffer, returned);
119 /****************************************************************************
120 ****************************************************************************/
122 static BOOL test_EnumDrivers(struct torture_context *tctx,
126 DWORD levels[] = { 1, 2, 3, 4, 5, 6 };
127 DWORD success[] = { 1, 1, 1, 1, 1, 1 };
129 LPBYTE buffer = NULL;
131 for (i=0; i < ARRAY_SIZE(levels); i++) {
138 torture_comment(tctx, "Testing EnumPrinterDrivers level %d", levels[i]);
140 EnumPrinterDrivers(servername, architecture, levels[i], NULL, 0, &needed, &returned);
141 err = GetLastError();
142 if (err == ERROR_INSUFFICIENT_BUFFER) {
144 buffer = malloc(needed);
145 torture_assert(tctx, buffer, "malloc failed");
146 if (!EnumPrinterDrivers(servername, architecture, levels[i], buffer, needed, &needed, &returned)) {
147 err = GetLastError();
151 sprintf(tmp, "EnumPrinterDrivers failed level %d on [%s] (buffer size = %d), error: %s\n",
152 levels[i], servername, needed, errstr(err));
154 torture_fail(tctx, tmp);
156 torture_warning(tctx, tmp);
167 /****************************************************************************
168 ****************************************************************************/
170 static BOOL test_GetForm(struct torture_context *tctx,
175 DWORD levels[] = { 1, 2 };
176 DWORD success[] = { 1, 0 };
178 LPBYTE buffer = NULL;
180 for (i=0; i < ARRAY_SIZE(levels); i++) {
186 torture_comment(tctx, "Testing GetForm(%s) level %d", formname, levels[i]);
188 GetForm(handle, formname, levels[i], NULL, 0, &needed);
189 err = GetLastError();
190 if (err == ERROR_INSUFFICIENT_BUFFER) {
192 buffer = malloc(needed);
193 torture_assert(tctx, buffer, "malloc failed");
194 if (!GetForm(handle, formname, levels[i], buffer, needed, &needed)) {
195 err = GetLastError();
199 sprintf(tmp, "GetForm failed level %d on [%s] (buffer size = %d), error: %s\n",
200 levels[i], servername, needed, errstr(err));
202 torture_fail(tctx, tmp);
204 torture_warning(tctx, tmp);
215 /****************************************************************************
216 ****************************************************************************/
218 static BOOL test_EnumForms(struct torture_context *tctx,
222 DWORD levels[] = { 1, 2 };
223 DWORD success[] = { 1, 0 };
225 LPBYTE buffer = NULL;
227 for (i=0; i < ARRAY_SIZE(levels); i++) {
234 torture_comment(tctx, "Testing EnumForms level %d", levels[i]);
236 EnumForms(handle, levels[i], NULL, 0, &needed, &returned);
237 err = GetLastError();
238 if (err == ERROR_INSUFFICIENT_BUFFER) {
240 buffer = malloc(needed);
241 torture_assert(tctx, buffer, "malloc failed");
242 if (!EnumForms(handle, levels[i], buffer, needed, &needed, &returned)) {
243 err = GetLastError();
247 sprintf(tmp, "EnumForms failed level %d on [%s] (buffer size = %d), error: %s\n",
248 levels[i], servername, needed, errstr(err));
250 torture_fail(tctx, tmp);
252 torture_warning(tctx, tmp);
263 /****************************************************************************
264 ****************************************************************************/
266 static BOOL test_EnumPorts(struct torture_context *tctx,
269 DWORD levels[] = { 1, 2 };
270 DWORD success[] = { 1, 1 };
272 LPBYTE buffer = NULL;
274 for (i=0; i < ARRAY_SIZE(levels); i++) {
281 torture_comment(tctx, "Testing EnumPorts level %d", levels[i]);
283 EnumPorts(servername, levels[i], NULL, 0, &needed, &returned);
284 err = GetLastError();
285 if (err == ERROR_INSUFFICIENT_BUFFER) {
287 buffer = malloc(needed);
288 torture_assert(tctx, buffer, "malloc failed");
289 if (!EnumPorts(servername, levels[i], buffer, needed, &needed, &returned)) {
290 err = GetLastError();
294 sprintf(tmp, "EnumPorts failed level %d on [%s] (buffer size = %d), error: %s\n",
295 levels[i], servername, needed, errstr(err));
297 torture_fail(tctx, tmp);
299 torture_warning(tctx, tmp);
310 /****************************************************************************
311 ****************************************************************************/
313 static BOOL test_EnumMonitors(struct torture_context *tctx,
316 DWORD levels[] = { 1, 2 };
317 DWORD success[] = { 1, 1 };
319 LPBYTE buffer = NULL;
321 for (i=0; i < ARRAY_SIZE(levels); i++) {
328 torture_comment(tctx, "Testing EnumMonitors level %d", levels[i]);
330 EnumMonitors(servername, levels[i], NULL, 0, &needed, &returned);
331 err = GetLastError();
332 if (err == ERROR_INSUFFICIENT_BUFFER) {
334 buffer = malloc(needed);
335 torture_assert(tctx, buffer, "malloc failed");
336 if (!EnumMonitors(servername, levels[i], buffer, needed, &needed, &returned)) {
337 err = GetLastError();
341 sprintf(tmp, "EnumMonitors failed level %d on [%s] (buffer size = %d), error: %s\n",
342 levels[i], servername, needed, errstr(err));
344 torture_fail(tctx, tmp);
346 torture_warning(tctx, tmp);
357 /****************************************************************************
358 ****************************************************************************/
360 static BOOL test_EnumPrintProcessors(struct torture_context *tctx,
364 DWORD levels[] = { 1 };
365 DWORD success[] = { 1 };
367 LPBYTE buffer = NULL;
369 for (i=0; i < ARRAY_SIZE(levels); i++) {
376 torture_comment(tctx, "Testing EnumPrintProcessors level %d", levels[i]);
378 EnumPrintProcessors(servername, architecture, levels[i], NULL, 0, &needed, &returned);
379 err = GetLastError();
380 if (err == ERROR_INSUFFICIENT_BUFFER) {
382 buffer = malloc(needed);
383 torture_assert(tctx, buffer, "malloc failed");
384 if (!EnumPrintProcessors(servername, architecture, levels[i], buffer, needed, &needed, &returned)) {
385 err = GetLastError();
389 sprintf(tmp, "EnumPrintProcessors failed level %d on [%s] (buffer size = %d), error: %s\n",
390 levels[i], servername, needed, errstr(err));
392 torture_fail(tctx, tmp);
394 torture_warning(tctx, tmp);
405 /****************************************************************************
406 ****************************************************************************/
408 static BOOL test_EnumPrintProcessorDatatypes(struct torture_context *tctx,
411 DWORD levels[] = { 1 };
412 DWORD success[] = { 1 };
414 LPBYTE buffer = NULL;
416 for (i=0; i < ARRAY_SIZE(levels); i++) {
423 torture_comment(tctx, "Testing EnumPrintProcessorDatatypes level %d", levels[i]);
425 EnumPrintProcessorDatatypes(servername, "winprint", levels[i], NULL, 0, &needed, &returned);
426 err = GetLastError();
427 if (err == ERROR_INSUFFICIENT_BUFFER) {
429 buffer = malloc(needed);
430 torture_assert(tctx, buffer, "malloc failed");
431 if (!EnumPrintProcessorDatatypes(servername, "winprint", levels[i], buffer, needed, &needed, &returned)) {
432 err = GetLastError();
436 sprintf(tmp, "EnumPrintProcessorDatatypes failed level %d on [%s] (buffer size = %d), error: %s\n",
437 levels[i], servername, needed, errstr(err));
439 torture_fail(tctx, tmp);
441 torture_warning(tctx, tmp);
452 /****************************************************************************
453 ****************************************************************************/
455 static BOOL test_EnumPrinterKey(struct torture_context *tctx,
465 torture_comment(tctx, "Testing EnumPrinterKey(%s)", key);
467 err = EnumPrinterKey(handle, key, NULL, 0, &needed);
468 if (err == ERROR_MORE_DATA) {
469 buffer = (LPTSTR)malloc(needed);
470 torture_assert(tctx, buffer, "malloc failed");
471 err = EnumPrinterKey(handle, key, buffer, needed, &needed);
474 sprintf(tmp, "EnumPrinterKey(%s) failed on [%s] (buffer size = %d), error: %s\n",
475 key, servername, needed, errstr(err));
476 torture_fail(tctx, tmp);
480 print_printer_keys(buffer);
488 /****************************************************************************
489 ****************************************************************************/
491 static BOOL test_GetPrinter(struct torture_context *tctx,
495 DWORD levels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
496 DWORD success[] = { 1, 1, 1, 1, 1, 1, 1, 1 };
498 LPBYTE buffer = NULL;
500 for (i=0; i < ARRAY_SIZE(levels); i++) {
506 torture_comment(tctx, "Testing GetPrinter level %d", levels[i]);
508 GetPrinter(handle, levels[i], NULL, 0, &needed);
509 err = GetLastError();
510 if (err == ERROR_INSUFFICIENT_BUFFER) {
512 buffer = malloc(needed);
513 torture_assert(tctx, buffer, "malloc failed");
514 if (!GetPrinter(handle, levels[i], buffer, needed, &needed)) {
515 err = GetLastError();
519 sprintf(tmp, "GetPrinter failed level %d on [%s] (buffer size = %d), error: %s\n",
520 levels[i], printername, needed, errstr(err));
522 torture_fail(tctx, tmp);
524 torture_warning(tctx, tmp);
535 /****************************************************************************
536 ****************************************************************************/
538 static BOOL test_GetPrinterDriver(struct torture_context *tctx,
543 DWORD levels[] = { 1, 2, 3, 4, 5, 6, 8 };
544 DWORD success[] = { 1, 1, 1, 1, 1, 1, 1 };
546 LPBYTE buffer = NULL;
548 for (i=0; i < ARRAY_SIZE(levels); i++) {
554 torture_comment(tctx, "Testing GetPrinterDriver level %d", levels[i]);
556 GetPrinterDriver(handle, architecture, levels[i], NULL, 0, &needed);
557 err = GetLastError();
558 if (err == ERROR_INSUFFICIENT_BUFFER) {
560 buffer = malloc(needed);
561 torture_assert(tctx, buffer, "malloc failed");
562 if (!GetPrinterDriver(handle, architecture, levels[i], buffer, needed, &needed)) {
563 err = GetLastError();
567 sprintf(tmp, "GetPrinterDriver 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);
584 /****************************************************************************
585 ****************************************************************************/
587 static BOOL test_EnumJobs(struct torture_context *tctx,
591 DWORD levels[] = { 1, 2, 3, 4 };
592 DWORD success[] = { 1, 1, 1, 1 };
594 LPBYTE buffer = NULL;
596 for (i=0; i < ARRAY_SIZE(levels); i++) {
603 torture_comment(tctx, "Testing EnumJobs level %d", levels[i]);
605 EnumJobs(handle, 0, 100, levels[i], NULL, 0, &needed, &returned);
606 err = GetLastError();
607 if (err == ERROR_INSUFFICIENT_BUFFER) {
609 buffer = malloc(needed);
610 torture_assert(tctx, buffer, "malloc failed");
611 if (!EnumJobs(handle, 0, 100, levels[i], buffer, needed, &needed, &returned)) {
612 err = GetLastError();
616 sprintf(tmp, "EnumJobs failed level %d on [%s] (buffer size = %d), error: %s\n",
617 levels[i], printername, needed, errstr(err));
619 torture_fail(tctx, tmp);
621 torture_warning(tctx, tmp);
632 /****************************************************************************
633 ****************************************************************************/
635 static BOOL test_EnumPrinterDataEx(struct torture_context *tctx,
642 LPBYTE buffer = NULL;
648 torture_comment(tctx, "Testing EnumPrinterDataEx(%s)", keyname);
650 err = EnumPrinterDataEx(handle, keyname, NULL, 0, &needed, &returned);
651 if (err == ERROR_MORE_DATA) {
652 buffer = malloc(needed);
653 torture_assert(tctx, buffer, "malloc failed");
654 err = EnumPrinterDataEx(handle, keyname, buffer, needed, &needed, &returned);
657 sprintf(tmp, "EnumPrinterDataEx(%s) failed on [%s] (buffer size = %d), error: %s\n",
658 keyname, servername, needed, errstr(err));
659 torture_fail(tctx, tmp);
664 LPPRINTER_ENUM_VALUES v = (LPPRINTER_ENUM_VALUES)buffer;
665 for (i=0; i < returned; i++) {
666 print_printer_enum_values(&v[i]);
671 *returned_p = returned;
684 /****************************************************************************
685 ****************************************************************************/
687 static BOOL test_OnePrinter(struct torture_context *tctx,
690 LPPRINTER_DEFAULTS defaults)
695 torture_comment(tctx, "Testing Printer %s", printername);
697 ret &= test_OpenPrinter(tctx, printername, defaults, &handle);
698 ret &= test_GetPrinter(tctx, printername, handle);
699 ret &= test_GetPrinterDriver(tctx, printername, architecture, handle);
700 ret &= test_EnumForms(tctx, printername, handle);
701 ret &= test_EnumJobs(tctx, printername, handle);
702 ret &= test_EnumPrinterKey(tctx, printername, handle, "");
703 ret &= test_EnumPrinterKey(tctx, printername, handle, "PrinterDriverData");
704 ret &= test_EnumPrinterDataEx(tctx, printername, "PrinterDriverData", handle, NULL, NULL);
705 ret &= test_ClosePrinter(tctx, handle);
710 /****************************************************************************
711 ****************************************************************************/
713 static BOOL test_EachPrinter(struct torture_context *tctx,
716 LPPRINTER_DEFAULTS defaults)
723 DWORD flags = PRINTER_ENUM_NAME;
724 PPRINTER_INFO_1 buffer = NULL;
727 torture_comment(tctx, "Testing EnumPrinters level %d", 1);
729 EnumPrinters(flags, servername, 1, NULL, 0, &needed, &returned);
730 err = GetLastError();
731 if (err == ERROR_INSUFFICIENT_BUFFER) {
733 buffer = (PPRINTER_INFO_1)malloc(needed);
734 torture_assert(tctx, buffer, "malloc failed");
735 if (!EnumPrinters(flags, servername, 1, (LPBYTE)buffer, needed, &needed, &returned)) {
736 err = GetLastError();
740 sprintf(tmp, "EnumPrinters failed level %d on [%s] (buffer size = %d), error: %s\n",
741 1, servername, needed, errstr(err));
742 torture_fail(tctx, tmp);
745 for (i=0; i < returned; i++) {
746 ret &= test_OnePrinter(tctx, buffer[i].pName, architecture, defaults);
754 /****************************************************************************
755 ****************************************************************************/
757 static BOOL test_GetPrintProcessorDirectory(struct torture_context *tctx,
761 DWORD levels[] = { 1 };
762 DWORD success[] = { 1 };
764 LPBYTE buffer = NULL;
766 for (i=0; i < ARRAY_SIZE(levels); i++) {
772 torture_comment(tctx, "Testing GetPrintProcessorDirectory level %d", levels[i]);
774 GetPrintProcessorDirectory(servername, architecture, levels[i], NULL, 0, &needed);
775 err = GetLastError();
776 if (err == ERROR_INSUFFICIENT_BUFFER) {
778 buffer = malloc(needed);
779 torture_assert(tctx, buffer, "malloc failed");
780 if (!GetPrintProcessorDirectory(servername, architecture, levels[i], buffer, needed, &needed)) {
781 err = GetLastError();
785 sprintf(tmp, "GetPrintProcessorDirectory failed level %d on [%s] (buffer size = %d), error: %s\n",
786 levels[i], servername, needed, errstr(err));
788 torture_fail(tctx, tmp);
790 torture_warning(tctx, tmp);
801 /****************************************************************************
802 ****************************************************************************/
804 static BOOL test_GetPrinterDriverDirectory(struct torture_context *tctx,
808 DWORD levels[] = { 1 };
809 DWORD success[] = { 1 };
811 LPBYTE buffer = NULL;
813 for (i=0; i < ARRAY_SIZE(levels); i++) {
819 torture_comment(tctx, "Testing GetPrinterDriverDirectory level %d", levels[i]);
821 GetPrinterDriverDirectory(servername, architecture, levels[i], NULL, 0, &needed);
822 err = GetLastError();
823 if (err == ERROR_INSUFFICIENT_BUFFER) {
825 buffer = malloc(needed);
826 torture_assert(tctx, buffer, "malloc failed");
827 if (!GetPrinterDriverDirectory(servername, architecture, levels[i], buffer, needed, &needed)) {
828 err = GetLastError();
832 sprintf(tmp, "GetPrinterDriverDirectory failed level %d on [%s] (buffer size = %d), error: %s\n",
833 levels[i], servername, needed, errstr(err));
835 torture_fail(tctx, tmp);
837 torture_warning(tctx, tmp);
848 /****************************************************************************
849 ****************************************************************************/
851 static BOOL test_GetPrinterData(struct torture_context *tctx,
859 LPBYTE buffer = NULL;
865 torture_comment(tctx, "Testing GetPrinterData(%s)", valuename);
867 err = GetPrinterData(handle, valuename, &type, NULL, 0, &needed);
868 if (err == ERROR_MORE_DATA) {
869 buffer = (LPBYTE)malloc(needed);
870 torture_assert(tctx, buffer, "malloc failed");
871 err = GetPrinterData(handle, valuename, &type, buffer, needed, &needed);
874 sprintf(tmp, "GetPrinterData(%s) failed on [%s] (buffer size = %d), error: %s\n",
875 valuename, servername, needed, errstr(err));
876 torture_fail(tctx, tmp);
880 print_printer_data("PrinterDriverData", valuename, needed, buffer, type);
900 /****************************************************************************
901 ****************************************************************************/
903 static BOOL test_GetPrinterDataEx(struct torture_context *tctx,
912 LPBYTE buffer = NULL;
918 torture_comment(tctx, "Testing GetPrinterDataEx(%s - %s)", keyname, valuename);
920 err = GetPrinterDataEx(handle, keyname, valuename, &type, NULL, 0, &needed);
921 if (err == ERROR_MORE_DATA) {
922 buffer = (LPBYTE)malloc(needed);
923 torture_assert(tctx, buffer, "malloc failed");
924 err = GetPrinterDataEx(handle, keyname, valuename, &type, buffer, needed, &needed);
927 sprintf(tmp, "GetPrinterDataEx(%s) failed on [%s] (buffer size = %d), error: %s\n",
928 valuename, servername, needed, errstr(err));
929 torture_fail(tctx, tmp);
933 print_printer_data(keyname, valuename, needed, buffer, type);
953 /****************************************************************************
954 ****************************************************************************/
956 static BOOL test_PrinterData(struct torture_context *tctx,
963 LPBYTE buffer, buffer_ex;
965 LPSTR valuenames[] = {
966 SPLREG_DEFAULT_SPOOL_DIRECTORY,
967 SPLREG_MAJOR_VERSION,
968 SPLREG_MINOR_VERSION,
970 SPLREG_DNS_MACHINE_NAME,
975 for (i=0; i < ARRAY_SIZE(valuenames); i++) {
976 ret &= test_GetPrinterData(tctx, servername, valuenames[i], handle, &type, &buffer, &size);
977 ret &= test_GetPrinterDataEx(tctx, servername, "random", valuenames[i], handle, &type_ex, &buffer_ex, &size_ex);
978 torture_assert_int_equal(tctx, type, type_ex, "type mismatch");
979 torture_assert_int_equal(tctx, size, size_ex, "size mismatch");
980 torture_assert_mem_equal(tctx, buffer, buffer_ex, size, "buffer mismatch");
988 /****************************************************************************
989 ****************************************************************************/
991 int main(int argc, char *argv[])
995 LPSTR architecture = "Windows NT x86";
996 HANDLE server_handle;
997 PRINTER_DEFAULTS defaults_admin, defaults_use;
998 struct torture_context *tctx;
1001 fprintf(stderr, "usage: %s <servername> [print]\n", argv[0]);
1005 tctx = malloc(sizeof(struct torture_context));
1007 fprintf(stderr, "out of memory\n");
1010 memset(tctx, '\0', sizeof(*tctx));
1012 servername = argv[1];
1015 if (strcmp(argv[2], "print") == 0) {
1020 defaults_admin.pDatatype = NULL;
1021 defaults_admin.pDevMode = NULL;
1022 defaults_admin.DesiredAccess = PRINTER_ACCESS_ADMINISTER;
1024 defaults_use.pDatatype = NULL;
1025 defaults_use.pDevMode = NULL;
1026 defaults_use.DesiredAccess = PRINTER_ACCESS_USE;
1028 ret &= test_EnumPrinters(tctx, servername);
1029 ret &= test_EnumDrivers(tctx, servername, architecture);
1030 ret &= test_OpenPrinter(tctx, servername, NULL, &server_handle);
1031 /* ret &= test_EnumPrinterKey(tctx, servername, server_handle, ""); */
1032 ret &= test_PrinterData(tctx, servername, server_handle);
1033 ret &= test_EnumForms(tctx, servername, server_handle);
1034 ret &= test_ClosePrinter(tctx, server_handle);
1035 ret &= test_EnumPorts(tctx, servername);
1036 ret &= test_EnumMonitors(tctx, servername);
1037 ret &= test_EnumPrintProcessors(tctx, servername, architecture);
1038 ret &= test_EnumPrintProcessorDatatypes(tctx, servername);
1039 ret &= test_GetPrintProcessorDirectory(tctx, servername, architecture);
1040 ret &= test_GetPrinterDriverDirectory(tctx, servername, architecture);
1041 ret &= test_EachPrinter(tctx, servername, architecture, NULL);
1044 if (tctx->last_reason) {
1045 fprintf(stderr, "failed: %s\n", tctx->last_reason);
1051 printf("%s run successfully\n", argv[0]);