diff --git a/testing/tools/common.py b/testing/tools/common.py
new file mode 100755
index 0000000..14745a8
--- /dev/null
+++ b/testing/tools/common.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+# Copyright 2015 The PDFium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+
+def os_name():
+  if sys.platform.startswith('linux'):
+    return 'linux'
+  if sys.platform.startswith('win'):
+    return 'win'
+  if sys.platform.startswith('darwin'):
+    return 'mac'
+  raise Exception('Confused, can not determine OS, aborting.')
+
+
+class DirectoryFinder:
+  '''A class for finding directories and paths under either a standalone
+  checkout or a chromium checkout of PDFium.'''
+
+  def __init__(self, build_location):
+    # |build_location| is typically "out/Debug" or "out/Release".
+    # Expect |my_dir| to be .../pdfium/testing/tools.
+    self.my_dir = os.path.dirname(os.path.realpath(__file__))
+    self.testing_dir = os.path.dirname(self.my_dir)
+    if (os.path.basename(self.my_dir) != 'tools' or
+        os.path.basename(self.testing_dir) != 'testing'):
+      raise Exception('Confused, can not find pdfium root directory, aborting.')
+    self.pdfium_dir = os.path.dirname(self.testing_dir)
+    # Find path to build directory.  This depends on whether this is a
+    # standalone build vs. a build as part of a chromium checkout. For
+    # standalone, we expect a path like .../pdfium/out/Debug, but for
+    # chromium, we expect a path like .../src/out/Debug two levels
+    # higher (to skip over the third_party/pdfium path component under
+    # which chromium sticks pdfium).
+    self.base_dir = self.pdfium_dir
+    one_up_dir = os.path.dirname(self.base_dir)
+    two_up_dir = os.path.dirname(one_up_dir)
+    if (os.path.basename(two_up_dir) == 'src' and
+        os.path.basename(one_up_dir) == 'third_party'):
+      self.base_dir = two_up_dir
+    self.build_dir = os.path.join(self.base_dir, build_location)
+    self.os_name = os_name()
+
+  def ExecutablePath(self, name):
+    '''Finds compiled binaries under the build path.'''
+    result = os.path.join(self.build_dir, name)
+    if self.os_name == 'win':
+      result = result + '.exe'
+    return result
+
+  def ScriptPath(self, name):
+    '''Finds other scripts in the same directory as this one.'''
+    return os.path.join(self.my_dir, name)
+
+  def WorkingDir(self, other_components=''):
+    '''Places generated files under the build directory, not source dir.'''
+    result = os.path.join(self.build_dir, 'gen', 'pdfium')
+    if other_components:
+      result = os.path.join(result, other_components)
+    return result
+
+  def TestingDir(self, other_components=''):
+    '''Finds test files somewhere under the testing directory.'''
+    result = self.testing_dir
+    if other_components:
+      result = os.path.join(result, other_components)
+    return result
diff --git a/testing/tools/pngdiffer.py b/testing/tools/pngdiffer.py
new file mode 100755
index 0000000..dc65b47
--- /dev/null
+++ b/testing/tools/pngdiffer.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+# Copyright 2015 The PDFium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import subprocess
+import sys
+
+class PNGDiffer():
+  ACTUAL_TEMPLATE = '.pdf.%d.png'
+  EXPECTED_TEMPLATE = '_expected' + ACTUAL_TEMPLATE
+
+  def __init__(self, finder):
+    self.pdfium_diff_path = finder.ExecutablePath('pdfium_diff')
+
+  def HasDifferences(self, input_filename, source_dir, working_dir):
+    input_root, _ = os.path.splitext(input_filename)
+    actual_path_template = os.path.join(
+        working_dir, input_root + self.ACTUAL_TEMPLATE)
+    expected_path_template = os.path.join(
+        source_dir, input_root + self.EXPECTED_TEMPLATE)
+    i = 0
+    try:
+      while True:
+        actual_path = actual_path_template % i;
+        expected_path = expected_path_template % i;
+        if not os.path.exists(expected_path):
+          if i == 0:
+            print "WARNING: no expected results files for " + input_filename
+          break
+        print "Checking " + actual_path
+        sys.stdout.flush()
+        subprocess.check_call(
+            [self.pdfium_diff_path, expected_path, actual_path])
+        i += 1
+    except subprocess.CalledProcessError as e:
+      print "FAILURE: " + input_filename + "; " + str(e)
+      return True
+    return False
diff --git a/testing/tools/run_corpus_tests.py b/testing/tools/run_corpus_tests.py
index 22f9eef..13376f7 100755
--- a/testing/tools/run_corpus_tests.py
+++ b/testing/tools/run_corpus_tests.py
@@ -6,129 +6,62 @@
 import optparse
 import os
 import re
-import subprocess
 import shutil
+import subprocess
 import sys
 
+import common
+import pngdiffer
+import suppressor
+
 # Nomenclature:
 #   x_root - "x"
 #   x_filename - "x.ext"
 #   x_path - "path/to/a/b/c/x.ext"
 #   c_dir - "path/to/a/b/c"
 
-def extract_suppressions(filename):
-  with open(filename) as f:
-    suppressions = [y for y in [
-      x.split('#')[0].strip() for x in f.readlines()] if y]
-  return suppressions
-
 def test_one_file(input_filename, source_dir, working_dir,
-                  pdfium_test_path, pdfium_diff_path):
-  input_root, _ = os.path.splitext(input_filename)
+                  pdfium_test_path, image_differ):
   input_path = os.path.join(source_dir, input_filename)
   pdf_path = os.path.join(working_dir, input_filename)
-  actual_path_template = os.path.join(working_dir, input_root + '.pdf.%d.png')
-  expected_path_template = os.path.join(source_dir,
-                                        input_root + '_expected.pdf.%d.png')
   try:
     shutil.copyfile(input_path, pdf_path)
     sys.stdout.flush()
     subprocess.check_call([pdfium_test_path, '--png', pdf_path])
-    i = 0;
-    while True:
-      expected_path = expected_path_template % i;
-      actual_path = actual_path_template % i;
-      if not os.path.exists(expected_path):
-        if i == 0:
-          print "WARNING: no expected results files found for " + input_filename
-        break
-      print "Checking " + actual_path
-      sys.stdout.flush()
-      subprocess.check_call([pdfium_diff_path, expected_path, actual_path])
-      i += 1
   except subprocess.CalledProcessError as e:
     print "FAILURE: " + input_filename + "; " + str(e)
     return False
+  if image_differ.HasDifferences(input_filename, source_dir, working_dir):
+    return False
   return True
 
 def main():
-  if sys.platform.startswith('linux'):
-    os_name = 'linux'
-  elif sys.platform.startswith('win'):
-    os_name = 'win'
-  elif sys.platform.startswith('darwin'):
-    os_name = 'mac'
-  else:
-    print 'Confused, can not determine OS, aborting.'
-    return 1
-
   parser = optparse.OptionParser()
   parser.add_option('--build-dir', default=os.path.join('out', 'Debug'),
                     help='relative path from the base source directory')
   options, args = parser.parse_args()
-
-  # Expect |my_dir| to be .../pdfium/testing/tools.
-  my_dir = os.path.dirname(os.path.realpath(__file__))
-  testing_dir = os.path.dirname(my_dir)
-  pdfium_dir = os.path.dirname(testing_dir)
-  if (os.path.basename(my_dir) != 'tools' or
-      os.path.basename(testing_dir) != 'testing'):
-    print 'Confused, can not find pdfium root directory, aborting.'
-    return 1
-
-  # Find path to build directory.  This depends on whether this is a
-  # standalone build vs. a build as part of a chromium checkout. For
-  # standalone, we expect a path like .../pdfium/out/Debug, but for
-  # chromium, we expect a path like .../src/out/Debug two levels
-  # higher (to skip over the third_party/pdfium path component under
-  # which chromium sticks pdfium).
-  base_dir = pdfium_dir
-  one_up_dir = os.path.dirname(base_dir)
-  two_up_dir = os.path.dirname(one_up_dir)
-  if (os.path.basename(two_up_dir) == 'src' and
-      os.path.basename(one_up_dir) == 'third_party'):
-    base_dir = two_up_dir
-  build_dir = os.path.join(base_dir, options.build_dir)
-
-  # Compiled binaries are found under the build path.
-  pdfium_test_path = os.path.join(build_dir, 'pdfium_test')
-  pdfium_diff_path = os.path.join(build_dir, 'pdfium_diff')
-  if os_name == 'win':
-    pdfium_test_path = pdfium_test_path + '.exe'
-    pdfium_diff_path = pdfium_diff_path + '.exe'
-  # TODO(tsepez): Mac may require special handling here.
-
-  # Place generated files under the build directory, not source directory.
-  working_dir = os.path.join(build_dir, 'gen', 'pdfium', 'testing', 'corpus')
+  finder = common.DirectoryFinder(options.build_dir)
+  pdfium_test_path = finder.ExecutablePath('pdfium_test')
+  working_dir = finder.WorkingDir(os.path.join('testing', 'corpus'))
   if not os.path.exists(working_dir):
     os.makedirs(working_dir)
 
-  suppression_list = extract_suppressions(
-    os.path.join(testing_dir, 'SUPPRESSIONS'))
-
-  platform_suppression_filename = 'SUPPRESSIONS_%s' % os_name
-  platform_suppression_list = extract_suppressions(
-    os.path.join(testing_dir, platform_suppression_filename))
+  test_suppressor = suppressor.Suppressor(finder)
+  image_differ = pngdiffer.PNGDiffer(finder)
 
   # test files are under .../pdfium/testing/corpus.
   failures = []
-  walk_from_dir = os.path.join(testing_dir, 'corpus');
+  walk_from_dir = finder.TestingDir('corpus');
   input_file_re = re.compile('^[a-zA-Z0-9_.]+[.]pdf$')
   for source_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(source_dir, input_filename)
          if os.path.isfile(input_path):
-           if input_filename in suppression_list:
-             print "Not running %s, found in SUPPRESSIONS file" % input_filename
+           if test_suppressor.IsSuppressed(input_filename):
              continue
-           if input_filename in platform_suppression_list:
-             print ("Not running %s, found in %s file" %
-                    (input_filename, platform_suppression_filename))
-             continue
-
          if not test_one_file(input_filename, source_dir, working_dir,
-                                pdfium_test_path, pdfium_diff_path):
+                              pdfium_test_path, image_differ):
              failures.append(input_path)
 
   if failures:
diff --git a/testing/tools/run_javascript_tests.py b/testing/tools/run_javascript_tests.py
index ff11326..9b3d69e 100755
--- a/testing/tools/run_javascript_tests.py
+++ b/testing/tools/run_javascript_tests.py
@@ -9,6 +9,8 @@
 import subprocess
 import sys
 
+import common
+
 # Nomenclature:
 #   x_root - "x"
 #   x_filename - "x.ext"
@@ -40,46 +42,12 @@
   parser.add_option('--build-dir', default=os.path.join('out', 'Debug'),
                     help='relative path from the base source directory')
   options, args = parser.parse_args()
-
-  # Expect |my_dir| to be .../pdfium/testing/tools.
-  my_dir = os.path.dirname(os.path.realpath(__file__))
-  testing_dir = os.path.dirname(my_dir)
-  pdfium_dir = os.path.dirname(testing_dir)
-  if (os.path.basename(my_dir) != 'tools' or
-      os.path.basename(testing_dir) != 'testing'):
-    print 'Confused, can not find pdfium root directory, aborting.'
-    return 1
-
-  # Other scripts are found in the same directory as this one.
-  fixup_path = os.path.join(my_dir, 'fixup_pdf_template.py')
-  text_diff_path = os.path.join(my_dir, 'text_diff.py')
-
-  # test files are in .../pdfium/testing/resources/javascript.
-  source_dir = os.path.join(testing_dir, 'resources', 'javascript')
-
-  # Find path to build directory.  This depends on whether this is a
-  # standalone build vs. a build as part of a chromium checkout. For
-  # standalone, we expect a path like .../pdfium/out/Debug, but for
-  # chromium, we expect a path like .../src/out/Debug two levels
-  # higher (to skip over the third_party/pdfium path component under
-  # which chromium sticks pdfium).
-  base_dir = pdfium_dir
-  one_up_dir = os.path.dirname(base_dir)
-  two_up_dir = os.path.dirname(one_up_dir)
-  if (os.path.basename(two_up_dir) == 'src' and
-      os.path.basename(one_up_dir) == 'third_party'):
-    base_dir = two_up_dir
-  build_dir = os.path.join(base_dir, options.build_dir)
-
-  # Compiled binaries are found under the build path.
-  pdfium_test_path = os.path.join(build_dir, 'pdfium_test')
-  if sys.platform.startswith('win'):
-    pdfium_test_path = pdfium_test_path + '.exe'
-  # TODO(tsepez): Mac may require special handling here.
-
-  # Place generated files under the build directory, not source directory.
-  gen_dir = os.path.join(build_dir, 'gen', 'pdfium')
-  working_dir = os.path.join(gen_dir, 'testing', 'javascript')
+  finder = common.DirectoryFinder(options.build_dir)
+  fixup_path = finder.ScriptPath('fixup_pdf_template.py')
+  text_diff_path = finder.ScriptPath('text_diff.py')
+  source_dir = finder.TestingDir(os.path.join('resources', 'javascript'))
+  pdfium_test_path = finder.ExecutablePath('pdfium_test')
+  working_dir = finder.WorkingDir(os.path.join('testing', 'javascript'))
   if not os.path.exists(working_dir):
     os.makedirs(working_dir)
 
diff --git a/testing/tools/run_pixel_tests.py b/testing/tools/run_pixel_tests.py
index 0123583..1fec0dd 100755
--- a/testing/tools/run_pixel_tests.py
+++ b/testing/tools/run_pixel_tests.py
@@ -9,113 +9,49 @@
 import subprocess
 import sys
 
+import common
+import pngdiffer
+import suppressor
+
 # Nomenclature:
 #   x_root - "x"
 #   x_filename - "x.ext"
 #   x_path - "path/to/a/b/c/x.ext"
 #   c_dir - "path/to/a/b/c"
 
-def extract_suppressions(filename):
-  with open(filename) as f:
-    suppressions = [y for y in [
-      x.split('#')[0].strip() for x in f.readlines()] if y]
-  return suppressions
-
 def generate_and_test(input_filename, source_dir, working_dir,
-                      fixup_path, pdfium_test_path, pdfium_diff_path):
+                      fixup_path, pdfium_test_path, image_differ):
   input_root, _ = os.path.splitext(input_filename)
   input_path = os.path.join(source_dir, input_root + '.in')
   pdf_path = os.path.join(working_dir, input_root + '.pdf')
-  actual_path_template = os.path.join(working_dir, input_root + '.pdf.%d.png')
-  expected_path_template = os.path.join(source_dir,
-                                        input_root + '_expected.pdf.%d.png')
   try:
     sys.stdout.flush()
     subprocess.check_call(
         [sys.executable, fixup_path, '--output-dir=' + working_dir, input_path])
     subprocess.check_call([pdfium_test_path, '--png', pdf_path])
-    i = 0;
-    while True:
-      expected_path = expected_path_template % i;
-      actual_path = actual_path_template % i;
-      if not os.path.exists(expected_path):
-        if i == 0:
-          print "WARNING: no expected results files found for " + input_filename
-        break
-      print "Checking " + actual_path
-      sys.stdout.flush()
-      subprocess.check_call([pdfium_diff_path, expected_path, actual_path])
-      i += 1
   except subprocess.CalledProcessError as e:
     print "FAILURE: " + input_filename + "; " + str(e)
     return False
+  if image_differ.HasDifferences(input_filename, source_dir, working_dir):
+    print "FAILURE: " + input_filename
+    return False
   return True
 
 def main():
-  if sys.platform.startswith('linux'):
-    os_name = 'linux'
-  elif sys.platform.startswith('win'):
-    os_name = 'win'
-  elif sys.platform.startswith('darwin'):
-    os_name = 'mac'
-  else:
-    print 'Confused, can not determine OS, aborting.'
-    return 1
-
   parser = optparse.OptionParser()
   parser.add_option('--build-dir', default=os.path.join('out', 'Debug'),
                     help='relative path from the base source directory')
   options, args = parser.parse_args()
-
-  # Expect |my_dir| to be .../pdfium/testing/tools.
-  my_dir = os.path.dirname(os.path.realpath(__file__))
-  testing_dir = os.path.dirname(my_dir)
-  pdfium_dir = os.path.dirname(testing_dir)
-  if (os.path.basename(my_dir) != 'tools' or
-      os.path.basename(testing_dir) != 'testing'):
-    print 'Confused, can not find pdfium root directory, aborting.'
-    return 1
-
-  # Other scripts are found in the same directory as this one.
-  fixup_path = os.path.join(my_dir, 'fixup_pdf_template.py')
-
-  # test files are in .../pdfium/testing/resources/pixel.
-  source_dir = os.path.join(testing_dir, 'resources', 'pixel')
-
-  # Find path to build directory.  This depends on whether this is a
-  # standalone build vs. a build as part of a chromium checkout. For
-  # standalone, we expect a path like .../pdfium/out/Debug, but for
-  # chromium, we expect a path like .../src/out/Debug two levels
-  # higher (to skip over the third_party/pdfium path component under
-  # which chromium sticks pdfium).
-  base_dir = pdfium_dir
-  one_up_dir = os.path.dirname(base_dir)
-  two_up_dir = os.path.dirname(one_up_dir)
-  if (os.path.basename(two_up_dir) == 'src' and
-      os.path.basename(one_up_dir) == 'third_party'):
-    base_dir = two_up_dir
-  build_dir = os.path.join(base_dir, options.build_dir)
-
-  # Compiled binaries are found under the build path.
-  pdfium_test_path = os.path.join(build_dir, 'pdfium_test')
-  pdfium_diff_path = os.path.join(build_dir, 'pdfium_diff')
-  if sys.platform.startswith('win'):
-    pdfium_test_path = pdfium_test_path + '.exe'
-    pdfium_diff_path = pdfium_diff_path + '.exe'
-  # TODO(tsepez): Mac may require special handling here.
-
-  # Place generated files under the build directory, not source directory.
-  gen_dir = os.path.join(build_dir, 'gen', 'pdfium')
-  working_dir = os.path.join(gen_dir, 'testing', 'pixel')
+  finder = common.DirectoryFinder(options.build_dir)
+  fixup_path = finder.ScriptPath('fixup_pdf_template.py')
+  source_dir = finder.TestingDir(os.path.join('resources', 'pixel'))
+  pdfium_test_path = finder.ExecutablePath('pdfium_test')
+  working_dir = finder.WorkingDir(os.path.join('testing', 'pixel'))
   if not os.path.exists(working_dir):
     os.makedirs(working_dir)
 
-  suppression_list = extract_suppressions(
-    os.path.join(testing_dir, 'SUPPRESSIONS'))
-
-  platform_suppression_filename = 'SUPPRESSIONS_%s' % os_name
-  platform_suppression_list = extract_suppressions(
-    os.path.join(testing_dir, platform_suppression_filename))
+  test_suppressor = suppressor.Suppressor(finder)
+  image_differ = pngdiffer.PNGDiffer(finder)
 
   failures = []
   input_file_re = re.compile('^[a-zA-Z0-9_.]+[.]in$')
@@ -123,15 +59,10 @@
     if input_file_re.match(input_filename):
       input_path = os.path.join(source_dir, input_filename)
       if os.path.isfile(input_path):
-        if input_filename in suppression_list:
-          print "Not running %s, found in SUPPRESSIONS file" % input_filename
-          continue
-        if input_filename in platform_suppression_list:
-          print ("Not running %s, found in %s file" %
-                 (input_filename, platform_suppression_filename))
+        if test_suppressor.IsSuppressed(input_filename):
           continue
         if not generate_and_test(input_filename, source_dir, working_dir,
-                                 fixup_path, pdfium_test_path, pdfium_diff_path):
+                                 fixup_path, pdfium_test_path, image_differ):
           failures.append(input_path)
 
   if failures:
diff --git a/testing/tools/suppressor.py b/testing/tools/suppressor.py
new file mode 100755
index 0000000..fff9bc8
--- /dev/null
+++ b/testing/tools/suppressor.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python
+# Copyright 2015 The PDFium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+
+import common
+
+class Suppressor:
+  SUPPRESSIONS_FILENAME = 'SUPPRESSIONS'
+  PLATFORM_SUPPRESSIONS_FILENAME = 'SUPPRESSIONS_%s' % common.os_name()
+
+  def __init__(self, finder):
+    testing_dir = finder.TestingDir()
+    self.suppression_list = self._ExtractSuppressions(
+      os.path.join(testing_dir, self.SUPPRESSIONS_FILENAME))
+    self.platform_suppression_list = self._ExtractSuppressions(
+      os.path.join(testing_dir, self.PLATFORM_SUPPRESSIONS_FILENAME))
+
+  def _ExtractSuppressions(self, suppressions_filename):
+    with open(suppressions_filename) as f:
+      return [y for y in [x.split('#')[0].strip() for x in f.readlines()] if y]
+
+  def IsSuppressed(self, input_filename):
+    if input_filename in self.suppression_list:
+      print ("Not running %s, found in %s file" %
+             (input_filename, self.SUPPRESSIONS_FILENAME))
+      return True
+    if input_filename in self.platform_suppression_list:
+      print ("Not running %s, found in %s file" %
+             (input_filename, self.PLATFORM_SUPPRESSIONS_FILENAME))
+      return True
+    return False
