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