tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

remote.py (3483B)


      1 # This Source Code Form is subject to the terms of the Mozilla Public
      2 # License, v. 2.0. If a copy of the MPL was not distributed with this
      3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
      4 
      5 
      6 # remote.py -- Python library for Android devices.
      7 
      8 import os
      9 import posixpath
     10 
     11 
     12 def push_libs(options, device, dest_dir):
     13    # This saves considerable time in pushing unnecessary libraries
     14    # to the device but needs to be updated if the dependencies change.
     15    required_libs = [
     16        "libnss3.so",
     17        "libmozglue.so",
     18        "libnspr4.so",
     19        "libplc4.so",
     20        "libplds4.so",
     21    ]
     22 
     23    for file in os.listdir(options.local_lib):
     24        if file in required_libs:
     25            local_file = os.path.join(options.local_lib, file)
     26            remote_file = posixpath.join(dest_dir, file)
     27            assert os.path.isfile(local_file)
     28            device.push(local_file, remote_file)
     29            device.chmod(remote_file)
     30 
     31 
     32 def push_progs(options, device, progs, dest_dir):
     33    assert isinstance(progs, list)
     34    for local_file in progs:
     35        remote_file = posixpath.join(dest_dir, os.path.basename(local_file))
     36        assert os.path.isfile(local_file)
     37        device.push(local_file, remote_file)
     38        device.chmod(remote_file)
     39 
     40 
     41 def init_remote_dir(device, path):
     42    device.rm(path, recursive=True, force=True)
     43    device.mkdir(path, parents=True)
     44 
     45 
     46 # We only have one device per test run.
     47 DEVICE = None
     48 
     49 
     50 def init_device(options):
     51    # Initialize the device
     52    global DEVICE
     53 
     54    assert options.remote and options.js_shell
     55 
     56    if DEVICE is not None:
     57        return DEVICE
     58 
     59    from mozdevice import ADBDeviceFactory, ADBError, ADBTimeoutError
     60 
     61    try:
     62        if not options.local_lib:
     63            # if not specified, use the local directory containing
     64            # the js binary to find the necessary libraries.
     65            options.local_lib = posixpath.dirname(options.js_shell)
     66 
     67        # Try to find 'adb' off the build environment to automatically use the
     68        # .mozbuild version if possible. In test automation, we don't have
     69        # mozbuild available so use the default 'adb' that automation provides.
     70        try:
     71            from mozbuild.base import MozbuildObject
     72            from mozrunner.devices.android_device import get_adb_path
     73 
     74            context = MozbuildObject.from_environment()
     75            adb_path = get_adb_path(context)
     76        except ImportError:
     77            adb_path = "adb"
     78 
     79        DEVICE = ADBDeviceFactory(
     80            adb=adb_path,
     81            device=options.device_serial,
     82            test_root=options.remote_test_root,
     83        )
     84 
     85        bin_dir = posixpath.join(options.remote_test_root, "bin")
     86        tests_dir = posixpath.join(options.remote_test_root, "tests")
     87        temp_dir = posixpath.join(options.remote_test_root, "tmp")
     88 
     89        # Create directory structure on device
     90        init_remote_dir(DEVICE, options.remote_test_root)
     91        init_remote_dir(DEVICE, tests_dir)
     92        init_remote_dir(DEVICE, bin_dir)
     93        init_remote_dir(DEVICE, temp_dir)
     94 
     95        # Push js shell and libraries.
     96        push_libs(options, DEVICE, bin_dir)
     97        push_progs(options, DEVICE, [options.js_shell], bin_dir)
     98 
     99        # update options.js_shell to point to the js binary on the device
    100        options.js_shell = os.path.join(bin_dir, "js")
    101 
    102        return DEVICE
    103 
    104    except (ADBError, ADBTimeoutError):
    105        print("TEST-UNEXPECTED-FAIL | remote.py : Device initialization failed")
    106        raise