OLD | NEW |
| (Empty) |
1 # Copyright 2015 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 # This script compares the gtest test list for two different builds. | |
6 # | |
7 # Usage: | |
8 # compare_test_lists.py <build_dir_1> <build_dir_2> <binary_name> | |
9 # | |
10 # For example, from the "src" directory: | |
11 # python tools/gn/bin/compare_test_lists.py out/Debug out/gnbuild ipc_tests | |
12 # | |
13 # This will compile the given binary in both output directories, then extracts | |
14 # the test lists and prints missing or extra tests between the first and the | |
15 # second build. | |
16 | |
17 import os | |
18 import subprocess | |
19 import sys | |
20 | |
21 def BuildBinary(build_dir, binary_name): | |
22 """Builds the given binary in the given directory with Ninja. | |
23 | |
24 Returns True on success.""" | |
25 return subprocess.call(["ninja", "-C", build_dir, binary_name]) == 0 | |
26 | |
27 | |
28 def GetTestList(path_to_binary): | |
29 """Returns a set of full test names. | |
30 | |
31 Each test will be of the form "Case.Test". There will be a separate line | |
32 for each combination of Case/Test (there are often multiple tests in each | |
33 case). | |
34 | |
35 Throws an exception on failure.""" | |
36 raw_output = subprocess.check_output([path_to_binary, "--gtest_list_tests"]) | |
37 input_lines = raw_output.split('\n') | |
38 | |
39 # The format of the gtest_list_tests output is: | |
40 # "Case1." | |
41 # " Test1 # <Optional extra stuff>" | |
42 # " Test2" | |
43 # "Case2." | |
44 # " Test1" | |
45 case_name = '' # Includes trailing dot. | |
46 test_set = set() | |
47 for line in input_lines: | |
48 if len(line) > 1: | |
49 if line[0] == ' ': | |
50 # Indented means a test in previous case. | |
51 test_set.add(case_name + line[:line.find('#')].strip()) | |
52 else: | |
53 # New test case. | |
54 case_name = line.strip() | |
55 | |
56 return test_set | |
57 | |
58 | |
59 def PrintSetDiff(a_name, a, b_name, b, binary_name): | |
60 """Prints the test list difference between the given sets a and b. | |
61 | |
62 a_name and b_name will be used to refer to the directories of the two sets, | |
63 and the binary name will be shown as the source of the output.""" | |
64 | |
65 a_not_b = list(a - b) | |
66 if len(a_not_b): | |
67 print "\n", binary_name, "tests in", a_name, "but not", b_name | |
68 a_not_b.sort() | |
69 for cur in a_not_b: | |
70 print " ", cur | |
71 | |
72 b_not_a = list(b - a) | |
73 if len(b_not_a): | |
74 print "\n", binary_name, "tests in", b_name, "but not", a_name | |
75 b_not_a.sort() | |
76 for cur in b_not_a: | |
77 print " ", cur | |
78 | |
79 if len(a_not_b) == 0 and len(b_not_a) == 0: | |
80 print "\nTests match!" | |
81 | |
82 | |
83 def Run(a_dir, b_dir, binary_name): | |
84 if not BuildBinary(a_dir, binary_name): | |
85 print "Building", binary_name, "in", a_dir, "failed" | |
86 return 1 | |
87 if not BuildBinary(b_dir, binary_name): | |
88 print "Building", binary_name, "in", b_dir, "failed" | |
89 return 1 | |
90 | |
91 a_tests = GetTestList(os.path.join(a_dir, binary_name)) | |
92 b_tests = GetTestList(os.path.join(b_dir, binary_name)) | |
93 | |
94 PrintSetDiff(a_dir, a_tests, b_dir, b_tests, binary_name) | |
95 | |
96 | |
97 if len(sys.argv) != 4: | |
98 print "Usage: compare_test_lists.py <build_dir_1> <build_dir_2> " \ | |
99 "<test_binary_name>" | |
100 sys.exit(1) | |
101 sys.exit(Run(sys.argv[1], sys.argv[2], sys.argv[3])) | |
OLD | NEW |