Enable SVG page loading performance tests
[WebKit-https.git] / Tools / Scripts / webkitpy / performance_tests / perftest_unittest.py
1 #!/usr/bin/python
2 # Copyright (C) 2012 Google Inc. All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are
6 # met:
7 #
8 #     * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer.
10 #     * Redistributions in binary form must reproduce the above
11 # copyright notice, this list of conditions and the following disclaimer
12 # in the documentation and/or other materials provided with the
13 # distribution.
14 #     * Neither the name of Google Inc. nor the names of its
15 # contributors may be used to endorse or promote products derived from
16 # this software without specific prior written permission.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 import StringIO
31 import math
32 import unittest
33
34 from webkitpy.layout_tests.port.driver import DriverOutput
35 from webkitpy.performance_tests.perftest import ChromiumStylePerfTest
36 from webkitpy.performance_tests.perftest import PageLoadingPerfTest
37 from webkitpy.performance_tests.perftest import PerfTest
38
39
40 class MockPrinter(object):
41     def __init__(self):
42         self.written_lines = []
43
44     def write(self, line):
45         self.written_lines.append(line)
46
47
48 class MainTest(unittest.TestCase):
49     def test_parse_output(self):
50         printer = MockPrinter()
51         buildbot_output = StringIO.StringIO()
52         output = DriverOutput('\n'.join([
53             'Running 20 times',
54             'Ignoring warm-up run (1115)',
55             '',
56             'avg 1100',
57             'median 1101',
58             'stdev 11',
59             'min 1080',
60             'max 1120']), image=None, image_hash=None, audio=None)
61         test = PerfTest('some-test', 'some-dir/some-test', '/path/some-dir/some-test')
62         self.assertEqual(test.parse_output(output, printer, buildbot_output),
63             {'some-test': {'avg': 1100.0, 'median': 1101.0, 'min': 1080.0, 'max': 1120.0, 'stdev': 11.0, 'unit': 'ms'}})
64         self.assertEqual(printer.written_lines, [])
65
66     def test_parse_output_with_failing_line(self):
67         printer = MockPrinter()
68         buildbot_output = StringIO.StringIO()
69         output = DriverOutput('\n'.join([
70             'Running 20 times',
71             'Ignoring warm-up run (1115)',
72             '',
73             'some-unrecognizable-line',
74             '',
75             'avg 1100',
76             'median 1101',
77             'stdev 11',
78             'min 1080',
79             'max 1120']), image=None, image_hash=None, audio=None)
80         test = PerfTest('some-test', 'some-dir/some-test', '/path/some-dir/some-test')
81         self.assertEqual(test.parse_output(output, printer, buildbot_output), None)
82         self.assertEqual(printer.written_lines, ['some-unrecognizable-line'])
83
84
85 class TestPageLoadingPerfTest(unittest.TestCase):
86     def assertWritten(self, stream, contents):
87         self.assertEquals(stream.buflist, contents)
88
89     class MockDriver(object):
90         def __init__(self, values):
91             self._values = values
92             self._index = 0
93
94         def run_test(self, input):
95             value = self._values[self._index]
96             self._index += 1
97             if isinstance(value, str):
98                 return DriverOutput('some output', image=None, image_hash=None, audio=None, error=value)
99             else:
100                 return DriverOutput('some output', image=None, image_hash=None, audio=None, test_time=self._values[self._index - 1])
101
102     def test_run(self):
103         printer = MockPrinter()
104         buildbot_output = StringIO.StringIO()
105         test = PageLoadingPerfTest('some-test', 'some-dir/some-test', '/path/some-dir/some-test')
106         driver = TestPageLoadingPerfTest.MockDriver([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
107         self.assertEqual(test.run(driver, None, printer, buildbot_output),
108             {'some-test': {'max': 20000, 'avg': 10500.0, 'median': 10500, 'stdev': math.sqrt(665 * 1000 * 1000), 'min': 1000, 'unit': 'ms'}})
109         self.assertEqual(printer.written_lines, [])
110         self.assertWritten(buildbot_output, ['RESULT some-test= 10500.0 ms\n', 'median= 10500 ms, stdev= 25787.5939165 ms, min= 1000 ms, max= 20000 ms\n'])
111
112     def test_run_with_bad_output(self):
113         printer = MockPrinter()
114         buildbot_output = StringIO.StringIO()
115         test = PageLoadingPerfTest('some-test', 'some-dir/some-test', '/path/some-dir/some-test')
116         driver = TestPageLoadingPerfTest.MockDriver([1, 2, 3, 4, 5, 6, 7, 'some error', 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
117         self.assertEqual(test.run(driver, None, printer, buildbot_output), None)
118         self.assertEqual(printer.written_lines, ['error: some-test\nsome error'])
119
120 if __name__ == '__main__':
121     unittest.main()