Squashed 'third_party/allwpilib_2017/' content from commit 35ac87d

Change-Id: I7bb6f5556c30d3f5a092e68de0be9c710c60c9f4
git-subtree-dir: third_party/allwpilib_2017
git-subtree-split: 35ac87d6ff8b7f061c4f18c9ea316e5dccd4888a
diff --git a/test-scripts/run-tests-on-robot.sh b/test-scripts/run-tests-on-robot.sh
new file mode 100755
index 0000000..4785dd5
--- /dev/null
+++ b/test-scripts/run-tests-on-robot.sh
@@ -0,0 +1,200 @@
+#!/usr/bin/env bash
+#*----------------------------------------------------------------------------*#
+#* Copyright (c) FIRST 2014. 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) name [-d test_dir] [-m] [-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
+    name  The name of the user trying to run the tests (used for driver station)
+    -d    The directory where the tests have been placed.
+          This is done to prevent overwriting an already running program
+          in the case where another user already has the driver station mutex.
+          This scrip will automatically move the test into the ${DEFAULT_TEST_DIR}
+          directory when the driver station mutex is released.
+          Default: Assumes the test is in the same directory as this scrip.
+    -m    The driver station mutex will be handled manually.
+    -A    Do not use the default arguments for the given language.
+    arg   The arguments to be passed to test."
+
+mutexTaken=false
+driverStationEnabled=false
+# This function should run even if the script exits abnormally
+function finish {
+	if [ "$driverStationEnabled" == true ]; then
+		/usr/local/frc/bin/teststand ds --name="${NAME}" disable
+		driverStationEnabled=false
+	fi
+	if [ "$mutexTaken" == true ]; then
+		/usr/local/frc/bin/teststand give --name="${NAME}"
+		mutexTaken=false
+	fi
+}
+trap finish EXIT SIGINT
+
+# This function should be run asynchronysly to enable the tests 10
+# seconds after they have been run.
+function enableIn10Seconds {
+	/usr/local/frc/bin/teststand ds --name="${NAME}" disable
+	driverStationEnabled=true
+	sleep 10
+	/usr/local/frc/bin/teststand ds --name="${NAME}" enable
+}
+
+# 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
+NAME=$2
+TEST_DIR="$DEFAULT_TEST_DIR"
+# Begin searching for options from the third paramater on
+PARAM_ARGS=${@:3}
+# Where the test arguments start
+TEST_RUN_ARGS=${@:3}
+RUN_WITH_DEFAULT_ARGS=true
+DEFAULT_ARGS=""
+MUTEX_OVERRIDE=false
+
+# 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=2
+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]
+		;;
+	m)
+		MUTEX_OVERRIDE=true
+		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
+
+# If the mutex has been retrived a higher level in the tree
+if [ "$MUTEX_OVERRIDE" == false ]; then
+	# Attempt to take the mutex for the driver station
+	mutexTaken=true
+	/usr/local/frc/bin/teststand take --name="${NAME}"
+else
+	printf "Override driver station control enabled.\n"
+fi
+
+# Kill all running robot programs
+killall java FRCUserProgram
+
+# Once we have the mutex no other tests are running
+# 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
+
+# Setup the driver station to enable automatically in 10 seconds without waiting for the function to excecute.
+enableIn10Seconds&
+
+# 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