1# Copyright (C) 2013 Google Inc. All rights reserved. 2# 3# Redistribution and use in source and binary forms, with or without 4# modification, are permitted provided that the following conditions are 5# met: 6# 7# * Redistributions of source code must retain the above copyright 8# notice, this list of conditions and the following disclaimer. 9# * Redistributions in binary form must reproduce the above 10# copyright notice, this list of conditions and the following disclaimer 11# in the documentation and/or other materials provided with the 12# distribution. 13# * Neither the name of Google Inc. nor the names of its 14# contributors may be used to endorse or promote products derived from 15# this software without specific prior written permission. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29import unittest 30 31from webkitpy.common.host_mock import MockHost 32from webkitpy.layout_tests.print_layout_test_times import main 33 34 35class PrintLayoutTestTimesTest(unittest.TestCase): 36 37 def check(self, args, expected_output, files=None): 38 host = MockHost() 39 fs = host.filesystem 40 results_directory = host.port_factory.get().results_directory() 41 if files: 42 fs.files = files 43 else: 44 fs.write_text_file(fs.join(results_directory, 'times_ms.json'), """ 45 {"foo": {"foo1": {"fast1.html": 10, 46 "fast2.html": 10, 47 "slow1.html": 80}, 48 "foo2": {"fast3.html": 10, 49 "fast4.html": 10, 50 "slow2.html": 80}}, 51 "bar": {"bar1": {"fast5.html": 10, 52 "fast6.html": 10, 53 "slow3.html": 80}}} 54 """) 55 main(host, args) 56 self.assertEqual(host.stdout.getvalue(), expected_output) 57 58 def test_fastest_overall(self): 59 # This is the fastest 10% of the tests overall (ignoring dir structure, equivalent to -f 0). 60 self.check(['--fastest', '10'], 61 "bar/bar1/fast5.html 10\n" 62 "bar/bar1/fast6.html 10\n" 63 "foo/foo1/fast1.html 10\n") 64 65 def test_fastest_forward_1(self): 66 # Note that we don't get anything from foo/foo2, as foo/foo1 used up the budget for foo. 67 self.check(['-f', '1', '--fastest', '10'], 68 "bar/bar1/fast5.html 10\n" 69 "foo/foo1/fast1.html 10\n" 70 "foo/foo1/fast2.html 10\n") 71 72 def test_fastest_back_1(self): 73 # Here we get one test from each dir, showing that we are going properly breadth-first. 74 self.check(['-b', '1', '--fastest', '10'], 75 "bar/bar1/fast5.html 10\n" 76 "foo/foo1/fast1.html 10\n" 77 "foo/foo2/fast3.html 10\n") 78 79 def test_no_args(self): 80 # This should be every test, sorted lexicographically. 81 self.check([], 82 "bar/bar1/fast5.html 10\n" 83 "bar/bar1/fast6.html 10\n" 84 "bar/bar1/slow3.html 80\n" 85 "foo/foo1/fast1.html 10\n" 86 "foo/foo1/fast2.html 10\n" 87 "foo/foo1/slow1.html 80\n" 88 "foo/foo2/fast3.html 10\n" 89 "foo/foo2/fast4.html 10\n" 90 "foo/foo2/slow2.html 80\n") 91 92 def test_total(self): 93 self.check(['-f', '0'], "300\n") 94 95 def test_forward_one(self): 96 self.check(['-f', '1'], 97 "bar 100\n" 98 "foo 200\n") 99 100 def test_backward_one(self): 101 self.check(['-b', '1'], 102 "bar/bar1 100\n" 103 "foo/foo1 100\n" 104 "foo/foo2 100\n") 105 106 def test_path_to_file(self): 107 # Tests that we can use a custom file rather than the port's default. 108 self.check(['/tmp/times_ms.json'], "foo/bar.html 1\n", 109 files={'/tmp/times_ms.json': '{"foo":{"bar.html": 1}}'}) 110