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);
161 print_driver_info_bylevel(levels[i], buffer, returned);
171 /****************************************************************************
172 ****************************************************************************/
174 static BOOL test_GetForm(struct torture_context *tctx,
179 DWORD levels[] = { 1, 2 };
180 DWORD success[] = { 1, 0 };
182 LPBYTE buffer = NULL;
184 for (i=0; i < ARRAY_SIZE(levels); i++) {
190 torture_comment(tctx, "Testing GetForm(%s) level %d", formname, levels[i]);
192 GetForm(handle, formname, levels[i], NULL, 0, &needed);
193 err = GetLastError();
194 if (err == ERROR_INSUFFICIENT_BUFFER) {
196 buffer = malloc(needed);
197 torture_assert(tctx, buffer, "malloc failed");
198 if (!GetForm(handle, formname, levels[i], buffer, needed, &needed)) {
199 err = GetLastError();
203 sprintf(tmp, "GetForm failed level %d on [%s] (buffer size = %d), error: %s\n",
204 levels[i], servername, needed, errstr(err));
206 torture_fail(tctx, tmp);
208 torture_warning(tctx, tmp);
213 print_form_info_bylevel(levels[i], buffer, 1);
223 /****************************************************************************
224 ****************************************************************************/
226 static BOOL test_EnumForms(struct torture_context *tctx,
230 DWORD levels[] = { 1, 2 };
231 DWORD success[] = { 1, 1 };
233 LPBYTE buffer = NULL;
235 for (i=0; i < ARRAY_SIZE(levels); i++) {
242 torture_comment(tctx, "Testing EnumForms level %d", levels[i]);
244 if (tctx->samba3 && levels[i] == 2) {
245 torture_comment(tctx, "skipping level %d enum against samba\n", levels[i]);
249 EnumForms(handle, levels[i], NULL, 0, &needed, &returned);
250 err = GetLastError();
251 if (err == ERROR_INSUFFICIENT_BUFFER) {
253 buffer = malloc(needed);
254 torture_assert(tctx, buffer, "malloc failed");
255 if (!EnumForms(handle, levels[i], buffer, needed, &needed, &returned)) {
256 err = GetLastError();
260 sprintf(tmp, "EnumForms failed level %d on [%s] (buffer size = %d), error: %s\n",
261 levels[i], servername, needed, errstr(err));
263 torture_fail(tctx, tmp);
265 torture_warning(tctx, tmp);
270 print_form_info_bylevel(levels[i], buffer, returned);
280 /****************************************************************************
281 ****************************************************************************/
283 static BOOL test_EnumPorts(struct torture_context *tctx,
286 DWORD levels[] = { 1, 2 };
287 DWORD success[] = { 1, 1 };
289 LPBYTE buffer = NULL;
291 for (i=0; i < ARRAY_SIZE(levels); i++) {
298 torture_comment(tctx, "Testing EnumPorts level %d", levels[i]);
300 EnumPorts(servername, levels[i], NULL, 0, &needed, &returned);
301 err = GetLastError();
302 if (err == ERROR_INSUFFICIENT_BUFFER) {
304 buffer = malloc(needed);
305 torture_assert(tctx, buffer, "malloc failed");
306 if (!EnumPorts(servername, levels[i], buffer, needed, &needed, &returned)) {
307 err = GetLastError();
311 sprintf(tmp, "EnumPorts failed level %d on [%s] (buffer size = %d), error: %s\n",
312 levels[i], servername, needed, errstr(err));
314 torture_fail(tctx, tmp);
316 torture_warning(tctx, tmp);
321 print_port_info_bylevel(levels[i], buffer, returned);
331 /****************************************************************************
332 ****************************************************************************/
334 static BOOL test_EnumMonitors(struct torture_context *tctx,
337 DWORD levels[] = { 1, 2 };
338 DWORD success[] = { 1, 1 };
340 LPBYTE buffer = NULL;
342 for (i=0; i < ARRAY_SIZE(levels); i++) {
349 torture_comment(tctx, "Testing EnumMonitors level %d", levels[i]);
351 EnumMonitors(servername, levels[i], NULL, 0, &needed, &returned);
352 err = GetLastError();
353 if (err == ERROR_INSUFFICIENT_BUFFER) {
355 buffer = malloc(needed);
356 torture_assert(tctx, buffer, "malloc failed");
357 if (!EnumMonitors(servername, levels[i], buffer, needed, &needed, &returned)) {
358 err = GetLastError();
362 sprintf(tmp, "EnumMonitors failed level %d on [%s] (buffer size = %d), error: %s\n",
363 levels[i], servername, needed, errstr(err));
365 torture_fail(tctx, tmp);
367 torture_warning(tctx, tmp);
372 print_monitor_info_bylevel(levels[i], buffer, returned);
382 /****************************************************************************
383 ****************************************************************************/
385 static BOOL test_EnumPrintProcessors(struct torture_context *tctx,
389 DWORD levels[] = { 1 };
390 DWORD success[] = { 1 };
392 LPBYTE buffer = NULL;
394 for (i=0; i < ARRAY_SIZE(levels); i++) {
401 torture_comment(tctx, "Testing EnumPrintProcessors level %d", levels[i]);
403 EnumPrintProcessors(servername, architecture, levels[i], NULL, 0, &needed, &returned);
404 err = GetLastError();
405 if (err == ERROR_INSUFFICIENT_BUFFER) {
407 buffer = malloc(needed);
408 torture_assert(tctx, buffer, "malloc failed");
409 if (!EnumPrintProcessors(servername, architecture, levels[i], buffer, needed, &needed, &returned)) {
410 err = GetLastError();
414 sprintf(tmp, "EnumPrintProcessors failed level %d on [%s] (buffer size = %d), error: %s\n",
415 levels[i], servername, needed, errstr(err));
417 torture_fail(tctx, tmp);
419 torture_warning(tctx, tmp);
424 print_printprocessor_info_bylevel(levels[i], buffer, returned);
434 /****************************************************************************
435 ****************************************************************************/
437 static BOOL test_EnumPrintProcessorDatatypes(struct torture_context *tctx,
440 DWORD levels[] = { 1 };
441 DWORD success[] = { 1 };
443 LPBYTE buffer = NULL;
445 for (i=0; i < ARRAY_SIZE(levels); i++) {
452 torture_comment(tctx, "Testing EnumPrintProcessorDatatypes level %d", levels[i]);
454 EnumPrintProcessorDatatypes(servername, "winprint", levels[i], NULL, 0, &needed, &returned);
455 err = GetLastError();
456 if (err == ERROR_INSUFFICIENT_BUFFER) {
458 buffer = malloc(needed);
459 torture_assert(tctx, buffer, "malloc failed");
460 if (!EnumPrintProcessorDatatypes(servername, "winprint", levels[i], buffer, needed, &needed, &returned)) {
461 err = GetLastError();
465 sprintf(tmp, "EnumPrintProcessorDatatypes failed level %d on [%s] (buffer size = %d), error: %s\n",
466 levels[i], servername, needed, errstr(err));
468 torture_fail(tctx, tmp);
470 torture_warning(tctx, tmp);
475 print_datatypes_info_bylevel(levels[i], buffer, returned);
485 /****************************************************************************
486 ****************************************************************************/
488 static BOOL test_EnumPrinterKey(struct torture_context *tctx,
498 torture_comment(tctx, "Testing EnumPrinterKey(%s)", key);
500 err = EnumPrinterKey(handle, key, NULL, 0, &needed);
501 if (err == ERROR_MORE_DATA) {
502 buffer = (LPTSTR)malloc(needed);
503 torture_assert(tctx, buffer, "malloc failed");
504 err = EnumPrinterKey(handle, key, buffer, needed, &needed);
507 sprintf(tmp, "EnumPrinterKey(%s) failed on [%s] (buffer size = %d), error: %s\n",
508 key, servername, needed, errstr(err));
509 torture_fail(tctx, tmp);
513 print_printer_keys(buffer);
521 /****************************************************************************
522 ****************************************************************************/
524 static BOOL test_GetPrinter(struct torture_context *tctx,
528 DWORD levels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
529 DWORD success[] = { 1, 1, 1, 1, 1, 1, 1, 1 };
531 LPBYTE buffer = NULL;
533 for (i=0; i < ARRAY_SIZE(levels); i++) {
539 torture_comment(tctx, "Testing GetPrinter level %d", levels[i]);
541 GetPrinter(handle, levels[i], NULL, 0, &needed);
542 err = GetLastError();
543 if (err == ERROR_INSUFFICIENT_BUFFER) {
545 buffer = malloc(needed);
546 torture_assert(tctx, buffer, "malloc failed");
547 if (!GetPrinter(handle, levels[i], buffer, needed, &needed)) {
548 err = GetLastError();
552 sprintf(tmp, "GetPrinter failed level %d on [%s] (buffer size = %d), error: %s\n",
553 levels[i], printername, needed, errstr(err));
555 torture_fail(tctx, tmp);
557 torture_warning(tctx, tmp);
562 print_printer_info_bylevel(levels[i], buffer, 1);
572 /****************************************************************************
573 ****************************************************************************/
575 static BOOL test_GetPrinterDriver(struct torture_context *tctx,
580 DWORD levels[] = { 1, 2, 3, 4, 5, 6, 8 };
581 DWORD success[] = { 1, 1, 1, 1, 1, 1, 1 };
583 LPBYTE buffer = NULL;
585 for (i=0; i < ARRAY_SIZE(levels); i++) {
591 torture_comment(tctx, "Testing GetPrinterDriver level %d", levels[i]);
593 GetPrinterDriver(handle, architecture, levels[i], NULL, 0, &needed);
594 err = GetLastError();
595 if (err == ERROR_INSUFFICIENT_BUFFER) {
597 buffer = malloc(needed);
598 torture_assert(tctx, buffer, "malloc failed");
599 if (!GetPrinterDriver(handle, architecture, levels[i], buffer, needed, &needed)) {
600 err = GetLastError();
604 sprintf(tmp, "GetPrinterDriver failed level %d on [%s] (buffer size = %d), error: %s\n",
605 levels[i], printername, needed, errstr(err));
607 torture_fail(tctx, tmp);
609 torture_warning(tctx, tmp);
614 print_driver_info_bylevel(levels[i], buffer, 1);
625 /****************************************************************************
626 ****************************************************************************/
628 static BOOL test_EnumJobs(struct torture_context *tctx,
632 DWORD levels[] = { 1, 2, 3, 4 };
633 DWORD success[] = { 1, 1, 1, 1 };
635 LPBYTE buffer = NULL;
637 for (i=0; i < ARRAY_SIZE(levels); i++) {
644 torture_comment(tctx, "Testing EnumJobs level %d", levels[i]);
646 if (tctx->samba3 && levels[i] == 4) {
647 torture_comment(tctx, "skipping level %d enum against samba\n", levels[i]);
651 EnumJobs(handle, 0, 100, levels[i], NULL, 0, &needed, &returned);
652 err = GetLastError();
653 if (err == ERROR_INSUFFICIENT_BUFFER) {
655 buffer = malloc(needed);
656 torture_assert(tctx, buffer, "malloc failed");
657 if (!EnumJobs(handle, 0, 100, levels[i], buffer, needed, &needed, &returned)) {
658 err = GetLastError();
662 sprintf(tmp, "EnumJobs failed level %d on [%s] (buffer size = %d), error: %s\n",
663 levels[i], printername, needed, errstr(err));
665 torture_fail(tctx, tmp);
667 torture_warning(tctx, tmp);
672 print_job_info_bylevel(levels[i], buffer, returned);
682 /****************************************************************************
683 ****************************************************************************/
685 static BOOL test_EnumPrinterDataEx(struct torture_context *tctx,
692 LPBYTE buffer = NULL;
698 torture_comment(tctx, "Testing EnumPrinterDataEx(%s)", keyname);
700 err = EnumPrinterDataEx(handle, keyname, NULL, 0, &needed, &returned);
701 if (err == ERROR_MORE_DATA) {
702 buffer = malloc(needed);
703 torture_assert(tctx, buffer, "malloc failed");
704 err = EnumPrinterDataEx(handle, keyname, buffer, needed, &needed, &returned);
707 sprintf(tmp, "EnumPrinterDataEx(%s) failed on [%s] (buffer size = %d), error: %s\n",
708 keyname, servername, needed, errstr(err));
709 torture_fail(tctx, tmp);
714 LPPRINTER_ENUM_VALUES v = (LPPRINTER_ENUM_VALUES)buffer;
715 for (i=0; i < returned; i++) {
716 print_printer_enum_values(&v[i]);
721 *returned_p = returned;
734 /****************************************************************************
735 ****************************************************************************/
737 static BOOL test_OnePrinter(struct torture_context *tctx,
740 LPPRINTER_DEFAULTS defaults)
745 torture_comment(tctx, "Testing Printer %s", printername);
747 ret &= test_OpenPrinter(tctx, printername, defaults, &handle);
748 ret &= test_GetPrinter(tctx, printername, handle);
749 ret &= test_GetPrinterDriver(tctx, printername, architecture, handle);
750 ret &= test_EnumForms(tctx, printername, handle);
751 ret &= test_EnumJobs(tctx, printername, handle);
752 ret &= test_EnumPrinterKey(tctx, printername, handle, "");
753 ret &= test_EnumPrinterKey(tctx, printername, handle, "PrinterDriverData");
754 ret &= test_EnumPrinterDataEx(tctx, printername, "PrinterDriverData", handle, NULL, NULL);
755 ret &= test_ClosePrinter(tctx, handle);
760 /****************************************************************************
761 ****************************************************************************/
763 static BOOL test_EachPrinter(struct torture_context *tctx,
766 LPPRINTER_DEFAULTS defaults)
773 DWORD flags = PRINTER_ENUM_NAME;
774 PPRINTER_INFO_1 buffer = NULL;
777 torture_comment(tctx, "Testing EnumPrinters level %d", 1);
779 EnumPrinters(flags, servername, 1, NULL, 0, &needed, &returned);
780 err = GetLastError();
781 if (err == ERROR_INSUFFICIENT_BUFFER) {
783 buffer = (PPRINTER_INFO_1)malloc(needed);
784 torture_assert(tctx, buffer, "malloc failed");
785 if (!EnumPrinters(flags, servername, 1, (LPBYTE)buffer, needed, &needed, &returned)) {
786 err = GetLastError();
790 sprintf(tmp, "EnumPrinters failed level %d on [%s] (buffer size = %d), error: %s\n",
791 1, servername, needed, errstr(err));
792 torture_fail(tctx, tmp);
795 for (i=0; i < returned; i++) {
796 ret &= test_OnePrinter(tctx, buffer[i].pName, architecture, defaults);
804 /****************************************************************************
805 ****************************************************************************/
807 static BOOL test_GetPrintProcessorDirectory(struct torture_context *tctx,
811 DWORD levels[] = { 1 };
812 DWORD success[] = { 1 };
814 LPBYTE buffer = NULL;
816 for (i=0; i < ARRAY_SIZE(levels); i++) {
822 torture_comment(tctx, "Testing GetPrintProcessorDirectory level %d", levels[i]);
824 GetPrintProcessorDirectory(servername, architecture, levels[i], NULL, 0, &needed);
825 err = GetLastError();
826 if (err == ERROR_INSUFFICIENT_BUFFER) {
828 buffer = malloc(needed);
829 torture_assert(tctx, buffer, "malloc failed");
830 if (!GetPrintProcessorDirectory(servername, architecture, levels[i], buffer, needed, &needed)) {
831 err = GetLastError();
835 sprintf(tmp, "GetPrintProcessorDirectory failed level %d on [%s] (buffer size = %d), error: %s\n",
836 levels[i], servername, needed, errstr(err));
838 torture_fail(tctx, tmp);
840 torture_warning(tctx, tmp);
851 /****************************************************************************
852 ****************************************************************************/
854 static BOOL test_GetPrinterDriverDirectory(struct torture_context *tctx,
858 DWORD levels[] = { 1 };
859 DWORD success[] = { 1 };
861 LPBYTE buffer = NULL;
863 for (i=0; i < ARRAY_SIZE(levels); i++) {
869 torture_comment(tctx, "Testing GetPrinterDriverDirectory level %d", levels[i]);
871 GetPrinterDriverDirectory(servername, architecture, levels[i], NULL, 0, &needed);
872 err = GetLastError();
873 if (err == ERROR_INSUFFICIENT_BUFFER) {
875 buffer = malloc(needed);
876 torture_assert(tctx, buffer, "malloc failed");
877 if (!GetPrinterDriverDirectory(servername, architecture, levels[i], buffer, needed, &needed)) {
878 err = GetLastError();
882 sprintf(tmp, "GetPrinterDriverDirectory failed level %d on [%s] (buffer size = %d), error: %s\n",
883 levels[i], servername, needed, errstr(err));
885 torture_fail(tctx, tmp);
887 torture_warning(tctx, tmp);
898 /****************************************************************************
899 ****************************************************************************/
901 static BOOL test_GetPrinterData(struct torture_context *tctx,
909 LPBYTE buffer = NULL;
915 torture_comment(tctx, "Testing GetPrinterData(%s)", valuename);
917 err = GetPrinterData(handle, valuename, &type, NULL, 0, &needed);
918 if (err == ERROR_MORE_DATA) {
919 buffer = (LPBYTE)malloc(needed);
920 torture_assert(tctx, buffer, "malloc failed");
921 err = GetPrinterData(handle, valuename, &type, buffer, needed, &needed);
924 sprintf(tmp, "GetPrinterData(%s) failed on [%s] (buffer size = %d), error: %s\n",
925 valuename, servername, needed, errstr(err));
926 torture_fail(tctx, tmp);
930 print_printer_data("PrinterDriverData", valuename, needed, buffer, type);
950 /****************************************************************************
951 ****************************************************************************/
953 static BOOL test_GetPrinterDataEx(struct torture_context *tctx,
962 LPBYTE buffer = NULL;
968 torture_comment(tctx, "Testing GetPrinterDataEx(%s - %s)", keyname, valuename);
970 err = GetPrinterDataEx(handle, keyname, valuename, &type, NULL, 0, &needed);
971 if (err == ERROR_MORE_DATA) {
972 buffer = (LPBYTE)malloc(needed);
973 torture_assert(tctx, buffer, "malloc failed");
974 err = GetPrinterDataEx(handle, keyname, valuename, &type, buffer, needed, &needed);
977 sprintf(tmp, "GetPrinterDataEx(%s) failed on [%s] (buffer size = %d), error: %s\n",
978 valuename, servername, needed, errstr(err));
979 torture_fail(tctx, tmp);
983 print_printer_data(keyname, valuename, needed, buffer, type);
1003 /****************************************************************************
1004 ****************************************************************************/
1006 static BOOL test_PrinterData(struct torture_context *tctx,
1012 DWORD type, type_ex;
1013 LPBYTE buffer, buffer_ex;
1014 DWORD size, size_ex;
1015 LPSTR valuenames[] = {
1016 SPLREG_DEFAULT_SPOOL_DIRECTORY,
1017 SPLREG_MAJOR_VERSION,
1018 SPLREG_MINOR_VERSION,
1020 SPLREG_DNS_MACHINE_NAME,
1021 SPLREG_ARCHITECTURE,
1025 for (i=0; i < ARRAY_SIZE(valuenames); i++) {
1026 ret &= test_GetPrinterData(tctx, servername, valuenames[i], handle, &type, &buffer, &size);
1027 ret &= test_GetPrinterDataEx(tctx, servername, "random", valuenames[i], handle, &type_ex, &buffer_ex, &size_ex);
1028 torture_assert_int_equal(tctx, type, type_ex, "type mismatch");
1029 torture_assert_int_equal(tctx, size, size_ex, "size mismatch");
1030 torture_assert_mem_equal(tctx, buffer, buffer_ex, size, "buffer mismatch");
1038 /****************************************************************************
1039 ****************************************************************************/
1041 const char *get_string_param(const char *str)
1045 p = strchr(str, '=');
1053 /****************************************************************************
1054 ****************************************************************************/
1056 int main(int argc, char *argv[])
1060 LPSTR architecture = "Windows NT x86";
1061 HANDLE server_handle;
1062 PRINTER_DEFAULTS defaults_admin, defaults_use;
1063 struct torture_context *tctx;
1067 fprintf(stderr, "usage: %s <servername> [print] [samba3] [architecture=ARCHITECTURE]\n", argv[0]);
1071 tctx = malloc(sizeof(struct torture_context));
1073 fprintf(stderr, "out of memory\n");
1076 memset(tctx, '\0', sizeof(*tctx));
1078 servername = argv[1];
1080 for (i=1; i < argc; i++) {
1081 if (strcmp(argv[i], "print") == 0) {
1084 if (strcmp(argv[i], "samba3") == 0) {
1085 tctx->samba3 = TRUE;
1087 if (strncmp(argv[i], "architecture", strlen("architecture")) == 0) {
1088 architecture = get_string_param(argv[i]);
1092 printf("Running testsuite with architecture: %s\n", architecture);
1094 defaults_admin.pDatatype = NULL;
1095 defaults_admin.pDevMode = NULL;
1096 defaults_admin.DesiredAccess = PRINTER_ACCESS_ADMINISTER;
1098 defaults_use.pDatatype = NULL;
1099 defaults_use.pDevMode = NULL;
1100 defaults_use.DesiredAccess = PRINTER_ACCESS_USE;
1102 ret &= test_EnumPrinters(tctx, servername);
1103 ret &= test_EnumDrivers(tctx, servername, architecture);
1104 ret &= test_OpenPrinter(tctx, servername, NULL, &server_handle);
1105 /* ret &= test_EnumPrinterKey(tctx, servername, server_handle, ""); */
1106 ret &= test_PrinterData(tctx, servername, server_handle);
1107 ret &= test_EnumForms(tctx, servername, server_handle);
1108 ret &= test_ClosePrinter(tctx, server_handle);
1109 ret &= test_EnumPorts(tctx, servername);
1110 ret &= test_EnumMonitors(tctx, servername);
1111 ret &= test_EnumPrintProcessors(tctx, servername, architecture);
1112 ret &= test_EnumPrintProcessorDatatypes(tctx, servername);
1113 ret &= test_GetPrintProcessorDirectory(tctx, servername, architecture);
1114 ret &= test_GetPrinterDriverDirectory(tctx, servername, architecture);
1115 ret &= test_EachPrinter(tctx, servername, architecture, NULL);
1118 if (tctx->last_reason) {
1119 fprintf(stderr, "failed: %s\n", tctx->last_reason);
1125 printf("%s run successfully\n", argv[0]);