#!/usr/bin/env python # Copyright (c) 2010 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Unit tests for coverage_posix.py. Run a single test with a command such as: ./coverage_posix_unittest.py CoveragePosixTest.testFindTestsAsArgs Waring that running a single test like that may interfere with the arg parsing tests, since coverage_posix.py uses optparse.OptionParser() which references globals. """ import coverage_posix as coverage import os import sys import tempfile import unittest class CoveragePosixTest(unittest.TestCase): def setUp(self): self.parseArgs() self.sample_test_names = ['zippy_tests', '../base/base.gyp:base_unittests'] def confirmSampleTestsArePresent(self, tests): """Confirm the tests in self.sample_test_names are in some form in 'tests'. The Coverage object can munge them (e.g. add .exe to the end as needed. Helper function for arg parsing, bundle file tests. Args: tests: the parsed tests from a Coverage object. """ for simple_test_name in ('zippy_tests', 'base_unittests'): found = False for item in tests: if simple_test_name in item: found = True break self.assertTrue(found) for not_test_name in ('kablammo', 'not_a_unittest'): found = False for item in tests: if not_test_name in item: found = True break self.assertFalse(found) def parseArgs(self): """Setup and process arg parsing.""" self.parser = coverage.CoverageOptionParser() (self.options, self.args) = self.parser.parse_args() self.options.directory = '.' def testSanity(self): """Sanity check we're able to actually run the tests. Simply creating a Coverage instance checks a few things (e.g. on Windows that the coverage tools can be found).""" c = coverage.Coverage(self.options, self.args) def testRunBasicProcess(self): """Test a simple run of a subprocess.""" c = coverage.Coverage(self.options, self.args) for code in range(2): retcode = c.Run([sys.executable, '-u', '-c', 'import sys; sys.exit(%d)' % code], ignore_error=True) self.assertEqual(code, retcode) def testRunSlowProcess(self): """Test program which prints slowly but doesn't hit our timeout. Overall runtime is longer than the timeout but output lines trickle in keeping things alive. """ self.options.timeout = 2.5 c = coverage.Coverage(self.options, self.args) slowscript = ('import sys, time\n' 'for x in range(10):\n' ' time.sleep(0.5)\n' ' print "hi mom"\n' 'sys.exit(0)\n') retcode = c.Run([sys.executable, '-u', '-c', slowscript]) self.assertEqual(0, retcode) def testRunExcessivelySlowProcess(self): """Test program which DOES hit our timeout. Initial lines should print but quickly it takes too long and should be killed. """ self.options.timeout = 2.5 c = coverage.Coverage(self.options, self.args) slowscript = ('import time\n' 'for x in range(1,10):\n' ' print "sleeping for %d" % x\n' ' time.sleep(x)\n') self.assertRaises(Exception, c.Run, [sys.executable, '-u', '-c', slowscript]) def testFindTestsAsArgs(self): """Test finding of tests passed as args.""" self.args += '--' self.args += self.sample_test_names c = coverage.Coverage(self.options, self.args) c.FindTests() self.confirmSampleTestsArePresent(c.tests) def testFindTestsFromBundleFile(self): """Test finding of tests from a bundlefile.""" (fd, filename) = tempfile.mkstemp() f = os.fdopen(fd, 'w') f.write(str(self.sample_test_names)) f.close() self.options.bundles = filename c = coverage.Coverage(self.options, self.args) c.FindTests() self.confirmSampleTestsArePresent(c.tests) os.unlink(filename) def testExclusionList(self): """Test the gtest_filter exclusion list.""" c = coverage.Coverage(self.options, self.args) self.assertFalse(c.GtestFilter('doesnotexist_test')) fake_exclusions = { sys.platform: { 'foobar': ('a','b'), 'doesnotexist_test': ('Evil.Crash','Naughty.Test') } } self.assertFalse(c.GtestFilter('barfoo')) filter = c.GtestFilter('doesnotexist_test', fake_exclusions) self.assertEquals('--gtest_filter=-Evil.Crash:-Naughty.Test', filter) if __name__ == '__main__': unittest.main()