Home | History | Annotate | Download | only in recipes
      1 # Copyright 2016 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 
      6 # Recipe module for Skia Swarming test.
      7 
      8 
      9 DEPS = [
     10   'env',
     11   'flavor',
     12   'recipe_engine/context',
     13   'recipe_engine/file',
     14   'recipe_engine/path',
     15   'recipe_engine/platform',
     16   'recipe_engine/properties',
     17   'recipe_engine/python',
     18   'recipe_engine/raw_io',
     19   'recipe_engine/step',
     20   'run',
     21   'vars',
     22 ]
     23 
     24 
     25 def upload_dm_results(buildername):
     26   skip_upload_bots = [
     27     'ASAN',
     28     'Coverage',
     29     'MSAN',
     30     'TSAN',
     31     'UBSAN',
     32     'Valgrind',
     33   ]
     34   for s in skip_upload_bots:
     35     if s in buildername:
     36       return False
     37   return True
     38 
     39 
     40 def dm_flags(api, bot):
     41   args = []
     42   configs = []
     43   blacklisted = []
     44 
     45   def blacklist(quad):
     46     config, src, options, name = (
     47         quad.split(' ') if isinstance(quad, str) else quad)
     48     if (config == '_' or
     49         config in configs or
     50         (config[0] == '~' and config[1:] in configs)):
     51       blacklisted.extend([config, src, options, name])
     52 
     53   # We've been spending lots of time writing out and especially uploading
     54   # .pdfs, but not doing anything further with them.  skia:6821
     55   args.extend(['--dont_write', 'pdf'])
     56 
     57   # This enables non-deterministic random seeding of the GPU FP optimization
     58   # test.
     59   # Not Android due to:
     60   #  - https://skia.googlesource.com/skia/+/
     61   #    5910ed347a638ded8cd4c06dbfda086695df1112/BUILD.gn#160
     62   #  - https://skia.googlesource.com/skia/+/
     63   #    ce06e261e68848ae21cac1052abc16bc07b961bf/tests/ProcessorTest.cpp#307
     64   # Not MSAN due to:
     65   #  - https://skia.googlesource.com/skia/+/
     66   #    0ac06e47269a40c177747310a613d213c95d1d6d/infra/bots/recipe_modules/
     67   #    flavor/gn_flavor.py#80
     68   if 'Android' not in bot and 'MSAN' not in bot:
     69     args.append('--randomProcessorTest')
     70 
     71   # 32-bit desktop bots tend to run out of memory, because they have relatively
     72   # far more cores than RAM (e.g. 32 cores, 3G RAM).  Hold them back a bit.
     73   if '-x86-' in bot and not 'NexusPlayer' in bot:
     74     args.extend(['--threads', '4'])
     75 
     76   # Nexus7 runs out of memory due to having 4 cores and only 1G RAM.
     77   if 'CPU' in bot and 'Nexus7' in bot:
     78     args.extend(['--threads', '2'])
     79 
     80   # MotoG4 occasionally fails when multiple threads read the same image file.
     81   if 'CPU' in bot and 'MotoG4' in bot:
     82     args.extend(['--threads', '0'])
     83 
     84   if 'Chromecast' in bot:
     85     args.extend(['--threads', '0'])
     86 
     87   # Avoid issues with dynamically exceeding resource cache limits.
     88   if 'Test' in bot and 'DISCARDABLE' in bot:
     89     args.extend(['--threads', '0'])
     90 
     91   # See if staying on the main thread helps skia:6748.
     92   if 'Test-iOS' in bot:
     93     args.extend(['--threads', '0'])
     94 
     95   # Android's kernel will occasionally attempt to kill our process, using
     96   # SIGINT, in an effort to free up resources. If requested, that signal
     97   # is ignored and dm will keep attempting to proceed until we actually
     98   # exhaust the available resources.
     99   if ('NexusPlayer' in bot or
    100       'Chromecast' in bot):
    101     args.append('--ignoreSigInt')
    102 
    103   if 'SwiftShader' in api.vars.extra_tokens:
    104     configs.extend(['gles', 'glesdft'])
    105     args.append('--disableDriverCorrectnessWorkarounds')
    106 
    107   elif api.vars.builder_cfg.get('cpu_or_gpu') == 'CPU':
    108     args.append('--nogpu')
    109 
    110     configs.append('8888')
    111 
    112     if 'BonusConfigs' in bot or ('SAN' in bot and 'GCE' in bot):
    113       configs.extend([
    114         'pdf',
    115         'g8', '565',
    116         'pic-8888', 'tiles_rt-8888', 'lite-8888', 'serialize-8888',
    117         'gbr-8888',
    118         'f16', 'srgb', 'esrgb', 'narrow', 'enarrow',
    119         'p3', 'ep3', 'rec2020', 'erec2020'])
    120 
    121   elif api.vars.builder_cfg.get('cpu_or_gpu') == 'GPU':
    122     args.append('--nocpu')
    123 
    124     # Add in either gles or gl configs to the canonical set based on OS
    125     sample_count = '8'
    126     gl_prefix = 'gl'
    127     if 'Android' in bot or 'iOS' in bot:
    128       sample_count = '4'
    129       # We want to test the OpenGL config not the GLES config on the Shield
    130       if 'NVIDIA_Shield' not in bot:
    131         gl_prefix = 'gles'
    132     elif 'Intel' in bot:
    133       sample_count = ''
    134     elif 'ChromeOS' in bot:
    135       gl_prefix = 'gles'
    136 
    137     if 'NativeFonts' in bot:
    138       configs.append(gl_prefix)
    139     else:
    140       configs.extend([gl_prefix,
    141                       gl_prefix + 'dft',
    142                       gl_prefix + 'srgb'])
    143       if sample_count is not '':
    144         configs.append(gl_prefix + 'msaa' + sample_count)
    145 
    146     # The NP produces a long error stream when we run with MSAA. The Tegra3 just
    147     # doesn't support it.
    148     if ('NexusPlayer' in bot or
    149         'Tegra3'      in bot or
    150         # We aren't interested in fixing msaa bugs on current iOS devices.
    151         'iPad4' in bot or
    152         'iPadPro' in bot or
    153         'iPhone6' in bot or
    154         'iPhone7' in bot or
    155         # skia:5792
    156         'IntelHD530'   in bot or
    157         'IntelIris540' in bot):
    158       configs = [x for x in configs if 'msaa' not in x]
    159 
    160     # The NP produces different images for dft on every run.
    161     if 'NexusPlayer' in bot:
    162       configs = [x for x in configs if 'dft' not in x]
    163 
    164     # We want to test both the OpenGL config and the GLES config on Linux Intel:
    165     # GL is used by Chrome, GLES is used by ChromeOS.
    166     # Also do the Ganesh threading verification test (render with and without
    167     # worker threads, using only the SW path renderer, and compare the results).
    168     if 'Intel' in bot and api.vars.is_linux:
    169       configs.extend(['gles',
    170                       'glesdft',
    171                       'glessrgb',
    172                       'gltestthreading'])
    173       # skbug.com/6333, skbug.com/6419, skbug.com/6702
    174       blacklist('gltestthreading gm _ lcdblendmodes')
    175       blacklist('gltestthreading gm _ lcdoverlap')
    176       blacklist('gltestthreading gm _ textbloblooper')
    177       # All of these GMs are flaky, too:
    178       blacklist('gltestthreading gm _ bleed_alpha_bmp')
    179       blacklist('gltestthreading gm _ bleed_alpha_bmp_shader')
    180       blacklist('gltestthreading gm _ bleed_alpha_image')
    181       blacklist('gltestthreading gm _ bleed_alpha_image_shader')
    182       blacklist('gltestthreading gm _ savelayer_with_backdrop')
    183       blacklist('gltestthreading gm _ persp_shaders_bw')
    184       blacklist('gltestthreading gm _ dftext_blob_persp')
    185       blacklist('gltestthreading gm _ dftext')
    186     # skbug.com/7523 - Flaky on various GPUs
    187       blacklist('gltestthreading gm _ orientation')
    188 
    189     # CommandBuffer bot *only* runs the command_buffer config.
    190     if 'CommandBuffer' in bot:
    191       configs = ['commandbuffer']
    192 
    193     # ANGLE bot *only* runs the angle configs
    194     if 'ANGLE' in bot:
    195       configs = ['angle_d3d11_es2',
    196                  'angle_d3d9_es2',
    197                  'angle_gl_es2',
    198                  'angle_d3d11_es3']
    199       if sample_count is not '':
    200         configs.append('angle_d3d11_es2_msaa' + sample_count)
    201         configs.append('angle_d3d11_es3_msaa' + sample_count)
    202       if 'GTX' in bot or 'Quadro' in bot:
    203         # See skia:7823 and chromium:693090.
    204         configs.append('angle_gl_es3')
    205         if sample_count is not '':
    206           configs.append('angle_gl_es2_msaa' + sample_count)
    207           configs.append('angle_gl_es3_msaa' + sample_count)
    208       if 'NUC5i7RYH' in bot:
    209         # skbug.com/7376
    210         blacklist('_ test _ ProcessorCloneTest')
    211 
    212     # Vulkan bot *only* runs the vk config.
    213     if 'Vulkan' in bot:
    214       configs = ['vk']
    215 
    216     if 'Metal' in bot:
    217       configs = ['mtl']
    218 
    219     # Test 1010102 on our Linux/NVIDIA bots and the persistent cache config
    220     # on the GL bots.
    221     if ('QuadroP400' in bot and 'PreAbandonGpuContext' not in bot and
    222         'TSAN' not in bot and api.vars.is_linux):
    223       if 'Vulkan' in bot:
    224         configs.append('vk1010102')
    225         # Decoding transparent images to 1010102 just looks bad
    226         blacklist('vk1010102 image _ _')
    227       else:
    228         configs.extend(['gl1010102', 'gltestpersistentcache'])
    229         # Decoding transparent images to 1010102 just looks bad
    230         blacklist('gl1010102 image _ _')
    231         # These tests produce slightly different pixels run to run on NV.
    232         blacklist('gltestpersistentcache gm _ atlastext')
    233         blacklist('gltestpersistentcache gm _ dftext')
    234         blacklist('gltestpersistentcache gm _ glyph_pos_h_b')
    235 
    236     # Test SkColorSpaceXformCanvas and rendering to wrapped dsts on a few bots
    237     # Also test 'glenarrow', which hits F16 surfaces and F16 vertex colors.
    238     if 'BonusConfigs' in api.vars.extra_tokens:
    239       configs = ['gbr-gl', 'glbetex', 'glbert', 'glenarrow']
    240 
    241 
    242     if 'ChromeOS' in bot:
    243       # Just run GLES for now - maybe add gles_msaa4 in the future
    244       configs = ['gles']
    245 
    246     if 'Chromecast' in bot:
    247       configs = ['gles']
    248 
    249     # Test coverage counting path renderer.
    250     if 'CCPR' in bot:
    251       configs = [c for c in configs if c == 'gl' or c == 'gles']
    252       args.extend(['--pr', 'ccpr', '--cachePathMasks', 'false'])
    253 
    254     # DDL is a GPU-only feature
    255     if 'DDL1' in bot:
    256       # This bot generates gl and vk comparison images for the large skps
    257       configs = [c for c in configs if c == 'gl' or c == 'vk']
    258       args.extend(['--skpViewportSize', "2048"])
    259       args.extend(['--pr', '~small'])
    260     if 'DDL3' in bot:
    261       # This bot generates the ddl-gl and ddl-vk images for the
    262       # large skps and the gms
    263       ddl_configs = ['ddl-' + c for c in configs if c == 'gl' or c == 'vk']
    264       ddl2_configs = ['ddl2-' + c for c in configs if c == 'gl' or c == 'vk']
    265       configs = ddl_configs + ddl2_configs
    266       args.extend(['--skpViewportSize', "2048"])
    267       args.extend(['--gpuThreads', "0"])
    268 
    269     if 'Lottie' in bot:
    270       configs = ['gl']
    271 
    272   tf = api.vars.builder_cfg.get('test_filter')
    273   if 'All' != tf:
    274     # Expected format: shard_XX_YY
    275     parts = tf.split('_')
    276     if len(parts) == 3:
    277       args.extend(['--shard', parts[1]])
    278       args.extend(['--shards', parts[2]])
    279     else: # pragma: nocover
    280       raise Exception('Invalid task name - bad shards: %s' % tf)
    281 
    282   args.append('--config')
    283   args.extend(configs)
    284 
    285   # Run tests, gms, and image decoding tests everywhere.
    286   args.extend('--src tests gm image lottie colorImage svg skp'.split(' '))
    287   if api.vars.builder_cfg.get('cpu_or_gpu') == 'GPU':
    288     # Don't run the 'svgparse_*' svgs on GPU.
    289     blacklist('_ svg _ svgparse_')
    290   elif bot == 'Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-All-ASAN':
    291     # Only run the CPU SVGs on 8888.
    292     blacklist('~8888 svg _ _')
    293   else:
    294     # On CPU SVGs we only care about parsing. Only run them on the above bot.
    295     args.remove('svg')
    296 
    297   # Eventually I'd like these to pass, but for now just skip 'em.
    298   if 'SK_FORCE_RASTER_PIPELINE_BLITTER' in bot:
    299     args.remove('tests')
    300 
    301   if 'NativeFonts' in bot:  # images won't exercise native font integration :)
    302     args.remove('image')
    303     args.remove('colorImage')
    304 
    305   def remove_from_args(arg):
    306     if arg in args:
    307       args.remove(arg)
    308 
    309   if 'DDL' in bot:
    310     # The DDL bots just render the large skps and the gms
    311     remove_from_args('tests')
    312     remove_from_args('image')
    313     remove_from_args('colorImage')
    314     remove_from_args('svg')
    315   else:
    316     # Currently, only the DDL bots render skps
    317     remove_from_args('skp')
    318 
    319   if 'Lottie' in api.vars.builder_cfg.get('extra_config', ''):
    320     # Only run the lotties on Lottie bots.
    321     remove_from_args('tests')
    322     remove_from_args('gm')
    323     remove_from_args('image')
    324     remove_from_args('colorImage')
    325     remove_from_args('svg')
    326     remove_from_args('skp')
    327   else:
    328     remove_from_args('lottie')
    329 
    330   # TODO: ???
    331   blacklist('f16 _ _ dstreadshuffle')
    332   blacklist('glsrgb image _ _')
    333   blacklist('glessrgb image _ _')
    334 
    335   # Not any point to running these.
    336   blacklist('gbr-8888 image _ _')
    337   blacklist('gbr-8888 colorImage _ _')
    338 
    339   # --src image --config g8 means "decode into Gray8", which isn't supported.
    340   blacklist('g8 image _ _')
    341   blacklist('g8 colorImage _ _')
    342 
    343   if 'Valgrind' in bot:
    344     # These take 18+ hours to run.
    345     blacklist('pdf gm _ fontmgr_iter')
    346     blacklist('pdf _ _ PANO_20121023_214540.jpg')
    347     blacklist('pdf skp _ worldjournal')
    348     blacklist('pdf skp _ desk_baidu.skp')
    349     blacklist('pdf skp _ desk_wikipedia.skp')
    350     blacklist('_ svg _ _')
    351 
    352   if 'iOS' in bot:
    353     blacklist(gl_prefix + ' skp _ _')
    354 
    355   if 'Mac' in bot or 'iOS' in bot:
    356     # CG fails on questionable bmps
    357     blacklist('_ image gen_platf rgba32abf.bmp')
    358     blacklist('_ image gen_platf rgb24prof.bmp')
    359     blacklist('_ image gen_platf rgb24lprof.bmp')
    360     blacklist('_ image gen_platf 8bpp-pixeldata-cropped.bmp')
    361     blacklist('_ image gen_platf 4bpp-pixeldata-cropped.bmp')
    362     blacklist('_ image gen_platf 32bpp-pixeldata-cropped.bmp')
    363     blacklist('_ image gen_platf 24bpp-pixeldata-cropped.bmp')
    364 
    365     # CG has unpredictable behavior on this questionable gif
    366     # It's probably using uninitialized memory
    367     blacklist('_ image gen_platf frame_larger_than_image.gif')
    368 
    369     # CG has unpredictable behavior on incomplete pngs
    370     # skbug.com/5774
    371     blacklist('_ image gen_platf inc0.png')
    372     blacklist('_ image gen_platf inc1.png')
    373     blacklist('_ image gen_platf inc2.png')
    374     blacklist('_ image gen_platf inc3.png')
    375     blacklist('_ image gen_platf inc4.png')
    376     blacklist('_ image gen_platf inc5.png')
    377     blacklist('_ image gen_platf inc6.png')
    378     blacklist('_ image gen_platf inc7.png')
    379     blacklist('_ image gen_platf inc8.png')
    380     blacklist('_ image gen_platf inc9.png')
    381     blacklist('_ image gen_platf inc10.png')
    382     blacklist('_ image gen_platf inc11.png')
    383     blacklist('_ image gen_platf inc12.png')
    384     blacklist('_ image gen_platf inc13.png')
    385     blacklist('_ image gen_platf inc14.png')
    386     blacklist('_ image gen_platf incInterlaced.png')
    387 
    388     # These images fail after Mac 10.13.1 upgrade.
    389     blacklist('_ image gen_platf incInterlaced.gif')
    390     blacklist('_ image gen_platf inc1.gif')
    391     blacklist('_ image gen_platf inc0.gif')
    392     blacklist('_ image gen_platf butterfly.gif')
    393 
    394   # WIC fails on questionable bmps
    395   if 'Win' in bot:
    396     blacklist('_ image gen_platf pal8os2v2.bmp')
    397     blacklist('_ image gen_platf pal8os2v2-16.bmp')
    398     blacklist('_ image gen_platf rgba32abf.bmp')
    399     blacklist('_ image gen_platf rgb24prof.bmp')
    400     blacklist('_ image gen_platf rgb24lprof.bmp')
    401     blacklist('_ image gen_platf 8bpp-pixeldata-cropped.bmp')
    402     blacklist('_ image gen_platf 4bpp-pixeldata-cropped.bmp')
    403     blacklist('_ image gen_platf 32bpp-pixeldata-cropped.bmp')
    404     blacklist('_ image gen_platf 24bpp-pixeldata-cropped.bmp')
    405     if 'x86_64' in bot and 'CPU' in bot:
    406       # This GM triggers a SkSmallAllocator assert.
    407       blacklist('_ gm _ composeshader_bitmap')
    408 
    409   if 'Win' in bot or 'Mac' in bot:
    410     # WIC and CG fail on arithmetic jpegs
    411     blacklist('_ image gen_platf testimgari.jpg')
    412     # More questionable bmps that fail on Mac, too. skbug.com/6984
    413     blacklist('_ image gen_platf rle8-height-negative.bmp')
    414     blacklist('_ image gen_platf rle4-height-negative.bmp')
    415 
    416   # These PNGs have CRC errors. The platform generators seem to draw
    417   # uninitialized memory without reporting an error, so skip them to
    418   # avoid lots of images on Gold.
    419   blacklist('_ image gen_platf error')
    420 
    421   if 'Android' in bot or 'iOS' in bot or 'Chromecast' in bot:
    422     # This test crashes the N9 (perhaps because of large malloc/frees). It also
    423     # is fairly slow and not platform-specific. So we just disable it on all of
    424     # Android and iOS. skia:5438
    425     blacklist('_ test _ GrShape')
    426 
    427   if api.vars.internal_hardware_label == '2':
    428     # skia:7160
    429     blacklist('_ test _ SRGBReadWritePixels')
    430     blacklist('_ test _ SRGBMipMap')
    431 
    432   if api.vars.internal_hardware_label == '5':
    433     # http://b/118312149#comment9
    434     blacklist('_ test _ SRGBReadWritePixels')
    435 
    436   # skia:4095
    437   bad_serialize_gms = ['bleed_image',
    438                        'c_gms',
    439                        'colortype',
    440                        'colortype_xfermodes',
    441                        'drawfilter',
    442                        'fontmgr_bounds_0.75_0',
    443                        'fontmgr_bounds_1_-0.25',
    444                        'fontmgr_bounds',
    445                        'fontmgr_match',
    446                        'fontmgr_iter',
    447                        'imagemasksubset']
    448 
    449   # skia:5589
    450   bad_serialize_gms.extend(['bitmapfilters',
    451                             'bitmapshaders',
    452                             'bleed',
    453                             'bleed_alpha_bmp',
    454                             'bleed_alpha_bmp_shader',
    455                             'convex_poly_clip',
    456                             'extractalpha',
    457                             'filterbitmap_checkerboard_32_32_g8',
    458                             'filterbitmap_image_mandrill_64',
    459                             'shadows',
    460                             'simpleaaclip_aaclip'])
    461   # skia:5595
    462   bad_serialize_gms.extend(['composeshader_bitmap',
    463                             'scaled_tilemodes_npot',
    464                             'scaled_tilemodes'])
    465 
    466   # skia:5778
    467   bad_serialize_gms.append('typefacerendering_pfaMac')
    468   # skia:5942
    469   bad_serialize_gms.append('parsedpaths')
    470 
    471   # these use a custom image generator which doesn't serialize
    472   bad_serialize_gms.append('ImageGeneratorExternal_rect')
    473   bad_serialize_gms.append('ImageGeneratorExternal_shader')
    474 
    475   # skia:6189
    476   bad_serialize_gms.append('shadow_utils')
    477 
    478   # skia:7938
    479   bad_serialize_gms.append('persp_images')
    480 
    481   # Not expected to round trip encoding/decoding.
    482   bad_serialize_gms.append('all_bitmap_configs')
    483   bad_serialize_gms.append('makecolorspace')
    484   bad_serialize_gms.append('readpixels')
    485   bad_serialize_gms.append('draw_image_set_rect_to_rect')
    486 
    487   # This GM forces a path to be convex. That property doesn't survive
    488   # serialization.
    489   bad_serialize_gms.append('analytic_antialias_convex')
    490 
    491   for test in bad_serialize_gms:
    492     blacklist(['serialize-8888', 'gm', '_', test])
    493 
    494   if 'Mac' not in bot:
    495     for test in ['bleed_alpha_image', 'bleed_alpha_image_shader']:
    496       blacklist(['serialize-8888', 'gm', '_', test])
    497   # It looks like we skip these only for out-of-memory concerns.
    498   if 'Win' in bot or 'Android' in bot:
    499     for test in ['verylargebitmap', 'verylarge_picture_image']:
    500       blacklist(['serialize-8888', 'gm', '_', test])
    501   if 'Mac' in bot and 'CPU' in bot:
    502     # skia:6992
    503     blacklist(['pic-8888', 'gm', '_', 'encode-platform'])
    504     blacklist(['serialize-8888', 'gm', '_', 'encode-platform'])
    505 
    506   # skia:4769
    507   for test in ['drawfilter']:
    508     blacklist([   'pic-8888', 'gm', '_', test])
    509     blacklist([  'lite-8888', 'gm', '_', test])
    510   # skia:4703
    511   for test in ['image-cacherator-from-picture',
    512                'image-cacherator-from-raster',
    513                'image-cacherator-from-ctable']:
    514     blacklist([      'pic-8888', 'gm', '_', test])
    515     blacklist(['serialize-8888', 'gm', '_', test])
    516 
    517   # GM that requires raster-backed canvas
    518   for test in ['complexclip4_bw', 'complexclip4_aa', 'p3']:
    519     blacklist([      'pic-8888', 'gm', '_', test])
    520     blacklist([     'lite-8888', 'gm', '_', test])
    521     blacklist(['serialize-8888', 'gm', '_', test])
    522 
    523   # GM that not support tiles_rt
    524   for test in ['complexclip4_bw', 'complexclip4_aa']:
    525     blacklist([ 'tiles_rt-8888', 'gm', '_', test])
    526 
    527   # Extensions for RAW images
    528   r = ['arw', 'cr2', 'dng', 'nef', 'nrw', 'orf', 'raf', 'rw2', 'pef', 'srw',
    529        'ARW', 'CR2', 'DNG', 'NEF', 'NRW', 'ORF', 'RAF', 'RW2', 'PEF', 'SRW']
    530 
    531   # skbug.com/4888
    532   # Blacklist RAW images (and a few large PNGs) on GPU bots
    533   # until we can resolve failures.
    534   if 'GPU' in bot:
    535     blacklist('_ image _ interlaced1.png')
    536     blacklist('_ image _ interlaced2.png')
    537     blacklist('_ image _ interlaced3.png')
    538     for raw_ext in r:
    539       blacklist('_ image _ .%s' % raw_ext)
    540 
    541   # Blacklist memory intensive tests on 32-bit bots.
    542   if ('Win8' in bot or 'Win2016' in bot) and 'x86-' in bot:
    543     blacklist('_ image f16 _')
    544     blacklist('_ image _ abnormal.wbmp')
    545     blacklist('_ image _ interlaced1.png')
    546     blacklist('_ image _ interlaced2.png')
    547     blacklist('_ image _ interlaced3.png')
    548     for raw_ext in r:
    549       blacklist('_ image _ .%s' % raw_ext)
    550 
    551   if 'Nexus5' in bot and 'GPU' in bot:
    552     # skia:5876
    553     blacklist(['_', 'gm', '_', 'encode-platform'])
    554 
    555   if 'AndroidOne-GPU' in bot:  # skia:4697, skia:4704, skia:4694, skia:4705
    556     blacklist(['_',            'gm', '_', 'bigblurs'])
    557     blacklist(['_',            'gm', '_', 'bleed'])
    558     blacklist(['_',            'gm', '_', 'bleed_alpha_bmp'])
    559     blacklist(['_',            'gm', '_', 'bleed_alpha_bmp_shader'])
    560     blacklist(['_',            'gm', '_', 'bleed_alpha_image'])
    561     blacklist(['_',            'gm', '_', 'bleed_alpha_image_shader'])
    562     blacklist(['_',            'gm', '_', 'bleed_image'])
    563     blacklist(['_',            'gm', '_', 'dropshadowimagefilter'])
    564     blacklist(['_',            'gm', '_', 'filterfastbounds'])
    565     blacklist([gl_prefix,      'gm', '_', 'imageblurtiled'])
    566     blacklist(['_',            'gm', '_', 'imagefiltersclipped'])
    567     blacklist(['_',            'gm', '_', 'imagefiltersscaled'])
    568     blacklist(['_',            'gm', '_', 'imageresizetiled'])
    569     blacklist(['_',            'gm', '_', 'matrixconvolution'])
    570     blacklist(['_',            'gm', '_', 'strokedlines'])
    571     if sample_count is not '':
    572       gl_msaa_config = gl_prefix + 'msaa' + sample_count
    573       blacklist([gl_msaa_config, 'gm', '_', 'imageblurtiled'])
    574       blacklist([gl_msaa_config, 'gm', '_', 'imagefiltersbase'])
    575 
    576   match = []
    577   if 'Valgrind' in bot: # skia:3021
    578     match.append('~Threaded')
    579 
    580   if 'Valgrind' in bot and 'PreAbandonGpuContext' in bot:
    581     # skia:6575
    582     match.append('~multipicturedraw_')
    583 
    584   if 'CommandBuffer' in bot:
    585     # https://crbug.com/697030
    586     match.append('~HalfFloatAlphaTextureTest')
    587 
    588   if 'AndroidOne' in bot:
    589     match.append('~WritePixels')  # skia:4711
    590     match.append('~PremulAlphaRoundTrip_Gpu')  # skia:7501
    591     match.append('~ReimportImageTextureWithMipLevels')  # skia:8090
    592 
    593   if 'Chromecast' in bot:
    594     if 'GPU' in bot:
    595       # skia:6687
    596       match.append('~animated-image-blurs')
    597       match.append('~blur_0.01')
    598       match.append('~blur_image_filter')
    599       match.append('~check_small_sigma_offset')
    600       match.append('~imageblur2')
    601       match.append('~lighting')
    602       match.append('~longpathdash')
    603       match.append('~matrixconvolution')
    604       match.append('~textblobmixedsizes_df')
    605       match.append('~textblobrandomfont')
    606     # Blacklisted to avoid OOM (we see DM just end with "broken pipe")
    607     match.append('~bigbitmaprect_')
    608     match.append('~DrawBitmapRect')
    609     match.append('~drawbitmaprect')
    610     match.append('~GM_animated-image-blurs')
    611     match.append('~ImageFilterBlurLargeImage')
    612     match.append('~savelayer_clipmask')
    613     match.append('~TextBlobCache')
    614     match.append('~verylarge')
    615 
    616   if 'GalaxyS6' in bot:
    617     match.append('~SpecialImage') # skia:6338
    618     match.append('~skbug6653') # skia:6653
    619 
    620   if 'MSAN' in bot:
    621     match.extend(['~Once', '~Shared'])  # Not sure what's up with these tests.
    622 
    623   if 'TSAN' in bot:
    624     match.extend(['~ReadWriteAlpha'])   # Flaky on TSAN-covered on nvidia bots.
    625     match.extend(['~RGBA4444TextureTest',  # Flakier than they are important.
    626                   '~RGB565TextureTest'])
    627 
    628   # By default, we test with GPU threading enabled, unless specifically
    629   # disabled.
    630   if 'NoGPUThreads' in bot:
    631     args.extend(['--gpuThreads', '0'])
    632 
    633   if 'Vulkan' in bot and 'Adreno530' in bot:
    634       # skia:5777
    635       match.extend(['~CopySurface'])
    636 
    637   if 'Vulkan' in bot and 'Adreno' in bot:
    638       # skia:7663
    639       match.extend(['~WritePixelsNonTextureMSAA_Gpu'])
    640       match.extend(['~WritePixelsMSAA_Gpu'])
    641 
    642   if 'Vulkan' in bot and api.vars.is_linux and 'IntelIris640' in bot:
    643     match.extend(['~VkHeapTests']) # skia:6245
    644 
    645   if api.vars.is_linux and 'IntelIris640' in bot:
    646     match.extend(['~GLPrograms']) # skia:7849
    647 
    648   if 'Vulkan' in bot and api.vars.is_linux and 'IntelHD405' in bot:
    649     # skia:7322
    650     blacklist(['vk', 'gm', '_', 'skbug_257'])
    651     blacklist(['vk', 'gm', '_', 'filltypespersp'])
    652     match.append('~^ClearOp$')
    653     match.append('~^CopySurface$')
    654     match.append('~^ImageNewShader_GPU$')
    655     match.append('~^InitialTextureClear$')
    656     match.append('~^PinnedImageTest$')
    657     match.append('~^ReadPixels_Gpu$')
    658     match.append('~^ReadPixels_Texture$')
    659     match.append('~^SRGBReadWritePixels$')
    660     match.append('~^VkUploadPixelsTests$')
    661     match.append('~^WritePixelsNonTexture_Gpu$')
    662     match.append('~^WritePixelsNonTextureMSAA_Gpu$')
    663     match.append('~^WritePixels_Gpu$')
    664     match.append('~^WritePixelsMSAA_Gpu$')
    665 
    666   if 'Vulkan' in bot and 'GTX660' in bot and 'Win' in bot:
    667     # skbug.com/8047
    668     match.append('~FloatingPointTextureTest$')
    669 
    670   if 'Vulkan' in bot and 'Win10' in bot and 'IntelIris655' in bot:
    671     # skia:8659
    672     blacklist(['vk', 'gm', '_', 'aarectmodes'])
    673     blacklist(['vk', 'gm', '_', 'aaxfermodes'])
    674     blacklist(['vk', 'gm', '_', 'crbug_892988'])
    675     blacklist(['vk', 'gm', '_', 'dftext'])
    676     blacklist(['vk', 'gm', '_', 'dftext_blob_persp'])
    677     blacklist(['vk', 'gm', '_', 'dont_clip_to_layer'])
    678     blacklist(['vk', 'gm', '_', 'drawregionmodes'])
    679     blacklist(['vk', 'gm', '_', 'filterfastbounds'])
    680     blacklist(['vk', 'gm', '_', 'fontmgr_iter'])
    681     blacklist(['vk', 'gm', '_', 'fontmgr_match'])
    682     blacklist(['vk', 'gm', '_', 'fontscalerdistortable'])
    683     blacklist(['vk', 'gm', '_', 'gammagradienttext'])
    684     blacklist(['vk', 'gm', '_', 'gammatext'])
    685     blacklist(['vk', 'gm', '_', 'gradtext'])
    686     blacklist(['vk', 'gm', '_', 'hairmodes'])
    687     blacklist(['vk', 'gm', '_', 'imagefilters_xfermodes'])
    688     blacklist(['vk', 'gm', '_', 'imagefiltersclipped'])
    689     blacklist(['vk', 'gm', '_', 'imagefiltersscaled'])
    690     blacklist(['vk', 'gm', '_', 'imagefiltersstroked'])
    691     blacklist(['vk', 'gm', '_', 'imagefilterstransformed'])
    692     blacklist(['vk', 'gm', '_', 'imageresizetiled'])
    693     blacklist(['vk', 'gm', '_', 'lcdblendmodes'])
    694     blacklist(['vk', 'gm', '_', 'lcdoverlap'])
    695     blacklist(['vk', 'gm', '_', 'lcdtext'])
    696     blacklist(['vk', 'gm', '_', 'lcdtextsize'])
    697     blacklist(['vk', 'gm', '_', 'matriximagefilter'])
    698     blacklist(['vk', 'gm', '_', 'resizeimagefilter'])
    699     blacklist(['vk', 'gm', '_', 'rotate_imagefilter'])
    700     blacklist(['vk', 'gm', '_', 'savelayer_lcdtext'])
    701     blacklist(['vk', 'gm', '_', 'shadermaskfilter_image'])
    702     blacklist(['vk', 'gm', '_', 'srcmode'])
    703     blacklist(['vk', 'gm', '_', 'surfaceprops'])
    704     blacklist(['vk', 'gm', '_', 'textblobgeometrychange'])
    705     blacklist(['vk', 'gm', '_', 'textbloblooper'])
    706     blacklist(['vk', 'gm', '_', 'textblobrandomfont'])
    707     blacklist(['vk', 'gm', '_', 'textfilter_color'])
    708     blacklist(['vk', 'gm', '_', 'textfilter_image'])
    709     blacklist(['vk', 'gm', '_', 'tilemodes'])
    710     blacklist(['vk', 'gm', '_', 'varied_text_clipped_lcd'])
    711     blacklist(['vk', 'gm', '_', 'varied_text_ignorable_clip_lcd'])
    712     if 'Debug' in bot:
    713       blacklist(['vk', 'gm', '_', 'fontscaler'])
    714       blacklist(['vk', 'gm', '_', 'mixedtextblobs'])
    715       blacklist(['vk', 'gm', '_', 'textblobmixedsizes'])
    716       blacklist(['vk', 'gm', '_', 'textblobmixedsizes_df'])
    717 
    718   if 'MoltenVK' in bot:
    719     # skbug.com/7959
    720     blacklist(['_', 'gm', '_', 'vertices_scaled_shader'])
    721     blacklist(['_', 'gm', '_', 'vertices'])
    722     match.append('~^InitialTextureClear$')
    723     match.append('~^RGB565TextureTest$')
    724     match.append('~^RGBA4444TextureTest$')
    725     match.append('~^WritePixelsNonTextureMSAA_Gpu$')
    726 
    727   if 'ANGLE' in bot:
    728     # skia:7835
    729     match.append('~BlurMaskBiggerThanDest')
    730 
    731   if 'IntelIris6100' in bot and 'ANGLE' in bot and 'Release' in bot:
    732     # skia:7376
    733     match.append('~^ProcessorOptimizationValidationTest$')
    734 
    735   if ('IntelIris6100' in bot or 'IntelHD4400' in bot) and 'ANGLE' in bot:
    736     # skia:6857
    737     blacklist(['angle_d3d9_es2', 'gm', '_', 'lighting'])
    738 
    739   if 'PowerVRGX6250' in bot:
    740     match.append('~gradients_view_perspective_nodither') #skia:6972
    741 
    742   if '-arm-' in bot and 'ASAN' in bot:
    743     # TODO: can we run with env allocator_may_return_null=1 instead?
    744     match.append('~BadImage')
    745 
    746   if 'Mac' in bot and 'IntelHD6000' in bot:
    747     # skia:7574
    748     match.append('~^ProcessorCloneTest$')
    749     match.append('~^GrMeshTest$')
    750 
    751   if 'Mac' in bot and 'IntelHD615' in bot:
    752     # skia:7603
    753     match.append('~^GrMeshTest$')
    754 
    755   if 'Metal' in bot:
    756     # skia:8243
    757     match.append('~^ClearOp$')
    758     match.append('~^DDLSurfaceCharacterizationTest$')
    759     match.append('~^DDLNonTextureabilityTest$')
    760     match.append('~^DDLOperatorEqTest$')
    761     match.append('~^DeferredProxyTest$')
    762     match.append('~^GPUMemorySize$')
    763     match.append('~^GrContext_colorTypeSupportedAsImage$')
    764     match.append('~^GrContext_colorTypeSupportedAsSurface$')
    765     match.append('~^GrContext_maxSurfaceSamplesForColorType$')
    766     match.append('~^GrContextFactory_sharedContexts$')
    767     match.append('~^GrPipelineDynamicStateTest$')
    768     match.append('~^InitialTextureClear$')
    769     match.append('~^PromiseImageTestNoDelayedRelease$')
    770     match.append('~^PromiseImageTestDelayedRelease$')
    771     match.append('~^PromiseImageTextureReuse$')
    772     match.append('~^PromiseImageTextureReuseDifferentConfig$')
    773     match.append('~^PromiseImageTextureShutdown$')
    774     match.append('~^PromiseImageTextureFullCache$')
    775     match.append('~^ResourceAllocatorTest$')
    776     match.append('~^RGB565TextureTest$')
    777     match.append('~^RGBA4444TextureTest$')
    778     match.append('~^TransferPixelsTest$')
    779     match.append('~^SurfaceSemaphores$')
    780     match.append('~^VertexAttributeCount$')
    781     match.append('~^WrappedProxyTest$')
    782 
    783   if blacklisted:
    784     args.append('--blacklist')
    785     args.extend(blacklisted)
    786 
    787   if match:
    788     args.append('--match')
    789     args.extend(match)
    790 
    791   # These bots run out of memory running RAW codec tests. Do not run them in
    792   # parallel
    793   if 'NexusPlayer' in bot or 'Nexus5' in bot or 'Nexus9' in bot:
    794     args.append('--noRAW_threading')
    795 
    796   if 'FSAA' in bot:
    797     args.extend(['--analyticAA', 'false', '--deltaAA', 'false'])
    798   if 'FAAA' in bot:
    799     args.extend(['--deltaAA', 'false', '--forceAnalyticAA'])
    800   if 'FDAA' in bot:
    801     args.extend(['--deltaAA', '--forceDeltaAA'])
    802 
    803   if 'NativeFonts' not in bot:
    804     args.append('--nonativeFonts')
    805 
    806   if 'GDI' in bot:
    807     args.append('--gdi')
    808 
    809   if ('QuadroP400' in bot or
    810       'Adreno540' in bot or
    811       'IntelHD2000' in bot or   # gen 6 - sandy bridge
    812       'IntelHD4400' in bot or   # gen 7 - haswell
    813       'IntelHD405' in bot or    # gen 8 - cherryview braswell
    814       'IntelIris6100' in bot or # gen 8 - broadwell
    815       'IntelIris540' in bot or  # gen 9 - skylake
    816       'IntelIris640' in bot or  # gen 9 - kaby lake
    817       'IntelIris655' in bot or  # gen 9 - coffee lake
    818       'MaliT760' in bot or
    819       'MaliT860' in bot or
    820       'MaliT880' in bot):
    821     args.extend(['--reduceOpListSplitting'])
    822 
    823   # Let's make all bots produce verbose output by default.
    824   args.append('--verbose')
    825 
    826   return args
    827 
    828 
    829 def key_params(api):
    830   """Build a unique key from the builder name (as a list).
    831 
    832   E.g.  arch x86 gpu GeForce320M mode MacMini4.1 os Mac10.6
    833   """
    834   # Don't bother to include role, which is always Test.
    835   blacklist = ['role', 'test_filter']
    836 
    837   flat = []
    838   for k in sorted(api.vars.builder_cfg.keys()):
    839     if k not in blacklist:
    840       flat.append(k)
    841       flat.append(api.vars.builder_cfg[k])
    842 
    843   return flat
    844 
    845 
    846 def test_steps(api):
    847   """Run the DM test."""
    848   b = api.properties['buildername']
    849   use_hash_file = False
    850   if upload_dm_results(b):
    851     host_dm_dir = str(api.flavor.host_dirs.dm_dir)
    852     api.flavor.create_clean_host_dir(api.path['start_dir'].join('test'))
    853     device_dm_dir = str(api.flavor.device_dirs.dm_dir)
    854     if host_dm_dir != device_dm_dir:
    855       api.flavor.create_clean_device_dir(device_dm_dir)
    856 
    857     # Obtain the list of already-generated hashes.
    858     hash_filename = 'uninteresting_hashes.txt'
    859 
    860     host_hashes_file = api.vars.tmp_dir.join(hash_filename)
    861     hashes_file = api.flavor.device_path_join(
    862         api.flavor.device_dirs.tmp_dir, hash_filename)
    863     api.run(
    864         api.python.inline,
    865         'get uninteresting hashes',
    866         program="""
    867         import contextlib
    868         import math
    869         import socket
    870         import sys
    871         import time
    872         import urllib2
    873 
    874         HASHES_URL = sys.argv[1]
    875         RETRIES = 5
    876         TIMEOUT = 60
    877         WAIT_BASE = 15
    878 
    879         socket.setdefaulttimeout(TIMEOUT)
    880         for retry in range(RETRIES):
    881           try:
    882             with contextlib.closing(
    883                 urllib2.urlopen(HASHES_URL, timeout=TIMEOUT)) as w:
    884               hashes = w.read()
    885               with open(sys.argv[2], 'w') as f:
    886                 f.write(hashes)
    887                 break
    888           except Exception as e:
    889             print 'Failed to get uninteresting hashes from %s:' % HASHES_URL
    890             print e
    891             if retry == RETRIES:
    892               raise
    893             waittime = WAIT_BASE * math.pow(2, retry)
    894             print 'Retry in %d seconds.' % waittime
    895             time.sleep(waittime)
    896         """,
    897         args=[api.properties['gold_hashes_url'], host_hashes_file],
    898         abort_on_failure=False,
    899         fail_build_on_failure=False,
    900         infra_step=True)
    901 
    902     if api.path.exists(host_hashes_file):
    903       api.flavor.copy_file_to_device(host_hashes_file, hashes_file)
    904       use_hash_file = True
    905 
    906   # Run DM.
    907   properties = [
    908     'gitHash',              api.properties['revision'],
    909     'builder',              api.vars.builder_name,
    910     'buildbucket_build_id', api.properties.get('buildbucket_build_id', ''),
    911   ]
    912   if api.vars.is_trybot:
    913     properties.extend([
    914       'issue',         api.vars.issue,
    915       'patchset',      api.vars.patchset,
    916       'patch_storage', api.vars.patch_storage,
    917     ])
    918   properties.extend(['swarming_bot_id', api.vars.swarming_bot_id])
    919   properties.extend(['swarming_task_id', api.vars.swarming_task_id])
    920 
    921   if 'Chromecast' in api.vars.builder_cfg.get('os', ''):
    922     # Due to limited disk space, we only deal with skps and one image.
    923     args = [
    924       'dm',
    925       '--resourcePath', api.flavor.device_dirs.resource_dir,
    926       '--skps', api.flavor.device_dirs.skp_dir,
    927       '--images', api.flavor.device_path_join(
    928           api.flavor.device_dirs.resource_dir, 'images', 'color_wheel.jpg'),
    929       '--nameByHash',
    930       '--properties'
    931     ] + properties
    932   else:
    933     args = [
    934       'dm',
    935       '--resourcePath', api.flavor.device_dirs.resource_dir,
    936       '--skps', api.flavor.device_dirs.skp_dir,
    937       '--images', api.flavor.device_path_join(
    938           api.flavor.device_dirs.images_dir, 'dm'),
    939       '--colorImages', api.flavor.device_path_join(
    940           api.flavor.device_dirs.images_dir, 'colorspace'),
    941       '--nameByHash',
    942       '--properties'
    943     ] + properties
    944 
    945     args.extend(['--svgs', api.flavor.device_dirs.svg_dir])
    946     if 'Lottie' in api.vars.builder_cfg.get('extra_config', ''):
    947       args.extend(['--lotties', api.flavor.device_dirs.lotties_dir])
    948 
    949   args.append('--key')
    950   keys = key_params(api)
    951 
    952   if 'Lottie' in api.vars.builder_cfg.get('extra_config', ''):
    953     keys.extend(['renderer', 'skottie'])
    954 
    955   args.extend(keys)
    956 
    957   if use_hash_file:
    958     args.extend(['--uninterestingHashesFile', hashes_file])
    959   if upload_dm_results(b):
    960     args.extend(['--writePath', api.flavor.device_dirs.dm_dir])
    961 
    962   args.extend(dm_flags(api, api.vars.builder_name))
    963 
    964   # See skia:2789.
    965   if 'AbandonGpuContext' in api.vars.extra_tokens:
    966     args.append('--abandonGpuContext')
    967   if 'PreAbandonGpuContext' in api.vars.extra_tokens:
    968     args.append('--preAbandonGpuContext')
    969   if 'ReleaseAndAbandonGpuContext' in api.vars.extra_tokens:
    970     args.append('--releaseAndAbandonGpuContext')
    971 
    972   api.run(api.flavor.step, 'dm', cmd=args, abort_on_failure=False)
    973 
    974   if upload_dm_results(b):
    975     # Copy images and JSON to host machine if needed.
    976     api.flavor.copy_directory_contents_to_host(
    977         api.flavor.device_dirs.dm_dir, api.flavor.host_dirs.dm_dir)
    978 
    979 
    980 def RunSteps(api):
    981   api.vars.setup()
    982   api.file.ensure_directory('makedirs tmp_dir', api.vars.tmp_dir)
    983   api.flavor.setup()
    984 
    985   env = {}
    986   if 'iOS' in api.vars.builder_name:
    987     env['IOS_BUNDLE_ID'] = 'com.google.dm'
    988     env['IOS_MOUNT_POINT'] = api.vars.slave_dir.join('mnt_iosdevice')
    989   with api.context(env=env):
    990     try:
    991       if 'Chromecast' in api.vars.builder_name:
    992         api.flavor.install(resources=True, skps=True)
    993       elif 'Lottie' in api.vars.builder_name:
    994         api.flavor.install(resources=True, lotties=True)
    995       else:
    996         api.flavor.install(skps=True, images=True, svgs=True, resources=True)
    997       test_steps(api)
    998     finally:
    999       api.flavor.cleanup_steps()
   1000     api.run.check_failure()
   1001 
   1002 
   1003 TEST_BUILDERS = [
   1004   'Test-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Release-All-Android',
   1005   'Test-Android-Clang-GalaxyS6-GPU-MaliT760-arm64-Debug-All-Android',
   1006   ('Test-Android-Clang-GalaxyS6-GPU-MaliT760-arm64-Debug-All'
   1007    '-Android_NoGPUThreads'),
   1008   ('Test-Android-Clang-GalaxyS7_G930FD-GPU-MaliT880-arm64-Release-All'
   1009    '-Android_Vulkan'),
   1010   'Test-Android-Clang-MotoG4-CPU-Snapdragon617-arm-Release-All-Android',
   1011   'Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-All-Android_CCPR',
   1012   'Test-Android-Clang-Nexus5-GPU-Adreno330-arm-Release-All-Android',
   1013   'Test-Android-Clang-Nexus7-CPU-Tegra3-arm-Release-All-Android',
   1014   'Test-Android-Clang-NexusPlayer-GPU-PowerVRG6430-x86-Release-All-Android',
   1015   'Test-Android-Clang-Pixel-GPU-Adreno530-arm64-Debug-All-Android_Vulkan',
   1016   'Test-Android-Clang-Pixel-GPU-Adreno530-arm-Debug-All-Android_ASAN',
   1017   ('Test-ChromeOS-Clang-AcerChromebookR13Convertible-GPU-PowerVRGX6250-'
   1018    'arm-Debug-All'),
   1019   'Test-Chromecast-Clang-Chorizo-CPU-Cortex_A7-arm-Release-All',
   1020   'Test-Chromecast-Clang-Chorizo-GPU-Cortex_A7-arm-Release-All',
   1021   'Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-All-ASAN',
   1022   'Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-All-BonusConfigs',
   1023   'Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-shard_00_10-Coverage',
   1024   'Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-All-MSAN',
   1025   ('Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Debug-All'
   1026    '-SK_USE_DISCARDABLE_SCALEDIMAGECACHE'),
   1027   'Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All-Lottie',
   1028   ('Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All'
   1029    '-SK_FORCE_RASTER_PIPELINE_BLITTER'),
   1030   'Test-Debian9-Clang-GCE-CPU-AVX2-x86_64-Release-All-TSAN',
   1031   'Test-Debian9-Clang-GCE-GPU-SwiftShader-x86_64-Release-All-SwiftShader',
   1032   'Test-Debian9-Clang-NUC5PPYH-GPU-IntelHD405-x86_64-Release-All-Vulkan',
   1033   'Test-Debian9-Clang-NUC7i5BNK-GPU-IntelIris640-x86_64-Debug-All-Vulkan',
   1034   'Test-Mac-Clang-MacBook10.1-GPU-IntelHD615-x86_64-Release-All-NativeFonts',
   1035   'Test-Mac-Clang-MacBookAir7.2-GPU-IntelHD6000-x86_64-Debug-All',
   1036   'Test-Mac-Clang-MacBookPro11.5-CPU-AVX2-x86_64-Release-All',
   1037   'Test-Mac-Clang-MacBookPro11.5-GPU-RadeonHD8870M-x86_64-Debug-All-Metal',
   1038   ('Test-Mac-Clang-MacBookPro11.5-GPU-RadeonHD8870M-x86_64-Release-All-'
   1039    'MoltenVK_Vulkan'),
   1040   'Test-Mac-Clang-MacMini7.1-GPU-IntelIris5100-x86_64-Debug-All-CommandBuffer',
   1041   'Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Vulkan_Coverage',
   1042   ('Test-Ubuntu17-GCC-Golo-GPU-QuadroP400-x86_64-Release-All'
   1043    '-Valgrind_AbandonGpuContext_SK_CPU_LIMIT_SSE41'),
   1044   ('Test-Ubuntu17-GCC-Golo-GPU-QuadroP400-x86_64-Release-All'
   1045    '-Valgrind_PreAbandonGpuContext_SK_CPU_LIMIT_SSE41'),
   1046   'Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-DDL1',
   1047   'Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-DDL3',
   1048   'Test-Ubuntu17-Clang-Golo-GPU-QuadroP400-x86_64-Debug-All-Lottie',
   1049   'Test-Win10-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-BonusConfigs',
   1050   ('Test-Win10-Clang-Golo-GPU-QuadroP400-x86_64-Release-All'
   1051    '-ReleaseAndAbandonGpuContext'),
   1052   'Test-Win10-Clang-NUC5i7RYH-CPU-AVX2-x86_64-Debug-All-NativeFonts_GDI',
   1053   'Test-Win10-Clang-NUC5i7RYH-GPU-IntelIris6100-x86_64-Release-All-ANGLE',
   1054   'Test-Win10-Clang-NUC8i5BEK-GPU-IntelIris655-x86_64-Debug-All-Vulkan',
   1055   'Test-Win10-Clang-NUCD34010WYKH-GPU-IntelHD4400-x86_64-Release-All-ANGLE',
   1056   'Test-Win10-Clang-ShuttleA-GPU-GTX660-x86_64-Release-All-Vulkan',
   1057   'Test-Win10-Clang-ShuttleC-GPU-GTX960-x86_64-Debug-All-ANGLE',
   1058   'Test-Win2016-Clang-GCE-CPU-AVX2-x86_64-Debug-All-FAAA',
   1059   'Test-Win2016-Clang-GCE-CPU-AVX2-x86_64-Debug-All-FDAA',
   1060   'Test-Win2016-Clang-GCE-CPU-AVX2-x86_64-Debug-All-FSAA',
   1061   'Test-iOS-Clang-iPadPro-GPU-PowerVRGT7800-arm64-Release-All',
   1062 ]
   1063 
   1064 
   1065 def GenTests(api):
   1066   for builder in TEST_BUILDERS:
   1067     test = (
   1068       api.test(builder) +
   1069       api.properties(buildername=builder,
   1070                      buildbucket_build_id='123454321',
   1071                      revision='abc123',
   1072                      path_config='kitchen',
   1073                      gold_hashes_url='https://example.com/hashes.txt',
   1074                      swarm_out_dir='[SWARM_OUT_DIR]') +
   1075       api.path.exists(
   1076           api.path['start_dir'].join('skia'),
   1077           api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1078                                      'skimage', 'VERSION'),
   1079           api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1080                                      'skp', 'VERSION'),
   1081           api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1082                                      'svg', 'VERSION'),
   1083           api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
   1084       ) +
   1085       api.step_data('get swarming bot id',
   1086           stdout=api.raw_io.output('skia-bot-123')) +
   1087       api.step_data('get swarming task id',
   1088           stdout=api.raw_io.output('123456'))
   1089     )
   1090     if 'Win' in builder:
   1091       test += api.platform('win', 64)
   1092 
   1093     if 'Chromecast' in builder:
   1094       test += api.step_data(
   1095           'read chromecast ip',
   1096           stdout=api.raw_io.output('192.168.1.2:5555'))
   1097 
   1098     if 'ChromeOS' in builder:
   1099       test += api.step_data(
   1100           'read chromeos ip',
   1101           stdout=api.raw_io.output('{"user_ip":"foo (at] 127.0.0.1"}'))
   1102 
   1103     yield test
   1104 
   1105   builder = 'Test-Win8-Clang-Golo-CPU-AVX-x86-Debug-All'
   1106   yield (
   1107     api.test('trybot') +
   1108     api.properties(buildername=builder,
   1109                    buildbucket_build_id='123454321',
   1110                    revision='abc123',
   1111                    path_config='kitchen',
   1112                    gold_hashes_url='https://example.com/hashes.txt',
   1113                    swarm_out_dir='[SWARM_OUT_DIR]') +
   1114     api.properties(patch_storage='gerrit') +
   1115     api.properties.tryserver(
   1116           buildername=builder,
   1117           gerrit_project='skia',
   1118           gerrit_url='https://skia-review.googlesource.com/',
   1119       )+
   1120     api.path.exists(
   1121         api.path['start_dir'].join('skia'),
   1122         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1123                                      'skimage', 'VERSION'),
   1124         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1125                                      'skp', 'VERSION'),
   1126         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1127                                      'svg', 'VERSION'),
   1128         api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
   1129     )
   1130   )
   1131 
   1132   builder = 'Test-Debian9-GCC-GCE-CPU-AVX2-x86_64-Debug-All'
   1133   yield (
   1134     api.test('failed_dm') +
   1135     api.properties(buildername=builder,
   1136                    buildbucket_build_id='123454321',
   1137                    revision='abc123',
   1138                    path_config='kitchen',
   1139                    gold_hashes_url='https://example.com/hashes.txt',
   1140                    swarm_out_dir='[SWARM_OUT_DIR]') +
   1141     api.path.exists(
   1142         api.path['start_dir'].join('skia'),
   1143         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1144                                      'skimage', 'VERSION'),
   1145         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1146                                      'skp', 'VERSION'),
   1147         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1148                                      'svg', 'VERSION'),
   1149         api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
   1150     ) +
   1151     api.step_data('symbolized dm', retcode=1)
   1152   )
   1153 
   1154   builder = 'Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Release-All-Android'
   1155   yield (
   1156     api.test('failed_get_hashes') +
   1157     api.properties(buildername=builder,
   1158                    buildbucket_build_id='123454321',
   1159                    revision='abc123',
   1160                    path_config='kitchen',
   1161                    gold_hashes_url='https://example.com/hashes.txt',
   1162                    swarm_out_dir='[SWARM_OUT_DIR]') +
   1163     api.path.exists(
   1164         api.path['start_dir'].join('skia'),
   1165         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1166                                      'skimage', 'VERSION'),
   1167         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1168                                      'skp', 'VERSION'),
   1169         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1170                                      'svg', 'VERSION'),
   1171         api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
   1172     ) +
   1173     api.step_data('get uninteresting hashes', retcode=1)
   1174   )
   1175 
   1176   builder = ('Test-Android-Clang-NexusPlayer-CPU-Moorefield-x86-'
   1177              'Debug-All-Android')
   1178   yield (
   1179     api.test('failed_push') +
   1180     api.properties(buildername=builder,
   1181                    buildbucket_build_id='123454321',
   1182                    revision='abc123',
   1183                    path_config='kitchen',
   1184                    gold_hashes_url='https://example.com/hashes.txt',
   1185                    swarm_out_dir='[SWARM_OUT_DIR]') +
   1186     api.path.exists(
   1187         api.path['start_dir'].join('skia'),
   1188         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1189                                      'skimage', 'VERSION'),
   1190         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1191                                      'skp', 'VERSION'),
   1192         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1193                                      'svg', 'VERSION'),
   1194         api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
   1195     ) +
   1196     api.step_data('get swarming bot id',
   1197                   stdout=api.raw_io.output('build123-m2--device5')) +
   1198     api.step_data('push [START_DIR]/skia/resources/* '+
   1199                   '/sdcard/revenge_of_the_skiabot/resources', retcode=1)
   1200   )
   1201 
   1202   builder = 'Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-All-Android'
   1203   retry_step_name = 'adb pull.pull /sdcard/revenge_of_the_skiabot/dm_out'
   1204   yield (
   1205     api.test('failed_pull') +
   1206     api.properties(buildername=builder,
   1207                    buildbucket_build_id='123454321',
   1208                    revision='abc123',
   1209                    path_config='kitchen',
   1210                    gold_hashes_url='https://example.com/hashes.txt',
   1211                    swarm_out_dir='[SWARM_OUT_DIR]') +
   1212     api.path.exists(
   1213         api.path['start_dir'].join('skia'),
   1214         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1215                                      'skimage', 'VERSION'),
   1216         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1217                                      'skp', 'VERSION'),
   1218         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1219                                      'svg', 'VERSION'),
   1220         api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
   1221     ) +
   1222     api.step_data('dm', retcode=1) +
   1223     api.step_data(retry_step_name, retcode=1) +
   1224     api.step_data(retry_step_name + ' (attempt 2)', retcode=1) +
   1225     api.step_data(retry_step_name + ' (attempt 3)', retcode=1)
   1226   )
   1227 
   1228   yield (
   1229     api.test('internal_bot_2') +
   1230     api.properties(buildername=builder,
   1231                    buildbucket_build_id='123454321',
   1232                    revision='abc123',
   1233                    path_config='kitchen',
   1234                    swarm_out_dir='[SWARM_OUT_DIR]',
   1235                    gold_hashes_url='https://example.com/hashes.txt',
   1236                    internal_hardware_label='2') +
   1237     api.path.exists(
   1238         api.path['start_dir'].join('skia'),
   1239         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1240                                      'skimage', 'VERSION'),
   1241         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1242                                      'skp', 'VERSION'),
   1243         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1244                                      'svg', 'VERSION'),
   1245         api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
   1246     )
   1247   )
   1248 
   1249   yield (
   1250     api.test('internal_bot_5') +
   1251     api.properties(buildername=builder,
   1252                    buildbucket_build_id='123454321',
   1253                    revision='abc123',
   1254                    path_config='kitchen',
   1255                    swarm_out_dir='[SWARM_OUT_DIR]',
   1256                    gold_hashes_url='https://example.com/hashes.txt',
   1257                    internal_hardware_label='5') +
   1258     api.path.exists(
   1259         api.path['start_dir'].join('skia'),
   1260         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1261                                      'skimage', 'VERSION'),
   1262         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1263                                      'skp', 'VERSION'),
   1264         api.path['start_dir'].join('skia', 'infra', 'bots', 'assets',
   1265                                      'svg', 'VERSION'),
   1266         api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt')
   1267     )
   1268   )
   1269