uhd/host/tests/devtest/run_testsuite.py
Trung Tran 3f77f6d5e0 devtest: add universal_newlines to subprocess call
subprocess call in python3+ return stderr and stdout object is byte
object instead of text. This caused many issue with parsing the ouput in
devtest. These are not an issue in python2. This change will make
devtest more python3 compatible.

Signed-off-by: Trung.Tran<trung.tran@ettus.com>
2019-01-23 11:03:39 -08:00

136 lines
5.3 KiB
Python
Executable file

#!/usr/bin/env python
#
# Copyright 2015-2016 Ettus Research LLC
# Copyright 2018 Ettus Research, a National Instruments Company
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
"""
Device test runner.
"""
from __future__ import print_function
import os
import sys
import subprocess
import argparse
import logging
from usrp_probe import get_usrp_list
def setup_parser():
""" Set up argparser """
parser = argparse.ArgumentParser(description="Test utility for UHD/USRP.")
parser.add_argument('--devtest-pattern', '-p', default='*', help='e.g. b2xx')
parser.add_argument('--device-filter', '-f', default=None, required=True, help='b200, x300, ...')
parser.add_argument('--log-dir', '-l', default='.')
parser.add_argument('--src-dir', default='.', help='Directory where the test sources are stored')
parser.add_argument('--build-dir', default=None, help='Build dir (where examples/ and utils/ are)')
parser.add_argument('--build-type', default='Release')
return parser
def setup_env(args):
" Add build dir into lib + exe paths, depending on OS "
def setup_env_win(env, build_dir, build_type):
" Add build dir into paths (Windows)"
env['PATH'] = "{build_dir}/lib/{build_type};" + \
"{build_dir}/examples/{build_type};" + \
"{build_dir}/utils/{build_type};{path}".format(
build_dir=build_dir,
build_type=build_type,
path=env.get('PATH', ''))
env['LIBPATH'] = "{build_dir}/lib/{build_type};{path}".format(
build_dir=build_dir, build_type=build_type, path=env.get('LIBPATH', '')
)
env['LIB'] = "{build_dir}/lib/{build_type};{path}".format(
build_dir=build_dir, build_type=build_type, path=env.get('LIB', '')
)
env['PYTHONPATH'] = "{build_dir}/python".format(build_dir=build_dir)
return env
def setup_env_unix(env, build_dir):
" Add build dir into paths (Unices)"
env['PATH'] = "{build_dir}/examples:{build_dir}/utils:{path}".format(
build_dir=build_dir, path=env.get('PATH', '')
)
env['LD_LIBRARY_PATH'] = "{build_dir}/lib:{path}".format(
build_dir=build_dir, path=env.get('LD_LIBRARY_PATH', '')
)
env['PYTHONPATH'] = "{build_dir}/python".format(build_dir=build_dir)
return env
def setup_env_osx(env, build_dir):
" Add build dir into paths (OS X)"
env['PATH'] = "{build_dir}/examples:{build_dir}/utils:{path}".format(
build_dir=build_dir, path=env.get('PATH', '')
)
env['DYLD_LIBRARY_PATH'] = "{build_dir}/lib:{path}".format(
build_dir=build_dir, path=env.get('DYLD_LIBRARY_PATH', '')
)
env['PYTHONPATH'] = "{build_dir}/python".format(build_dir=build_dir)
return env
### Go
env = os.environ
if sys.platform.startswith('linux'):
env = setup_env_unix(env, args.build_dir)
elif sys.platform.startswith('win'):
env = setup_env_win(env, args.build_dir, args.build_type)
elif sys.platform.startswith('darwin'):
env = setup_env_osx(env, args.build_dir)
else:
print("Devtest not supported on this platform ({0})."
.format(sys.platform))
exit(1)
return env
def main():
" Go, go, go! "
args = setup_parser().parse_args()
env = setup_env(args)
devtest_pattern = "devtest_{p}.py".format(p=args.devtest_pattern)
uhd_args_list = get_usrp_list("type=" + args.device_filter, env)
if len(uhd_args_list) == 0:
print("No devices found. Exiting.")
exit(1)
tests_passed = True
for uhd_idx, uhd_info in enumerate(uhd_args_list):
print('--- Running all tests for device {dev} ({prod}, Serial: {ser}).'.format(
dev=uhd_idx,
prod=uhd_info.get('product', 'USRP'),
ser=uhd_info.get('serial')
))
print('--- This will take some time. Better grab a cup of tea.')
sys.stdout.flush()
args_str = uhd_info['args']
env['_UHD_TEST_ARGS_STR'] = args_str
logfile_name = "log{}.log".format(
args_str.replace('type=', '_').replace('serial=', '_').replace(',', '')
)
resultsfile_name = "results{}.log".format(
args_str.replace('type=', '_').replace('serial=', '_').replace(',', '')
)
env['_UHD_TEST_LOGFILE'] = os.path.join(args.log_dir, logfile_name)
env['_UHD_TEST_RESULTSFILE'] = os.path.join(args.log_dir, resultsfile_name)
env['_UHD_TEST_LOG_LEVEL'] = str(logging.INFO)
env['_UHD_TEST_PRINT_LEVEL'] = str(logging.WARNING)
env['_UHD_BUILD_DIR'] = str(args.build_dir)
env['_UHD_DEVTEST_SRC_DIR'] = str(args.src_dir)
proc = subprocess.Popen(
[
"python", "-m", "unittest", "discover", "-v",
"-s", args.src_dir,
"-p", devtest_pattern,
],
env=env,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True
)
print(proc.communicate()[0])
sys.stdout.flush()
if proc.returncode != 0:
tests_passed = False
print('--- Done testing all attached devices.')
return tests_passed
if __name__ == "__main__":
exit(not main())