#!/usr/bin/env bash #*----------------------------------------------------------------------------*# #* Copyright (c) 2014-2019 FIRST. All Rights Reserved. *# #* Open Source Software - may be modified and shared by FRC teams. The code *# #* must be accompanied by the FIRST BSD license file in the root directory of *# #* the project. *# #*----------------------------------------------------------------------------*# # This file is intended to be run in the DEFAULT_TEST_DIR on the roboRIO. # Do not attempt to run this file on your local system. # There is one file (delploy-and-run-test-on-robot.sh) that is designed to # deploy this file allong with the compiled tests for you. # Configurable variables source config.sh DEFAULT_TEST_DIR=${DEFAULT_DESTINATION_DIR} DEFAULT_PATH_TO_JRE=/usr/local/frc/JRE/bin/java usage="$(basename "$0") [-h] (java|cpp) [-d test_dir] [-A] [arg] [arg]... A script designed to run the integration tests. This script should only be run on the roborio. Where: -h Show this help text -d The directory where the tests have been placed. This is done to prevent overwriting an already running program. This scrip will automatically move the test into the ${DEFAULT_TEST_DIR} directory. Default: Assumes the test is in the same directory as this scrip. -A Do not use the default arguments for the given language. arg The arguments to be passed to test." # Are you trying to run this program on a platform other than the roboRIO? if [[ ! -e "${DEFAULT_TEST_DIR}" ]]; then printf "Failed to find %s\nAre you trying to run this file on your local computer?\n" "${DEFAULT_TEST_DIR}" printf "This script should only be run on the roboRIO.\n\n" echo "$usage" exit 1 fi LANGUAGE=none TEST_FILE=none TEST_DIR="$DEFAULT_TEST_DIR" # Begin searching for options from the second paramater on PARAM_ARGS=${@:2} # Where the test arguments start TEST_RUN_ARGS=${@:2} RUN_WITH_DEFAULT_ARGS=true DEFAULT_ARGS="" # Determine the language that we are attempting to run if [[ "$1" = java ]]; then LANGUAGE=$1 TEST_FILE=$DEFAULT_JAVA_TEST_NAME DEFAULT_ARGS=$DEFAULT_JAVA_TEST_ARGS elif [[ "$1" = cpp ]]; then LANGUAGE=$1 TEST_FILE=$DEFAULT_CPP_TEST_NAME DEFAULT_ARGS=$DEFAULT_CPP_TEST_ARGS elif [[ "$1" = "-h" ]]; then #If the first argument is the help option #Allow it to be searhced for in getopts PARAM_ARGS=${@} else printf "Invalid language selection: %s\n\n" "$1" >&2 echo "$usage" >&2 exit 1 fi PARAM_COUNTER=1 printf "Param Args ${PARAM_ARGS}\n" # Check for optional paramaters while getopts ':hmd:A' option $PARAM_ARGS ; do case "$option" in h) # Print the help message printf "Usage:\n" echo "$usage" exit ;; A) # Remove the default arguments RUN_WITH_DEFAULT_ARGS=false PARAM_COUNTER=$[$PARAM_COUNTER +1] ;; d) TEST_DIR=$OPTARG # Since we are selecting the directory the run args start from the 5th argument PARAM_COUNTER=$[$PARAM_COUNTER +2] ;; ?) # When an unknown param is found then we are done so break break ;; esac done TEST_RUN_ARGS=${@:$[$PARAM_COUNTER +1]} if [[ "$RUN_WITH_DEFAULT_ARGS" == true ]]; then TEST_RUN_ARGS="${DEFAULT_ARGS} ${TEST_RUN_ARGS}" fi # Make sure at least two paramaters are passed or four if running with -d option if [[ $# -lt $PARAM_COUNTER ]]; then printf "Invalid arg count. Should be %s, was %s.\n" "${PARAM_COUNTER}" "$#" echo "$usage" exit 1 fi # Make sure the webserver is disabled to save memory /usr/local/natinst/etc/init.d/systemWebServer stop # Kill all running robot programs killall java FRCUserProgram # If we are running with the -d argument move the test to the DEFAULT_TEST_DIR if [[ ! -e "${TEST_DIR}/${TEST_FILE}" ]]; then printf "Failed to find %s.\nDid you copy the test file correctly?\n" "${TEST_DIR}/${TEST_FILE}" echo "$usage" exit 1 elif [[ $TEST_DIR != "$DEFAULT_TEST_DIR" ]]; then mv "${TEST_DIR}/${TEST_FILE}" "${DEFAULT_TEST_DIR}" fi # Make sure the excecutable file has permission to run # Get the serial number and FPGADeviceCode for this rio export serialnum=`/sbin/fw_printenv -n serial#` export eval `/sbin/fw_printenv DeviceCode FPGADeviceCode DeviceDesc TargetClass` # Store the run command for the language RUN_COMMAND=none if [[ ${LANGUAGE} = java ]]; then chmod a+x ${DEFAULT_JAVA_TEST_NAME} RUN_COMMAND="env LD_LIBRARY_PATH=/opt/GenICam_v3_0_NI/bin/Linux32_ARM/:/usr/local/frc/lib ${DEFAULT_PATH_TO_JRE} -ea -jar ${DEFAULT_JAVA_TEST_NAME} ${TEST_RUN_ARGS}" elif [[ ${LANGUAGE} = cpp ]]; then chmod a+x ${DEFAULT_CPP_TEST_NAME} RUN_COMMAND="./${DEFAULT_CPP_TEST_NAME} ${TEST_RUN_ARGS}" fi printf "Running: %s\n\n" "${RUN_COMMAND}" COREDUMP_DIR=${DEFAULT_DESTINATION_TEST_RESULTS_DIR}/coredump mkdir -p ${COREDUMP_DIR} CORE_LOCATION=${COREDUMP_DIR}/core echo ${CORE_LOCATION} > /proc/sys/kernel/core_pattern ulimit -c unlimited eval ${RUN_COMMAND} if [[ $? -gt 127 && -e ${CORE_LOCATION} ]]; then mv ${CORE_LOCATION} ${COREDUMP_DIR}/core.${LANGUAGE} if [[ ${LANGUAGE} = java ]]; then cp -p ${DEFAULT_JAVA_TEST_NAME} ${COREDUMP_DIR}/ elif [[ ${LANGUAGE} = cpp ]]; then cp -p ${DEFAULT_CPP_TEST_NAME} ${COREDUMP_DIR}/ fi fi