1 # Copyright (C) 2010 Google Inc. All rights reserved. 2 # Copyright (C) 2010 Gabor Rapcsanyi (rgabor (at] inf.u-szeged.hu), University of Szeged 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 """Unit tests for manager.py.""" 31 32 import sys 33 import time 34 import unittest 35 36 from webkitpy.common.host_mock import MockHost 37 from webkitpy.layout_tests.controllers.manager import Manager 38 from webkitpy.layout_tests.models import test_expectations 39 from webkitpy.layout_tests.models.test_run_results import TestRunResults 40 from webkitpy.tool.mocktool import MockOptions 41 42 43 class FakePrinter(object): 44 def write_update(self, s): 45 pass 46 47 48 class ManagerTest(unittest.TestCase): 49 def test_needs_servers(self): 50 def get_manager(): 51 host = MockHost() 52 port = host.port_factory.get('test-mac-leopard') 53 manager = Manager(port, options=MockOptions(http=True, max_locked_shards=1), printer=FakePrinter()) 54 return manager 55 56 manager = get_manager() 57 self.assertFalse(manager.needs_servers(['fast/html'])) 58 59 manager = get_manager() 60 self.assertTrue(manager.needs_servers(['http/tests/misc'])) 61 62 def test_servers_started(self): 63 def get_manager(port): 64 manager = Manager(port, options=MockOptions(http=True, max_locked_shards=1), printer=FakePrinter()) 65 return manager 66 67 def start_http_server(additional_dirs, number_of_drivers): 68 self.http_started = True 69 70 def start_websocket_server(): 71 self.websocket_started = True 72 73 def stop_http_server(): 74 self.http_stopped = True 75 76 def stop_websocket_server(): 77 self.websocket_stopped = True 78 79 host = MockHost() 80 port = host.port_factory.get('test-mac-leopard') 81 port.start_http_server = start_http_server 82 port.start_websocket_server = start_websocket_server 83 port.stop_http_server = stop_http_server 84 port.stop_websocket_server = stop_websocket_server 85 86 self.http_started = self.http_stopped = self.websocket_started = self.websocket_stopped = False 87 manager = get_manager(port) 88 manager._start_servers(['http/tests/foo.html']) 89 self.assertEqual(self.http_started, True) 90 self.assertEqual(self.websocket_started, False) 91 manager._stop_servers() 92 self.assertEqual(self.http_stopped, True) 93 self.assertEqual(self.websocket_stopped, False) 94 95 self.http_started = self.http_stopped = self.websocket_started = self.websocket_stopped = False 96 manager._start_servers(['http/tests/websocket/foo.html']) 97 self.assertEqual(self.http_started, True) 98 self.assertEqual(self.websocket_started, True) 99 manager._stop_servers() 100 self.assertEqual(self.http_stopped, True) 101 self.assertEqual(self.websocket_stopped, True) 102 103 self.http_started = self.http_stopped = self.websocket_started = self.websocket_stopped = False 104 manager._start_servers(['fast/html/foo.html']) 105 self.assertEqual(self.http_started, False) 106 self.assertEqual(self.websocket_started, False) 107 manager._stop_servers() 108 self.assertEqual(self.http_stopped, False) 109 self.assertEqual(self.websocket_stopped, False) 110 111 112 def test_look_for_new_crash_logs(self): 113 def get_manager(): 114 host = MockHost() 115 port = host.port_factory.get('test-mac-leopard') 116 manager = Manager(port, options=MockOptions(test_list=None, http=True, max_locked_shards=1), printer=FakePrinter()) 117 return manager 118 host = MockHost() 119 port = host.port_factory.get('test-mac-leopard') 120 tests = ['failures/expected/crash.html'] 121 expectations = test_expectations.TestExpectations(port, tests) 122 run_results = TestRunResults(expectations, len(tests)) 123 manager = get_manager() 124 manager._look_for_new_crash_logs(run_results, time.time()) 125 126 def _make_fake_test_result(self, host, results_directory): 127 host.filesystem.maybe_make_directory(results_directory) 128 host.filesystem.write_binary_file(results_directory + '/results.html', 'This is a test results file') 129 130 def test_rename_results_folder(self): 131 host = MockHost() 132 port = host.port_factory.get('test-mac-leopard') 133 134 def get_manager(): 135 manager = Manager(port, options=MockOptions(max_locked_shards=1), printer=FakePrinter()) 136 return manager 137 self._make_fake_test_result(port.host, '/tmp/layout-test-results') 138 self.assertTrue(port.host.filesystem.exists('/tmp/layout-test-results')) 139 timestamp = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime(port.host.filesystem.mtime('/tmp/layout-test-results/results.html'))) 140 archived_file_name = '/tmp/layout-test-results' + '_' + timestamp 141 manager = get_manager() 142 manager._rename_results_folder() 143 self.assertFalse(port.host.filesystem.exists('/tmp/layout-test-results')) 144 self.assertTrue(port.host.filesystem.exists(archived_file_name)) 145 146 def test_clobber_old_results(self): 147 host = MockHost() 148 port = host.port_factory.get('test-mac-leopard') 149 150 def get_manager(): 151 manager = Manager(port, options=MockOptions(max_locked_shards=1), printer=FakePrinter()) 152 return manager 153 self._make_fake_test_result(port.host, '/tmp/layout-test-results') 154 self.assertTrue(port.host.filesystem.exists('/tmp/layout-test-results')) 155 manager = get_manager() 156 manager._clobber_old_results() 157 self.assertFalse(port.host.filesystem.exists('/tmp/layout-test-results')) 158 159 def test_limit_archived_results_count(self): 160 host = MockHost() 161 port = host.port_factory.get('test-mac-leopard') 162 163 def get_manager(): 164 manager = Manager(port, options=MockOptions(max_locked_shards=1), printer=FakePrinter()) 165 return manager 166 for x in range(1, 31): 167 dir_name = '/tmp/layout-test-results' + '_' + str(x) 168 self._make_fake_test_result(port.host, dir_name) 169 manager = get_manager() 170 manager._limit_archived_results_count() 171 deleted_dir_count = 0 172 for x in range(1, 31): 173 dir_name = '/tmp/layout-test-results' + '_' + str(x) 174 if not port.host.filesystem.exists(dir_name): 175 deleted_dir_count = deleted_dir_count + 1 176 self.assertEqual(deleted_dir_count, 5) 177