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