webkitpy: Refactor setup_test_run for IOSPort and IOSSimulator
[WebKit-https.git] / Tools / Scripts / webkitpy / port / ios.py
1 # Copyright (C) 2014-2017 Apple 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
5 # are met:
6 # 1.  Redistributions of source code must retain the above copyright
7 #     notice, this list of conditions and the following disclaimer.
8 # 2.  Redistributions in binary form must reproduce the above copyright
9 #     notice, this list of conditions and the following disclaimer in the
10 #     documentation and/or other materials provided with the distribution.
11 #
12 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
13 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15 # DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
16 # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
18 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
19 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
20 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
21 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
23 import logging
24
25 from webkitpy.common.memoized import memoized
26 from webkitpy.port.darwin import DarwinPort
27 from webkitpy.port.simulator_process import SimulatorProcess
28
29 _log = logging.getLogger(__name__)
30
31
32 class IOSPort(DarwinPort):
33     port_name = "ios"
34
35     def __init__(self, host, port_name, **kwargs):
36         super(IOSPort, self).__init__(host, port_name, **kwargs)
37         self._test_runner_process_constructor = SimulatorProcess
38         self._printing_cmd_line = False
39         self._current_device = None
40
41     def _device_for_worker_number_map(self):
42         raise NotImplementedError
43
44     def driver_cmd_line_for_logging(self):
45         # Avoid creating/connecting to devices just for logging the commandline.
46         self._printing_cmd_line = True
47         result = super(IOSPort, self).driver_cmd_line_for_logging()
48         self._printing_cmd_line = False
49         return result
50
51     def driver_name(self):
52         if self.get_option('driver_name'):
53             return self.get_option('driver_name')
54         if self.get_option('webkit_test_runner'):
55             return 'WebKitTestRunnerApp.app'
56         return 'DumpRenderTree.app'
57
58     @memoized
59     def child_processes(self):
60         return int(self.get_option('child_processes'))
61
62     def using_multiple_devices(self):
63         return False
64
65     def _testing_device(self, number):
66         device = self._device_for_worker_number_map()[number]
67         if not device:
68             raise RuntimeError('Device at {} could not be found'.format(number))
69         return device
70
71     # FIXME: This is only exposed so that SimulatorProcess can use it.
72     def device_for_worker_number(self, number):
73         if self._printing_cmd_line:
74             return None
75         # When using simulated devices, this means webkitpy is managing the devices.
76         if self.using_multiple_devices():
77             return self._testing_device(number)
78         return self._current_device
79
80     def _create_devices(self, device_class):
81         raise NotImplementedError
82
83     def setup_test_run(self, device_class=None):
84         self._create_devices(device_class)