Home | History | Annotate | Download | only in cups
      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 */
     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 */
    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 */
    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