avs-device-sdk/tools/Testing/android_test.py

115 lines
3.9 KiB
Python

# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License").
# You may not use this file except in compliance with the License.
# A copy of the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is distributed
# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied. See the License for the specific language governing
# permissions and limitations under the License.
from argparse import ArgumentParser
from subprocess import check_call, check_output
from os import devnull, path
import string
# Used devnull to redirect output.
FNULL = open(devnull, 'w')
# Android uses forward slash to separate folders.
SEPARATOR = '/'
def run_test(args):
"""Upload and run the test on the device."""
lib_folder = string.join([args.device_path, 'lib'], SEPARATOR)
test_folder = string.join([args.device_path, 'test'], SEPARATOR)
input_folder = string.join([args.device_path, 'input'], SEPARATOR)
test_path = string.join([test_folder, args.name], SEPARATOR)
# Setup the device folders.
check_call('adb shell mkdir -p {}'.format(test_folder).split(),
stdout=FNULL)
check_call('adb shell mkdir -p {}'.format(input_folder).split(),
stdout=FNULL)
check_call('adb push {} {}'.format(args.source, test_folder).split(),
stdout=FNULL)
# Upload necessary input files and setup arguments.
inputs = process_inputs(input_folder, args.inputs)
# Run test command on test folder and with installed libraries.
cd_command = 'cd {};'.format(test_folder)
export_command = 'export LD_LIBRARY_PATH={};'.format(lib_folder)
test_command = '{} {};'.format(test_path, inputs)
return check_output(['adb',
'shell',
cd_command,
export_command,
test_command,
'echo $?'])
def parse():
"""Parse arguments."""
parser = ArgumentParser()
parser.add_argument('-n',
'--name',
type=str,
help='The test name.')
parser.add_argument('-s',
'--source',
type=str,
help='The test path on the host device.')
parser.add_argument('-d',
'--device_path',
type=str,
help='The install folder path on the android device.')
parser.add_argument('-i',
'--inputs',
nargs='*',
help='The inputs to be given to the test.')
return parser.parse_args()
def process_inputs(inputs_folder, inputs):
"""Process the inputs passed to the test.
If the input is an existing file or directory, upload it to the device and
use the new location as argument.
"""
ret = []
for toProcess in inputs:
if path.exists(toProcess) or (path.dirname(toProcess) and
path.exists(path.dirname(toProcess))):
# Input is a file / directory. Upload it to the device.
push_command = 'adb push {} {}'.format(toProcess, inputs_folder)
check_call(push_command.split(), stdout=FNULL)
basename = path.basename(toProcess)
ret.append(string.join([inputs_folder, basename], SEPARATOR))
else:
ret.append(toProcess)
return string.join(ret)
def parse_output(output):
"""Extract test return value and print the test output."""
lines = output.splitlines()
print(string.join(lines[0:-1], '\n'))
return int(lines[-1])
if __name__ == '__main__':
args = parse()
output = run_test(args)
ret_value = parse_output(output)
exit(ret_value)