diff options
author | 2016-08-03 10:38:44 -0700 | |
---|---|---|
committer | 2016-08-03 10:38:44 -0700 | |
commit | bc20a701d8bd3df9d8cf8a20eeb17c3f90c99364 (patch) | |
tree | ddc87122558c8b89c6cfa1bd113acd49e42c0c2e /infra/bots/recipes/swarm_test.py | |
parent | bffc2566872f99d378a1113d0a49ec9ee0d60b7a (diff) |
[Recipes] Move test and perf steps into test and perf recipes
This looks like another big change, but I really just moved blocks of code around. Again, no expectations diffs because no behavior is changed.
BUG=skia:5578
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2198973002
Review-Url: https://codereview.chromium.org/2198973002
Diffstat (limited to 'infra/bots/recipes/swarm_test.py')
-rw-r--r-- | infra/bots/recipes/swarm_test.py | 160 |
1 files changed, 158 insertions, 2 deletions
diff --git a/infra/bots/recipes/swarm_test.py b/infra/bots/recipes/swarm_test.py index c42a7901ba..e219e72cee 100644 --- a/infra/bots/recipes/swarm_test.py +++ b/infra/bots/recipes/swarm_test.py @@ -7,13 +7,17 @@ DEPS = [ + 'build/file', 'core', 'recipe_engine/json', 'recipe_engine/path', 'recipe_engine/platform', 'recipe_engine/properties', + 'recipe_engine/python', 'recipe_engine/raw_io', + 'flavor', 'run', + 'vars', ] @@ -33,10 +37,162 @@ TEST_BUILDERS = { } +def key_params(api): + """Build a unique key from the builder name (as a list). + + E.g. arch x86 gpu GeForce320M mode MacMini4.1 os Mac10.6 + """ + # Don't bother to include role, which is always Test. + # TryBots are uploaded elsewhere so they can use the same key. + blacklist = ['role', 'is_trybot'] + + flat = [] + for k in sorted(api.vars.builder_cfg.keys()): + if k not in blacklist: + flat.append(k) + flat.append(api.vars.builder_cfg[k]) + return flat + + +def test_steps(api): + """Run the DM test.""" + use_hash_file = False + if api.vars.upload_dm_results: + # This must run before we write anything into + # api.flavor.device_dirs.dm_dir or we may end up deleting our + # output on machines where they're the same. + api.flavor.create_clean_host_dir(api.vars.dm_dir) + host_dm_dir = str(api.vars.dm_dir) + device_dm_dir = str(api.flavor.device_dirs.dm_dir) + if host_dm_dir != device_dm_dir: + api.flavor.create_clean_device_dir(device_dm_dir) + + # Obtain the list of already-generated hashes. + hash_filename = 'uninteresting_hashes.txt' + + # Ensure that the tmp_dir exists. + api.run.run_once(api.file.makedirs, + 'tmp_dir', + api.vars.tmp_dir, + infra_step=True) + + host_hashes_file = api.vars.tmp_dir.join(hash_filename) + hashes_file = api.flavor.device_path_join( + api.flavor.device_dirs.tmp_dir, hash_filename) + api.run( + api.python.inline, + 'get uninteresting hashes', + program=""" + import contextlib + import math + import socket + import sys + import time + import urllib2 + + HASHES_URL = 'https://gold.skia.org/_/hashes' + RETRIES = 5 + TIMEOUT = 60 + WAIT_BASE = 15 + + socket.setdefaulttimeout(TIMEOUT) + for retry in range(RETRIES): + try: + with contextlib.closing( + urllib2.urlopen(HASHES_URL, timeout=TIMEOUT)) as w: + hashes = w.read() + with open(sys.argv[1], 'w') as f: + f.write(hashes) + break + except Exception as e: + print 'Failed to get uninteresting hashes from %s:' % HASHES_URL + print e + if retry == RETRIES: + raise + waittime = WAIT_BASE * math.pow(2, retry) + print 'Retry in %d seconds.' % waittime + time.sleep(waittime) + """, + args=[host_hashes_file], + cwd=api.vars.skia_dir, + abort_on_failure=False, + fail_build_on_failure=False, + infra_step=True) + + if api.path.exists(host_hashes_file): + api.flavor.copy_file_to_device(host_hashes_file, hashes_file) + use_hash_file = True + + # Run DM. + properties = [ + 'gitHash', api.vars.got_revision, + 'master', api.vars.master_name, + 'builder', api.vars.builder_name, + 'build_number', api.vars.build_number, + ] + if api.vars.is_trybot: + properties.extend([ + 'issue', api.vars.issue, + 'patchset', api.vars.patchset, + ]) + + args = [ + 'dm', + '--undefok', # This helps branches that may not know new flags. + '--resourcePath', api.flavor.device_dirs.resource_dir, + '--skps', api.flavor.device_dirs.skp_dir, + '--images', api.flavor.device_path_join( + api.flavor.device_dirs.images_dir, 'dm'), + '--colorImages', api.flavor.device_path_join( + api.flavor.device_dirs.images_dir, 'colorspace'), + '--nameByHash', + '--properties' + ] + properties + + args.append('--key') + args.extend(key_params(api)) + if use_hash_file: + args.extend(['--uninterestingHashesFile', hashes_file]) + if api.vars.upload_dm_results: + args.extend(['--writePath', api.flavor.device_dirs.dm_dir]) + + skip_flag = None + if api.vars.builder_cfg.get('cpu_or_gpu') == 'CPU': + skip_flag = '--nogpu' + elif api.vars.builder_cfg.get('cpu_or_gpu') == 'GPU': + skip_flag = '--nocpu' + if skip_flag: + args.append(skip_flag) + args.extend(api.vars.dm_flags) + + api.run(api.flavor.step, 'dm', cmd=args, + abort_on_failure=False, + env=api.vars.default_env) + + if api.vars.upload_dm_results: + # Copy images and JSON to host machine if needed. + api.flavor.copy_directory_contents_to_host( + api.flavor.device_dirs.dm_dir, api.vars.dm_dir) + + # See skia:2789. + if ('Valgrind' in api.vars.builder_name and + api.vars.builder_cfg.get('cpu_or_gpu') == 'GPU'): + abandonGpuContext = list(args) + abandonGpuContext.append('--abandonGpuContext') + api.run(api.flavor.step, 'dm --abandonGpuContext', + cmd=abandonGpuContext, abort_on_failure=False) + preAbandonGpuContext = list(args) + preAbandonGpuContext.append('--preAbandonGpuContext') + api.run(api.flavor.step, 'dm --preAbandonGpuContext', + cmd=preAbandonGpuContext, abort_on_failure=False, + env=api.vars.default_env) + + def RunSteps(api): api.core.setup() - api.core.test_steps() - api.core.cleanup_steps() + api.flavor.install() + test_steps(api) + api.flavor.cleanup_steps() api.run.check_failure() |