106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# Copyright (C) 2013 Google Inc. All rights reserved. 206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# 306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without 406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# modification, are permitted provided that the following conditions are 506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# met: 606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# 706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# * Redistributions of source code must retain the above copyright 806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# notice, this list of conditions and the following disclaimer. 906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# * Redistributions in binary form must reproduce the above 1006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer 1106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# in the documentation and/or other materials provided with the 1206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# distribution. 1306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# * Neither the name of Google Inc. nor the names of its 1406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# contributors may be used to endorse or promote products derived from 1506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# this software without specific prior written permission. 1606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# 1706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 29e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)import unittest 3006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 3106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)from webkitpy.common.host_mock import MockHost 3206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)from webkitpy.layout_tests.print_layout_test_times import main 3306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 3406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 3506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)class PrintLayoutTestTimesTest(unittest.TestCase): 3606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 3706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) def check(self, args, expected_output, files=None): 3806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) host = MockHost() 3906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) fs = host.filesystem 4006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) results_directory = host.port_factory.get().results_directory() 4106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if files: 4206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) fs.files = files 4306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) else: 4406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) fs.write_text_file(fs.join(results_directory, 'times_ms.json'), """ 4506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) {"foo": {"foo1": {"fast1.html": 10, 4606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "fast2.html": 10, 4706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "slow1.html": 80}, 4806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo2": {"fast3.html": 10, 4906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "fast4.html": 10, 5006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "slow2.html": 80}}, 5106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "bar": {"bar1": {"fast5.html": 10, 5206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "fast6.html": 10, 5306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "slow3.html": 80}}} 5406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) """) 5506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) main(host, args) 5606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) self.assertEqual(host.stdout.getvalue(), expected_output) 5706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 5806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) def test_fastest_overall(self): 5906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) # This is the fastest 10% of the tests overall (ignoring dir structure, equivalent to -f 0). 6006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) self.check(['--fastest', '10'], 6106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "bar/bar1/fast5.html 10\n" 6206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "bar/bar1/fast6.html 10\n" 6306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo1/fast1.html 10\n") 6406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 6506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) def test_fastest_forward_1(self): 6606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) # Note that we don't get anything from foo/foo2, as foo/foo1 used up the budget for foo. 6706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) self.check(['-f', '1', '--fastest', '10'], 6806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "bar/bar1/fast5.html 10\n" 6906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo1/fast1.html 10\n" 7006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo1/fast2.html 10\n") 7106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 7206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) def test_fastest_back_1(self): 7306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) # Here we get one test from each dir, showing that we are going properly breadth-first. 7406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) self.check(['-b', '1', '--fastest', '10'], 7506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "bar/bar1/fast5.html 10\n" 7606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo1/fast1.html 10\n" 7706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo2/fast3.html 10\n") 7806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 7906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) def test_no_args(self): 8006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) # This should be every test, sorted lexicographically. 8106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) self.check([], 8206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "bar/bar1/fast5.html 10\n" 8306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "bar/bar1/fast6.html 10\n" 8406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "bar/bar1/slow3.html 80\n" 8506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo1/fast1.html 10\n" 8606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo1/fast2.html 10\n" 8706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo1/slow1.html 80\n" 8806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo2/fast3.html 10\n" 8906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo2/fast4.html 10\n" 9006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo2/slow2.html 80\n") 9106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 9206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) def test_total(self): 9306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) self.check(['-f', '0'], "300\n") 9406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 9506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) def test_forward_one(self): 9606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) self.check(['-f', '1'], 9706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "bar 100\n" 9806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo 200\n") 9906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 10006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) def test_backward_one(self): 10106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) self.check(['-b', '1'], 10206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "bar/bar1 100\n" 10306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo1 100\n" 10406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "foo/foo2 100\n") 10506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 10606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) def test_path_to_file(self): 10706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) # Tests that we can use a custom file rather than the port's default. 10806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) self.check(['/tmp/times_ms.json'], "foo/bar.html 1\n", 10906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) files={'/tmp/times_ms.json': '{"foo":{"bar.html": 1}}'}) 110