1#!/usr/bin/env python 2 3# Copyright (C) 2001-2004 Artifex Software Inc. 4# All Rights Reserved. 5# 6# This software is provided AS-IS with no warranty, either express or 7# implied. 8# 9# This software is distributed under license and may not be copied, modified 10# or distributed except as expressly authorized under the terms of that 11# license. Refer to licensing information at http://www.artifex.com/ 12# or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, 13# San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information. 14 15# $Id: gscheck_pdfwrite.py 9206 2008-11-06 23:51:27Z marcos $ 16 17# 18# gscheck_pdfwrite.py 19# 20# compares Ghostscript against a baseline made from file->pdf->raster->md5sum. 21# this test tries to detect Ghostscript changes that affect the pdfwrite driver. 22 23myself="gscheck_pdfwrite.py" 24 25import os, stat 26import calendar, string, time 27import gstestutils 28import gsconf, gstestgs, gsparamsets, gssum, gsutil 29import shutil 30 31class GSPDFWriteCompareTestCase(gstestgs.GhostscriptTestCase): 32 def shortDescription(self): 33 file = "%s.pdf.%s.%d.%d" % (self.file[string.rindex(self.file, '/') + 1:], self.device, self.dpi, self.band) 34 rasterfilename = gsconf.rasterdbdir + file + ".gz" 35 36 if self.band: 37 banded = "banded" 38 else: 39 banded = "noband" 40 filename_base= os.path.basename(self.file) 41 filename_details= "%s (%s/%ddpi/%s)" % (filename_base, self.device, self.dpi,banded) 42 43 message="pdfwrite testing "+filename_details 44 45 if not os.access(rasterfilename, os.F_OK): 46 message="ERROR \ncannot find "+rasterfilename+" for "+filename_details 47 print myself,message 48 self.skip = 1 49 else: 50 ct = time.localtime(os.stat(rasterfilename)[stat.ST_MTIME]) 51 baseline_date = "%s %d, %4d %02d:%02d" % (calendar.month_abbr[ct[1]], ct[2], ct[0], ct[3], ct[4]) 52 53 message="Checking pdfwrite of %s against baseline set on %s" % (filename_details,baseline_date) 54 55 return message 56 57 def runTest(self): 58 if hasattr(self, "skip") and self.skip: 59 self.assert_(True) 60 return 61 62 file1 = '%s.%s.%d.%d.pdf' % (self.file[string.rindex(self.file, '/') + 1:], 'pdf', self.dpi, self.band) 63 file2 = '%s.pdf.%s.%d.%d' % (self.file[string.rindex(self.file, '/') + 1:], self.device, self.dpi, self.band) 64 65 gs = gstestgs.Ghostscript() 66 67 gs.gsroot = self.gsroot 68 gs.dpi = self.dpi 69 gs.band = self.band 70 gs.infile = self.file 71 if self.log_stdout: 72 gs.log_stdout = self.log_stdout 73 if self.log_stderr: 74 gs.log_stderr = self.log_stderr 75 76 # do file->PDF conversion 77 gs.device = 'pdfwrite' 78 gs.dpi = None 79 gs.outfile = file1 80 if not gs.process(): 81 self.fail("non-zero exit code trying to create pdf file from " + self.file) 82 83 # do PDF->device (pbmraw, pgmraw, ppmraw, pkmraw) 84 gs.device = self.device 85 gs.dpi = self.dpi 86 gs.infile = file1 87 gs.outfile = file2 88 if not gs.process(): 89 self.fail("non-zero exit code trying to rasterize " + file1) 90 91 if os.path.exists(file1): 92 shutil.move(file1, gsconf.datadir+"/raster.daily") 93# os.unlink(file1) 94 else: 95 self.fail("output file "+file1+" was not created for input file: " + file1) 96 97 if os.path.exists(file2): 98 sum = gssum.make_sum(file2) 99 if not sum: 100 self.fail("no checksum for output file "+file2+" was not created for input file: " + self.file) 101 shutil.move(file2, gsconf.datadir+"/raster.daily") 102# os.unlink(file2) 103 else: 104 self.fail("output file "+file2+" was not created for input file: " + file2) 105 106 # add test result to daily database 107 if self.track_daily: 108 if gsconf.__dict__.has_key("checksumdb") and gsconf.checksumdb: 109 dbname=gsconf.dailydir+gsconf.checksumdb # mhw+".db" 110 else: 111 dbname=gsconf.get_dailydb_name() 112 gssum.add_file(file2, dbname=dbname, sum=sum) 113 114 else: 115 outputfile=file2 116 if gssum.exists(outputfile,gsconf.baselinedb): 117 sum_baseline=gssum.get_sum(outputfile,gsconf.baselinedb) 118 message=myself+' checksum did not match baseline (' + outputfile + ') for input file: ' + self.file 119 self.assertEqual(sum,sum_baseline,message) 120 else: 121 message = myself+" no baseline checksum (" + outputfile + ") for file: " + self.file 122 self.fail(message) 123 124# Add the tests defined in this file to a suite 125 126def add_compare_test(suite, gsroot, testfile, device, dpi, band, track, now=None): 127 128 logdir=gsconf.logdir 129 if now == None: 130 now=time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime()) 131 prefix=logdir+now+"." 132 133 log_stdout=prefix+gsconf.gs_stdout 134 log_stderr=prefix+gsconf.gs_stderr 135 136 suite.addTest(GSPDFWriteCompareTestCase(gsroot=gsroot, 137 file=gsconf.comparefiledir + testfile, 138 device=device,dpi=dpi,band=band, 139 log_stdout=log_stdout, 140 log_stderr=log_stderr, 141 track_daily=track,now=now) 142 ) 143 144def addTests(suite,gsroot,now,options=None, **args): 145 if options: 146 pass # future implementation possible 147 148 if args.has_key('track'): 149 track = args['track'] 150 else: 151 track = 0 152 153 # get a list of test files 154 comparefiles = os.listdir(gsconf.comparefiledir) 155 comparefiles.sort() 156 157# for testfile in comparefiles: 158# print myself,testfile 159 160 for testfile in comparefiles: 161 if gsutil.check_extension(testfile): 162 for params in gsparamsets.pdftestparamsets: 163 add_compare_test(suite, 164 gsroot,testfile,params.device,params.resolution,params.banding,track) 165 166if __name__ == "__main__": 167 gstestutils.gsRunTestsMain(addTests) 168