133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Copyright 2012 the V8 project authors. All rights reserved. 233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Redistribution and use in source and binary forms, with or without 333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# modification, are permitted provided that the following conditions are 433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# met: 533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# 633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Redistributions of source code must retain the above copyright 733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# notice, this list of conditions and the following disclaimer. 833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Redistributions in binary form must reproduce the above 933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# copyright notice, this list of conditions and the following 1033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# disclaimer in the documentation and/or other materials provided 1133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# with the distribution. 1233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Neither the name of Google Inc. nor the names of its 1333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# contributors may be used to endorse or promote products derived 1433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# from this software without specific prior written permission. 1533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# 1633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport imp 3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport os 3133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3221d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.orgfrom . import commands 3333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom . import statusfile 3446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.orgfrom . import utils 3521d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.orgfrom ..objects import testcase 3633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgclass TestSuite(object): 3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org @staticmethod 4033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def LoadTestSuite(root): 4133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org name = root.split(os.path.sep)[-1] 4233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org f = None 4333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org try: 4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org (f, pathname, description) = imp.find_module("testcfg", [root]) 4533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org module = imp.load_module("testcfg", f, pathname, description) 46ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org return module.GetSuite(name, root) 47ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org except: 48ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org # Use default if no testcfg is present. 49ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org return GoogleTestSuite(name, root) 5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org finally: 5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if f: 5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org f.close() 5333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def __init__(self, name, root): 5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.name = name # string 5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.root = root # string containing path 5733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.tests = None # list of TestCase objects 5833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.rules = None # dictionary mapping test path to list of outcomes 5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.wildcards = None # dictionary mapping test paths to list of outcomes 6033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.total_duration = None # float, assigned on demand 6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def shell(self): 6333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return "d8" 6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def suffix(self): 6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return ".js" 6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def status_file(self): 6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return "%s/%s.status" % (self.root, self.name) 7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org # Used in the status file and for stdout printing. 7233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def CommonTestName(self, testcase): 73594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if utils.IsWindows(): 74594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return testcase.path.replace("\\", "/") 75594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org else: 76594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return testcase.path 7733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def ListTests(self, context): 7933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org raise NotImplementedError 8033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 81690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org def VariantFlags(self, testcase, default_flags): 82690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org if testcase.outcomes and statusfile.OnlyStandardVariant(testcase.outcomes): 83690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org return [[]] 84690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org return default_flags 8533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 8633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def DownloadData(self): 8733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org pass 8833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 8933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def ReadStatusFile(self, variables): 9033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org (self.rules, self.wildcards) = \ 9133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org statusfile.ReadStatusFile(self.status_file(), variables) 9233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 9333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def ReadTestCases(self, context): 9433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.tests = self.ListTests(context) 9533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 96594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org @staticmethod 97594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org def _FilterFlaky(flaky, mode): 98594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return (mode == "run" and not flaky) or (mode == "skip" and flaky) 99594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 10037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org @staticmethod 10137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org def _FilterSlow(slow, mode): 10237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return (mode == "run" and not slow) or (mode == "skip" and slow) 10337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org 10437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org @staticmethod 10537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org def _FilterPassFail(pass_fail, mode): 10637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org return (mode == "run" and not pass_fail) or (mode == "skip" and pass_fail) 10737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org 10837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org def FilterTestCasesByStatus(self, warn_unused_rules, 10937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org flaky_tests="dontcare", 11037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org slow_tests="dontcare", 11137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org pass_fail_tests="dontcare"): 11233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org filtered = [] 11333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org used_rules = set() 11433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for t in self.tests: 115594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org flaky = False 11637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org slow = False 11737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org pass_fail = False 11833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org testname = self.CommonTestName(t) 11933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if testname in self.rules: 12033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org used_rules.add(testname) 121594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org # Even for skipped tests, as the TestCase object stays around and 122594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org # PrintReport() uses it. 123594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org t.outcomes = self.rules[testname] 124594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if statusfile.DoSkip(t.outcomes): 12533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org continue # Don't add skipped tests to |filtered|. 126594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org flaky = statusfile.IsFlaky(t.outcomes) 12737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org slow = statusfile.IsSlow(t.outcomes) 12837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org pass_fail = statusfile.IsPassOrFail(t.outcomes) 129594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org skip = False 130594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org for rule in self.wildcards: 131594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org assert rule[-1] == '*' 132594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if testname.startswith(rule[:-1]): 133594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org used_rules.add(rule) 134594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org t.outcomes = self.wildcards[rule] 135594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org if statusfile.DoSkip(t.outcomes): 136594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org skip = True 137594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org break # "for rule in self.wildcards" 138594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org flaky = flaky or statusfile.IsFlaky(t.outcomes) 13937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org slow = slow or statusfile.IsSlow(t.outcomes) 14037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org pass_fail = pass_fail or statusfile.IsPassOrFail(t.outcomes) 14137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org if (skip or self._FilterFlaky(flaky, flaky_tests) 14237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org or self._FilterSlow(slow, slow_tests) 14337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org or self._FilterPassFail(pass_fail, pass_fail_tests)): 144594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org continue # "for t in self.tests" 14533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org filtered.append(t) 14633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.tests = filtered 14733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 14833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if not warn_unused_rules: 14933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return 15033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 15133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for rule in self.rules: 15233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if rule not in used_rules: 15333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org print("Unused rule: %s -> %s" % (rule, self.rules[rule])) 15433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for rule in self.wildcards: 15533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if rule not in used_rules: 15633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org print("Unused rule: %s -> %s" % (rule, self.wildcards[rule])) 15733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 15833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def FilterTestCasesByArgs(self, args): 15933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org filtered = [] 16033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org filtered_args = [] 16133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for a in args: 16233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org argpath = a.split(os.path.sep) 16333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if argpath[0] != self.name: 16433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org continue 16533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if len(argpath) == 1 or (len(argpath) == 2 and argpath[1] == '*'): 16633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return # Don't filter, run all tests in this suite. 16733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org path = os.path.sep.join(argpath[1:]) 16833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if path[-1] == '*': 16933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org path = path[:-1] 17033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org filtered_args.append(path) 17133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for t in self.tests: 17233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for a in filtered_args: 17333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if t.path.startswith(a): 17433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org filtered.append(t) 17533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org break 17633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.tests = filtered 17733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 17833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def GetFlagsForTestCase(self, testcase, context): 17933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org raise NotImplementedError 18033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 18133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def GetSourceForTest(self, testcase): 18233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return "(no source available)" 18333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 18433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def IsFailureOutput(self, output, testpath): 18533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return output.exit_code != 0 18633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 18733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def IsNegativeTest(self, testcase): 18833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return False 18933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 19033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def HasFailed(self, testcase): 19133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org execution_failed = self.IsFailureOutput(testcase.output, testcase.path) 19233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if self.IsNegativeTest(testcase): 19333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return not execution_failed 19433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org else: 19533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return execution_failed 19633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 197d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org def GetOutcome(self, testcase): 19833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if testcase.output.HasCrashed(): 199d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return statusfile.CRASH 20033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org elif testcase.output.HasTimedOut(): 201d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return statusfile.TIMEOUT 20233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org elif self.HasFailed(testcase): 203d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return statusfile.FAIL 20433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org else: 205d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return statusfile.PASS 206d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 207d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org def HasUnexpectedOutput(self, testcase): 208d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org outcome = self.GetOutcome(testcase) 209d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return not outcome in (testcase.outcomes or [statusfile.PASS]) 21033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 21133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def StripOutputForTransmit(self, testcase): 21233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if not self.HasUnexpectedOutput(testcase): 21333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org testcase.output.stdout = "" 21433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org testcase.output.stderr = "" 21533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 21633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org def CalculateTotalDuration(self): 21733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.total_duration = 0.0 21833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for t in self.tests: 21933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org self.total_duration += t.duration 22033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return self.total_duration 221ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 222ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 223ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass GoogleTestSuite(TestSuite): 224ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org def __init__(self, name, root): 225ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org super(GoogleTestSuite, self).__init__(name, root) 226ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 227ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org def ListTests(self, context): 228ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org shell = os.path.abspath(os.path.join(context.shell_dir, self.shell())) 229ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org if utils.IsWindows(): 230ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org shell += ".exe" 231ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org output = commands.Execute(context.command_prefix + 232ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org [shell, "--gtest_list_tests"] + 233ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org context.extra_flags) 234ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org if output.exit_code != 0: 235ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org print output.stdout 236ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org print output.stderr 237ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org return [] 238ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org tests = [] 239ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org test_case = '' 240ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org for line in output.stdout.splitlines(): 241ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org test_desc = line.strip().split()[0] 242ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org if test_desc.endswith('.'): 243ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org test_case = test_desc 244ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org elif test_case and test_desc: 245ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org test = testcase.TestCase(self, test_case + test_desc, dependency=None) 246ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org tests.append(test) 247ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org tests.sort() 248ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org return tests 249ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 250ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org def GetFlagsForTestCase(self, testcase, context): 251ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org return (testcase.flags + ["--gtest_filter=" + testcase.path] + 252ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org ["--gtest_random_seed=%s" % context.random_seed] + 253ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org ["--gtest_print_time=0"] + 254ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org context.mode_flags) 255ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 256ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org def shell(self): 257ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org return self.name 258