1 /*
2 * PWG unit test program for CUPS.
3 *
4 * Copyright © 2020-2024 by OpenPrinting.
5 * Copyright 2009-2016 by Apple Inc.
6 *
7 * Licensed under Apache License v2.0. See the file "LICENSE" for more information.
8 */
9
10 /*
11 * Include necessary headers...
12 */
13
14 #include "ppd-private.h"
15 #include "file-private.h"
16
17
18 /*
19 * Local functions...
20 */
21
22 static int test_pagesize(_ppd_cache_t *pc, ppd_file_t *ppd,
23 const char *ppdsize);
24 static int test_ppd_cache(_ppd_cache_t *pc, ppd_file_t *ppd);
25
26
27 /*
28 * 'main()' - Main entry.
29 */
30
31 int /* O - Exit status */
main(int argc,char * argv[])32 main(int argc, /* I - Number of command-line args */
33 char *argv[]) /* I - Command-line arguments */
34 {
35 int status; /* Status of tests (0 = success, 1 = fail) */
36 const char *ppdfile; /* PPD filename */
37 ppd_file_t *ppd; /* PPD file */
38 _ppd_cache_t *pc; /* PPD cache and PWG mapping data */
39 const pwg_media_t *pwgmedia; /* PWG media size */
40 size_t i, /* Looping var */
41 num_media; /* Number of media sizes */
42 const pwg_media_t *mediatable; /* Media size table */
43 int dupmedia = 0; /* Duplicate media sizes? */
44
45
46 status = 0;
47
48 if (argc < 2 || argc > 3)
49 {
50 puts("Usage: ./testpwg filename.ppd [jobfile]");
51 return (1);
52 }
53
54 ppdfile = argv[1];
55
56 printf("ppdOpenFile(%s): ", ppdfile);
57 if ((ppd = ppdOpenFile(ppdfile)) == NULL)
58 {
59 ppd_status_t err; /* Last error in file */
60 int line; /* Line number in file */
61
62
63 err = ppdLastError(&line);
64
65 printf("FAIL (%s on line %d)\n", ppdErrorString(err), line);
66
67 return (1);
68 }
69 else
70 puts("PASS");
71
72 fputs("_ppdCacheCreateWithPPD(ppd): ", stdout);
73 if ((pc = _ppdCacheCreateWithPPD(ppd)) == NULL)
74 {
75 puts("FAIL");
76 status ++;
77 }
78 else
79 {
80 puts("PASS");
81 status += test_ppd_cache(pc, ppd);
82
83 if (argc == 3)
84 {
85 /*
86 * Test PageSize mapping code.
87 */
88
89 int fd; /* Job file descriptor */
90 const char *pagesize; /* PageSize value */
91 ipp_t *job; /* Job attributes */
92 ipp_attribute_t *media; /* Media attribute */
93
94 if ((fd = open(argv[2], O_RDONLY)) >= 0)
95 {
96 job = ippNew();
97 ippReadFile(fd, job);
98 close(fd);
99
100 if ((media = ippFindAttribute(job, "media", IPP_TAG_ZERO)) != NULL &&
101 media->value_tag != IPP_TAG_NAME &&
102 media->value_tag != IPP_TAG_KEYWORD)
103 media = NULL;
104
105 if (media)
106 printf("_ppdCacheGetPageSize(media=%s): ",
107 media->values[0].string.text);
108 else
109 fputs("_ppdCacheGetPageSize(media-col): ", stdout);
110
111 fflush(stdout);
112
113 if ((pagesize = _ppdCacheGetPageSize(pc, job, NULL, NULL)) == NULL)
114 {
115 puts("FAIL (Not Found)");
116 status = 1;
117 }
118 else if (media && _cups_strcasecmp(pagesize, media->values[0].string.text))
119 {
120 printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize,
121 media->values[0].string.text);
122 status = 1;
123 }
124 else
125 printf("PASS (%s)\n", pagesize);
126
127 ippDelete(job);
128 }
129 else
130 {
131 perror(argv[2]);
132 status = 1;
133 }
134 }
135
136 /*
137 * _ppdCacheDestroy should never fail...
138 */
139
140 fputs("_ppdCacheDestroy(pc): ", stdout);
141 _ppdCacheDestroy(pc);
142 puts("PASS");
143 }
144
145 fputs("pwgMediaForPWG(\"iso_a4_210x297mm\"): ", stdout);
146 if ((pwgmedia = pwgMediaForPWG("iso_a4_210x297mm")) == NULL)
147 {
148 puts("FAIL (not found)");
149 status ++;
150 }
151 else if (strcmp(pwgmedia->pwg, "iso_a4_210x297mm"))
152 {
153 printf("FAIL (%s)\n", pwgmedia->pwg);
154 status ++;
155 }
156 else if (pwgmedia->width != 21000 || pwgmedia->length != 29700)
157 {
158 printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
159 status ++;
160 }
161 else
162 puts("PASS");
163
164 fputs("pwgMediaForPWG(\"roll_max_36.1025x3622.0472in\"): ", stdout);
165 if ((pwgmedia = pwgMediaForPWG("roll_max_36.1025x3622.0472in")) == NULL)
166 {
167 puts("FAIL (not found)");
168 status ++;
169 }
170 else if (pwgmedia->width != 91700 || pwgmedia->length != 9199999)
171 {
172 printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
173 status ++;
174 }
175 else
176 printf("PASS (%dx%d)\n", pwgmedia->width, pwgmedia->length);
177
178 fputs("pwgMediaForPWG(\"disc_test_10x100mm\"): ", stdout);
179 if ((pwgmedia = pwgMediaForPWG("disc_test_10x100mm")) == NULL)
180 {
181 puts("FAIL (not found)");
182 status ++;
183 }
184 else if (pwgmedia->width != 10000 || pwgmedia->length != 10000)
185 {
186 printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
187 status ++;
188 }
189 else
190 printf("PASS (%dx%d)\n", pwgmedia->width, pwgmedia->length);
191
192 fputs("pwgMediaForLegacy(\"na-letter\"): ", stdout);
193 if ((pwgmedia = pwgMediaForLegacy("na-letter")) == NULL)
194 {
195 puts("FAIL (not found)");
196 status ++;
197 }
198 else if (strcmp(pwgmedia->pwg, "na_letter_8.5x11in"))
199 {
200 printf("FAIL (%s)\n", pwgmedia->pwg);
201 status ++;
202 }
203 else if (pwgmedia->width != 21590 || pwgmedia->length != 27940)
204 {
205 printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
206 status ++;
207 }
208 else
209 puts("PASS");
210
211 fputs("pwgMediaForPPD(\"4x6\"): ", stdout);
212 if ((pwgmedia = pwgMediaForPPD("4x6")) == NULL)
213 {
214 puts("FAIL (not found)");
215 status ++;
216 }
217 else if (strcmp(pwgmedia->pwg, "na_index-4x6_4x6in"))
218 {
219 printf("FAIL (%s)\n", pwgmedia->pwg);
220 status ++;
221 }
222 else if (pwgmedia->width != 10160 || pwgmedia->length != 15240)
223 {
224 printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
225 status ++;
226 }
227 else
228 puts("PASS");
229
230 fputs("pwgMediaForPPD(\"10x15cm\"): ", stdout);
231 if ((pwgmedia = pwgMediaForPPD("10x15cm")) == NULL)
232 {
233 puts("FAIL (not found)");
234 status ++;
235 }
236 else if (strcmp(pwgmedia->pwg, "om_100x150mm_100x150mm"))
237 {
238 printf("FAIL (%s)\n", pwgmedia->pwg);
239 status ++;
240 }
241 else if (pwgmedia->width != 10000 || pwgmedia->length != 15000)
242 {
243 printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
244 status ++;
245 }
246 else
247 puts("PASS");
248
249 fputs("pwgMediaForPPD(\"Custom.10x15cm\"): ", stdout);
250 if ((pwgmedia = pwgMediaForPPD("Custom.10x15cm")) == NULL)
251 {
252 puts("FAIL (not found)");
253 status ++;
254 }
255 else if (strcmp(pwgmedia->pwg, "custom_10x15cm_100x150mm"))
256 {
257 printf("FAIL (%s)\n", pwgmedia->pwg);
258 status ++;
259 }
260 else if (pwgmedia->width != 10000 || pwgmedia->length != 15000)
261 {
262 printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length);
263 status ++;
264 }
265 else
266 puts("PASS");
267
268 fputs("pwgMediaForSize(29700, 42000): ", stdout);
269 if ((pwgmedia = pwgMediaForSize(29700, 42000)) == NULL)
270 {
271 puts("FAIL (not found)");
272 status ++;
273 }
274 else if (strcmp(pwgmedia->pwg, "iso_a3_297x420mm"))
275 {
276 printf("FAIL (%s)\n", pwgmedia->pwg);
277 status ++;
278 }
279 else
280 puts("PASS");
281
282 fputs("pwgMediaForSize(9842, 19050): ", stdout);
283 if ((pwgmedia = pwgMediaForSize(9842, 19050)) == NULL)
284 {
285 puts("FAIL (not found)");
286 status ++;
287 }
288 else if (strcmp(pwgmedia->pwg, "na_monarch_3.875x7.5in"))
289 {
290 printf("FAIL (%s)\n", pwgmedia->pwg);
291 status ++;
292 }
293 else
294 printf("PASS (%s)\n", pwgmedia->pwg);
295
296 fputs("pwgMediaForSize(9800, 19000): ", stdout);
297 if ((pwgmedia = pwgMediaForSize(9800, 19000)) == NULL)
298 {
299 puts("FAIL (not found)");
300 status ++;
301 }
302 else if (strcmp(pwgmedia->pwg, "jpn_you6_98x190mm"))
303 {
304 printf("FAIL (%s)\n", pwgmedia->pwg);
305 status ++;
306 }
307 else
308 printf("PASS (%s)\n", pwgmedia->pwg);
309
310 fputs("Duplicate size test: ", stdout);
311 for (mediatable = _pwgMediaTable(&num_media);
312 num_media > 1;
313 num_media --, mediatable ++)
314 {
315 for (i = num_media - 1, pwgmedia = mediatable + 1; i > 0; i --, pwgmedia ++)
316 {
317 if (pwgmedia->width == mediatable->width &&
318 pwgmedia->length == mediatable->length)
319 {
320 if (!dupmedia)
321 {
322 dupmedia = 1;
323 status ++;
324 puts("FAIL");
325 }
326
327 printf(" %s and %s have the same dimensions (%dx%d)\n",
328 pwgmedia->pwg, mediatable->pwg, pwgmedia->width,
329 pwgmedia->length);
330 }
331 }
332 }
333 if (!dupmedia)
334 puts("PASS");
335
336
337 return (status);
338 }
339
340
341 /*
342 * 'test_pagesize()' - Test the PWG mapping functions.
343 */
344
345 static int /* O - 1 on failure, 0 on success */
test_pagesize(_ppd_cache_t * pc,ppd_file_t * ppd,const char * ppdsize)346 test_pagesize(_ppd_cache_t *pc, /* I - PWG mapping data */
347 ppd_file_t *ppd, /* I - PPD file */
348 const char *ppdsize) /* I - PPD page size */
349 {
350 int status = 0; /* Return status */
351 ipp_t *job; /* Job attributes */
352 const char *pagesize; /* PageSize value */
353
354
355 if (ppdPageSize(ppd, ppdsize))
356 {
357 printf("_ppdCacheGetPageSize(keyword=%s): ", ppdsize);
358 fflush(stdout);
359
360 if ((pagesize = _ppdCacheGetPageSize(pc, NULL, ppdsize, NULL)) == NULL)
361 {
362 puts("FAIL (Not Found)");
363 status = 1;
364 }
365 else if (_cups_strcasecmp(pagesize, ppdsize))
366 {
367 printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize, ppdsize);
368 status = 1;
369 }
370 else
371 puts("PASS");
372
373 job = ippNew();
374 ippAddString(job, IPP_TAG_JOB, IPP_TAG_KEYWORD, "media", NULL, ppdsize);
375
376 printf("_ppdCacheGetPageSize(media=%s): ", ppdsize);
377 fflush(stdout);
378
379 if ((pagesize = _ppdCacheGetPageSize(pc, job, NULL, NULL)) == NULL)
380 {
381 puts("FAIL (Not Found)");
382 status = 1;
383 }
384 else if (_cups_strcasecmp(pagesize, ppdsize))
385 {
386 printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize, ppdsize);
387 status = 1;
388 }
389 else
390 puts("PASS");
391
392 ippDelete(job);
393 }
394
395 return (status);
396 }
397
398
399 /*
400 * 'test_ppd_cache()' - Test the PPD cache functions.
401 */
402
403 static int /* O - 1 on failure, 0 on success */
test_ppd_cache(_ppd_cache_t * pc,ppd_file_t * ppd)404 test_ppd_cache(_ppd_cache_t *pc, /* I - PWG mapping data */
405 ppd_file_t *ppd) /* I - PPD file */
406 {
407 int i, /* Looping var */
408 status = 0; /* Return status */
409 _ppd_cache_t *pc2; /* Loaded data */
410 pwg_size_t *size, /* Size from original */
411 *size2; /* Size from saved */
412 pwg_map_t *map, /* Map from original */
413 *map2; /* Map from saved */
414
415
416 /*
417 * Verify that we can write and read back the same data...
418 */
419
420 fputs("_ppdCacheWriteFile(test.pwg): ", stdout);
421 if (!_ppdCacheWriteFile(pc, "test.pwg", NULL))
422 {
423 puts("FAIL");
424 status ++;
425 }
426 else
427 puts("PASS");
428
429 fputs("_ppdCacheCreateWithFile(test.pwg): ", stdout);
430 if ((pc2 = _ppdCacheCreateWithFile("test.pwg", NULL)) == NULL)
431 {
432 puts("FAIL");
433 status ++;
434 }
435 else
436 {
437 // TODO: FINISH ADDING ALL VALUES IN STRUCTURE
438 if (pc2->num_sizes != pc->num_sizes)
439 {
440 if (!status)
441 puts("FAIL");
442
443 printf(" SAVED num_sizes=%d, ORIG num_sizes=%d\n", pc2->num_sizes,
444 pc->num_sizes);
445
446 status ++;
447 }
448 else
449 {
450 for (i = pc->num_sizes, size = pc->sizes, size2 = pc2->sizes;
451 i > 0;
452 i --, size ++, size2 ++)
453 {
454 if (strcmp(size2->map.pwg, size->map.pwg) ||
455 strcmp(size2->map.ppd, size->map.ppd) ||
456 size2->width != size->width ||
457 size2->length != size->length ||
458 size2->left != size->left ||
459 size2->bottom != size->bottom ||
460 size2->right != size->right ||
461 size2->top != size->top)
462 {
463 if (!status)
464 puts("FAIL");
465
466 if (strcmp(size->map.pwg, size2->map.pwg))
467 printf(" SAVED size->map.pwg=\"%s\", ORIG "
468 "size->map.pwg=\"%s\"\n", size2->map.pwg, size->map.pwg);
469
470 if (strcmp(size2->map.ppd, size->map.ppd))
471 printf(" SAVED size->map.ppd=\"%s\", ORIG "
472 "size->map.ppd=\"%s\"\n", size2->map.ppd, size->map.ppd);
473
474 if (size2->width != size->width)
475 printf(" SAVED size->width=%d, ORIG size->width=%d\n",
476 size2->width, size->width);
477
478 if (size2->length != size->length)
479 printf(" SAVED size->length=%d, ORIG size->length=%d\n",
480 size2->length, size->length);
481
482 if (size2->left != size->left)
483 printf(" SAVED size->left=%d, ORIG size->left=%d\n",
484 size2->left, size->left);
485
486 if (size2->bottom != size->bottom)
487 printf(" SAVED size->bottom=%d, ORIG size->bottom=%d\n",
488 size2->bottom, size->bottom);
489
490 if (size2->right != size->right)
491 printf(" SAVED size->right=%d, ORIG size->right=%d\n",
492 size2->right, size->right);
493
494 if (size2->top != size->top)
495 printf(" SAVED size->top=%d, ORIG size->top=%d\n",
496 size2->top, size->top);
497
498 status ++;
499 break;
500 }
501 }
502
503 for (i = pc->num_sources, map = pc->sources, map2 = pc2->sources;
504 i > 0;
505 i --, map ++, map2 ++)
506 {
507 if (strcmp(map2->pwg, map->pwg) ||
508 strcmp(map2->ppd, map->ppd))
509 {
510 if (!status)
511 puts("FAIL");
512
513 if (strcmp(map->pwg, map2->pwg))
514 printf(" SAVED source->pwg=\"%s\", ORIG source->pwg=\"%s\"\n",
515 map2->pwg, map->pwg);
516
517 if (strcmp(map2->ppd, map->ppd))
518 printf(" SAVED source->ppd=\"%s\", ORIG source->ppd=\"%s\"\n",
519 map2->ppd, map->ppd);
520
521 status ++;
522 break;
523 }
524 }
525
526 for (i = pc->num_types, map = pc->types, map2 = pc2->types;
527 i > 0;
528 i --, map ++, map2 ++)
529 {
530 if (strcmp(map2->pwg, map->pwg) ||
531 strcmp(map2->ppd, map->ppd))
532 {
533 if (!status)
534 puts("FAIL");
535
536 if (strcmp(map->pwg, map2->pwg))
537 printf(" SAVED type->pwg=\"%s\", ORIG type->pwg=\"%s\"\n",
538 map2->pwg, map->pwg);
539
540 if (strcmp(map2->ppd, map->ppd))
541 printf(" SAVED type->ppd=\"%s\", ORIG type->ppd=\"%s\"\n",
542 map2->ppd, map->ppd);
543
544 status ++;
545 break;
546 }
547 }
548 }
549
550 if (!status)
551 puts("PASS");
552
553 _ppdCacheDestroy(pc2);
554 }
555
556 /*
557 * Test PageSize mapping code...
558 */
559
560 status += test_pagesize(pc, ppd, "Letter");
561 status += test_pagesize(pc, ppd, "na-letter");
562 status += test_pagesize(pc, ppd, "A4");
563 status += test_pagesize(pc, ppd, "iso-a4");
564
565 return (status);
566 }
567