#!/usr/bin/env python import unittest import os import sys import tempfile import shutil import subprocess class Common(object): PDF2HTMLEX_PATH = "@PDF2HTMLEX_PATH@" if not os.path.isfile(PDF2HTMLEX_PATH) or not os.access(PDF2HTMLEX_PATH, os.X_OK): print >> sys.stderr, "Cannot locate pdf2htmlEX executable, expected at ", PDF2HTMLEX_PATH, ". Make sure source was built before running this test." exit(1) SRC_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) TEST_DIR = os.path.join(SRC_DIR, 'test') DATA_DIR = os.path.join(SRC_DIR, 'share') SAVE_TMP = bool(os.environ.get('P2H_TEST_SAVE_TMP')) GENERATING_MODE = bool(os.environ.get('P2H_TEST_GEN')) CANONICAL_TEMPDIR = '/tmp/pdf2htmlEX_test' def setUp(self): if not self.SAVE_TMP: self.cur_temp_dir = tempfile.mkdtemp(prefix='pdf2htmlEX_test') else: shutil.rmtree(self.CANONICAL_TEMPDIR, True) os.mkdir(self.CANONICAL_TEMPDIR) self.cur_temp_dir = self.CANONICAL_TEMPDIR self.cur_data_dir = os.path.join(self.cur_temp_dir, 'share') self.cur_output_dir = os.path.join(self.cur_temp_dir, 'out') os.mkdir(self.cur_data_dir) os.mkdir(self.cur_output_dir) # filter manifest with open(os.path.join(self.DATA_DIR, 'manifest')) as inf: with open(os.path.join(self.cur_data_dir, 'manifest'), 'w') as outf: ignore = False for line in inf: if ignore: if line.startswith('#TEST_IGNORE_END'): ignore = False elif line.startswith('#TEST_IGNORE_BEGIN'): ignore = True else: outf.write(line) # copy files shutil.copy(os.path.join(self.DATA_DIR, 'base.min.css'), os.path.join(self.cur_data_dir, 'base.min.css')) shutil.copy(os.path.join(self.TEST_DIR, 'fancy.min.css'), os.path.join(self.cur_data_dir, 'fancy.min.css')) def tearDown(self): if not self.SAVE_TMP: shutil.rmtree(self.cur_temp_dir, True) def run_pdf2htmlEX(self, args): """ Execute the pdf2htmlEX with the specified arguments. :type args: list of values :param args: list of arguments to pass to executable. :return: an object of relevant info """ args = [Common.PDF2HTMLEX_PATH, '--data-dir', self.cur_data_dir, '--dest-dir', self.cur_output_dir ] + args with open(os.devnull, 'w') as fnull: return_code = subprocess.call(list(map(str, args)), stderr=fnull) self.assertEquals(return_code, 0, 'cannot execute pdf2htmlEX') files = os.listdir(self.cur_output_dir) return { 'return_code' : return_code, 'output_files' : files } if __name__ == '__main__': suites = [] loader = unittest.TestLoader() all_classes = ['test_output', 'test_local_browser'] if bool(os.environ.get('P2H_TEST_REMOTE')): all_classes += 'test_remote_browser' all_modules = [ __import__(m) for m in all_classes ] test_names = [] for name in sys.argv[1:]: test_names.append(name) if name.find('.') == -1: for m in all_classes: test_names.append(m + '.' + name) print( 'TEST_NAMES -> ', test_names ) for module in all_modules: if len(test_names) > 0 and module.__name__ not in test_names: for n in test_names: try: suites.append(loader.loadTestsFromName(n, module)) print( "DEB2 ", n, module, ' ==> ', loader.loadTestsFromName(n, module)) except: print "Catched error:", sys.exc_info() pass else: suites.append(loader.loadTestsFromModule(module)) print( "DEB1 ", module, ' ==> ', loader.loadTestsFromModule(module)) if len(suites) == 0: print >>sys.stderr, 'No test found' exit(1) failure_count = 0 runner = unittest.TextTestRunner(verbosity=2) for suite in suites: result = runner.run(suite) print( 'SUITE ', suite, ' ---> ', result ) failure_count += len(result.errors) + len(result.failures) exit(failure_count)