1d30ea906Sjfb8856606#!/usr/bin/env python 2d30ea906Sjfb8856606 3d30ea906Sjfb8856606# SPDX-License-Identifier: BSD-3-Clause 4d30ea906Sjfb8856606# Copyright(c) 2017 Intel Corporation 5d30ea906Sjfb8856606 6d30ea906Sjfb8856606import sys 7d30ea906Sjfb8856606import os 8d30ea906Sjfb8856606import argparse 9d30ea906Sjfb8856606import subprocess 10d30ea906Sjfb8856606import shlex 11d30ea906Sjfb8856606 12d30ea906Sjfb8856606from threading import Timer 13d30ea906Sjfb8856606 14d30ea906Sjfb8856606def kill(process): 15d30ea906Sjfb8856606 print "ERROR: Test app timed out" 16d30ea906Sjfb8856606 process.kill() 17d30ea906Sjfb8856606 18d30ea906Sjfb8856606if "RTE_SDK" in os.environ: 19d30ea906Sjfb8856606 dpdk_path = os.environ["RTE_SDK"] 20d30ea906Sjfb8856606else: 21d30ea906Sjfb8856606 dpdk_path = "../.." 22d30ea906Sjfb8856606 23d30ea906Sjfb8856606if "RTE_TARGET" in os.environ: 24d30ea906Sjfb8856606 dpdk_target = os.environ["RTE_TARGET"] 25d30ea906Sjfb8856606else: 26*4418919fSjohnjiang dpdk_target = "x86_64-native-linux-gcc" 27d30ea906Sjfb8856606 28d30ea906Sjfb8856606parser = argparse.ArgumentParser( 29d30ea906Sjfb8856606 description='BBdev Unit Test Application', 30d30ea906Sjfb8856606 formatter_class=argparse.ArgumentDefaultsHelpFormatter) 31d30ea906Sjfb8856606parser.add_argument("-p", "--testapp-path", 32d30ea906Sjfb8856606 help="specifies path to the bbdev test app", 33d30ea906Sjfb8856606 default=dpdk_path + "/" + dpdk_target + "/app/testbbdev") 34d30ea906Sjfb8856606parser.add_argument("-e", "--eal-params", 35d30ea906Sjfb8856606 help="EAL arguments which are passed to the test app", 36d30ea906Sjfb8856606 default="--vdev=baseband_null0") 37d30ea906Sjfb8856606parser.add_argument("-t", "--timeout", 38d30ea906Sjfb8856606 type=int, 39d30ea906Sjfb8856606 help="Timeout in seconds", 40d30ea906Sjfb8856606 default=300) 41d30ea906Sjfb8856606parser.add_argument("-c", "--test-cases", 42d30ea906Sjfb8856606 nargs="+", 43d30ea906Sjfb8856606 help="Defines test cases to run. Run all if not specified") 44d30ea906Sjfb8856606parser.add_argument("-v", "--test-vector", 45d30ea906Sjfb8856606 nargs="+", 46d30ea906Sjfb8856606 help="Specifies paths to the test vector files.", 47d30ea906Sjfb8856606 default=[dpdk_path + 48d30ea906Sjfb8856606 "/app/test-bbdev/test_vectors/bbdev_null.data"]) 49d30ea906Sjfb8856606parser.add_argument("-n", "--num-ops", 50d30ea906Sjfb8856606 type=int, 51d30ea906Sjfb8856606 help="Number of operations to process on device.", 52d30ea906Sjfb8856606 default=32) 53d30ea906Sjfb8856606parser.add_argument("-b", "--burst-size", 54d30ea906Sjfb8856606 nargs="+", 55d30ea906Sjfb8856606 type=int, 56d30ea906Sjfb8856606 help="Operations enqueue/dequeue burst size.", 57d30ea906Sjfb8856606 default=[32]) 58d30ea906Sjfb8856606parser.add_argument("-l", "--num-lcores", 59d30ea906Sjfb8856606 type=int, 60d30ea906Sjfb8856606 help="Number of lcores to run.", 61d30ea906Sjfb8856606 default=16) 62*4418919fSjohnjiangparser.add_argument("-i", "--init-device", 63*4418919fSjohnjiang action='store_true', 64*4418919fSjohnjiang help="Initialise PF device with default values.") 65d30ea906Sjfb8856606 66d30ea906Sjfb8856606args = parser.parse_args() 67d30ea906Sjfb8856606 68d30ea906Sjfb8856606if not os.path.exists(args.testapp_path): 69d30ea906Sjfb8856606 print "No such file: " + args.testapp_path 70d30ea906Sjfb8856606 sys.exit(1) 71d30ea906Sjfb8856606 72d30ea906Sjfb8856606params = [args.testapp_path] 73d30ea906Sjfb8856606if args.eal_params: 74d30ea906Sjfb8856606 params.extend(shlex.split(args.eal_params)) 75d30ea906Sjfb8856606 76d30ea906Sjfb8856606params.extend(["--"]) 77d30ea906Sjfb8856606 78d30ea906Sjfb8856606if args.num_ops: 79d30ea906Sjfb8856606 params.extend(["-n", str(args.num_ops)]) 80d30ea906Sjfb8856606 81d30ea906Sjfb8856606if args.num_lcores: 82d30ea906Sjfb8856606 params.extend(["-l", str(args.num_lcores)]) 83d30ea906Sjfb8856606 84d30ea906Sjfb8856606if args.test_cases: 85d30ea906Sjfb8856606 params.extend(["-c"]) 86d30ea906Sjfb8856606 params.extend([",".join(args.test_cases)]) 87d30ea906Sjfb8856606 88*4418919fSjohnjiangif args.init_device: 89*4418919fSjohnjiang params.extend(["-i"]) 90*4418919fSjohnjiang 91*4418919fSjohnjiang 92d30ea906Sjfb8856606exit_status = 0 93d30ea906Sjfb8856606for vector in args.test_vector: 94d30ea906Sjfb8856606 for burst_size in args.burst_size: 95d30ea906Sjfb8856606 call_params = params[:] 96d30ea906Sjfb8856606 call_params.extend(["-v", vector]) 97d30ea906Sjfb8856606 call_params.extend(["-b", str(burst_size)]) 98d30ea906Sjfb8856606 params_string = " ".join(call_params) 99d30ea906Sjfb8856606 100d30ea906Sjfb8856606 print("Executing: {}".format(params_string)) 101d30ea906Sjfb8856606 app_proc = subprocess.Popen(call_params) 102d30ea906Sjfb8856606 if args.timeout > 0: 103d30ea906Sjfb8856606 timer = Timer(args.timeout, kill, [app_proc]) 104d30ea906Sjfb8856606 timer.start() 105d30ea906Sjfb8856606 106d30ea906Sjfb8856606 try: 107d30ea906Sjfb8856606 app_proc.communicate() 108d30ea906Sjfb8856606 except: 109d30ea906Sjfb8856606 print("Error: failed to execute: {}".format(params_string)) 110d30ea906Sjfb8856606 finally: 111d30ea906Sjfb8856606 timer.cancel() 112d30ea906Sjfb8856606 113d30ea906Sjfb8856606 if app_proc.returncode != 0: 114d30ea906Sjfb8856606 exit_status = 1 115d30ea906Sjfb8856606 print("ERROR TestCase failed. Failed test for vector {}. Return code: {}".format( 116d30ea906Sjfb8856606 vector, app_proc.returncode)) 117d30ea906Sjfb8856606 118d30ea906Sjfb8856606sys.exit(exit_status) 119