Пример #1
0
  def Run(self):
    parser = optparse.OptionParser()

    parser.add_option('--build-dir', default=os.path.join('out', 'Debug'),
                      help='relative path from the base source directory')

    parser.add_option('-j', default=multiprocessing.cpu_count(),
                      dest='num_workers', type='int',
                      help='run NUM_WORKERS jobs in parallel')

    parser.add_option('--gold_properties', default='', dest="gold_properties",
                      help='Key value pairs that are written to the top level '
                           'of the JSON file that is ingested by Gold.')

    parser.add_option('--gold_key', default='', dest="gold_key",
                      help='Key value pairs that are added to the "key" field '
                           'of the JSON file that is ingested by Gold.')

    parser.add_option('--gold_output_dir', default='', dest="gold_output_dir",
                      help='Path of where to write the JSON output to be '
                           'uploaded to Gold.')

    parser.add_option('--gold_ignore_hashes', default='',
                      dest="gold_ignore_hashes",
                      help='Path to a file with MD5 hashes we wish to ignore.')

    parser.add_option('--regenerate_expected', default='',
                      dest="regenerate_expected",
                      help='Regenerates expected images. Valid values are '
                           '"all" to regenerate all expected pngs, and '
                           '"platform" to regenerate only platform-specific '
                           'expected pngs.')

    parser.add_option('--ignore_errors', action="store_true",
                      dest="ignore_errors",
                      help='Prevents the return value from being non-zero '
                           'when image comparison fails.')

    self.options, self.args = parser.parse_args()

    if (self.options.regenerate_expected
        and self.options.regenerate_expected not in ['all', 'platform']) :
      print 'FAILURE: --regenerate_expected must be "all" or "platform"'
      return 1

    finder = common.DirectoryFinder(self.options.build_dir)
    self.fixup_path = finder.ScriptPath('fixup_pdf_template.py')
    self.text_diff_path = finder.ScriptPath('text_diff.py')
    self.font_dir = os.path.join(finder.TestingDir(), 'resources', 'fonts')

    self.source_dir = finder.TestingDir()
    if self.test_dir != 'corpus':
      test_dir = finder.TestingDir(os.path.join('resources', self.test_dir))
    else:
      test_dir = finder.TestingDir(self.test_dir)

    self.pdfium_test_path = finder.ExecutablePath('pdfium_test')
    if not os.path.exists(self.pdfium_test_path):
      print "FAILURE: Can't find test executable '%s'" % self.pdfium_test_path
      print 'Use --build-dir to specify its location.'
      return 1

    self.working_dir = finder.WorkingDir(os.path.join('testing', self.test_dir))
    if not os.path.exists(self.working_dir):
      os.makedirs(self.working_dir)

    self.feature_string = subprocess.check_output([self.pdfium_test_path,
                                                   '--show-config'])
    self.test_suppressor = suppressor.Suppressor(finder, self.feature_string)
    self.image_differ = pngdiffer.PNGDiffer(finder)
    error_message = self.image_differ.CheckMissingTools(
        self.options.regenerate_expected)
    if error_message:
      print "FAILURE: %s" % error_message
      return 1

    self.gold_baseline = gold.GoldBaseline(self.options.gold_properties)

    walk_from_dir = finder.TestingDir(test_dir);

    self.test_cases = []
    self.execution_suppressed_cases = []
    input_file_re = re.compile('^.+[.](in|pdf)$')
    if self.args:
      for file_name in self.args:
        file_name.replace('.pdf', '.in')
        input_path = os.path.join(walk_from_dir, file_name)
        if not os.path.isfile(input_path):
          print "Can't find test file '%s'" % file_name
          return 1

        self.test_cases.append((os.path.basename(input_path),
                           os.path.dirname(input_path)))
    else:
      for file_dir, _, filename_list in os.walk(walk_from_dir):
        for input_filename in filename_list:
          if input_file_re.match(input_filename):
            input_path = os.path.join(file_dir, input_filename)
            if self.test_suppressor.IsExecutionSuppressed(input_path):
              self.execution_suppressed_cases.append(input_path)
            else:
              if os.path.isfile(input_path):
                self.test_cases.append((input_filename, file_dir))

    self.test_cases.sort()
    self.failures = []
    self.surprises = []
    self.result_suppressed_cases = []

    # Collect Gold results if an output directory was named.
    self.gold_results = None
    if self.options.gold_output_dir:
      self.gold_results = gold.GoldResults(self.test_type,
                                           self.options.gold_output_dir,
                                           self.options.gold_properties,
                                           self.options.gold_key,
                                           self.options.gold_ignore_hashes)

    if self.options.num_workers > 1 and len(self.test_cases) > 1:
      try:
        pool = multiprocessing.Pool(self.options.num_workers)
        worker_func = functools.partial(TestOneFileParallel, self)

        worker_results = pool.imap(worker_func, self.test_cases)
        for worker_result in worker_results:
          result, input_filename, source_dir = worker_result
          input_path = os.path.join(source_dir, input_filename)

          self.HandleResult(input_filename, input_path, result)

      except KeyboardInterrupt:
        pool.terminate()
      finally:
        pool.close()
        pool.join()
    else:
      for test_case in self.test_cases:
        input_filename, input_file_dir = test_case
        result = self.GenerateAndTest(input_filename, input_file_dir)
        self.HandleResult(input_filename,
                          os.path.join(input_file_dir, input_filename), result)

    if self.gold_results:
      self.gold_results.WriteResults()

    if self.surprises:
      self.surprises.sort()
      print '\n\nUnexpected Successes:'
      for surprise in self.surprises:
        print surprise

    if self.failures:
      self.failures.sort()
      print '\n\nSummary of Failures:'
      for failure in self.failures:
        print failure

    self._PrintSummary()

    if self.failures:
      if not self.options.ignore_errors:
        return 1

    return 0
Пример #2
0
    def Run(self):
        parser = optparse.OptionParser()

        parser.add_option('--build-dir',
                          default=os.path.join('out', 'Debug'),
                          help='relative path from the base source directory')

        parser.add_option('-j',
                          default=multiprocessing.cpu_count(),
                          dest='num_workers',
                          type='int',
                          help='run NUM_WORKERS jobs in parallel')

        parser.add_option('--wrapper',
                          default='',
                          dest="wrapper",
                          help='wrapper for running test under Dr. Memory')

        parser.add_option(
            '--gold_properties',
            default='',
            dest="gold_properties",
            help=
            'Key value pairs that are written to the top level of the JSON file that is ingested by Gold.'
        )

        parser.add_option(
            '--gold_key',
            default='',
            dest="gold_key",
            help=
            'Key value pairs that are added to the "key" field of the JSON file that is ingested by Gold.'
        )

        parser.add_option(
            '--gold_output_dir',
            default='',
            dest="gold_output_dir",
            help=
            'Path of where to write the JSON output to be uploaded to Gold.')

        parser.add_option(
            '--ignore_errors',
            action="store_true",
            dest="ignore_errors",
            help=
            'Prevents the return value from being non-zero when image comparison fails.'
        )

        options, args = parser.parse_args()

        finder = common.DirectoryFinder(options.build_dir)
        self.fixup_path = finder.ScriptPath('fixup_pdf_template.py')
        self.text_diff_path = finder.ScriptPath('text_diff.py')

        self.drmem_wrapper = options.wrapper

        self.source_dir = finder.TestingDir()
        if self.test_dir != 'corpus':
            test_dir = finder.TestingDir(
                os.path.join('resources', self.test_dir))
        else:
            test_dir = finder.TestingDir(self.test_dir)

        self.pdfium_test_path = finder.ExecutablePath('pdfium_test')
        if not os.path.exists(self.pdfium_test_path):
            print "FAILURE: Can't find test executable '%s'" % self.pdfium_test_path
            print "Use --build-dir to specify its location."
            return 1

        self.working_dir = finder.WorkingDir(
            os.path.join('testing', self.test_dir))
        if not os.path.exists(self.working_dir):
            os.makedirs(self.working_dir)

        self.feature_string = subprocess.check_output(
            [self.pdfium_test_path, '--show-config'])
        self.test_suppressor = suppressor.Suppressor(finder,
                                                     self.feature_string)
        self.image_differ = pngdiffer.PNGDiffer(finder)

        walk_from_dir = finder.TestingDir(test_dir)

        test_cases = []
        input_file_re = re.compile('^[a-zA-Z0-9_.]+[.](in|pdf)$')
        if len(args):
            for file_name in args:
                file_name.replace(".pdf", ".in")
                input_path = os.path.join(walk_from_dir, file_name)
                if not os.path.isfile(input_path):
                    print "Can't find test file '%s'" % file_name
                    return 1

                test_cases.append((os.path.basename(input_path),
                                   os.path.dirname(input_path)))
        else:
            for file_dir, _, filename_list in os.walk(walk_from_dir):
                for input_filename in filename_list:
                    if input_file_re.match(input_filename):
                        input_path = os.path.join(file_dir, input_filename)
                        if not self.test_suppressor.IsExecutionSuppressed(
                                input_path):
                            if os.path.isfile(input_path):
                                test_cases.append((input_filename, file_dir))

        self.failures = []
        self.surprises = []

        # Collect Gold results if an output directory was named.
        self.gold_results = None
        if options.gold_output_dir:
            self.gold_results = gold.GoldResults("pdfium",
                                                 options.gold_output_dir,
                                                 options.gold_properties,
                                                 options.gold_key)

        if options.num_workers > 1 and len(test_cases) > 1:
            try:
                pool = multiprocessing.Pool(options.num_workers)
                worker_func = functools.partial(TestOneFileParallel, self)

                worker_results = pool.imap(worker_func, test_cases)
                for worker_result in worker_results:
                    result, input_filename, source_dir = worker_result
                    input_path = os.path.join(source_dir, input_filename)

                    self.HandleResult(input_filename, input_path, result)

            except KeyboardInterrupt:
                pool.terminate()
            finally:
                pool.close()
                pool.join()
        else:
            for test_case in test_cases:
                input_filename, input_file_dir = test_case
                result = self.GenerateAndTest(input_filename, input_file_dir)
                self.HandleResult(input_filename,
                                  os.path.join(input_file_dir, input_filename),
                                  result)

        if self.gold_results:
            self.gold_results.WriteResults()

        if self.surprises:
            self.surprises.sort()
            print '\n\nUnexpected Successes:'
            for surprise in self.surprises:
                print surprise

        if self.failures:
            self.failures.sort()
            print '\n\nSummary of Failures:'
            for failure in self.failures:
                print failure
                if not options.ignore_errors:
                    return 1
        return 0