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_raster.py 9206 2008-11-06 23:51:27Z marcos $
16
17#
18# gscheck_raster.py
19#
20# rasterizes input files in several configurations and checks them
21# against known baselines
22#
23
24myself="gscheck_raster.py"
25import sys, os, stat
26import string, calendar, time
27import gstestutils
28import gssum, gsconf, gstestgs, gsparamsets, gsutil
29import shutil
30
31import time
32
33class GSCompareTestCase(gstestgs.GhostscriptTestCase):
34
35    def shortDescription(self):
36        file = "%s.%s.%d.%d" % (self.file[string.rindex(self.file, '/') + 1:], self.device, self.dpi, self.band)
37	rasterfilename = gsconf.rasterdbdir + file + ".gz"
38
39        if self.band:
40            banded = "banded"
41        else:
42            banded = "noband"
43        filename_base= os.path.basename(self.file)
44        filename_details= "%s (%s/%ddpi/%s)" % (filename_base, self.device, self.dpi,banded)
45
46	if not os.access(rasterfilename, os.F_OK):
47            message="ERROR \ncannot find "+rasterfilename+" for "+filename_details
48            print myself,message
49            self.skip = 1
50        else:
51            ct = time.localtime(os.stat(rasterfilename)[stat.ST_MTIME])
52            baseline_date = "%s %d, %4d %02d:%02d" % ( calendar.month_abbr[ct[1]], ct[2], ct[0], ct[3], ct[4] )
53            message="Checking %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 == 1:
59	    self.assert_(True)
60	    return
61
62	outputfile = "%s.%s.%d.%d" % (self.file[string.rindex(self.file, '/') + 1:], self.device, self.dpi, self.band)
63
64	gs = gstestgs.Ghostscript()
65
66	gs.gsroot = self.gsroot
67	gs.device = self.device
68	gs.dpi = self.dpi
69	gs.band = self.band
70	gs.infile = self.file
71	gs.outfile = outputfile
72	if self.log_stdout:
73	    gs.log_stdout = self.log_stdout
74	if self.log_stderr:
75	    gs.log_stderr = self.log_stderr
76
77	if gs.process():
78	    sum = gssum.make_sum(outputfile)
79        else:
80	    sum = ''
81
82        if os.path.exists(outputfile):
83            shutil.move(outputfile, gsconf.datadir+"/raster.daily")
84#           os.unlink(outputfile)
85
86	if sum and self.track_daily:	                                                  # add test result to daily database
87            if gsconf.__dict__.has_key("checksumdb") and gsconf.checksumdb:
88                dbname=gsconf.dailydir+gsconf.checksumdb # mhw +".db"
89            else:
90                dbname=gsconf.get_dailydb_name()
91            gssum.add_file(outputfile, dbname=dbname, sum=sum)
92
93	if not sum:
94	    message=myself+" output file "+outputfile+" was not created for input file: " + self.file
95	    self.fail(message)
96        else:
97            if gssum.exists(outputfile,gsconf.baselinedb):
98                sum_baseline=gssum.get_sum(outputfile,gsconf.baselinedb)
99                message=myself+' checksum did not match baseline (' + outputfile + ') for input file: ' + self.file
100                self.assertEqual(sum,sum_baseline,message)
101            else:
102                message = myself+" no baseline checksum (" + outputfile + ") for file: " + self.file
103                self.fail(message)
104
105# add compare tests
106def add_compare_test(suite, gsroot, testfile, device, dpi, band, track, now=None):
107
108    logdir=gsconf.logdir
109    if now == None:
110        now=time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime())
111    prefix=logdir+now+"."
112
113    log_stdout=prefix+gsconf.gs_stdout
114    log_stderr=prefix+gsconf.gs_stderr
115
116    suite.addTest(GSCompareTestCase(gsroot=gsroot,
117                                    file=gsconf.comparefiledir + testfile,
118                                    device=device,dpi=dpi,band=band,
119                                    log_stdout=log_stdout,
120                                    log_stderr=log_stderr,
121                                    track_daily=track,now=now)
122                  )
123
124def addTests(suite,gsroot,now,options=None, **args):
125    if args.has_key('track'):
126        track = args['track']
127    else:
128        track = 0
129
130    # get a list of test files
131    comparefiles = os.listdir(gsconf.comparefiledir)
132    comparefiles.sort()
133
134    if sys.modules["gsconf"].__dict__.has_key("revision"):
135        print myself,gsconf.revision
136
137#    for testfile in comparefiles:
138#        print myself,testfile
139
140    for testfile in comparefiles:
141        if gsutil.check_extension(testfile):
142	    for params in gsparamsets.testparamsets:
143	        add_compare_test(suite,
144                                 gsroot,testfile,
145                                 params.device,params.resolution,params.banding,
146                                 track,now)
147
148if __name__ == '__main__':
149    gstestutils.gsRunTestsMain(addTests)
150