summaryrefslogtreecommitdiff
path: root/gn/build/full_test.py
blob: 2095dddf6da3add158a43c8db853efb66e55b82c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/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())