Home | History | Annotate | Download | only in tests
      1 #!/usr/bin/python
      2 
      3 """
      4 Copyright 2014 Google Inc.
      5 
      6 Use of this source code is governed by a BSD-style license that can be
      7 found in the LICENSE file.
      8 
      9 A wrapper around the standard Python unittest library, adding features we need
     10 for various unittests within this directory.
     11 """
     12 
     13 import errno
     14 import os
     15 import shutil
     16 import sys
     17 import unittest
     18 
     19 # Set the PYTHONPATH to include the tools directory.
     20 sys.path.append(
     21     os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir))
     22 import find_run_binary
     23 
     24 
     25 class TestCase(unittest.TestCase):
     26 
     27   def shortDescription(self):
     28     """Tell unittest framework to not print docstrings for test cases."""
     29     return None
     30 
     31   def create_empty_dir(self, path):
     32     """Creates an empty directory at path and returns path.
     33 
     34     Args:
     35       path: path on local disk
     36     """
     37     shutil.rmtree(path=path, ignore_errors=True)
     38     try:
     39       os.makedirs(path)
     40     except OSError as exc:
     41       if exc.errno != errno.EEXIST:
     42         raise
     43     return path
     44 
     45   def run_command(self, args):
     46     """Runs a program from the command line and returns stdout.
     47 
     48     Args:
     49       args: Command line to run, as a list of string parameters. args[0] is the
     50             binary to run.
     51 
     52     Returns:
     53       stdout from the program, as a single string.
     54 
     55     Raises:
     56       Exception: the program exited with a nonzero return code.
     57     """
     58     return find_run_binary.run_command(args)
     59 
     60   def find_path_to_program(self, program):
     61     """Returns path to an existing program binary.
     62 
     63     Args:
     64       program: Basename of the program to find (e.g., 'render_pictures').
     65 
     66     Returns:
     67       Absolute path to the program binary, as a string.
     68 
     69     Raises:
     70       Exception: unable to find the program binary.
     71     """
     72     return find_run_binary.find_path_to_program(program)
     73 
     74 
     75 def main(test_case_class):
     76   """Run the unit tests within the given class.
     77 
     78   Raises an Exception if any of those tests fail (in case we are running in the
     79   context of run_all.py, which depends on that Exception to signal failures).
     80 
     81   TODO(epoger): Make all of our unit tests use the Python unittest framework,
     82   so we can leverage its ability to run *all* the tests and report failures at
     83   the end.
     84   """
     85   suite = unittest.TestLoader().loadTestsFromTestCase(test_case_class)
     86   results = unittest.TextTestRunner(verbosity=2).run(suite)
     87   if not results.wasSuccessful():
     88     raise Exception('failed unittest %s' % test_case_class)
     89