21efd2c3ccf55598a847b770102f5087da9f2951
[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.common.system.outputcapture import OutputCapture
35 from webkitpy.layout_tests.port.driver import DriverOutput
36 from webkitpy.performance_tests.perftest import ChromiumStylePerfTest
37 from webkitpy.performance_tests.perftest import PageLoadingPerfTest
38 from webkitpy.performance_tests.perftest import PerfTest
39 from webkitpy.performance_tests.perftest import PerfTestFactory
40
41
42 class MainTest(unittest.TestCase):
43     def test_parse_output(self):
44         output = DriverOutput('\n'.join([
45             'Running 20 times',
46             'Ignoring warm-up run (1115)',
47             '',
48             'avg 1100',
49             'median 1101',
50             'stdev 11',
51             'min 1080',
52             'max 1120']), image=None, image_hash=None, audio=None)
53         output_capture = OutputCapture()
54         output_capture.capture_output()
55         try:
56             test = PerfTest('some-test', '/path/some-dir/some-test')
57             self.assertEqual(test.parse_output(output),
58                 {'some-test': {'avg': 1100.0, 'median': 1101.0, 'min': 1080.0, 'max': 1120.0, 'stdev': 11.0, 'unit': 'ms'}})
59         finally:
60             actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
61         self.assertEqual(actual_stdout, '')
62         self.assertEqual(actual_stderr, '')
63         self.assertEqual(actual_logs, 'RESULT some-test= 1100.0 ms\nmedian= 1101.0 ms, stdev= 11.0 ms, min= 1080.0 ms, max= 1120.0 ms\n')
64
65     def test_parse_output_with_failing_line(self):
66         output = DriverOutput('\n'.join([
67             'Running 20 times',
68             'Ignoring warm-up run (1115)',
69             '',
70             'some-unrecognizable-line',
71             '',
72             'avg 1100',
73             'median 1101',
74             'stdev 11',
75             'min 1080',
76             'max 1120']), image=None, image_hash=None, audio=None)
77         output_capture = OutputCapture()
78         output_capture.capture_output()
79         try:
80             test = PerfTest('some-test', '/path/some-dir/some-test')
81             self.assertEqual(test.parse_output(output), None)
82         finally:
83             actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
84         self.assertEqual(actual_stdout, '')
85         self.assertEqual(actual_stderr, '')
86         self.assertEqual(actual_logs, 'some-unrecognizable-line\n')
87
88
89 class TestPageLoadingPerfTest(unittest.TestCase):
90     class MockDriver(object):
91         def __init__(self, values):
92             self._values = values
93             self._index = 0
94
95         def run_test(self, input):
96             value = self._values[self._index]
97             self._index += 1
98             if isinstance(value, str):
99                 return DriverOutput('some output', image=None, image_hash=None, audio=None, error=value)
100             else:
101                 return DriverOutput('some output', image=None, image_hash=None, audio=None, test_time=self._values[self._index - 1])
102
103     def test_run(self):
104         test = PageLoadingPerfTest('some-test', '/path/some-dir/some-test')
105         driver = TestPageLoadingPerfTest.MockDriver([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
106         output_capture = OutputCapture()
107         output_capture.capture_output()
108         try:
109             self.assertEqual(test.run(driver, None),
110                 {'some-test': {'max': 20000, 'avg': 11000.0, 'median': 11000, 'stdev': math.sqrt(570 * 1000 * 1000), 'min': 2000, 'unit': 'ms'}})
111         finally:
112             actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
113         self.assertEqual(actual_stdout, '')
114         self.assertEqual(actual_stderr, '')
115         self.assertEqual(actual_logs, 'RESULT some-test= 11000.0 ms\nmedian= 11000 ms, stdev= 23874.6727726 ms, min= 2000 ms, max= 20000 ms\n')
116
117     def test_run_with_bad_output(self):
118         output_capture = OutputCapture()
119         output_capture.capture_output()
120         try:
121             test = PageLoadingPerfTest('some-test', '/path/some-dir/some-test')
122             driver = TestPageLoadingPerfTest.MockDriver([1, 2, 3, 4, 5, 6, 7, 'some error', 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
123             self.assertEqual(test.run(driver, None), None)
124         finally:
125             actual_stdout, actual_stderr, actual_logs = output_capture.restore_output()
126         self.assertEqual(actual_stdout, '')
127         self.assertEqual(actual_stderr, '')
128         self.assertEqual(actual_logs, 'error: some-test\nsome error\n')
129
130
131 class TestPerfTestFactory(unittest.TestCase):
132     def test_regular_test(self):
133         test = PerfTestFactory.create_perf_test('some-dir/some-test', '/path/some-dir/some-test')
134         self.assertEqual(test.__class__, PerfTest)
135
136     def test_inspector_test(self):
137         test = PerfTestFactory.create_perf_test('inspector/some-test', '/path/inspector/some-test')
138         self.assertEqual(test.__class__, ChromiumStylePerfTest)
139
140     def test_page_loading_test(self):
141         test = PerfTestFactory.create_perf_test('PageLoad/some-test', '/path/PageLoad/some-test')
142         self.assertEqual(test.__class__, PageLoadingPerfTest)
143
144
145 if __name__ == '__main__':
146     unittest.main()