Index: infra/bots/recipes/swarm_test.py |
diff --git a/infra/bots/recipes/swarm_test.py b/infra/bots/recipes/swarm_test.py |
index c42a7901baacbc3409f66ed98908e5232a943446..e219e72cee9209633a688030f01e29f2211a422c 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() |