benchmarking/platforms/ios/idb.py (65 lines of code) (raw):
#!/usr/bin/env python
##############################################################################
# Copyright 2017-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
##############################################################################
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import os
import shutil
import sys
from platforms.platform_util_base import PlatformUtilBase
from utils.custom_logger import getLogger
class IDB(PlatformUtilBase):
def __init__(self, device=None, tempdir=None):
super(IDB, self).__init__(device, tempdir)
self.bundle_id = None
if self.tempdir is not None:
self.cached_tree = os.path.join(self.tempdir, "tree")
if not os.path.isdir(self.cached_tree):
os.mkdir(self.cached_tree)
def setBundleId(self, bundle_id):
self.bundle_id = bundle_id
def run(self, *args, **kwargs):
idb = ["ios-deploy"]
if self.device:
idb.extend(["--id", self.device])
if self.bundle_id:
idb.extend(["--bundle_id", self.bundle_id])
return super(IDB, self).run(idb, *args, **kwargs)
def push(self, src, tgt):
# only push files, not directories, as apps are directories
if os.path.isdir(src):
getLogger().info("Skip pushing directory {}".format(src))
return
return self.run("--upload", src, "--to", tgt)
def pull(self, src, tgt):
# ios-deploy will dump all files from the app to the directory,
# so we only dump it once and save the result.
# it is better to remove all uncessary files before we dump the
# result
assert self.cached_tree is not None, "cached_tree is None."
src_filename = os.path.join(self.cached_tree, src)
if not os.path.isfile(src_filename):
self.run("--download", "--to", self.cached_tree)
assert os.path.isfile(src_filename), "File {} doesn't exist in app".format(
src_filename
)
shutil.copyfile(src_filename, tgt)
def reboot(self):
# use idevicediagnostics to reboot device if exists
try:
super(IDB, self).run("idevicepair", "-u", self.device, "pair")
super(IDB, self).run("idevicediagnostics", "-u", self.device, "restart")
return True
except Exception:
getLogger().critical(
f"Rebooting failure for device {self.device}.",
exc_info=True,
)
return False
def deleteFile(self, file):
# need to make sure the file exists
# return self.run("--rm", file)
# no need to delete file since files are added to a bundle
# and the app is installed in every benchmark
pass
def batteryLevel(self):
try:
response = self.run("--get_battery_level")
level = int(response[-1].lstrip("BatteryCurrentCapacity:"))
getLogger().info("Result {}".format(level))
return level
except Exception:
getLogger().critical(
f"Could not read battery level for device {self.device}.",
exc_info=True,
)
return -1