|  | #!/usr/bin/env python | 
|  | # Copyright 2018 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | import os | 
|  | import shutil | 
|  | import subprocess | 
|  | import sys | 
|  | import timeit | 
|  |  | 
|  |  | 
|  | IS_WIN = sys.platform.startswith('win') | 
|  |  | 
|  |  | 
|  | def RemoveDir(d): | 
|  | if os.path.isdir(d): | 
|  | shutil.rmtree(d) | 
|  |  | 
|  |  | 
|  | def Trial(gn_path_to_use, save_out_dir=None): | 
|  | bin_path = os.path.join('out', 'gntrial') | 
|  | if not os.path.isdir(bin_path): | 
|  | os.makedirs(bin_path) | 
|  | gn_to_run = os.path.join(bin_path, 'gn' + ('.exe' if IS_WIN else '')) | 
|  | shutil.copy2(gn_path_to_use, gn_to_run) | 
|  | comp_dir = os.path.join('out', 'COMP') | 
|  | subprocess.check_call([gn_to_run, 'gen', comp_dir, '-q', '--check']) | 
|  | if save_out_dir: | 
|  | RemoveDir(save_out_dir) | 
|  | shutil.move(comp_dir, save_out_dir) | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | if len(sys.argv) < 3 or len(sys.argv) > 4: | 
|  | print 'Usage: full_test.py /chrome/tree/at/762a25542878 rel_gn_path [clean]' | 
|  | return 1 | 
|  |  | 
|  | if len(sys.argv) == 4: | 
|  | RemoveDir('out') | 
|  |  | 
|  | subprocess.check_call([sys.executable, os.path.join('build', 'gen.py')]) | 
|  | subprocess.check_call(['ninja', '-C', 'out']) | 
|  | subprocess.check_call([os.path.join('out', 'gn_unittests')]) | 
|  | orig_dir = os.getcwd() | 
|  |  | 
|  | in_chrome_tree_gn = sys.argv[2] | 
|  | our_gn = os.path.join(orig_dir, 'out', 'gn' + ('.exe' if IS_WIN else '')) | 
|  |  | 
|  | os.chdir(sys.argv[1]) | 
|  |  | 
|  | # Check in-tree vs. ours. Uses: | 
|  | # - Chromium tree at 762a25542878 in argv[1] (this can be off by a bit, but | 
|  | #   is roughly when GN was moved out of the Chrome tree, so matches in case GN | 
|  | #   semantics/ordering change after that.) | 
|  | # - relative path to argv[1] built gn binary in argv[2] | 
|  |  | 
|  | # First, do a comparison to make sure the output between the two gn binaries | 
|  | # actually matches. | 
|  | print 'Confirming output matches...' | 
|  | dir_a = os.path.join('out', 'a') | 
|  | dir_b = os.path.join('out', 'b') | 
|  | Trial(in_chrome_tree_gn, dir_a) | 
|  | Trial(our_gn, dir_b) | 
|  | subprocess.check_call(['diff', '-r', dir_a, dir_b]) | 
|  |  | 
|  | # Then, some time trials. | 
|  | TRIALS = 5 | 
|  | print 'Comparing performance... (takes a while)' | 
|  | time_a = timeit.timeit('Trial("%s")' % in_chrome_tree_gn, number=TRIALS, | 
|  | setup='from __main__ import Trial') | 
|  | time_b = timeit.timeit('Trial("%s")' % our_gn, number=TRIALS, | 
|  | setup='from __main__ import Trial') | 
|  | print 'In-tree gn avg: %.3fs' % (time_a / TRIALS) | 
|  | print 'Our gn avg: %.3fs' % (time_b / TRIALS) | 
|  |  | 
|  | return 0 | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) |