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