testprogs: fix EnumJobs debug output in spoolss test.
[Samba/nascimento.git] / testprogs / win32 / spoolss / spoolss.c
blobb83259dd90a934953b77efbde8702dff91e2ead0
1 /*
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 ****************************************************************************/
24 #include "spoolss.h"
25 #include "string.h"
26 #include "torture.h"
28 /****************************************************************************
29 ****************************************************************************/
31 static BOOL test_OpenPrinter(struct torture_context *tctx,
32 LPSTR printername,
33 LPPRINTER_DEFAULTS defaults,
34 LPHANDLE handle)
36 torture_comment(tctx, "Testing OpenPrinter(%s)", printername);
38 if (!OpenPrinter(printername, handle, defaults)) {
39 char tmp[1024];
40 sprintf(tmp, "failed to open printer %s, error was: 0x%08x\n",
41 printername, GetLastError());
42 torture_fail(tctx, tmp);
45 return TRUE;
48 /****************************************************************************
49 ****************************************************************************/
51 static BOOL test_ClosePrinter(struct torture_context *tctx,
52 HANDLE handle)
54 torture_comment(tctx, "Testing ClosePrinter");
56 if (!ClosePrinter(handle)) {
57 char tmp[1024];
58 sprintf(tmp, "failed to close printer, error was: %s\n",
59 errstr(GetLastError()));
60 torture_fail(tctx, tmp);
63 return TRUE;
67 /****************************************************************************
68 ****************************************************************************/
70 static BOOL test_EnumPrinters(struct torture_context *tctx,
71 LPSTR servername)
73 DWORD levels[] = { 1, 2, 5 };
74 DWORD success[] = { 1, 1, 1 };
75 DWORD i;
76 DWORD flags = PRINTER_ENUM_NAME;
77 LPBYTE buffer = NULL;
79 for (i=0; i < ARRAY_SIZE(levels); i++) {
81 DWORD needed = 0;
82 DWORD returned = 0;
83 DWORD err = 0;
84 char tmp[1024];
86 torture_comment(tctx, "Testing EnumPrinters level %d", levels[i]);
88 EnumPrinters(flags, servername, levels[i], NULL, 0, &needed, &returned);
89 err = GetLastError();
90 if (err == ERROR_INSUFFICIENT_BUFFER) {
91 err = 0;
92 buffer = malloc(needed);
93 torture_assert(tctx, buffer, "malloc failed");
94 if (!EnumPrinters(flags, servername, levels[i], buffer, needed, &needed, &returned)) {
95 err = GetLastError();
98 if (err) {
99 sprintf(tmp, "EnumPrinters failed level %d on [%s] (buffer size = %d), error: %s\n",
100 levels[i], servername, needed, errstr(err));
101 if (success[i]) {
102 torture_fail(tctx, tmp);
103 } else {
104 torture_warning(tctx, tmp);
108 if (tctx->print) {
109 print_printer_info_bylevel(levels[i], buffer, returned);
112 free(buffer);
113 buffer = NULL;
116 return TRUE;
119 /****************************************************************************
120 ****************************************************************************/
122 static BOOL test_EnumDrivers(struct torture_context *tctx,
123 LPSTR servername,
124 LPSTR architecture)
126 DWORD levels[] = { 1, 2, 3, 4, 5, 6 };
127 DWORD success[] = { 1, 1, 1, 1, 1, 1 };
128 DWORD i;
129 LPBYTE buffer = NULL;
131 for (i=0; i < ARRAY_SIZE(levels); i++) {
133 DWORD needed = 0;
134 DWORD returned = 0;
135 DWORD err = 0;
136 char tmp[1024];
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) {
143 err = 0;
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();
150 if (err) {
151 sprintf(tmp, "EnumPrinterDrivers failed level %d on [%s] (buffer size = %d), error: %s\n",
152 levels[i], servername, needed, errstr(err));
153 if (success[i]) {
154 torture_fail(tctx, tmp);
155 } else {
156 torture_warning(tctx, tmp);
160 if (tctx->print) {
161 print_driver_info_bylevel(levels[i], buffer, returned);
164 free(buffer);
165 buffer = NULL;
168 return TRUE;
171 /****************************************************************************
172 ****************************************************************************/
174 static BOOL test_GetForm(struct torture_context *tctx,
175 LPSTR servername,
176 HANDLE handle,
177 LPSTR formname)
179 DWORD levels[] = { 1, 2 };
180 DWORD success[] = { 1, 0 };
181 DWORD i;
182 LPBYTE buffer = NULL;
184 for (i=0; i < ARRAY_SIZE(levels); i++) {
186 DWORD needed = 0;
187 DWORD err = 0;
188 char tmp[1024];
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) {
195 err = 0;
196 buffer = malloc(needed);
197 torture_assert(tctx, buffer, "malloc failed");
198 if (!GetForm(handle, formname, levels[i], buffer, needed, &needed)) {
199 err = GetLastError();
202 if (err) {
203 sprintf(tmp, "GetForm failed level %d on [%s] (buffer size = %d), error: %s\n",
204 levels[i], servername, needed, errstr(err));
205 if (success[i]) {
206 torture_fail(tctx, tmp);
207 } else {
208 torture_warning(tctx, tmp);
212 if (tctx->print) {
213 print_form_info_bylevel(levels[i], buffer, 1);
216 free(buffer);
217 buffer = NULL;
220 return TRUE;
223 /****************************************************************************
224 ****************************************************************************/
226 static BOOL test_EnumForms(struct torture_context *tctx,
227 LPSTR servername,
228 HANDLE handle)
230 DWORD levels[] = { 1, 2 };
231 DWORD success[] = { 1, 0 };
232 DWORD i;
233 LPBYTE buffer = NULL;
235 for (i=0; i < ARRAY_SIZE(levels); i++) {
237 DWORD needed = 0;
238 DWORD returned = 0;
239 DWORD err = 0;
240 char tmp[1024];
242 torture_comment(tctx, "Testing EnumForms level %d", levels[i]);
244 EnumForms(handle, levels[i], NULL, 0, &needed, &returned);
245 err = GetLastError();
246 if (err == ERROR_INSUFFICIENT_BUFFER) {
247 err = 0;
248 buffer = malloc(needed);
249 torture_assert(tctx, buffer, "malloc failed");
250 if (!EnumForms(handle, levels[i], buffer, needed, &needed, &returned)) {
251 err = GetLastError();
254 if (err) {
255 sprintf(tmp, "EnumForms failed level %d on [%s] (buffer size = %d), error: %s\n",
256 levels[i], servername, needed, errstr(err));
257 if (success[i]) {
258 torture_fail(tctx, tmp);
259 } else {
260 torture_warning(tctx, tmp);
264 if (tctx->print) {
265 print_form_info_bylevel(levels[i], buffer, returned);
268 free(buffer);
269 buffer = NULL;
272 return TRUE;
275 /****************************************************************************
276 ****************************************************************************/
278 static BOOL test_EnumPorts(struct torture_context *tctx,
279 LPSTR servername)
281 DWORD levels[] = { 1, 2 };
282 DWORD success[] = { 1, 1 };
283 DWORD i;
284 LPBYTE buffer = NULL;
286 for (i=0; i < ARRAY_SIZE(levels); i++) {
288 DWORD needed = 0;
289 DWORD returned = 0;
290 DWORD err = 0;
291 char tmp[1024];
293 torture_comment(tctx, "Testing EnumPorts level %d", levels[i]);
295 EnumPorts(servername, levels[i], NULL, 0, &needed, &returned);
296 err = GetLastError();
297 if (err == ERROR_INSUFFICIENT_BUFFER) {
298 err = 0;
299 buffer = malloc(needed);
300 torture_assert(tctx, buffer, "malloc failed");
301 if (!EnumPorts(servername, levels[i], buffer, needed, &needed, &returned)) {
302 err = GetLastError();
305 if (err) {
306 sprintf(tmp, "EnumPorts failed level %d on [%s] (buffer size = %d), error: %s\n",
307 levels[i], servername, needed, errstr(err));
308 if (success[i]) {
309 torture_fail(tctx, tmp);
310 } else {
311 torture_warning(tctx, tmp);
315 if (tctx->print) {
316 print_port_info_bylevel(levels[i], buffer, returned);
319 free(buffer);
320 buffer = NULL;
323 return TRUE;
326 /****************************************************************************
327 ****************************************************************************/
329 static BOOL test_EnumMonitors(struct torture_context *tctx,
330 LPSTR servername)
332 DWORD levels[] = { 1, 2 };
333 DWORD success[] = { 1, 1 };
334 DWORD i;
335 LPBYTE buffer = NULL;
337 for (i=0; i < ARRAY_SIZE(levels); i++) {
339 DWORD needed = 0;
340 DWORD returned = 0;
341 DWORD err = 0;
342 char tmp[1024];
344 torture_comment(tctx, "Testing EnumMonitors level %d", levels[i]);
346 EnumMonitors(servername, levels[i], NULL, 0, &needed, &returned);
347 err = GetLastError();
348 if (err == ERROR_INSUFFICIENT_BUFFER) {
349 err = 0;
350 buffer = malloc(needed);
351 torture_assert(tctx, buffer, "malloc failed");
352 if (!EnumMonitors(servername, levels[i], buffer, needed, &needed, &returned)) {
353 err = GetLastError();
356 if (err) {
357 sprintf(tmp, "EnumMonitors failed level %d on [%s] (buffer size = %d), error: %s\n",
358 levels[i], servername, needed, errstr(err));
359 if (success[i]) {
360 torture_fail(tctx, tmp);
361 } else {
362 torture_warning(tctx, tmp);
366 if (tctx->print) {
367 print_monitor_info_bylevel(levels[i], buffer, returned);
370 free(buffer);
371 buffer = NULL;
374 return TRUE;
377 /****************************************************************************
378 ****************************************************************************/
380 static BOOL test_EnumPrintProcessors(struct torture_context *tctx,
381 LPSTR servername,
382 LPSTR architecture)
384 DWORD levels[] = { 1 };
385 DWORD success[] = { 1 };
386 DWORD i;
387 LPBYTE buffer = NULL;
389 for (i=0; i < ARRAY_SIZE(levels); i++) {
391 DWORD needed = 0;
392 DWORD returned = 0;
393 DWORD err = 0;
394 char tmp[1024];
396 torture_comment(tctx, "Testing EnumPrintProcessors level %d", levels[i]);
398 EnumPrintProcessors(servername, architecture, levels[i], NULL, 0, &needed, &returned);
399 err = GetLastError();
400 if (err == ERROR_INSUFFICIENT_BUFFER) {
401 err = 0;
402 buffer = malloc(needed);
403 torture_assert(tctx, buffer, "malloc failed");
404 if (!EnumPrintProcessors(servername, architecture, levels[i], buffer, needed, &needed, &returned)) {
405 err = GetLastError();
408 if (err) {
409 sprintf(tmp, "EnumPrintProcessors failed level %d on [%s] (buffer size = %d), error: %s\n",
410 levels[i], servername, needed, errstr(err));
411 if (success[i]) {
412 torture_fail(tctx, tmp);
413 } else {
414 torture_warning(tctx, tmp);
418 if (tctx->print) {
419 print_printprocessor_info_bylevel(levels[i], buffer, returned);
422 free(buffer);
423 buffer = NULL;
426 return TRUE;
429 /****************************************************************************
430 ****************************************************************************/
432 static BOOL test_EnumPrintProcessorDatatypes(struct torture_context *tctx,
433 LPSTR servername)
435 DWORD levels[] = { 1 };
436 DWORD success[] = { 1 };
437 DWORD i;
438 LPBYTE buffer = NULL;
440 for (i=0; i < ARRAY_SIZE(levels); i++) {
442 DWORD needed = 0;
443 DWORD returned = 0;
444 DWORD err = 0;
445 char tmp[1024];
447 torture_comment(tctx, "Testing EnumPrintProcessorDatatypes level %d", levels[i]);
449 EnumPrintProcessorDatatypes(servername, "winprint", levels[i], NULL, 0, &needed, &returned);
450 err = GetLastError();
451 if (err == ERROR_INSUFFICIENT_BUFFER) {
452 err = 0;
453 buffer = malloc(needed);
454 torture_assert(tctx, buffer, "malloc failed");
455 if (!EnumPrintProcessorDatatypes(servername, "winprint", levels[i], buffer, needed, &needed, &returned)) {
456 err = GetLastError();
459 if (err) {
460 sprintf(tmp, "EnumPrintProcessorDatatypes failed level %d on [%s] (buffer size = %d), error: %s\n",
461 levels[i], servername, needed, errstr(err));
462 if (success[i]) {
463 torture_fail(tctx, tmp);
464 } else {
465 torture_warning(tctx, tmp);
469 if (tctx->print) {
470 print_datatypes_info_bylevel(levels[i], buffer, returned);
473 free(buffer);
474 buffer = NULL;
477 return TRUE;
480 /****************************************************************************
481 ****************************************************************************/
483 static BOOL test_EnumPrinterKey(struct torture_context *tctx,
484 LPSTR servername,
485 HANDLE handle,
486 LPCSTR key)
488 LPSTR buffer = NULL;
489 DWORD needed = 0;
490 DWORD err = 0;
491 char tmp[1024];
493 torture_comment(tctx, "Testing EnumPrinterKey(%s)", key);
495 err = EnumPrinterKey(handle, key, NULL, 0, &needed);
496 if (err == ERROR_MORE_DATA) {
497 buffer = (LPTSTR)malloc(needed);
498 torture_assert(tctx, buffer, "malloc failed");
499 err = EnumPrinterKey(handle, key, buffer, needed, &needed);
501 if (err) {
502 sprintf(tmp, "EnumPrinterKey(%s) failed on [%s] (buffer size = %d), error: %s\n",
503 key, servername, needed, errstr(err));
504 torture_fail(tctx, tmp);
507 if (tctx->print) {
508 print_printer_keys(buffer);
511 free(buffer);
513 return TRUE;
516 /****************************************************************************
517 ****************************************************************************/
519 static BOOL test_GetPrinter(struct torture_context *tctx,
520 LPSTR printername,
521 HANDLE handle)
523 DWORD levels[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
524 DWORD success[] = { 1, 1, 1, 1, 1, 1, 1, 1 };
525 DWORD i;
526 LPBYTE buffer = NULL;
528 for (i=0; i < ARRAY_SIZE(levels); i++) {
530 DWORD needed = 0;
531 DWORD err = 0;
532 char tmp[1024];
534 torture_comment(tctx, "Testing GetPrinter level %d", levels[i]);
536 GetPrinter(handle, levels[i], NULL, 0, &needed);
537 err = GetLastError();
538 if (err == ERROR_INSUFFICIENT_BUFFER) {
539 err = 0;
540 buffer = malloc(needed);
541 torture_assert(tctx, buffer, "malloc failed");
542 if (!GetPrinter(handle, levels[i], buffer, needed, &needed)) {
543 err = GetLastError();
546 if (err) {
547 sprintf(tmp, "GetPrinter failed level %d on [%s] (buffer size = %d), error: %s\n",
548 levels[i], printername, needed, errstr(err));
549 if (success[i]) {
550 torture_fail(tctx, tmp);
551 } else {
552 torture_warning(tctx, tmp);
556 if (tctx->print) {
557 print_printer_info_bylevel(levels[i], buffer, 1);
560 free(buffer);
561 buffer = NULL;
564 return TRUE;
567 /****************************************************************************
568 ****************************************************************************/
570 static BOOL test_GetPrinterDriver(struct torture_context *tctx,
571 LPSTR printername,
572 LPSTR architecture,
573 HANDLE handle)
575 DWORD levels[] = { 1, 2, 3, 4, 5, 6, 8 };
576 DWORD success[] = { 1, 1, 1, 1, 1, 1, 1 };
577 DWORD i;
578 LPBYTE buffer = NULL;
580 for (i=0; i < ARRAY_SIZE(levels); i++) {
582 DWORD needed = 0;
583 DWORD err = 0;
584 char tmp[1024];
586 torture_comment(tctx, "Testing GetPrinterDriver level %d", levels[i]);
588 GetPrinterDriver(handle, architecture, levels[i], NULL, 0, &needed);
589 err = GetLastError();
590 if (err == ERROR_INSUFFICIENT_BUFFER) {
591 err = 0;
592 buffer = malloc(needed);
593 torture_assert(tctx, buffer, "malloc failed");
594 if (!GetPrinterDriver(handle, architecture, levels[i], buffer, needed, &needed)) {
595 err = GetLastError();
598 if (err) {
599 sprintf(tmp, "GetPrinterDriver failed level %d on [%s] (buffer size = %d), error: %s\n",
600 levels[i], printername, needed, errstr(err));
601 if (success[i]) {
602 torture_fail(tctx, tmp);
603 } else {
604 torture_warning(tctx, tmp);
608 if (tctx->print) {
609 print_driver_info_bylevel(levels[i], buffer, 1);
612 free(buffer);
613 buffer = NULL;
616 return TRUE;
620 /****************************************************************************
621 ****************************************************************************/
623 static BOOL test_EnumJobs(struct torture_context *tctx,
624 LPSTR printername,
625 HANDLE handle)
627 DWORD levels[] = { 1, 2, 3, 4 };
628 DWORD success[] = { 1, 1, 1, 1 };
629 DWORD i;
630 LPBYTE buffer = NULL;
632 for (i=0; i < ARRAY_SIZE(levels); i++) {
634 DWORD needed = 0;
635 DWORD returned = 0;
636 DWORD err = 0;
637 char tmp[1024];
639 torture_comment(tctx, "Testing EnumJobs level %d", levels[i]);
641 EnumJobs(handle, 0, 100, levels[i], NULL, 0, &needed, &returned);
642 err = GetLastError();
643 if (err == ERROR_INSUFFICIENT_BUFFER) {
644 err = 0;
645 buffer = malloc(needed);
646 torture_assert(tctx, buffer, "malloc failed");
647 if (!EnumJobs(handle, 0, 100, levels[i], buffer, needed, &needed, &returned)) {
648 err = GetLastError();
651 if (err) {
652 sprintf(tmp, "EnumJobs failed level %d on [%s] (buffer size = %d), error: %s\n",
653 levels[i], printername, needed, errstr(err));
654 if (success[i]) {
655 torture_fail(tctx, tmp);
656 } else {
657 torture_warning(tctx, tmp);
661 if (tctx->print) {
662 print_job_info_bylevel(levels[i], buffer, returned);
665 free(buffer);
666 buffer = NULL;
669 return TRUE;
672 /****************************************************************************
673 ****************************************************************************/
675 static BOOL test_EnumPrinterDataEx(struct torture_context *tctx,
676 LPSTR servername,
677 LPSTR keyname,
678 HANDLE handle,
679 LPBYTE *buffer_p,
680 DWORD *returned_p)
682 LPBYTE buffer = NULL;
683 DWORD needed = 0;
684 DWORD returned = 0;
685 DWORD err = 0;
686 char tmp[1024];
688 torture_comment(tctx, "Testing EnumPrinterDataEx(%s)", keyname);
690 err = EnumPrinterDataEx(handle, keyname, NULL, 0, &needed, &returned);
691 if (err == ERROR_MORE_DATA) {
692 buffer = malloc(needed);
693 torture_assert(tctx, buffer, "malloc failed");
694 err = EnumPrinterDataEx(handle, keyname, buffer, needed, &needed, &returned);
696 if (err) {
697 sprintf(tmp, "EnumPrinterDataEx(%s) failed on [%s] (buffer size = %d), error: %s\n",
698 keyname, servername, needed, errstr(err));
699 torture_fail(tctx, tmp);
702 if (tctx->print) {
703 DWORD i;
704 LPPRINTER_ENUM_VALUES v = (LPPRINTER_ENUM_VALUES)buffer;
705 for (i=0; i < returned; i++) {
706 print_printer_enum_values(&v[i]);
710 if (returned_p) {
711 *returned_p = returned;
714 if (buffer_p) {
715 *buffer_p = buffer;
716 } else {
717 free(buffer);
720 return TRUE;
724 /****************************************************************************
725 ****************************************************************************/
727 static BOOL test_OnePrinter(struct torture_context *tctx,
728 LPSTR printername,
729 LPSTR architecture,
730 LPPRINTER_DEFAULTS defaults)
732 HANDLE handle;
733 BOOL ret = TRUE;
735 torture_comment(tctx, "Testing Printer %s", printername);
737 ret &= test_OpenPrinter(tctx, printername, defaults, &handle);
738 ret &= test_GetPrinter(tctx, printername, handle);
739 ret &= test_GetPrinterDriver(tctx, printername, architecture, handle);
740 ret &= test_EnumForms(tctx, printername, handle);
741 ret &= test_EnumJobs(tctx, printername, handle);
742 ret &= test_EnumPrinterKey(tctx, printername, handle, "");
743 ret &= test_EnumPrinterKey(tctx, printername, handle, "PrinterDriverData");
744 ret &= test_EnumPrinterDataEx(tctx, printername, "PrinterDriverData", handle, NULL, NULL);
745 ret &= test_ClosePrinter(tctx, handle);
747 return ret;
750 /****************************************************************************
751 ****************************************************************************/
753 static BOOL test_EachPrinter(struct torture_context *tctx,
754 LPSTR servername,
755 LPSTR architecture,
756 LPPRINTER_DEFAULTS defaults)
758 DWORD needed = 0;
759 DWORD returned = 0;
760 DWORD err = 0;
761 char tmp[1024];
762 DWORD i;
763 DWORD flags = PRINTER_ENUM_NAME;
764 PPRINTER_INFO_1 buffer = NULL;
765 BOOL ret = TRUE;
767 torture_comment(tctx, "Testing EnumPrinters level %d", 1);
769 EnumPrinters(flags, servername, 1, NULL, 0, &needed, &returned);
770 err = GetLastError();
771 if (err == ERROR_INSUFFICIENT_BUFFER) {
772 err = 0;
773 buffer = (PPRINTER_INFO_1)malloc(needed);
774 torture_assert(tctx, buffer, "malloc failed");
775 if (!EnumPrinters(flags, servername, 1, (LPBYTE)buffer, needed, &needed, &returned)) {
776 err = GetLastError();
779 if (err) {
780 sprintf(tmp, "EnumPrinters failed level %d on [%s] (buffer size = %d), error: %s\n",
781 1, servername, needed, errstr(err));
782 torture_fail(tctx, tmp);
785 for (i=0; i < returned; i++) {
786 ret &= test_OnePrinter(tctx, buffer[i].pName, architecture, defaults);
789 free(buffer);
791 return ret;
794 /****************************************************************************
795 ****************************************************************************/
797 static BOOL test_GetPrintProcessorDirectory(struct torture_context *tctx,
798 LPSTR servername,
799 LPSTR architecture)
801 DWORD levels[] = { 1 };
802 DWORD success[] = { 1 };
803 DWORD i;
804 LPBYTE buffer = NULL;
806 for (i=0; i < ARRAY_SIZE(levels); i++) {
808 DWORD needed = 0;
809 DWORD err = 0;
810 char tmp[1024];
812 torture_comment(tctx, "Testing GetPrintProcessorDirectory level %d", levels[i]);
814 GetPrintProcessorDirectory(servername, architecture, levels[i], NULL, 0, &needed);
815 err = GetLastError();
816 if (err == ERROR_INSUFFICIENT_BUFFER) {
817 err = 0;
818 buffer = malloc(needed);
819 torture_assert(tctx, buffer, "malloc failed");
820 if (!GetPrintProcessorDirectory(servername, architecture, levels[i], buffer, needed, &needed)) {
821 err = GetLastError();
824 if (err) {
825 sprintf(tmp, "GetPrintProcessorDirectory failed level %d on [%s] (buffer size = %d), error: %s\n",
826 levels[i], servername, needed, errstr(err));
827 if (success[i]) {
828 torture_fail(tctx, tmp);
829 } else {
830 torture_warning(tctx, tmp);
834 free(buffer);
835 buffer = NULL;
838 return TRUE;
841 /****************************************************************************
842 ****************************************************************************/
844 static BOOL test_GetPrinterDriverDirectory(struct torture_context *tctx,
845 LPSTR servername,
846 LPSTR architecture)
848 DWORD levels[] = { 1 };
849 DWORD success[] = { 1 };
850 DWORD i;
851 LPBYTE buffer = NULL;
853 for (i=0; i < ARRAY_SIZE(levels); i++) {
855 DWORD needed = 0;
856 DWORD err = 0;
857 char tmp[1024];
859 torture_comment(tctx, "Testing GetPrinterDriverDirectory level %d", levels[i]);
861 GetPrinterDriverDirectory(servername, architecture, levels[i], NULL, 0, &needed);
862 err = GetLastError();
863 if (err == ERROR_INSUFFICIENT_BUFFER) {
864 err = 0;
865 buffer = malloc(needed);
866 torture_assert(tctx, buffer, "malloc failed");
867 if (!GetPrinterDriverDirectory(servername, architecture, levels[i], buffer, needed, &needed)) {
868 err = GetLastError();
871 if (err) {
872 sprintf(tmp, "GetPrinterDriverDirectory failed level %d on [%s] (buffer size = %d), error: %s\n",
873 levels[i], servername, needed, errstr(err));
874 if (success[i]) {
875 torture_fail(tctx, tmp);
876 } else {
877 torture_warning(tctx, tmp);
881 free(buffer);
882 buffer = NULL;
885 return TRUE;
888 /****************************************************************************
889 ****************************************************************************/
891 static BOOL test_GetPrinterData(struct torture_context *tctx,
892 LPSTR servername,
893 LPSTR valuename,
894 HANDLE handle,
895 DWORD *type_p,
896 LPBYTE *buffer_p,
897 DWORD *size_p)
899 LPBYTE buffer = NULL;
900 DWORD needed = 0;
901 DWORD type;
902 DWORD err = 0;
903 char tmp[1024];
905 torture_comment(tctx, "Testing GetPrinterData(%s)", valuename);
907 err = GetPrinterData(handle, valuename, &type, NULL, 0, &needed);
908 if (err == ERROR_MORE_DATA) {
909 buffer = (LPBYTE)malloc(needed);
910 torture_assert(tctx, buffer, "malloc failed");
911 err = GetPrinterData(handle, valuename, &type, buffer, needed, &needed);
913 if (err) {
914 sprintf(tmp, "GetPrinterData(%s) failed on [%s] (buffer size = %d), error: %s\n",
915 valuename, servername, needed, errstr(err));
916 torture_fail(tctx, tmp);
919 if (tctx->print) {
920 print_printer_data("PrinterDriverData", valuename, needed, buffer, type);
923 if (type_p) {
924 *type_p = type;
927 if (size_p) {
928 *size_p = needed;
931 if (buffer_p) {
932 *buffer_p = buffer;
933 } else {
934 free(buffer);
937 return TRUE;
940 /****************************************************************************
941 ****************************************************************************/
943 static BOOL test_GetPrinterDataEx(struct torture_context *tctx,
944 LPSTR servername,
945 LPSTR keyname,
946 LPSTR valuename,
947 HANDLE handle,
948 DWORD *type_p,
949 LPBYTE *buffer_p,
950 DWORD *size_p)
952 LPBYTE buffer = NULL;
953 DWORD needed = 0;
954 DWORD type;
955 DWORD err = 0;
956 char tmp[1024];
958 torture_comment(tctx, "Testing GetPrinterDataEx(%s - %s)", keyname, valuename);
960 err = GetPrinterDataEx(handle, keyname, valuename, &type, NULL, 0, &needed);
961 if (err == ERROR_MORE_DATA) {
962 buffer = (LPBYTE)malloc(needed);
963 torture_assert(tctx, buffer, "malloc failed");
964 err = GetPrinterDataEx(handle, keyname, valuename, &type, buffer, needed, &needed);
966 if (err) {
967 sprintf(tmp, "GetPrinterDataEx(%s) failed on [%s] (buffer size = %d), error: %s\n",
968 valuename, servername, needed, errstr(err));
969 torture_fail(tctx, tmp);
972 if (tctx->print) {
973 print_printer_data(keyname, valuename, needed, buffer, type);
976 if (type_p) {
977 *type_p = type;
980 if (size_p) {
981 *size_p = needed;
984 if (buffer_p) {
985 *buffer_p = buffer;
986 } else {
987 free(buffer);
990 return TRUE;
993 /****************************************************************************
994 ****************************************************************************/
996 static BOOL test_PrinterData(struct torture_context *tctx,
997 LPSTR servername,
998 HANDLE handle)
1000 BOOL ret = TRUE;
1001 DWORD i;
1002 DWORD type, type_ex;
1003 LPBYTE buffer, buffer_ex;
1004 DWORD size, size_ex;
1005 LPSTR valuenames[] = {
1006 SPLREG_DEFAULT_SPOOL_DIRECTORY,
1007 SPLREG_MAJOR_VERSION,
1008 SPLREG_MINOR_VERSION,
1009 SPLREG_DS_PRESENT,
1010 SPLREG_DNS_MACHINE_NAME,
1011 SPLREG_ARCHITECTURE,
1012 SPLREG_OS_VERSION
1015 for (i=0; i < ARRAY_SIZE(valuenames); i++) {
1016 ret &= test_GetPrinterData(tctx, servername, valuenames[i], handle, &type, &buffer, &size);
1017 ret &= test_GetPrinterDataEx(tctx, servername, "random", valuenames[i], handle, &type_ex, &buffer_ex, &size_ex);
1018 torture_assert_int_equal(tctx, type, type_ex, "type mismatch");
1019 torture_assert_int_equal(tctx, size, size_ex, "size mismatch");
1020 torture_assert_mem_equal(tctx, buffer, buffer_ex, size, "buffer mismatch");
1021 free(buffer);
1022 free(buffer_ex);
1025 return ret;
1028 /****************************************************************************
1029 ****************************************************************************/
1031 int main(int argc, char *argv[])
1033 BOOL ret = FALSE;
1034 LPSTR servername;
1035 LPSTR architecture = "Windows NT x86";
1036 HANDLE server_handle;
1037 PRINTER_DEFAULTS defaults_admin, defaults_use;
1038 struct torture_context *tctx;
1040 if (argc < 2) {
1041 fprintf(stderr, "usage: %s <servername> [print]\n", argv[0]);
1042 exit(-1);
1045 tctx = malloc(sizeof(struct torture_context));
1046 if (!tctx) {
1047 fprintf(stderr, "out of memory\n");
1048 exit(-1);
1050 memset(tctx, '\0', sizeof(*tctx));
1052 servername = argv[1];
1054 if (argc >= 3) {
1055 if (strcmp(argv[2], "print") == 0) {
1056 tctx->print = TRUE;
1060 defaults_admin.pDatatype = NULL;
1061 defaults_admin.pDevMode = NULL;
1062 defaults_admin.DesiredAccess = PRINTER_ACCESS_ADMINISTER;
1064 defaults_use.pDatatype = NULL;
1065 defaults_use.pDevMode = NULL;
1066 defaults_use.DesiredAccess = PRINTER_ACCESS_USE;
1068 ret &= test_EnumPrinters(tctx, servername);
1069 ret &= test_EnumDrivers(tctx, servername, architecture);
1070 ret &= test_OpenPrinter(tctx, servername, NULL, &server_handle);
1071 /* ret &= test_EnumPrinterKey(tctx, servername, server_handle, ""); */
1072 ret &= test_PrinterData(tctx, servername, server_handle);
1073 ret &= test_EnumForms(tctx, servername, server_handle);
1074 ret &= test_ClosePrinter(tctx, server_handle);
1075 ret &= test_EnumPorts(tctx, servername);
1076 ret &= test_EnumMonitors(tctx, servername);
1077 ret &= test_EnumPrintProcessors(tctx, servername, architecture);
1078 ret &= test_EnumPrintProcessorDatatypes(tctx, servername);
1079 ret &= test_GetPrintProcessorDirectory(tctx, servername, architecture);
1080 ret &= test_GetPrinterDriverDirectory(tctx, servername, architecture);
1081 ret &= test_EachPrinter(tctx, servername, architecture, NULL);
1083 if (!ret) {
1084 if (tctx->last_reason) {
1085 fprintf(stderr, "failed: %s\n", tctx->last_reason);
1087 free(tctx);
1088 return -1;
1091 printf("%s run successfully\n", argv[0]);
1093 free(tctx);
1094 return 0;