blob: 79152b6b1616b24947880389ca1ca7760c914637 [file] [log] [blame]
# Copyright (C) 2017-2019 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import socket
class Device(object):
def __init__(self, platform_device):
self.platform_device = platform_device
self.listening_socket = None
def listening_port(self):
if not self.listening_socket:
return None
return self.listening_socket.getsockname()[1]
def install_app(self, app_path, env=None):
return self.platform_device.install_app(app_path, env)
def install_dylibs(self, path_to_dylibs):
if hasattr(self.platform_device, 'install_dylibs'):
return self.platform_device.install_dylibs(path_to_dylibs=path_to_dylibs)
return True
def launch_app(self, bundle_id, args, env=None):
return self.platform_device.launch_app(bundle_id, args, env)
def prepare_for_testing(self, ports_to_forward, test_app_bundle_id, layout_test_directory):
if not self.listening_socket:
self.listening_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.listening_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.listening_socket.bind(('127.0.0.1', 0))
if hasattr(self.platform_device, 'prepare_for_testing'):
self.platform_device.prepare_for_testing(
ports_to_forward=ports_to_forward + [self.listening_port()],
test_app_bundle_id=test_app_bundle_id,
layout_test_directory=layout_test_directory,
)
def finished_testing(self):
if hasattr(self.platform_device, 'finished_testing'):
self.platform_device.finished_testing()
self.listening_socket = None
def symbolicate_crash_log_if_needed(self, path):
if hasattr(self.platform_device, 'symbolicate_crash_log_if_needed'):
return self.platform_device.symbolicate_crash_log_if_needed(path)
return self.filesystem.read_text_file(path)
def release_worker_resources(self):
if hasattr(self.platform_device, 'release_worker_resources'):
return self.platform_device.release_worker_resources()
return None
@property
def executive(self):
return self.platform_device.executive
@property
def filesystem(self):
return self.platform_device.filesystem
@property
def user(self):
return self.platform_device.user
@property
def platform(self):
return self.platform_device.platform
@property
def workspace(self):
return self.platform_device.workspace
@property
def udid(self):
return self.platform_device.udid
@property
def device_type(self):
return self.platform_device.device_type
@property
def build_version(self):
return self.platform_device.build_version
def __nonzero__(self):
return self.platform_device is not None
def __eq__(self, other):
return self.udid == other.udid
def __ne__(self, other):
return not self.__eq__(other)
def __repr__(self):
return u'{}'.format(self.platform_device)
def __hash__(self):
return hash(self.udid)