Home | History | Annotate | Download | only in recipes
      1 # Copyright 2018 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 # Recipe which runs the PathKit tests using docker
      6 
      7 DEPS = [
      8   'checkout',
      9   'env',
     10   'infra',
     11   'recipe_engine/file',
     12   'recipe_engine/path',
     13   'recipe_engine/properties',
     14   'recipe_engine/python',
     15   'recipe_engine/step',
     16   'run',
     17   'vars',
     18 ]
     19 
     20 
     21 DOCKER_IMAGE = 'gcr.io/skia-public/gold-karma-chrome-tests:68.0.3440.106_v6'
     22 INNER_KARMA_SCRIPT = '/SRC/skia/infra/pathkit/test_pathkit.sh'
     23 
     24 
     25 def RunSteps(api):
     26   api.vars.setup()
     27   checkout_root = api.checkout.default_checkout_root
     28   out_dir = api.vars.swarming_out_dir
     29   api.checkout.bot_update(checkout_root=checkout_root)
     30 
     31   # Make sure this exists, otherwise Docker will make it with root permissions.
     32   api.file.ensure_directory('mkdirs out_dir', out_dir, mode=0777)
     33 
     34   # The karma script is configured to look in ./npm-(asmjs|wasm)/bin/test/ for
     35   # the test files to load, so we must copy them there (see Set up for docker).
     36   copy_dest = checkout_root.join('skia', 'modules', 'pathkit',
     37                                  'npm-wasm', 'bin', 'test')
     38   if 'asmjs' in api.vars.builder_name:
     39     copy_dest = checkout_root.join('skia', 'modules', 'pathkit',
     40                                    'npm-asmjs', 'bin', 'test')
     41 
     42   base_dir = api.vars.build_dir
     43   bundle_name = 'pathkit.wasm'
     44   if 'asmjs' in api.vars.builder_name:
     45     # release mode has a .js.mem file that needs to come with.
     46     # debug mode has an optional .map file, but we can omit that for tests
     47     if 'Debug' in api.vars.builder_name:
     48       bundle_name = ''
     49     else:
     50       bundle_name = 'pathkit.js.mem'
     51 
     52   api.python.inline(
     53       name='Set up for docker',
     54       program='''import errno
     55 import os
     56 import shutil
     57 import sys
     58 
     59 copy_dest = sys.argv[1]
     60 base_dir = sys.argv[2]
     61 bundle_name = sys.argv[3]
     62 out_dir = sys.argv[4]
     63 
     64 # Clean out old binaries (if any)
     65 try:
     66   shutil.rmtree(copy_dest)
     67 except OSError as e:
     68   if e.errno != errno.ENOENT:
     69     raise
     70 
     71 # Make folder
     72 try:
     73   os.makedirs(copy_dest)
     74 except OSError as e:
     75   if e.errno != errno.EEXIST:
     76     raise
     77 
     78 # Copy binaries (pathkit.js and pathkit.wasm) to where the karma tests
     79 # expect them ($SKIA_ROOT/modules/pathkit/npm-wasm/bin/test/)
     80 dest = os.path.join(copy_dest, 'pathkit.js')
     81 shutil.copyfile(os.path.join(base_dir, 'pathkit.js'), dest)
     82 os.chmod(dest, 0o644) # important, otherwise non-privileged docker can't read.
     83 
     84 if bundle_name:
     85   dest = os.path.join(copy_dest, bundle_name)
     86   shutil.copyfile(os.path.join(base_dir, bundle_name), dest)
     87   os.chmod(dest, 0o644) # important, otherwise non-privileged docker can't read.
     88 
     89 # Prepare output folder, api.file.ensure_directory doesn't touch
     90 # the permissions of the out directory if it already exists.
     91 os.chmod(out_dir, 0o777) # important, otherwise non-privileged docker can't write.
     92 ''',
     93       args=[copy_dest, base_dir, bundle_name, out_dir],
     94       infra_step=True)
     95 
     96 
     97   cmd = ['docker', 'run', '--shm-size=2gb', '--rm',
     98          '--volume', '%s:/SRC' % checkout_root,
     99          '--volume', '%s:/OUT' % out_dir]
    100 
    101   if 'asmjs' in api.vars.builder_name:
    102     cmd.extend(['--env', 'ASM_JS=1'])
    103 
    104   cmd.extend([
    105       DOCKER_IMAGE,             INNER_KARMA_SCRIPT,
    106       '--builder',              api.vars.builder_name,
    107       '--git_hash',             api.properties['revision'],
    108       '--buildbucket_build_id', api.properties.get('buildbucket_build_id',
    109                                                   ''),
    110       '--bot_id',               api.vars.swarming_bot_id,
    111       '--task_id',              api.vars.swarming_task_id,
    112       '--browser',              'Chrome',
    113       '--config',               api.vars.configuration,
    114       '--source_type',          'pathkit',
    115       ])
    116 
    117   if 'asmjs' in api.vars.builder_name:
    118     cmd.extend(['--compiled_language', 'asmjs']) # the default is wasm
    119 
    120   if api.vars.is_trybot:
    121     cmd.extend([
    122       '--issue',         api.vars.issue,
    123       '--patchset',      api.vars.patchset,
    124     ])
    125 
    126   # Override DOCKER_CONFIG set by Kitchen.
    127   env = {'DOCKER_CONFIG': '/home/chrome-bot/.docker'}
    128   with api.env(env):
    129     api.run(
    130         api.step,
    131         'Test PathKit with Docker',
    132         cmd=cmd)
    133 
    134 
    135 def GenTests(api):
    136   yield (
    137       api.test('Test-Debian9-EMCC-GCE-CPU-AVX2-wasm-Debug-All-PathKit') +
    138       api.properties(buildername=('Test-Debian9-EMCC-GCE-CPU-AVX2'
    139                                   '-wasm-Debug-All-PathKit'),
    140                      repository='https://skia.googlesource.com/skia.git',
    141                      revision='abc123',
    142                      path_config='kitchen',
    143                      swarm_out_dir='[SWARM_OUT_DIR]')
    144   )
    145 
    146   yield (
    147       api.test('Test-Debian9-EMCC-GCE-CPU-AVX2-asmjs-Debug-All-PathKit') +
    148       api.properties(buildername=('Test-Debian9-EMCC-GCE-CPU-AVX2'
    149                                   '-asmjs-Debug-All-PathKit'),
    150                      repository='https://skia.googlesource.com/skia.git',
    151                      revision='abc123',
    152                      path_config='kitchen',
    153                      swarm_out_dir='[SWARM_OUT_DIR]')
    154   )
    155 
    156   yield (
    157       api.test('Test-Debian9-EMCC-GCE-CPU-AVX2-asmjs-Release-All-PathKit') +
    158       api.properties(buildername=('Test-Debian9-EMCC-GCE-CPU-AVX2'
    159                                   '-asmjs-Release-All-PathKit'),
    160                      repository='https://skia.googlesource.com/skia.git',
    161                      revision='abc123',
    162                      path_config='kitchen',
    163                      swarm_out_dir='[SWARM_OUT_DIR]')
    164   )
    165 
    166   yield (
    167       api.test('pathkit_trybot') +
    168       api.properties(buildername=('Test-Debian9-EMCC-GCE-CPU-AVX2'
    169                                   '-wasm-Debug-All-PathKit'),
    170                      repository='https://skia.googlesource.com/skia.git',
    171                      revision='abc123',
    172                      path_config='kitchen',
    173                      swarm_out_dir='[SWARM_OUT_DIR]',
    174                      patch_ref='89/456789/12',
    175                      patch_repo='https://skia.googlesource.com/skia.git',
    176                      patch_storage='gerrit',
    177                      patch_set=7,
    178                      patch_issue=1234,
    179                      gerrit_project='skia',
    180                      gerrit_url='https://skia-review.googlesource.com/')
    181   )
    182