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