Skip to content
Snippets Groups Projects
Commit be7b092e authored by Craig Tiller's avatar Craig Tiller
Browse files

Merge github.com:ctiller/grpc into testcpp

parents bf2659f0 9fef05c2
No related branches found
No related tags found
No related merge requests found
bins
deps
libs
objs
*.pyc
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#define __GRPC_INTERNAL_IOMGR_POLLSET_H_ #define __GRPC_INTERNAL_IOMGR_POLLSET_H_
#include <grpc/support/port_platform.h> #include <grpc/support/port_platform.h>
#include <grpc/support/time.h>
/* A grpc_pollset is a set of file descriptors that a higher level item is /* A grpc_pollset is a set of file descriptors that a higher level item is
interested in. For example: interested in. For example:
......
...@@ -39,6 +39,36 @@ _RUNNING = object() ...@@ -39,6 +39,36 @@ _RUNNING = object()
_KILLED = object() _KILLED = object()
_COLORS = {
'red': 31,
'green': 32,
'yellow': 33,
}
_BEGINNING_OF_LINE = '\x1b[0G'
_CLEAR_LINE = '\x1b[2K'
_TAG_COLOR = {
'FAILED': 'red',
'PASSED': 'green',
'START': 'yellow',
'WAITING': 'yellow',
}
def message(tag, message, explanatory_text=None):
sys.stdout.write('%s%s\x1b[%dm%s\x1b[0m: %s%s' % (
_BEGINNING_OF_LINE,
_CLEAR_LINE,
_COLORS[_TAG_COLOR[tag]],
tag,
message,
'\n%s\n' % explanatory_text if explanatory_text is not None else ''))
sys.stdout.flush()
class Job(object): class Job(object):
"""Manages one job.""" """Manages one job."""
...@@ -49,9 +79,7 @@ class Job(object): ...@@ -49,9 +79,7 @@ class Job(object):
stderr=subprocess.STDOUT, stderr=subprocess.STDOUT,
stdout=self._tempfile) stdout=self._tempfile)
self._state = _RUNNING self._state = _RUNNING
sys.stdout.write('\x1b[0G\x1b[2K\x1b[33mSTART\x1b[0m: %s' % message('START', self._cmdline)
self._cmdline)
sys.stdout.flush()
def state(self): def state(self):
"""Poll current state of the job. Prints messages at completion.""" """Poll current state of the job. Prints messages at completion."""
...@@ -60,16 +88,10 @@ class Job(object): ...@@ -60,16 +88,10 @@ class Job(object):
self._state = _FAILURE self._state = _FAILURE
self._tempfile.seek(0) self._tempfile.seek(0)
stdout = self._tempfile.read() stdout = self._tempfile.read()
sys.stdout.write('\x1b[0G\x1b[2K\x1b[31mFAILED\x1b[0m: %s' message('FAILED', '%s [ret=%d]' % (self._cmdline, self._process.returncode), stdout)
' [ret=%d]\n'
'%s\n' % (
self._cmdline, self._process.returncode, stdout))
sys.stdout.flush()
else: else:
self._state = _SUCCESS self._state = _SUCCESS
sys.stdout.write('\x1b[0G\x1b[2K\x1b[32mPASSED\x1b[0m: %s' % message('PASSED', '%s' % self._cmdline)
self._cmdline)
sys.stdout.flush()
return self._state return self._state
def kill(self): def kill(self):
...@@ -86,6 +108,7 @@ class Jobset(object): ...@@ -86,6 +108,7 @@ class Jobset(object):
self._check_cancelled = check_cancelled self._check_cancelled = check_cancelled
self._cancelled = False self._cancelled = False
self._failures = 0 self._failures = 0
self._completed = 0
self._maxjobs = maxjobs self._maxjobs = maxjobs
def start(self, cmdline): def start(self, cmdline):
...@@ -107,8 +130,11 @@ class Jobset(object): ...@@ -107,8 +130,11 @@ class Jobset(object):
if st == _FAILURE: self._failures += 1 if st == _FAILURE: self._failures += 1
dead.add(job) dead.add(job)
for job in dead: for job in dead:
self._completed += 1
self._running.remove(job) self._running.remove(job)
if not dead: return if dead: return
message('WAITING', '%d jobs running, %d complete' % (
len(self._running), self._completed))
time.sleep(0.1) time.sleep(0.1)
def cancelled(self): def cancelled(self):
......
...@@ -11,16 +11,44 @@ import time ...@@ -11,16 +11,44 @@ import time
import jobset import jobset
import watch_dirs import watch_dirs
# flags required for make for each configuration # SimpleConfig: just compile with CONFIG=config, and run the binary to test
_CONFIGS = ['dbg', 'opt', 'tsan', 'msan', 'asan'] class SimpleConfig(object):
def __init__(self, config):
self.build_config = config
def run_command(self, binary):
return [binary]
# ValgrindConfig: compile with some CONFIG=config, but use valgrind to run
class ValgrindConfig(object):
def __init__(self, config):
self.build_config = config
def run_command(self, binary):
return ['valgrind', binary]
# different configurations we can run under
_CONFIGS = {
'dbg': SimpleConfig('dbg'),
'opt': SimpleConfig('opt'),
'tsan': SimpleConfig('tsan'),
'msan': SimpleConfig('msan'),
'asan': SimpleConfig('asan'),
'valgrind': ValgrindConfig('dbg'),
}
_DEFAULT = ['dbg', 'opt']
_MAKE_TEST_TARGETS = ['buildtests_c', 'buildtests_cxx'] _MAKE_TEST_TARGETS = ['buildtests_c', 'buildtests_cxx']
# parse command line # parse command line
argp = argparse.ArgumentParser(description='Run grpc tests.') argp = argparse.ArgumentParser(description='Run grpc tests.')
argp.add_argument('-c', '--config', argp.add_argument('-c', '--config',
choices=['all'] + _CONFIGS, choices=['all'] + sorted(_CONFIGS.keys()),
nargs='+', nargs='+',
default=['all']) default=_DEFAULT)
argp.add_argument('-t', '--test-filter', nargs='*', default=['*']) argp.add_argument('-t', '--test-filter', nargs='*', default=['*'])
argp.add_argument('-n', '--runs_per_test', default=1, type=int) argp.add_argument('-n', '--runs_per_test', default=1, type=int)
argp.add_argument('-f', '--forever', argp.add_argument('-f', '--forever',
...@@ -30,10 +58,11 @@ argp.add_argument('-f', '--forever', ...@@ -30,10 +58,11 @@ argp.add_argument('-f', '--forever',
args = argp.parse_args() args = argp.parse_args()
# grab config # grab config
configs = [cfg run_configs = set(_CONFIGS[cfg]
for cfg in itertools.chain.from_iterable( for cfg in itertools.chain.from_iterable(
_CONFIGS if x == 'all' else [x] _CONFIGS.iterkeys() if x == 'all' else [x]
for x in args.config)] for x in args.config))
build_configs = set(cfg.build_config for cfg in run_configs)
filters = args.test_filter filters = args.test_filter
runs_per_test = args.runs_per_test runs_per_test = args.runs_per_test
forever = args.forever forever = args.forever
...@@ -47,19 +76,20 @@ def _build_and_run(check_cancelled): ...@@ -47,19 +76,20 @@ def _build_and_run(check_cancelled):
'-j', '%d' % (multiprocessing.cpu_count() + 1), '-j', '%d' % (multiprocessing.cpu_count() + 1),
target, target,
'CONFIG=%s' % cfg] 'CONFIG=%s' % cfg]
for cfg in configs for cfg in build_configs
for target in _MAKE_TEST_TARGETS), for target in _MAKE_TEST_TARGETS),
check_cancelled, maxjobs=1): check_cancelled, maxjobs=1):
sys.exit(1) sys.exit(1)
# run all the tests # run all the tests
jobset.run(([x] jobset.run((
for x in itertools.chain.from_iterable( config.run_command(x)
itertools.chain.from_iterable(itertools.repeat( for config in run_configs
glob.glob('bins/%s/%s_test' % (config, filt)), for filt in filters
runs_per_test)) for x in itertools.chain.from_iterable(itertools.repeat(
for config in configs glob.glob('bins/%s/%s_test' % (
for filt in filters)), check_cancelled) config.build_config, filt)),
runs_per_test))), check_cancelled)
if forever: if forever:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment