• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python
2# Copyright 2015 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import argparse
7import os
8import subprocess
9import sys
10
11script_dir = os.path.dirname(os.path.realpath(__file__))
12tool_dir = os.path.abspath(os.path.join(script_dir, '../../pylib'))
13sys.path.insert(0, tool_dir)
14
15from clang import plugin_testing
16
17
18class BlinkGcPluginTest(plugin_testing.ClangPluginTest):
19  """Test harness for the Blink GC plugin."""
20
21  def AdjustClangArguments(self, clang_cmd):
22    clang_cmd.append('-Wno-inaccessible-base')
23    clang_cmd.append('-Xclang')
24    clang_cmd.append('-plugin-arg-blink-gc-plugin')
25    clang_cmd.append('-Xclang')
26    clang_cmd.append('use-chromium-style-naming')
27
28  def ProcessOneResult(self, test_name, actual):
29    # Some Blink GC plugins dump a JSON representation of the object graph, and
30    # use the processed results as the actual results of the test.
31    if os.path.exists('%s.graph.json' % test_name):
32      try:
33        actual = subprocess.check_output(
34            ['python', '../process-graph.py', '-c',
35             '%s.graph.json' % test_name],
36            stderr=subprocess.STDOUT)
37      except subprocess.CalledProcessError, e:
38        # The graph processing script returns a failure exit code if the graph
39        # is bad (e.g. it has a cycle). The output still needs to be captured in
40        # that case, since the expected results capture the errors.
41        actual = e.output
42      finally:
43        # Clean up the .graph.json file to prevent false passes from stale
44        # results from a previous run.
45        os.remove('%s.graph.json' % test_name)
46    return super(BlinkGcPluginTest, self).ProcessOneResult(test_name, actual)
47
48
49def main():
50  parser = argparse.ArgumentParser()
51  parser.add_argument(
52      '--reset-results',
53      action='store_true',
54      help='If specified, overwrites the expected results in place.')
55  parser.add_argument('clang_path', help='The path to the clang binary.')
56  parser.add_argument('plugin_path',
57                      nargs='?',
58                      help='The path to the plugin library, if any.')
59  args = parser.parse_args()
60
61  return BlinkGcPluginTest(
62      os.path.dirname(os.path.realpath(__file__)),
63      args.clang_path,
64      args.plugin_path,
65      'blink-gc-plugin',
66      args.reset_results).Run()
67
68
69if __name__ == '__main__':
70  sys.exit(main())
71