#!/bin/bash
local TEST_NAME="$1" # HTML output file
local LOGFILE="$3" # Test file
local EXTRA_INFO="$4"
local TEST_CMD="$@" # The command to run (passed as a single string)
# Start the timer
local START_TIME=$(date +%s)
# Run the test command using eval to handle the single string properly
eval "$TEST_CMD"
local TEST_EXIT_CODE=$?
# Stop the timer and calculate elapsed time
local END_TIME=$(date +%s)
local ELAPSED_TIME=$((END_TIME - START_TIME))
# Determine the test status based on the exit code
local DEBUG_MESSAGE
local PASS_OR_FAIL
local SHOULD_DELETE_HTML=0
if [ $TEST_EXIT_CODE -eq 0 ]; then
DEBUG_MESSAGE="${GREEN}Completed successfully (EXITCODE=$TEST_EXIT_CODE) $EXTRA_INFO: $TEST_CMD${NC}"
PASS_OR_FAIL="PASS"
elif [ $TEST_EXIT_CODE -eq 124 ]; then
DEBUG_MESSAGE="${RED}Killed (definitely due to timeout) (EXITCODE=$TEST_EXIT_CODE) after $EXTRA_INFO seconds: $TEST_CMD${NC}"
[ "$if_failures" -eq 1 ] && SHOULD_DELETE_HTML=1
PASS_OR_FAIL="FAIL"
elif [ $TEST_EXIT_CODE -eq 134 ]; then
DEBUG_MESSAGE="${RED}Test aborted by user (EXITCODE=$TEST_EXIT_CODE) $EXTRA_INFO: $TEST_CMD${NC}"
SHOULD_DELETE_HTML=1
PASS_OR_FAIL="FAIL"
elif [ $TEST_EXIT_CODE -eq 4 ]; then
DEBUG_MESSAGE="${RED}Stopping tests (EXITCODE=$TEST_EXIT_CODE) $EXTRA_INFO: $TEST_CMD${NC}"
SHOULD_DELETE_HTML=1
PASS_OR_FAIL="FAIL"
exit 4
elif [ $TEST_EXIT_CODE -ne 7 ]; then
DEBUG_MESSAGE="${YELLOW}Completed (EXITCODE=$TEST_EXIT_CODE) $EXTRA_INFO: $TEST_CMD${NC}"
PASS_OR_FAIL="FAIL"
else
DEBUG_MESSAGE="${GREEN}Completed successfully (EXITCODE=$TEST_EXIT_CODE) $EXTRA_INFO: $TEST_CMD${NC}"
PASS_OR_FAIL="PASS"
fi
# Generate the HTML link
local HTML_LINK="file://$file_html#${TEST_NAME}"
# Determine if the HTML file should be used as the logfile or a separate .log file should be created
if [ $SHOULD_DELETE_HTML -eq 1 ]; then
# Create a separate .log file since the HTML file is planned for deletion
LOGFILE="${file_html}.log"
cp "$file_html" "$LOGFILE"
else
# Use the HTML file as the logfile since it won't be deleted
LOGFILE="$file_html"
fi
# Redirect debug messages to both the logfile and console
echo "$DEBUG_MESSAGE" | tee -a "$LOGFILE"
# Write the line to /tmp/SHARED.UNITS
echo "| $TEST_NAME | $PASS_OR_FAIL | [$TEST_NAME]($HTML_LINK) | $TEST_CMD | $TEST_EXIT_CODE | 7 | $ELAPSED_TIME | $LOGFILE |" >> /tmp/SHARED.UNITS
# Delete the HTML file if it was planned for deletion
if [ $SHOULD_DELETE_HTML -eq 1 ]; then
rm -f "$file_html"
fi
return $TEST_EXIT_CODE