[poppler] regtest/backends regtest/main.py regtest/TestReferences.py regtest/TestRun.py regtest/Utils.py

Carlos Garcia Campos carlosgc at kemper.freedesktop.org
Thu Dec 3 06:53:52 PST 2015


 regtest/TestReferences.py      |    7 +++++--
 regtest/TestRun.py             |   11 +++++++----
 regtest/Utils.py               |   13 +++++++++++++
 regtest/backends/__init__.py   |    2 +-
 regtest/backends/cairo.py      |    7 +++++--
 regtest/backends/postscript.py |    7 +++++--
 regtest/backends/splash.py     |    7 +++++--
 regtest/backends/text.py       |    7 +++++--
 regtest/main.py                |    3 +++
 9 files changed, 49 insertions(+), 15 deletions(-)

New commits:
commit 3e22c678e749eda4402a7440b91b33d627705fdb
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date:   Thu Dec 3 15:46:58 2015 +0100

    regtest: Add support for testing password protected documents
    
    Similar to how skipped file works, you can pass a passwords file from
    the command line or add a Passwords file to your docs directory. This
    file should be a python file containing a "passwords" dictionary where
    the key is the test document and the value is the password required to
    open that document.

diff --git a/regtest/TestReferences.py b/regtest/TestReferences.py
index 4572ef6..05b08e2 100644
--- a/regtest/TestReferences.py
+++ b/regtest/TestReferences.py
@@ -21,7 +21,7 @@ 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
+from Utils import get_document_paths_from_dir, get_skipped_tests, get_passwords
 
 from Queue import Queue
 from threading import Thread, RLock
@@ -32,6 +32,7 @@ class TestReferences:
         self._docsdir = docsdir
         self._refsdir = refsdir
         self._skipped = get_skipped_tests(docsdir)
+        self._passwords = get_passwords(docsdir)
         self.config = Config()
         self.printer = get_printer()
         self._total_tests = 1
@@ -73,6 +74,8 @@ class TestReferences:
             raise
         doc_path = os.path.join(self._docsdir, filename)
 
+        password = self._passwords.get(filename)
+
         for backend in backends:
             if not self.config.force and backend.has_results(refs_path):
                 with self._lock:
@@ -80,7 +83,7 @@ class TestReferences:
                 self.printer.print_default("Results found, skipping '%s' for %s backend" % (doc_path, backend.get_name()))
                 continue
 
-            if backend.create_refs(doc_path, refs_path):
+            if backend.create_refs(doc_path, refs_path, password):
                 backend.create_checksums(refs_path, self.config.checksums_only)
             with self._lock:
                 self._n_tests += 1
diff --git a/regtest/TestRun.py b/regtest/TestRun.py
index 99b23ea..fc3f6a7 100644
--- a/regtest/TestRun.py
+++ b/regtest/TestRun.py
@@ -18,7 +18,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 Utils import get_document_paths_from_dir, get_skipped_tests, get_passwords
 from Printer import get_printer
 import sys
 import os
@@ -34,6 +34,7 @@ class TestRun:
         self._refsdir = refsdir
         self._outdir = outdir
         self._skip = get_skipped_tests(docsdir)
+        self._passwords = get_passwords(docsdir)
         self.config = Config()
         self.printer = get_printer()
         self._total_tests = 1
@@ -68,7 +69,7 @@ class TestRun:
 
         return get_all_backends()
 
-    def test(self, refs_path, doc_path, test_path, backend):
+    def test(self, refs_path, doc_path, test_path, backend, password):
         # First check whether there are test results for the backend
         ref_has_md5 = backend.has_md5(refs_path)
         ref_is_crashed = backend.is_crashed(refs_path)
@@ -80,7 +81,7 @@ class TestRun:
             self.printer.print_default("Reference files not found, skipping '%s' for %s backend" % (doc_path, backend.get_name()))
             return
 
-        test_has_md5 = backend.create_refs(doc_path, test_path)
+        test_has_md5 = backend.create_refs(doc_path, test_path, password)
         test_passed = False
         if ref_has_md5 and test_has_md5:
             test_passed = backend.compare_checksums(refs_path, test_path, not self.config.keep_results, self.config.create_diffs, self.config.update_refs)
@@ -165,8 +166,10 @@ class TestRun:
             self.printer.print_default("Reference dir not found for %s, skipping" % (doc_path))
             return
 
+        password = self._passwords.get(filename)
+
         for backend in backends:
-            self.test(refs_path, doc_path, out_path, backend)
+            self.test(refs_path, doc_path, out_path, backend, password)
 
     def _worker_thread(self):
         while True:
diff --git a/regtest/Utils.py b/regtest/Utils.py
index f491a6d..cd1a572 100644
--- a/regtest/Utils.py
+++ b/regtest/Utils.py
@@ -55,4 +55,17 @@ def get_skipped_tests(docsdir):
     f.close()
     return skipped
 
+def get_passwords(docsdir):
+    from Config import Config
+    config = Config()
+    if config.passwords_file:
+        passwords_file = config.passwords_file
+    elif os.path.exists(os.path.join(docsdir, 'Passwords')):
+        passwords_file = os.path.join(docsdir, 'Passwords')
+    else:
+        return {}
+
+    passwords = {}
+    execfile(passwords_file, passwords)
+    return passwords['passwords']
 
diff --git a/regtest/backends/__init__.py b/regtest/backends/__init__.py
index 95de143..1287110 100644
--- a/regtest/backends/__init__.py
+++ b/regtest/backends/__init__.py
@@ -287,7 +287,7 @@ class Backend:
     def _create_diff(self, ref_path, result_path):
         raise NotImplementedError
 
-    def create_refs(self, doc_path, refs_path):
+    def create_refs(self, doc_path, refs_path, password = None):
         raise NotImplementedError
 
 _backends = {}
diff --git a/regtest/backends/cairo.py b/regtest/backends/cairo.py
index 3593342..818ac3b 100644
--- a/regtest/backends/cairo.py
+++ b/regtest/backends/cairo.py
@@ -26,9 +26,12 @@ class Cairo(Backend):
         Backend.__init__(self, name, '.diff.png')
         self._pdftocairo = os.path.join(self._utilsdir, 'pdftocairo');
 
-    def create_refs(self, doc_path, refs_path):
+    def create_refs(self, doc_path, refs_path, password = None):
         out_path = os.path.join(refs_path, 'cairo')
-        p = subprocess.Popen([self._pdftocairo, '-cropbox', '-r', '72', '-png', doc_path, out_path], stderr = subprocess.PIPE)
+        cmd = [self._pdftocairo, '-cropbox', '-r', '72', '-png', doc_path, out_path]
+        if password is not None:
+            cmd.extend(['-opw', password])
+        p = subprocess.Popen(cmd, stderr = subprocess.PIPE)
         return self._check_exit_status(p, out_path)
 
     def _create_diff(self, ref_path, result_path):
diff --git a/regtest/backends/postscript.py b/regtest/backends/postscript.py
index 6236002..f9547cd 100644
--- a/regtest/backends/postscript.py
+++ b/regtest/backends/postscript.py
@@ -26,9 +26,12 @@ class PostScript(Backend):
         Backend.__init__(self, name)
         self._pdftops = os.path.join(self._utilsdir, 'pdftops');
 
-    def create_refs(self, doc_path, refs_path):
+    def create_refs(self, doc_path, refs_path, password = None):
         out_path = os.path.join(refs_path, 'postscript')
-        p = subprocess.Popen([self._pdftops, doc_path, out_path + '.ps'], stderr = subprocess.PIPE)
+        cmd = [self._pdftops, doc_path, out_path + '.ps']
+        if password is not None:
+            cmd.extend(['-opw', password])
+        p = subprocess.Popen(cmd, stderr = subprocess.PIPE)
         return self._check_exit_status(p, out_path)
 
 register_backend('postscript', PostScript)
diff --git a/regtest/backends/splash.py b/regtest/backends/splash.py
index aadbdec..f107198 100644
--- a/regtest/backends/splash.py
+++ b/regtest/backends/splash.py
@@ -26,9 +26,12 @@ class Splash(Backend):
         Backend.__init__(self, name, '.diff.png')
         self._pdftoppm = os.path.join(self._utilsdir, 'pdftoppm');
 
-    def create_refs(self, doc_path, refs_path):
+    def create_refs(self, doc_path, refs_path, password = None):
         out_path = os.path.join(refs_path, 'splash')
-        p = subprocess.Popen([self._pdftoppm, '-cropbox', '-r', '72', '-png', doc_path, out_path], stderr = subprocess.PIPE)
+        cmd = [self._pdftoppm, '-cropbox', '-r', '72', '-png', doc_path, out_path]
+        if password is not None:
+            cmd.extend(['-opw', password])
+        p = subprocess.Popen(cmd, stderr = subprocess.PIPE)
         return self._check_exit_status(p, out_path)
 
     def _create_diff(self, ref_path, result_path):
diff --git a/regtest/backends/text.py b/regtest/backends/text.py
index 10b660a..598aab8 100644
--- a/regtest/backends/text.py
+++ b/regtest/backends/text.py
@@ -26,9 +26,12 @@ class Text(Backend):
         Backend.__init__(self, name, '.diff')
         self._pdftotext = os.path.join(self._utilsdir, 'pdftotext');
 
-    def create_refs(self, doc_path, refs_path):
+    def create_refs(self, doc_path, refs_path, password = None):
         out_path = os.path.join(refs_path, 'text')
-        p = subprocess.Popen([self._pdftotext, doc_path, out_path + '.txt'], stderr = subprocess.PIPE)
+        cmd = [self._pdftotext, doc_path, out_path + '.txt']
+        if password is not None:
+            cmd.extend(['-opw', password])
+        p = subprocess.Popen([cmd, stderr = subprocess.PIPE)
         return self._check_exit_status(p, out_path)
 
     def _create_diff(self, ref_path, result_path):
diff --git a/regtest/main.py b/regtest/main.py
index 59b178b..0febb79 100644
--- a/regtest/main.py
+++ b/regtest/main.py
@@ -65,6 +65,9 @@ def main(args):
     parser.add_argument('--skip', metavar = 'FILE',
                         action = 'store', dest = 'skipped_file',
                         help = 'File containing tests to skip')
+    parser.add_argument('-p', '--passwords', metavar = 'FILE',
+                        action = 'store', dest = 'passwords_file',
+                        help = 'File containing the documents passwords')
     parser.add_argument('-t', '--threads',
                         action = 'store', dest = 'threads', type = int, default = n_cpus,
                         help = 'Number of worker threads (Default: %d)' % n_cpus)


More information about the poppler mailing list