16d528ed9Sopenharmony_ci#!/usr/bin/env python3 26d528ed9Sopenharmony_ci# Copyright 2018 The Chromium Authors. All rights reserved. 36d528ed9Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be 46d528ed9Sopenharmony_ci# found in the LICENSE file. 56d528ed9Sopenharmony_ci 66d528ed9Sopenharmony_ciimport os 76d528ed9Sopenharmony_ciimport shutil 86d528ed9Sopenharmony_ciimport subprocess 96d528ed9Sopenharmony_ciimport sys 106d528ed9Sopenharmony_ciimport timeit 116d528ed9Sopenharmony_ci 126d528ed9Sopenharmony_ci 136d528ed9Sopenharmony_ciIS_WIN = sys.platform.startswith('win') 146d528ed9Sopenharmony_ci 156d528ed9Sopenharmony_ci 166d528ed9Sopenharmony_cidef RemoveDir(d): 176d528ed9Sopenharmony_ci if os.path.isdir(d): 186d528ed9Sopenharmony_ci shutil.rmtree(d) 196d528ed9Sopenharmony_ci 206d528ed9Sopenharmony_ci 216d528ed9Sopenharmony_cidef Trial(gn_path_to_use, save_out_dir=None): 226d528ed9Sopenharmony_ci bin_path = os.path.join('out', 'gntrial') 236d528ed9Sopenharmony_ci if not os.path.isdir(bin_path): 246d528ed9Sopenharmony_ci os.makedirs(bin_path) 256d528ed9Sopenharmony_ci gn_to_run = os.path.join(bin_path, 'gn' + ('.exe' if IS_WIN else '')) 266d528ed9Sopenharmony_ci shutil.copy2(gn_path_to_use, gn_to_run) 276d528ed9Sopenharmony_ci comp_dir = os.path.join('out', 'COMP') 286d528ed9Sopenharmony_ci subprocess.check_call([gn_to_run, 'gen', comp_dir, '-q', '--check']) 296d528ed9Sopenharmony_ci if save_out_dir: 306d528ed9Sopenharmony_ci RemoveDir(save_out_dir) 316d528ed9Sopenharmony_ci shutil.move(comp_dir, save_out_dir) 326d528ed9Sopenharmony_ci 336d528ed9Sopenharmony_ci 346d528ed9Sopenharmony_cidef main(): 356d528ed9Sopenharmony_ci if len(sys.argv) < 3 or len(sys.argv) > 4: 366d528ed9Sopenharmony_ci print('Usage: full_test.py /chrome/tree/at/762a25542878 rel_gn_path [clean]') 376d528ed9Sopenharmony_ci return 1 386d528ed9Sopenharmony_ci 396d528ed9Sopenharmony_ci if len(sys.argv) == 4: 406d528ed9Sopenharmony_ci RemoveDir('out') 416d528ed9Sopenharmony_ci 426d528ed9Sopenharmony_ci subprocess.check_call([sys.executable, os.path.join('build', 'gen.py')]) 436d528ed9Sopenharmony_ci subprocess.check_call(['ninja', '-C', 'out']) 446d528ed9Sopenharmony_ci subprocess.check_call([os.path.join('out', 'gn_unittests')]) 456d528ed9Sopenharmony_ci orig_dir = os.getcwd() 466d528ed9Sopenharmony_ci 476d528ed9Sopenharmony_ci in_chrome_tree_gn = sys.argv[2] 486d528ed9Sopenharmony_ci our_gn = os.path.join(orig_dir, 'out', 'gn' + ('.exe' if IS_WIN else '')) 496d528ed9Sopenharmony_ci 506d528ed9Sopenharmony_ci os.chdir(sys.argv[1]) 516d528ed9Sopenharmony_ci 526d528ed9Sopenharmony_ci # Check in-tree vs. ours. Uses: 536d528ed9Sopenharmony_ci # - Chromium tree at 762a25542878 in argv[1] (this can be off by a bit, but 546d528ed9Sopenharmony_ci # is roughly when GN was moved out of the Chrome tree, so matches in case GN 556d528ed9Sopenharmony_ci # semantics/ordering change after that.) 566d528ed9Sopenharmony_ci # - relative path to argv[1] built gn binary in argv[2] 576d528ed9Sopenharmony_ci 586d528ed9Sopenharmony_ci # First, do a comparison to make sure the output between the two gn binaries 596d528ed9Sopenharmony_ci # actually matches. 606d528ed9Sopenharmony_ci print('Confirming output matches...') 616d528ed9Sopenharmony_ci dir_a = os.path.join('out', 'a') 626d528ed9Sopenharmony_ci dir_b = os.path.join('out', 'b') 636d528ed9Sopenharmony_ci Trial(in_chrome_tree_gn, dir_a) 646d528ed9Sopenharmony_ci Trial(our_gn, dir_b) 656d528ed9Sopenharmony_ci subprocess.check_call(['diff', '-r', dir_a, dir_b]) 666d528ed9Sopenharmony_ci 676d528ed9Sopenharmony_ci # Then, some time trials. 686d528ed9Sopenharmony_ci TRIALS = 5 696d528ed9Sopenharmony_ci print('Comparing performance... (takes a while)') 706d528ed9Sopenharmony_ci time_a = timeit.timeit('Trial("%s")' % in_chrome_tree_gn, number=TRIALS, 716d528ed9Sopenharmony_ci setup='from __main__ import Trial') 726d528ed9Sopenharmony_ci time_b = timeit.timeit('Trial("%s")' % our_gn, number=TRIALS, 736d528ed9Sopenharmony_ci setup='from __main__ import Trial') 746d528ed9Sopenharmony_ci print('In-tree gn avg: %.3fs' % (time_a / TRIALS)) 756d528ed9Sopenharmony_ci print('Our gn avg: %.3fs' % (time_b / TRIALS)) 766d528ed9Sopenharmony_ci 776d528ed9Sopenharmony_ci return 0 786d528ed9Sopenharmony_ci 796d528ed9Sopenharmony_ci 806d528ed9Sopenharmony_ciif __name__ == '__main__': 816d528ed9Sopenharmony_ci sys.exit(main()) 82