[poppler] regtest/backends regtest/commands regtest/main.py regtest/Printer.py regtest/TestReferences.py regtest/TestRun.py
Carlos Garcia Campos
carlosgc at kemper.freedesktop.org
Sun Sep 23 09:21:27 PDT 2012
regtest/Printer.py | 96 ++++++++++++++++++++++++++++++++++++
regtest/TestReferences.py | 8 +--
regtest/TestRun.py | 35 ++++++-------
regtest/backends/__init__.py | 13 +++-
regtest/commands/create-refs.py | 3 -
regtest/commands/find-regression.py | 5 +
regtest/commands/run-tests.py | 3 -
regtest/main.py | 3 +
8 files changed, 137 insertions(+), 29 deletions(-)
New commits:
commit 32bb87419c360a3b14c717c0f385198b70a1b2e7
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date: Sun Sep 23 18:15:13 2012 +0200
regtest: Reduce the noise of the default output when running tests
Show permanent information only about failed tests, without the details
about the failing pages. Previous verbose output is available passing
--verbose command line output.
diff --git a/regtest/Printer.py b/regtest/Printer.py
new file mode 100644
index 0000000..68356b5
--- /dev/null
+++ b/regtest/Printer.py
@@ -0,0 +1,96 @@
+# Printer.py
+#
+# Copyright (C) 2012 Carlos Garcia Campos <carlosgc at gnome.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import sys
+from Config import Config
+
+class Printer:
+
+ __single = None
+
+ def __init__(self):
+ if Printer.__single is not None:
+ raise Printer.__single
+
+ self._verbose = Config().verbose
+ self._stream = sys.stdout
+ self._rewrite = self._stream.isatty() #and not self.config.verbose
+ self._current_line = None
+
+ Printer.__single = self
+
+ def _erase_current_line(self):
+ if not self._rewrite or self._current_line is None:
+ return
+
+ line_len = len(self._current_line)
+ self._stream.write('\b' * line_len + ' ' * line_len + '\b' * line_len)
+ self._current_line = None
+
+ def _ensure_new_line(self, msg):
+ if not msg.endswith('\n'):
+ msg += '\n'
+ return msg
+
+ def _print(self, msg):
+ self._stream.write(msg)
+ self._stream.flush()
+
+ def printout(self, msg):
+ self._erase_current_line()
+ self._print(msg)
+ self._current_line = msg[msg.rfind('\n') + 1:]
+
+ def printout_update(self, msg):
+ if self._rewrite and self._current_line is not None:
+ msg = self._current_line + msg
+ elif not self._rewrite:
+ msg = self._ensure_new_line(msg)
+ self.printout(msg)
+
+ def printout_ln(self, msg):
+ if self._current_line is not None:
+ self._current_line = None
+ msg = '\n' + msg
+
+ self._print(self._ensure_new_line(msg))
+
+ def printerr(self, msg):
+ self.stderr.write(self._ensure_new_line(msg))
+ self.stderr.flush()
+
+ def print_test_start(self, msg):
+ self.printout(msg)
+
+ def print_test_result(self, msg):
+ self.printout_update(msg)
+
+ def print_default(self, msg):
+ if self._verbose:
+ self.printout_ln(msg)
+
+def get_printer():
+ try:
+ instance = Printer()
+ except Printer, i:
+ instance = i
+
+ return instance
+
+
+
diff --git a/regtest/TestReferences.py b/regtest/TestReferences.py
index d65d30d..9a9e923 100644
--- a/regtest/TestReferences.py
+++ b/regtest/TestReferences.py
@@ -20,6 +20,7 @@ import os
import errno
from backends import get_backend, get_all_backends
from Config import Config
+from Printer import get_printer
from Utils import get_document_paths_from_dir, get_skipped_tests
class TestReferences:
@@ -29,6 +30,7 @@ class TestReferences:
self._refsdir = refsdir
self._skipped = get_skipped_tests(docsdir)
self.config = Config()
+ self.printer = get_printer()
try:
os.makedirs(self._refsdir)
@@ -40,7 +42,7 @@ class TestReferences:
def create_refs_for_file(self, filename, n_doc = 1, total_docs = 1):
if filename in self._skipped:
- print("Skipping test '%s' (%d/%d)" % (os.path.join(self._docsdir, filename), n_doc, total_docs))
+ self.printer.print_default("Skipping test '%s' (%d/%d)" % (os.path.join(self._docsdir, filename), n_doc, total_docs))
return
refs_path = os.path.join(self._refsdir, filename)
@@ -60,9 +62,9 @@ class TestReferences:
for backend in backends:
if not self.config.force and backend.has_results(refs_path):
- print("Results found, skipping '%s' for %s backend (%d/%d)" % (doc_path, backend.get_name(), n_doc, total_docs))
+ self.printer.print_default("Results found, skipping '%s' for %s backend (%d/%d)" % (doc_path, backend.get_name(), n_doc, total_docs))
continue
- print("Creating refs for '%s' using %s backend (%d/%d)" % (doc_path, backend.get_name(), n_doc, total_docs))
+ self.printer.printout_ln("Creating refs for '%s' using %s backend (%d/%d)" % (doc_path, backend.get_name(), n_doc, total_docs))
if backend.create_refs(doc_path, refs_path):
backend.create_checksums(refs_path, self.config.checksums_only)
diff --git a/regtest/TestRun.py b/regtest/TestRun.py
index cffd00b..24afa2f 100644
--- a/regtest/TestRun.py
+++ b/regtest/TestRun.py
@@ -19,6 +19,7 @@
from backends import get_backend, get_all_backends
from Config import Config
from Utils import get_document_paths_from_dir, get_skipped_tests
+from Printer import get_printer
import sys
import os
import errno
@@ -31,6 +32,7 @@ class TestRun:
self._outdir = outdir
self._skip = get_skipped_tests(docsdir)
self.config = Config()
+ self.printer = get_printer()
# Results
self._n_tests = 0
@@ -56,12 +58,11 @@ class TestRun:
ref_is_failed = backend.is_failed(refs_path)
if not ref_has_md5 and not ref_is_crashed and not ref_is_failed:
self._skipped.append("%s (%s)" % (doc_path, backend.get_name()))
- print("Reference files not found, skipping '%s' for %s backend" % (doc_path, backend.get_name()))
+ self.printer.print_default("Reference files not found, skipping '%s' for %s backend" % (doc_path, backend.get_name()))
return
self._n_tests += 1
- sys.stdout.write("Testing '%s' using %s backend (%d/%d): " % (doc_path, backend.get_name(), n_doc, total_docs))
- sys.stdout.flush()
+ self.printer.print_test_start("Testing '%s' using %s backend (%d/%d): " % (doc_path, backend.get_name(), n_doc, total_docs))
test_has_md5 = backend.create_refs(doc_path, test_path)
if backend.has_stderr(test_path):
@@ -70,7 +71,7 @@ class TestRun:
if ref_has_md5 and test_has_md5:
if backend.compare_checksums(refs_path, test_path, not self.config.keep_results, self.config.create_diffs, self.config.update_refs):
# FIXME: remove dir if it's empty?
- print("PASS")
+ self.printer.print_test_result("PASS")
self._n_passed += 1
else:
print("FAIL")
@@ -78,32 +79,31 @@ class TestRun:
return
elif test_has_md5:
if ref_is_crashed:
- print("DOES NOT CRASH")
+ self.printer.print_test_result("DOES NOT CRASH")
elif ref_is_failed:
- print("DOES NOT FAIL")
-
+ self.printer.print_test_result("DOES NOT FAIL")
return
test_is_crashed = backend.is_crashed(test_path)
if ref_is_crashed and test_is_crashed:
- print("PASS (Expected crash)")
+ self.printer.print_test_result("PASS (Expected crash)")
self._n_passed += 1
return
test_is_failed = backend.is_failed(test_path)
if ref_is_failed and test_is_failed:
# FIXME: compare status errors
- print("PASS (Expected fail with status error %d)" % (test_is_failed))
+ self.printer.print_test_result("PASS (Expected fail with status error %d)" % (test_is_failed))
self._n_passed += 1
return
if test_is_crashed:
- print("CRASH")
+ self.printer.print_test_result("CRASH")
self._crashed.append("%s (%s)" % (doc_path, backend.get_name()))
return
if test_is_failed:
- print("FAIL (status error %d)" % (test_is_failed))
+ self.printer.print_test_result("FAIL (status error %d)" % (test_is_failed))
self._failed_status_error("%s (%s)" % (doc_path, backend.get_name()))
return
@@ -111,7 +111,7 @@ class TestRun:
if filename in self._skip:
doc_path = os.path.join(self._docsdir, filename)
self._skipped.append("%s" % (doc_path))
- print("Skipping test '%s' (%d/%d)" % (doc_path, n_doc, total_docs))
+ self.printer.print_default("Skipping test '%s' (%d/%d)" % (doc_path, n_doc, total_docs))
return
out_path = os.path.join(self._outdir, filename)
@@ -127,7 +127,7 @@ class TestRun:
if not os.path.isdir(refs_path):
self._skipped.append("%s" % (doc_path))
- print("Reference dir not found for %s, skipping (%d/%d)" % (doc_path, n_doc, total_docs))
+ self.printer.print_default("Reference dir not found for %s, skipping (%d/%d)" % (doc_path, n_doc, total_docs))
return
if self.config.backends:
@@ -147,16 +147,17 @@ class TestRun:
def summary(self):
if not self._n_tests:
- print("No tests run")
+ self.printer.printout_ln("No tests run")
return
- print("Total %d tests" % (self._n_tests))
- print("%d tests passed (%.2f%%)" % (self._n_passed, (self._n_passed * 100.) / self._n_tests))
+ self.printer.printout_ln("Total %d tests" % (self._n_tests))
+ self.printer.printout_ln("%d tests passed (%.2f%%)" % (self._n_passed, (self._n_passed * 100.) / self._n_tests))
def report_tests(test_list, test_type):
n_tests = len(test_list)
if not n_tests:
return
- print("%d tests %s (%.2f%%): %s" % (n_tests, test_type, (n_tests * 100.) / self._n_tests, ", ".join(test_list)))
+ self.printer.printout_ln("%d tests %s (%.2f%%): %s" % (n_tests, test_type, (n_tests * 100.) / self._n_tests, ", ".join(test_list)))
+
report_tests(self._failed, "failed")
report_tests(self._crashed, "crashed")
report_tests(self._failed_status_error, "failed to run")
diff --git a/regtest/backends/__init__.py b/regtest/backends/__init__.py
index 26be0b0..ff6ef84 100644
--- a/regtest/backends/__init__.py
+++ b/regtest/backends/__init__.py
@@ -21,6 +21,7 @@ import os
import shutil
import errno
from Config import Config
+from Printer import get_printer
__all__ = [ 'register_backend',
'get_backend',
@@ -38,6 +39,8 @@ class Backend:
self._diff_ext = diff_ext
self._utilsdir = Config().utils_dir
+ self.printer = get_printer()
+
def get_name(self):
return self._name
@@ -83,7 +86,7 @@ class Backend:
if not basename in tests:
retval = False
- print("%s found in md5 ref file but missing in output dir %s" % (basename, out_path))
+ self.printer.print_default("%s found in md5 ref file but missing in output dir %s" % (basename, out_path))
continue
result_path = os.path.join(out_path, basename)
@@ -99,10 +102,10 @@ class Backend:
if remove_results:
os.remove(result_path)
else:
- print("Differences found in %s" % (basename))
+ self.printer.print_default("Differences found in %s" % (basename))
if create_diffs:
if not os.path.exists(ref_path):
- print("Reference file %s not found, skipping diff for %s" % (ref_path, result_path))
+ self.printer.print_default("Reference file %s not found, skipping diff for %s" % (ref_path, result_path))
else:
try:
self._create_diff(ref_path, result_path)
@@ -112,14 +115,14 @@ class Backend:
if update_refs:
if os.path.exists(ref_path):
- print("Updating image reference %s" % (ref_path))
+ self.printer.print_default("Updating image reference %s" % (ref_path))
shutil.copyfile(result_path, ref_path)
retval = False
md5_file.close()
if update_refs and not retval:
- print("Updating md5 reference %s" % (md5_path))
+ self.printer.print_default("Updating md5 reference %s" % (md5_path))
f = open(md5_path + '.md5.tmp', 'wb')
f.writelines(result_md5)
f.close()
diff --git a/regtest/commands/create-refs.py b/regtest/commands/create-refs.py
index b055703..d559fb3 100644
--- a/regtest/commands/create-refs.py
+++ b/regtest/commands/create-refs.py
@@ -20,6 +20,7 @@ from commands import Command, register_command
from TestReferences import TestReferences
from Timer import Timer
from Config import Config
+from Printer import get_printer
import os
import tempfile
@@ -60,6 +61,6 @@ class CreateRefs(Command):
refs.create_refs()
else:
refs.create_refs_for_file(os.path.basename(doc))
- print("Refs created in %s" % (t.elapsed_str()))
+ get_printer().printout_ln("Refs created in %s" % (t.elapsed_str()))
register_command('create-refs', CreateRefs)
diff --git a/regtest/commands/find-regression.py b/regtest/commands/find-regression.py
index 1a46eee..8f5f811 100644
--- a/regtest/commands/find-regression.py
+++ b/regtest/commands/find-regression.py
@@ -20,6 +20,7 @@ from commands import Command, register_command
from Bisect import Bisect
from Timer import Timer
from Config import Config
+from Printer import get_printer
import os
import tempfile
@@ -66,12 +67,12 @@ class FindRegression(Command):
doc = options['test']
if not os.path.isfile(doc):
- print("Invalid test %s: not a regulat file" % (doc))
+ get_printer().printerr("Invalid test %s: not a regulat file" % (doc))
return
t = Timer()
bisect = Bisect(options['test'], options['refs_dir'], options['out_dir'])
bisect.run()
- print("Tests run in %s" % (t.elapsed_str()))
+ get_printer().printout_ln("Tests run in %s" % (t.elapsed_str()))
register_command('find-regression', FindRegression)
diff --git a/regtest/commands/run-tests.py b/regtest/commands/run-tests.py
index d05d815..c5d87f9 100644
--- a/regtest/commands/run-tests.py
+++ b/regtest/commands/run-tests.py
@@ -20,6 +20,7 @@ from commands import Command, register_command
from TestRun import TestRun
from Timer import Timer
from Config import Config
+from Printer import get_printer
import os
import tempfile
@@ -68,6 +69,6 @@ class RunTests(Command):
else:
tests.run_test(os.path.basename(doc))
tests.summary()
- print("Tests run in %s" % (t.elapsed_str()))
+ get_printer().printout_ln("Tests run in %s" % (t.elapsed_str()))
register_command('run-tests', RunTests)
diff --git a/regtest/main.py b/regtest/main.py
index a46a64c..290c8bc 100644
--- a/regtest/main.py
+++ b/regtest/main.py
@@ -49,6 +49,9 @@ def main(args):
parser.add_argument('--help-command', metavar = 'COMMAND',
action = HelpAction,
help = 'Show help for a given command')
+ parser.add_argument('-v', '--verbose',
+ action = 'store_true', dest = 'verbose', default = False,
+ help = 'Run in verbose mode')
parser.add_argument('--utils-dir',
action = 'store', dest = 'utils_dir', default = os.path.abspath("../utils"),
help = 'Directory of poppler utils used for the tests')
More information about the poppler
mailing list