| Index: scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py
 | 
| diff --git a/scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py b/scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py
 | 
| index cf25356ece54b6bacc25e0fed592cffe1c877fdb..bc359b2deadd2b8e605d887edff85bdb214d47ca 100755
 | 
| --- a/scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py
 | 
| +++ b/scripts/slave/recipe_modules/isolate/resources/compare_build_artifacts.py
 | 
| @@ -17,6 +17,58 @@ import time
 | 
|  BASE_DIR = os.path.dirname(os.path.abspath(__file__))
 | 
|  
 | 
|  
 | 
| +# List of files that are known to be non deterministic. This is a temporary
 | 
| +# workaround to find regression on the deterministic builders.
 | 
| +# TODO(sebmarchand): Remove this once all the files are deterministic.
 | 
| +WHITELIST = {
 | 
| +  'win': {
 | 
| +    'base_unittests.exe',
 | 
| +    'base_unittests.isolated',
 | 
| +    'browser_tests.exe',
 | 
| +    'browser_tests.isolated',
 | 
| +    'chrome.dll',
 | 
| +    'chrome.exe',
 | 
| +    'chrome_child.dll',
 | 
| +    'chrome_watcher.dll',
 | 
| +    'clearkeycdm.dll',
 | 
| +    'content_browsertests.exe',
 | 
| +    'content_browsertests.isolated',
 | 
| +    'content_unittests.exe',
 | 
| +    'content_unittests.isolated',
 | 
| +    'd8.exe',
 | 
| +    'delegate_execute.exe',
 | 
| +    'delegate_execute_unittests.exe',
 | 
| +    'interactive_ui_tests.exe',
 | 
| +    'interactive_ui_tests.isolated',
 | 
| +    'metro_driver.dll',
 | 
| +    'mock_nacl_gdb.exe',
 | 
| +    'net_unittests.exe',
 | 
| +    'net_unittests.isolated',
 | 
| +    'npapi_test_plugin.dll',
 | 
| +    'pdf.dll',
 | 
| +    'peerconnection_server.exe',
 | 
| +    'ppapi_nacl_tests_pnacl_newlib_x32.nexe',
 | 
| +    'ppapi_nacl_tests_pnacl_newlib_x64.nexe',
 | 
| +    'sync_integration_tests.exe',
 | 
| +    'sync_integration_tests.isolated',
 | 
| +    'test_registrar.exe',
 | 
| +    'unit_tests.exe',
 | 
| +    'unit_tests.isolated',
 | 
| +  },
 | 
| +  'linux': {
 | 
| +    'browser_tests.isolated',
 | 
| +    'nacl_helper_nonsfi',
 | 
| +    'nacl_irt_x86_64.nexe',
 | 
| +    'ppapi_nacl_tests_glibc_x64.nexe',
 | 
| +    'ppapi_nacl_tests_newlib_x64.nexe',
 | 
| +    'ppapi_nacl_tests_pnacl_newlib_x64.nexe',
 | 
| +    'unit_tests.isolated',
 | 
| +  },
 | 
| +  'mac': { },
 | 
| +  'android': { },
 | 
| +  'ios': { },
 | 
| +}
 | 
| +
 | 
|  def get_files_to_compare(build_dir, recursive=False):
 | 
|    """Get the list of files to compare."""
 | 
|    allowed = frozenset(
 | 
| @@ -124,7 +176,8 @@ def compare_files(first_filepath, second_filepath):
 | 
|    return diff_binary(first_filepath, second_filepath, file_len)
 | 
|  
 | 
|  
 | 
| -def compare_build_artifacts(first_dir, second_dir, recursive=False):
 | 
| +def compare_build_artifacts(first_dir, second_dir, target_platform,
 | 
| +                            recursive=False):
 | 
|    """Compare the artifacts from two distinct builds."""
 | 
|    if not os.path.isdir(first_dir):
 | 
|      print >> sys.stderr, '%s isn\'t a valid directory.' % first_dir
 | 
| @@ -136,7 +189,10 @@ def compare_build_artifacts(first_dir, second_dir, recursive=False):
 | 
|    with open(os.path.join(BASE_DIR, 'deterministic_build_blacklist.json')) as f:
 | 
|      blacklist = frozenset(json.load(f))
 | 
|  
 | 
| -  res = 0
 | 
| +  whitelist = WHITELIST[target_platform]
 | 
| +
 | 
| +  unexpected_failures = 0
 | 
| +  expected_failures = 0
 | 
|    first_list = get_files_to_compare(first_dir, recursive) - blacklist
 | 
|    second_list = get_files_to_compare(second_dir, recursive) - blacklist
 | 
|  
 | 
| @@ -144,7 +200,7 @@ def compare_build_artifacts(first_dir, second_dir, recursive=False):
 | 
|    if diff:
 | 
|      print >> sys.stderr, 'Different list of files in both directories'
 | 
|      print >> sys.stderr, '\n'.join('  ' + i for i in sorted(diff))
 | 
| -    res += len(diff)
 | 
| +    unexpected_failures += len(diff)
 | 
|  
 | 
|    epoch_hex = struct.pack('<I', int(time.time())).encode('hex')
 | 
|    print('Epoch: %s' %
 | 
| @@ -157,14 +213,20 @@ def compare_build_artifacts(first_dir, second_dir, recursive=False):
 | 
|      if not result:
 | 
|        result = 'equal'
 | 
|      else:
 | 
| -      result = 'DIFFERENT: %s' % result
 | 
| -      res += 1
 | 
| +      expected = 'unexpected'
 | 
| +      if f in whitelist:
 | 
| +        expected_failures += 1
 | 
| +        expected = 'expected'
 | 
| +      else:
 | 
| +        unexpected_failures += 1
 | 
| +      result = 'DIFFERENT (%s): %s' % (expected, result)
 | 
|      print('%-*s: %s' % (max_filepath_len, f, result))
 | 
|  
 | 
|    print '%d files are equal, %d are different.'  % (
 | 
| -      len(first_list & second_list) - res, res)
 | 
| +      len(first_list & second_list) - expected_failures - unexpected_failures,
 | 
| +      expected_failures + unexpected_failures)
 | 
|  
 | 
| -  return 0 if res == 0 else 1
 | 
| +  return 0 if unexpected_failures == 0 else 1
 | 
|  
 | 
|  
 | 
|  def main():
 | 
| @@ -175,15 +237,19 @@ def main():
 | 
|        '-s', '--second-build-dir', help='The second build directory.')
 | 
|    parser.add_option('-r', '--recursive', action='store_true', default=False,
 | 
|                      help='Indicates if the comparison should be recursive.')
 | 
| +  parser.add_option('-t', '--target-platform', help='The target platform.')
 | 
|    options, _ = parser.parse_args()
 | 
|  
 | 
|    if not options.first_build_dir:
 | 
|      parser.error('--first-build-dir is required')
 | 
|    if not options.second_build_dir:
 | 
|      parser.error('--second-build-dir is required')
 | 
| +  if not options.target_platform:
 | 
| +    parser.error('--target-platform is required')
 | 
|  
 | 
|    return compare_build_artifacts(os.path.abspath(options.first_build_dir),
 | 
|                                   os.path.abspath(options.second_build_dir),
 | 
| +                                 options.target_platform,
 | 
|                                   options.recursive)
 | 
|  
 | 
|  
 | 
| 
 |