| OLD | NEW | 
|---|
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be | 
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. | 
| 4 | 4 | 
| 5 """Recipe to test the deterministic build. | 5 """Recipe to test the deterministic build. | 
| 6 |  | 
| 7 Waterfall page: https://build.chromium.org/p/chromium.swarm/waterfall |  | 
| 8 """ | 6 """ | 
| 9 | 7 | 
| 10 from infra.libs.infra_types import freeze |  | 
| 11 |  | 
| 12 DEPS = [ | 8 DEPS = [ | 
| 13   'bot_update', | 9   'bot_update', | 
| 14   'chromium', | 10   'chromium', | 
| 15   'chromium_android', | 11   'chromium_android', | 
| 16   'gclient', | 12   'gclient', | 
| 17   'isolate', | 13   'isolate', | 
| 18   'json', | 14   'json', | 
| 19   'path', | 15   'path', | 
| 20   'platform', | 16   'platform', | 
| 21   'properties', | 17   'properties', | 
| 22   'python', | 18   'python', | 
| 23   'step', | 19   'step', | 
| 24 ] | 20 ] | 
| 25 | 21 | 
| 26 DETERMINISTIC_BUILDERS = freeze({ | 22 DETERMINISTIC_BUILDERS = { | 
| 27   'Android deterministic build': { | 23   'Android deterministic build': { | 
| 28     'chromium_config': 'android', | 24     'chromium_config': 'android', | 
| 29     'chromium_config_kwargs': { | 25     'chromium_config_kwargs': { | 
| 30       'BUILD_CONFIG': 'Release', | 26       'BUILD_CONFIG': 'Release', | 
| 31       'TARGET_BITS': 32, | 27       'TARGET_BITS': 32, | 
| 32       'TARGET_PLATFORM': 'android', | 28       'TARGET_PLATFORM': 'android', | 
| 33     }, | 29     }, | 
| 34     'platform': 'linux', | 30     'platform': 'linux', | 
| 35     'targets': ['all'], | 31     'targets': ['all'], | 
| 36   }, | 32   }, | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 47   'Windows deterministic build': { | 43   'Windows deterministic build': { | 
| 48     'chromium_config': 'chromium', | 44     'chromium_config': 'chromium', | 
| 49     'gclient_config': 'chromium', | 45     'gclient_config': 'chromium', | 
| 50     'platform': 'win', | 46     'platform': 'win', | 
| 51   }, | 47   }, | 
| 52   'Windows Clang deterministic build': { | 48   'Windows Clang deterministic build': { | 
| 53     'chromium_config': 'chromium_win_clang', | 49     'chromium_config': 'chromium_win_clang', | 
| 54     'gclient_config': 'chromium', | 50     'gclient_config': 'chromium', | 
| 55     'platform': 'win', | 51     'platform': 'win', | 
| 56   }, | 52   }, | 
| 57 }) | 53 } | 
|  | 54 DETERMINISTIC_BUILDERS['android_deterministic'] = ( | 
|  | 55     DETERMINISTIC_BUILDERS['Android deterministic build']) | 
|  | 56 DETERMINISTIC_BUILDERS['linux_deterministic'] = ( | 
|  | 57     DETERMINISTIC_BUILDERS['Linux deterministic build']) | 
|  | 58 DETERMINISTIC_BUILDERS['mac_deterministic'] = ( | 
|  | 59     DETERMINISTIC_BUILDERS['Mac deterministic build']) | 
|  | 60 DETERMINISTIC_BUILDERS['windows_deterministic'] = ( | 
|  | 61     DETERMINISTIC_BUILDERS['Windows deterministic build']) | 
| 58 | 62 | 
| 59 | 63 | 
| 60 def MoveBuildDirectory(api, src_dir, dst_dir): | 64 def MoveBuildDirectory(api, src_dir, dst_dir): | 
| 61   api.python.inline('Move %s to %s' % (src_dir, dst_dir), | 65   api.python.inline('Move %s to %s' % (src_dir, dst_dir), | 
| 62                     """ | 66                     """ | 
| 63                     import os | 67                     import os | 
| 64                     import shutil | 68                     import shutil | 
| 65                     import sys | 69                     import sys | 
| 66                     if os.path.exists(sys.argv[2]): | 70                     if os.path.exists(sys.argv[2]): | 
| 67                       shutil.rmtree(sys.argv[2]) | 71                       shutil.rmtree(sys.argv[2]) | 
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 133   api.chromium.compile(targets, force_clobber=True, name='Second build') | 137   api.chromium.compile(targets, force_clobber=True, name='Second build') | 
| 134   api.isolate.remove_build_metadata() | 138   api.isolate.remove_build_metadata() | 
| 135   if enable_isolate: | 139   if enable_isolate: | 
| 136     # This should be quick if the build is indeed deterministic. | 140     # This should be quick if the build is indeed deterministic. | 
| 137     api.isolate.isolate_tests(api.chromium.output_dir) | 141     api.isolate.isolate_tests(api.chromium.output_dir) | 
| 138   MoveBuildDirectory(api, str(api.chromium.output_dir), | 142   MoveBuildDirectory(api, str(api.chromium.output_dir), | 
| 139                      str(api.chromium.output_dir).rstrip('\\/') + '.2') | 143                      str(api.chromium.output_dir).rstrip('\\/') + '.2') | 
| 140 | 144 | 
| 141   # Compare the artifacts from the 2 builds, raise an exception if they're | 145   # Compare the artifacts from the 2 builds, raise an exception if they're | 
| 142   # not equals. | 146   # not equals. | 
| 143   # TODO(sebmarchand): Do a smarter comparison. |  | 
| 144   api.isolate.compare_build_artifacts( | 147   api.isolate.compare_build_artifacts( | 
| 145       str(api.chromium.output_dir).rstrip('\\/') + '.1', | 148       str(api.chromium.output_dir).rstrip('\\/') + '.1', | 
| 146       str(api.chromium.output_dir).rstrip('\\/') + '.2') | 149       str(api.chromium.output_dir).rstrip('\\/') + '.2') | 
| 147 | 150 | 
| 148 | 151 | 
| 149 def _sanitize_nonalpha(text): | 152 def _sanitize_nonalpha(text): | 
| 150   return ''.join(c if c.isalnum() else '_' for c in text) | 153   return ''.join(c if c.isalnum() else '_' for c in text) | 
| 151 | 154 | 
| 152 | 155 | 
| 153 def GenTests(api): | 156 def GenTests(api): | 
| 154   mastername = 'chromium.swarm' | 157   mastername = 'chromium.swarm' | 
| 155   for buildername in DETERMINISTIC_BUILDERS: | 158   for buildername in DETERMINISTIC_BUILDERS: | 
| 156     test_name = 'full_%s_%s' % (_sanitize_nonalpha(mastername), | 159     test_name = 'full_%s_%s' % (_sanitize_nonalpha(mastername), | 
| 157                                 _sanitize_nonalpha(buildername)) | 160                                 _sanitize_nonalpha(buildername)) | 
| 158     yield ( | 161     yield ( | 
| 159       api.test(test_name) + | 162       api.test(test_name) + | 
| 160       api.properties.scheduled() + | 163       api.properties.scheduled() + | 
| 161       api.properties.generic(buildername=buildername, | 164       api.properties.generic(buildername=buildername, | 
| 162                              mastername=mastername) + | 165                              mastername=mastername) + | 
| 163       api.platform(DETERMINISTIC_BUILDERS[buildername]['platform'], 32) + | 166       api.platform(DETERMINISTIC_BUILDERS[buildername]['platform'], 32) + | 
| 164       api.properties(configuration='Release') + | 167       api.properties(configuration='Release') + | 
| 165       api.step_data('remove_build_metadata', retcode=1) | 168       api.step_data('remove_build_metadata', retcode=1) | 
| 166     ) | 169     ) | 
| OLD | NEW | 
|---|