blob: 8938e70d817ddee4a0793c12af8c4cd9f35137ee [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2012 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.
"""Runs all unit tests under this base directory."""
import os
import subprocess
import sys
import unittest
BUILDBOT_PATH = os.path.dirname(os.path.abspath(__file__))
GO_DIRS = [
'.',
'ct',
'golden',
'monitoring',
'perf',
]
GO_TEST_FAILED = (
'''======================================================================
Go test failed: %s
CWD: %s
----------------------------------------------------------------------
%s
----------------------------------------------------------------------
''')
NO_CRAWL_DIRS = [
'.git',
'.svn',
'autoroll_git',
'common',
'git_poller_skia.git',
'third_party',
]
def FilterDirectory(dirpath, filenames):
""" Determine whether to look for tests in the given directory.
dirpath: string; path of the directory in question.
filenames: list of strings; the files in the directory.
"""
if not dirpath or not filenames:
return False
for no_crawl_dir in NO_CRAWL_DIRS:
if no_crawl_dir in dirpath:
return False
return True
def RunGoTest(cmd, cwd):
p = subprocess.Popen(cmd, cwd=cwd,
stderr=subprocess.STDOUT,
stdout=subprocess.PIPE)
output = p.communicate()[0]
if p.returncode != 0:
return [GO_TEST_FAILED % (' '.join(cmd), cwd, output)]
return []
def GoTests(cwd):
# TODO(borenet): Switch to 'make test' once we're sure the karma-based tests
# will run in headless mode.
return RunGoTest(['make', 'testgo'], cwd)
def GoVet():
return RunGoTest(['go', 'vet', './...'], '.')
def GoImports():
cmd = ['goimports', '-l', '.']
try:
diff_files = subprocess.check_output(cmd, cwd='.',
stderr=subprocess.PIPE).splitlines()
except subprocess.CalledProcessError:
return [GO_TEST_FAILED % (
' '.join(cmd), '.',
('goimports failed to run! Is it installed? You may need to run:\n'
'go get http://code.google.com/p/go.tools/cmd/goimports'))]
if len(diff_files) > 0:
return [GO_TEST_FAILED % (
' '.join(cmd), '.',
('goimports found diffs in the following files: %s' %
', '.join(diff_files)))]
return []
if __name__ == '__main__':
print 'Searching for tests.'
tests_to_run = []
for (dirpath, dirnames, filenames) in os.walk(BUILDBOT_PATH, topdown=True):
dirnames[:] = [d for d in dirnames if not d in NO_CRAWL_DIRS]
test_modules = [os.path.join(dirpath, filename) for filename in filenames
if filename.endswith('_test.py')]
if not test_modules:
continue
tests_to_run.extend(test_modules)
go_tests = [GoVet, GoImports]
go_tests_cwd = [GoTests]
num_tests = (len(tests_to_run) + len(go_tests) +
len(GO_DIRS) * len(go_tests_cwd))
print 'Found %d tests.' % num_tests
errors = []
for test in tests_to_run:
proc = subprocess.Popen(['python', test], stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
if proc.wait() != 0:
errors.append(proc.communicate()[0])
for go_dir in GO_DIRS:
for test in go_tests_cwd:
errors.extend(test(go_dir))
for go_test in go_tests:
errors.extend(go_test())
if errors:
for error in errors:
print error
sys.exit(1)
else:
print 'All tests succeeded.'