• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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