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