• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2# Copyright 2015 The PDFium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import optparse
7import os
8import re
9import subprocess
10import sys
11
12import common
13
14# Nomenclature:
15#   x_root - "x"
16#   x_filename - "x.ext"
17#   x_path - "path/to/a/b/c/x.ext"
18#   c_dir - "path/to/a/b/c"
19
20def generate_and_test(input_filename, source_dir, working_dir,
21                      fixup_path, pdfium_test_path, text_diff_path,
22                      drmem_wrapper):
23  input_root, _ = os.path.splitext(input_filename)
24  input_path = os.path.join(source_dir, input_root + '.in')
25  pdf_path = os.path.join(working_dir, input_root + '.pdf')
26  txt_path = os.path.join(working_dir, input_root + '.txt')
27  expected_path = os.path.join(source_dir, input_root + '_expected.txt')
28  try:
29    sys.stdout.flush()
30    subprocess.check_call(
31        [sys.executable, fixup_path, '--output-dir=' + working_dir, input_path])
32    with open(txt_path, 'w') as outfile:
33      # add Dr. Memory wrapper if exist
34      cmd_to_run = common.DrMemoryWrapper(drmem_wrapper, input_root)
35      cmd_to_run.extend([pdfium_test_path, pdf_path])
36      # run test
37      subprocess.check_call(cmd_to_run, stdout=outfile)
38    subprocess.check_call(
39        [sys.executable, text_diff_path, expected_path, txt_path])
40  except subprocess.CalledProcessError as e:
41    print "FAILURE: " + input_filename + "; " + str(e)
42    return False
43  return True
44
45def main():
46  parser = optparse.OptionParser()
47  parser.add_option('--build-dir', default=os.path.join('out', 'Debug'),
48                    help='relative path from the base source directory')
49  parser.add_option('--wrapper', default='', dest="wrapper",
50                    help='Dr. Memory wrapper for running test under Dr. Memory')
51  options, args = parser.parse_args()
52
53  finder = common.DirectoryFinder(options.build_dir)
54  fixup_path = finder.ScriptPath('fixup_pdf_template.py')
55  text_diff_path = finder.ScriptPath('text_diff.py')
56  source_dir = finder.TestingDir(os.path.join('resources', 'javascript'))
57  pdfium_test_path = finder.ExecutablePath('pdfium_test')
58  if not os.path.exists(pdfium_test_path):
59    print "FAILURE: Can't find test executable '%s'" % pdfium_test_path
60    print "Use --build-dir to specify its location."
61    return 1
62  working_dir = finder.WorkingDir(os.path.join('testing', 'javascript'))
63  if not os.path.exists(working_dir):
64    os.makedirs(working_dir)
65
66  input_files = []
67  if len(args):
68    for file_name in args:
69      input_files.append(file_name.replace(".pdf", ".in"))
70  else:
71    input_files = os.listdir(source_dir)
72
73  failures = []
74  input_file_re = re.compile('^[a-zA-Z0-9_.]+[.]in$')
75  for input_filename in input_files:
76    if input_file_re.match(input_filename):
77      input_path = os.path.join(source_dir, input_filename)
78      if os.path.isfile(input_path):
79        if not generate_and_test(input_filename, source_dir, working_dir,
80                                 fixup_path, pdfium_test_path, text_diff_path,
81                                 options.wrapper):
82          failures.append(input_path)
83
84  if failures:
85    failures.sort()
86    print '\n\nSummary of Failures:'
87    for failure in failures:
88      print failure
89    return 1
90  return 0
91
92
93if __name__ == '__main__':
94  sys.exit(main())
95