You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
6.0 KiB
172 lines
6.0 KiB
#! /usr/bin/env python
|
|
##############################################################################
|
|
# This file is part of the wvWare 2 project
|
|
# Copyright (C) 2003 Werner Trobin <trobin@kde.org>
|
|
#
|
|
# This library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Library General Public
|
|
# License version 2 as published by the Free Software Foundation.
|
|
#
|
|
# This library is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Library General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Library General Public License
|
|
# along with this library; see the file COPYING.LIB. If not, write to
|
|
# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
# Boston, MA 02111-1307, USA.
|
|
##############################################################################
|
|
|
|
# An automatic regression test script, based on a record/replay approach.
|
|
# It runs .doc files through wv2, using a verbose "consumer", printing tons
|
|
# of information about the .doc file. This information is compared to a
|
|
# previously recorded and verified template.
|
|
|
|
import getopt, sys, os, filecmp
|
|
from stat import *
|
|
|
|
|
|
# Prints usage information to stdout
|
|
def usage():
|
|
print "Regression test for the wv2 library..."
|
|
print "Usage: regression [OPTION]... [FILE]...\n"
|
|
print "Examples:"
|
|
print " regression --record <document.doc> # Record a template of the given .doc"
|
|
print " regression <file/directory> # Verify the given file/directory\n"
|
|
print "Options:"
|
|
print " -d, --diff In case the regression test fails, output the diff"
|
|
print " -h, --help Output this information"
|
|
print " -l, --local Don't recurse to subdirectories"
|
|
print " -m, --missing-only Record only missing template files (implies -r)"
|
|
print " -p, --pedantic Abort on any .doc error"
|
|
print " -r, --record Record a template file"
|
|
print " -x, --extension=EXT Use EXT as extension for the template files (default=reg)"
|
|
|
|
|
|
# Processes all remaining command line arguments after getopt removed
|
|
# all the options.
|
|
def process(args):
|
|
for a in args:
|
|
try:
|
|
mode = os.stat(a)[ST_MODE]
|
|
if S_ISDIR(mode):
|
|
processDirectory(a)
|
|
elif S_ISREG(mode):
|
|
processDocument(a)
|
|
else:
|
|
print "Skipping %s: This isn't a file or directory" % (a)
|
|
except OSError, e:
|
|
print "Skipping %s: %s (%d)" % (a, e.strerror, e.errno)
|
|
|
|
|
|
# Recursively processes all (.doc) files of a directory
|
|
def processDirectory(directory):
|
|
for f in os.listdir(directory):
|
|
pathname = '%s/%s' % (directory, f)
|
|
mode = os.stat(pathname)[ST_MODE]
|
|
if S_ISDIR(mode) and local == 0:
|
|
processDirectory(pathname)
|
|
elif S_ISREG(mode):
|
|
processDocument(pathname)
|
|
else:
|
|
# Unknown file type, print a message
|
|
print "Skipping", pathname
|
|
|
|
|
|
# Process a single (.doc) file. Starts wv2 on it and compares (or generates)
|
|
# the template file
|
|
def processDocument(document):
|
|
root, ext = os.path.splitext(document)
|
|
if ext != ".doc" and ext != ".DOC":
|
|
return
|
|
|
|
print "Processing:", document
|
|
status = 0
|
|
result = 0
|
|
templateFile = root + '.' + extension
|
|
|
|
if record == 1:
|
|
if missing == 0 or not os.path.exists(templateFile):
|
|
status = os.system("./handlertest \"%s\" &> \"%s\"" % (document, templateFile))
|
|
if status != 0:
|
|
os.unlink(templateFile)
|
|
else:
|
|
# Does the template file exist at all?
|
|
try:
|
|
mode = os.stat(templateFile)[ST_MODE]
|
|
if not S_ISREG(mode):
|
|
status = -42
|
|
except OSError:
|
|
status = -42
|
|
|
|
if status == -42:
|
|
print "Error: There's no template file for '%s'" % (document)
|
|
result = 1 # We don't want to exit even with --pedantic
|
|
else: # Okay, it makes sense to start the comparison
|
|
tmpFile = os.tempnam()
|
|
status = os.system("./handlertest \"%s\" &> \"%s\"" % (document, tmpFile))
|
|
# If the status is okay we compare the files
|
|
if status == 0:
|
|
result = filecmp.cmp(tmpFile, templateFile)
|
|
if result == 0 and diff == 1:
|
|
os.system("diff -ua \"%s\" \"%s\"" % (templateFile, tmpFile))
|
|
print "%s: %d (status = %d)" % (document, result, status)
|
|
os.unlink(tmpFile)
|
|
|
|
if result != 1 and pedantic == 1:
|
|
print "Error: Aborting the test run (--pedantic), status", status, "result", result
|
|
sys.exit(status)
|
|
|
|
|
|
# Interpret the options and kick off the testing process.
|
|
# Sets the global variables "record", "extension", and "pedantic"
|
|
def main():
|
|
try:
|
|
opts, args = getopt.getopt(sys.argv[1:], "dhrx:plm", ["diff", "help", "record", "extension=", "pedantic", "local", "missing-only"])
|
|
except getopt.GetoptError:
|
|
# print help information and exit:
|
|
usage()
|
|
sys.exit(2)
|
|
|
|
global diff, record, extension, pedantic, local, missing
|
|
# Does the user want to see the diff on failure?
|
|
diff = 0
|
|
# Are we in record or in verify mode?
|
|
record = 0
|
|
# What extension do we use?
|
|
extension = "reg"
|
|
# Pedantic mode?
|
|
pedantic = 0
|
|
# Recurse?
|
|
local = 0
|
|
# Missing only?
|
|
missing = 0
|
|
|
|
for o, a in opts:
|
|
if o in ("-d", "--diff"):
|
|
diff = 1
|
|
if o in ("-h", "--help"):
|
|
usage()
|
|
sys.exit()
|
|
if o in ("-r", "--record"):
|
|
record = 1
|
|
if o in ("-x", "--extension"):
|
|
extension = a
|
|
if o in ("-p", "--pedantic"):
|
|
pedantic = 1
|
|
if o in ("-l", "--local"):
|
|
local = 1
|
|
if o in ("-m", "--missing-only"):
|
|
missing = 1
|
|
record = 1
|
|
|
|
if len(args) == 0:
|
|
usage()
|
|
sys.exit(2)
|
|
|
|
process(args)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|