| #!/usr/bin/env python3 |
| |
| import time |
| from uiautomator import Device |
| import sys |
| import subprocess |
| import pathlib |
| |
| # Prepare the DUT |
| def prepare_dut(serial, scenarios_dir, data_dir, apps): |
| # Copy the scenarios |
| ret = subprocess.run(['adb', '-s', serial, 'push', scenarios_dir, |
| '/sdcard/viser'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, |
| universal_newlines=True) |
| if 0 < ret.returncode: |
| print('Could not push the scenarios, error was: {}'.format(ret.stderr), |
| file=sys.stderr) |
| else: |
| print('Scenarios pushed.') |
| |
| # Copy the scenarios data |
| ret = subprocess.run(['adb', '-s', serial, 'push', data_dir, |
| '/sdcard/viser/data'], stdout=subprocess.PIPE, |
| stderr=subprocess.PIPE, universal_newlines=True) |
| if 0 < ret.returncode: |
| print('Could not push the scenarios data, error was: {}'.format(ret.stderr), |
| file=sys.stderr) |
| else: |
| print('Scenarios data pushed.') |
| |
| # Install the smartviser apps |
| for app in apps: |
| ret = subprocess.run(['adb', '-s', serial, 'install', '-r', app], |
| stdout=subprocess.PIPE, stderr=subprocess.PIPE, |
| universal_newlines=True) |
| if 0 < ret.returncode: |
| print('Could not install app `{}`, error was: {}'.format(app, |
| ret.stderr), file=sys.stderr) |
| else: |
| print('App `{}` installed.'.format(app)) |
| |
| # Grant the permissions through the UI |
| def configure_perms(dut): |
| prompt = dut(resourceId='android:id/content') \ |
| .child_by_text('You need to grant access for the Permissions Group ' |
| 'Calendar Camera Contacts Microphone SMS Storage Telephone Location', |
| className='android.widget.LinearLayout') \ |
| .child(text='OK', className='android.widget.Button').click() |
| |
| # Accept any permission that is asked for |
| prompt = dut(resourceId='com.android.packageinstaller:id/permission_allow_button', |
| className='android.widget.Button') |
| while prompt.exists: |
| prompt.click() |
| |
| # Input the credentials |
| dut(resourceId='android:id/content') \ |
| .child(text='Username') \ |
| .child(className='android.widget.EditText') \ |
| .set_text('borjan@fairphone.com') |
| dut(resourceId='android:id/content') \ |
| .child(text='Password') \ |
| .child(className='android.widget.EditText') \ |
| .set_text('Rickisalso1niceguy!') |
| |
| # Sign in |
| dut(resourceId='android:id/content') \ |
| .child(text='Sign in', className='android.widget.Button') \ |
| .click() |
| |
| def configure_sms(dut): |
| # TODO wait for the connection to be established and time-out |
| prompt = dut(resourceId='android:id/content') \ |
| .child(text='Viser must be your SMS app to send messages') |
| while not prompt.exists: |
| time.sleep(1) |
| |
| # Make viser the default SMS app |
| dut(resourceId='android:id/content') \ |
| .child_by_text('Viser must be your SMS app to send messages', |
| className='android.widget.LinearLayout') \ |
| .child(text='OK', className='android.widget.Button') \ |
| .click() |
| |
| dut(resourceId='android:id/content') \ |
| .child_by_text('Change SMS app?', className='android.widget.LinearLayout') \ |
| .child(text='Yes', className='android.widget.Button') \ |
| .click() |
| |
| def configure_settings(dut): |
| # Set the e-mail account |
| dut(text='Settings', className='android.widget.TextView') \ |
| .click() |
| dut(resourceId='android:id/list') \ |
| .child_by_text('User settings', className='android.widget.LinearLayout') \ |
| .click() |
| dut(resourceId='android:id/list') \ |
| .child_by_text('Email account', className='android.widget.LinearLayout') \ |
| .click() |
| prompt = dut(resourceId='android:id/content') \ |
| .child_by_text('Email account', className='android.widget.LinearLayout') |
| prompt.child(resourceId='android:id/edit') \ |
| .set_text('fairphone.viser@gmail.com') |
| prompt.child(text='OK', className='android.widget.Button') \ |
| .click() |
| dut(resourceId='android:id/list') \ |
| .child_by_text('Email password', className='android.widget.LinearLayout') \ |
| .click() |
| dut(text='Password :') \ |
| .child(className='android.widget.EditText') \ |
| .set_text('fairphoneviser2017') |
| dut(description='OK', className='android.widget.TextView') \ |
| .click() |
| dut.press.back() |
| dut.press.back() |
| |
| serials = [] |
| |
| if len(sys.argv) > 1: |
| serials.append(sys.argv[1]) |
| else: |
| # List devices attached to adb |
| ret = subprocess.run( |
| "adb devices | grep -E '^[a-z0-9-]+\s+device$' | awk '{{print $1}}'", |
| shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, |
| universal_newlines=True) |
| |
| if 0 < ret.returncode: |
| # TODO handle the error |
| raise Exception('Failed to list adb devices') |
| elif ret.stdout: |
| for line in ret.stdout.splitlines(): |
| serial = line.strip() |
| if serial: |
| serials.append(serial) |
| |
| for serial in serials: |
| print('Configuring device {}'.format(serial)) |
| |
| dut = Device(serial) |
| |
| # Push the scenarios, their data, and install the apps |
| prepare_dut(serial, '../scenarios', '../scenarios-data', [ |
| '../../vendor/smartviser/viser/prebuilts/apk/com.smartviser.demogame.apk', |
| '../../vendor/smartviser/viser/prebuilts/apk/com.lunarlabs.panda.proxy.apk', |
| '../../vendor/smartviser/viser/prebuilts/apk/com.lunarlabs.panda.apk' |
| ]) |
| |
| # Start the viser app |
| ret = subprocess.run(['adb', '-s', serial, 'shell', 'monkey', '-p', |
| 'com.lunarlabs.panda', '-c', 'android.intent.category.LAUNCHER', |
| '1'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, |
| universal_newlines=True) |
| if 0 < ret.returncode: |
| print('Could not start the viser app, error was: {}'.format(app, |
| ret.stderr), file=sys.stderr) |
| exit(-1) |
| |
| configure_perms(dut) |
| |
| # TODO DO NOT DO THE FOLLOWING IF NO SIM CARD IS IN THE DUT |
| # time.sleep(10) |
| # configure_sms(dut) |
| |
| configure_settings(dut) |