| 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 |