1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Redistribution and use in source and binary forms, with or without 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# modification, are permitted provided that the following conditions are 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# met: 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# * Redistributions of source code must retain the above copyright 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# notice, this list of conditions and the following disclaimer. 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# * Redistributions in binary form must reproduce the above 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# copyright notice, this list of conditions and the following 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# disclaimer in the documentation and/or other materials provided 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# with the distribution. 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# * Neither the name of Google Inc. nor the names of its 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# contributors may be used to endorse or promote products derived 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# from this software without specific prior written permission. 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport imp 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport os 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom . import commands 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom . import statusfile 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom . import utils 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfrom ..objects import testcase 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass TestSuite(object): 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch @staticmethod 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def LoadTestSuite(root): 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch name = root.split(os.path.sep)[-1] 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch f = None 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch try: 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (f, pathname, description) = imp.find_module("testcfg", [root]) 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch module = imp.load_module("testcfg", f, pathname, description) 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return module.GetSuite(name, root) 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch except: 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Use default if no testcfg is present. 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GoogleTestSuite(name, root) 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch finally: 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if f: 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch f.close() 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def __init__(self, name, root): 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.name = name # string 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.root = root # string containing path 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.tests = None # list of TestCase objects 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.rules = None # dictionary mapping test path to list of outcomes 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.wildcards = None # dictionary mapping test paths to list of outcomes 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.total_duration = None # float, assigned on demand 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def shell(self): 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "d8" 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def suffix(self): 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ".js" 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def status_file(self): 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "%s/%s.status" % (self.root, self.name) 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Used in the status file and for stdout printing. 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def CommonTestName(self, testcase): 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if utils.IsWindows(): 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return testcase.path.replace("\\", "/") 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else: 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return testcase.path 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def ListTests(self, context): 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch raise NotImplementedError 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def VariantFlags(self, testcase, default_flags): 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if testcase.outcomes and statusfile.OnlyStandardVariant(testcase.outcomes): 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return [[]] 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return default_flags 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def DownloadData(self): 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pass 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def ReadStatusFile(self, variables): 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (self.rules, self.wildcards) = \ 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch statusfile.ReadStatusFile(self.status_file(), variables) 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def ReadTestCases(self, context): 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.tests = self.ListTests(context) 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch @staticmethod 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _FilterFlaky(flaky, mode): 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (mode == "run" and not flaky) or (mode == "skip" and flaky) 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch @staticmethod 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _FilterSlow(slow, mode): 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (mode == "run" and not slow) or (mode == "skip" and slow) 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch @staticmethod 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def _FilterPassFail(pass_fail, mode): 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (mode == "run" and not pass_fail) or (mode == "skip" and pass_fail) 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def FilterTestCasesByStatus(self, warn_unused_rules, 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flaky_tests="dontcare", 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slow_tests="dontcare", 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pass_fail_tests="dontcare"): 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch filtered = [] 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch used_rules = set() 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for t in self.tests: 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flaky = False 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slow = False 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pass_fail = False 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testname = self.CommonTestName(t) 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if testname in self.rules: 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch used_rules.add(testname) 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # Even for skipped tests, as the TestCase object stays around and 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch # PrintReport() uses it. 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch t.outcomes = self.rules[testname] 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if statusfile.DoSkip(t.outcomes): 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch continue # Don't add skipped tests to |filtered|. 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flaky = statusfile.IsFlaky(t.outcomes) 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slow = statusfile.IsSlow(t.outcomes) 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pass_fail = statusfile.IsPassOrFail(t.outcomes) 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch skip = False 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for rule in self.wildcards: 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assert rule[-1] == '*' 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if testname.startswith(rule[:-1]): 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch used_rules.add(rule) 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch t.outcomes = self.wildcards[rule] 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if statusfile.DoSkip(t.outcomes): 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch skip = True 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break # "for rule in self.wildcards" 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flaky = flaky or statusfile.IsFlaky(t.outcomes) 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slow = slow or statusfile.IsSlow(t.outcomes) 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pass_fail = pass_fail or statusfile.IsPassOrFail(t.outcomes) 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (skip or self._FilterFlaky(flaky, flaky_tests) 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch or self._FilterSlow(slow, slow_tests) 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch or self._FilterPassFail(pass_fail, pass_fail_tests)): 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch continue # "for t in self.tests" 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch filtered.append(t) 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.tests = filtered 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if not warn_unused_rules: 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for rule in self.rules: 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if rule not in used_rules: 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print("Unused rule: %s -> %s" % (rule, self.rules[rule])) 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for rule in self.wildcards: 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if rule not in used_rules: 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print("Unused rule: %s -> %s" % (rule, self.wildcards[rule])) 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def FilterTestCasesByArgs(self, args): 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch filtered = [] 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch filtered_args = [] 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for a in args: 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch argpath = a.split(os.path.sep) 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if argpath[0] != self.name: 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch continue 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if len(argpath) == 1 or (len(argpath) == 2 and argpath[1] == '*'): 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return # Don't filter, run all tests in this suite. 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch path = os.path.sep.join(argpath[1:]) 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if path[-1] == '*': 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch path = path[:-1] 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch filtered_args.append(path) 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for t in self.tests: 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for a in filtered_args: 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if t.path.startswith(a): 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch filtered.append(t) 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.tests = filtered 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def GetFlagsForTestCase(self, testcase, context): 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch raise NotImplementedError 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def GetSourceForTest(self, testcase): 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return "(no source available)" 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def IsFailureOutput(self, output, testpath): 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return output.exit_code != 0 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def IsNegativeTest(self, testcase): 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return False 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def HasFailed(self, testcase): 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch execution_failed = self.IsFailureOutput(testcase.output, testcase.path) 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if self.IsNegativeTest(testcase): 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return not execution_failed 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else: 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return execution_failed 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def GetOutcome(self, testcase): 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if testcase.output.HasCrashed(): 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return statusfile.CRASH 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elif testcase.output.HasTimedOut(): 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return statusfile.TIMEOUT 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elif self.HasFailed(testcase): 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return statusfile.FAIL 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch else: 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return statusfile.PASS 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def HasUnexpectedOutput(self, testcase): 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch outcome = self.GetOutcome(testcase) 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return not outcome in (testcase.outcomes or [statusfile.PASS]) 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def StripOutputForTransmit(self, testcase): 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if not self.HasUnexpectedOutput(testcase): 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testcase.output.stdout = "" 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch testcase.output.stderr = "" 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def CalculateTotalDuration(self): 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.total_duration = 0.0 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for t in self.tests: 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch self.total_duration += t.duration 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return self.total_duration 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass GoogleTestSuite(TestSuite): 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def __init__(self, name, root): 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch super(GoogleTestSuite, self).__init__(name, root) 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def ListTests(self, context): 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shell = os.path.abspath(os.path.join(context.shell_dir, self.shell())) 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if utils.IsWindows(): 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shell += ".exe" 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch output = commands.Execute(context.command_prefix + 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch [shell, "--gtest_list_tests"] + 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context.extra_flags) 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if output.exit_code != 0: 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print output.stdout 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch print output.stderr 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return [] 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch tests = [] 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch test_case = '' 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for line in output.stdout.splitlines(): 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch test_desc = line.strip().split()[0] 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if test_desc.endswith('.'): 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch test_case = test_desc 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elif test_case and test_desc: 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch test = testcase.TestCase(self, test_case + test_desc, dependency=None) 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch tests.append(test) 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch tests.sort() 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return tests 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def GetFlagsForTestCase(self, testcase, context): 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (testcase.flags + ["--gtest_filter=" + testcase.path] + 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ["--gtest_random_seed=%s" % context.random_seed] + 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ["--gtest_print_time=0"] + 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context.mode_flags) 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch def shell(self): 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return self.name 258