diff options
Diffstat (limited to 'js/src/tests/lib/remote.py')
-rw-r--r-- | js/src/tests/lib/remote.py | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/js/src/tests/lib/remote.py b/js/src/tests/lib/remote.py new file mode 100644 index 0000000000..015a351a3b --- /dev/null +++ b/js/src/tests/lib/remote.py @@ -0,0 +1,106 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +# remote.py -- Python library for Android devices. + +import os +import posixpath + + +def push_libs(options, device, dest_dir): + # This saves considerable time in pushing unnecessary libraries + # to the device but needs to be updated if the dependencies change. + required_libs = [ + "libnss3.so", + "libmozglue.so", + "libnspr4.so", + "libplc4.so", + "libplds4.so", + ] + + for file in os.listdir(options.local_lib): + if file in required_libs: + local_file = os.path.join(options.local_lib, file) + remote_file = posixpath.join(dest_dir, file) + assert os.path.isfile(local_file) + device.push(local_file, remote_file) + device.chmod(remote_file) + + +def push_progs(options, device, progs, dest_dir): + assert isinstance(progs, list) + for local_file in progs: + remote_file = posixpath.join(dest_dir, os.path.basename(local_file)) + assert os.path.isfile(local_file) + device.push(local_file, remote_file) + device.chmod(remote_file) + + +def init_remote_dir(device, path): + device.rm(path, recursive=True, force=True) + device.mkdir(path, parents=True) + + +# We only have one device per test run. +DEVICE = None + + +def init_device(options): + # Initialize the device + global DEVICE + + assert options.remote and options.js_shell + + if DEVICE is not None: + return DEVICE + + from mozdevice import ADBDeviceFactory, ADBError, ADBTimeoutError + + try: + if not options.local_lib: + # if not specified, use the local directory containing + # the js binary to find the necessary libraries. + options.local_lib = posixpath.dirname(options.js_shell) + + # Try to find 'adb' off the build environment to automatically use the + # .mozbuild version if possible. In test automation, we don't have + # mozbuild available so use the default 'adb' that automation provides. + try: + from mozbuild.base import MozbuildObject + from mozrunner.devices.android_device import get_adb_path + + context = MozbuildObject.from_environment() + adb_path = get_adb_path(context) + except ImportError: + adb_path = "adb" + + DEVICE = ADBDeviceFactory( + adb=adb_path, + device=options.device_serial, + test_root=options.remote_test_root, + ) + + bin_dir = posixpath.join(options.remote_test_root, "bin") + tests_dir = posixpath.join(options.remote_test_root, "tests") + temp_dir = posixpath.join(options.remote_test_root, "tmp") + + # Create directory structure on device + init_remote_dir(DEVICE, options.remote_test_root) + init_remote_dir(DEVICE, tests_dir) + init_remote_dir(DEVICE, bin_dir) + init_remote_dir(DEVICE, temp_dir) + + # Push js shell and libraries. + push_libs(options, DEVICE, bin_dir) + push_progs(options, DEVICE, [options.js_shell], bin_dir) + + # update options.js_shell to point to the js binary on the device + options.js_shell = os.path.join(bin_dir, "js") + + return DEVICE + + except (ADBError, ADBTimeoutError): + print("TEST-UNEXPECTED-FAIL | remote.py : Device initialization failed") + raise |