Skip to content

rngtest, run-test.sh: Robust error handling, dependency SKIP, and summary improvements #85

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 32 additions & 11 deletions Runner/run-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ fi
# Store results
RESULTS_PASS=""
RESULTS_FAIL=""
RESULTS_SKIP=""

execute_test_case() {
test_path=$1
Expand All @@ -43,20 +44,37 @@ execute_test_case() {
run_script="$test_path/run.sh"
if [ -f "$run_script" ]; then
log "Executing test case: $test_name"
if (cd "$test_path" && sh "./run.sh"); then
log_pass "$test_name passed"
if [ -z "$RESULTS_PASS" ]; then
RESULTS_PASS="$test_name"
(cd "$test_path" && sh "./run.sh")
res_file="$test_path/$test_name.res"
if [ -f "$res_file" ]; then
if grep -q "SKIP" "$res_file"; then
log_skip "$test_name skipped"
if [ -z "$RESULTS_SKIP" ]; then
RESULTS_SKIP="$test_name"
else
RESULTS_SKIP=$(printf "%s\n%s" "$RESULTS_SKIP" "$test_name")
fi
elif grep -q "PASS" "$res_file"; then
log_pass "$test_name passed"
if [ -z "$RESULTS_PASS" ]; then
RESULTS_PASS="$test_name"
else
RESULTS_PASS=$(printf "%s\n%s" "$RESULTS_PASS" "$test_name")
fi
elif grep -q "FAIL" "$res_file"; then
log_fail "$test_name failed"
if [ -z "$RESULTS_FAIL" ]; then
RESULTS_FAIL="$test_name"
else
RESULTS_FAIL=$(printf "%s\n%s" "$RESULTS_FAIL" "$test_name")
fi
else
RESULTS_PASS=$(printf "%s\n%s" "$RESULTS_PASS" "$test_name")
log_fail "$test_name: unknown result in .res file"
RESULTS_FAIL=$(printf "%s\n%s" "$RESULTS_FAIL" "$test_name (unknown result)")
fi
else
log_fail "$test_name failed"
if [ -z "$RESULTS_FAIL" ]; then
RESULTS_FAIL="$test_name"
else
RESULTS_FAIL=$(printf "%s\n%s" "$RESULTS_FAIL" "$test_name")
fi
log_fail "$test_name: .res file not found"
RESULTS_FAIL=$(printf "%s\n%s" "$RESULTS_FAIL" "$test_name (.res not found)")
fi
else
log_error "No run.sh found in $test_path"
Expand Down Expand Up @@ -95,6 +113,9 @@ print_summary() {
echo
echo "FAILED:"
[ -n "$RESULTS_FAIL" ] && printf "%s\n" "$RESULTS_FAIL" || echo " None"
echo
echo "SKIPPED:"
[ -n "$RESULTS_SKIP" ] && printf "%s\n" "$RESULTS_SKIP" || echo " None"
log_info "=================================="
}

Expand Down
56 changes: 44 additions & 12 deletions Runner/suites/Kernel/FunctionalArea/baseport/rngtest/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,42 +20,74 @@ if [ -z "$INIT_ENV" ]; then
exit 1
fi

# Only source if not already loaded (idempotent)
if [ -z "$__INIT_ENV_LOADED" ]; then
# shellcheck disable=SC1090
. "$INIT_ENV"
fi
# Always source functestlib.sh, using $TOOLS exported by init_env
# shellcheck disable=SC1090,SC1091
. "$TOOLS/functestlib.sh"

TESTNAME="rngtest"
test_path=$(find_test_case_by_name "$TESTNAME")
cd "$test_path" || exit 1
# shellcheck disable=SC2034
res_file="./$TESTNAME.res"

log_info "-----------------------------------------------------------------------------------------"
log_info "-------------------Starting $TESTNAME Testcase----------------------------"
log_info "=== Test Initialization ==="

log_info "Checking if dependency binary is available"
check_dependencies rngtest
check_dependencies rngtest dd

cat /dev/random | rngtest -c 1000 > /tmp/rngtest_output.txt
TMP_BIN="/tmp/rngtest_input.bin"
TMP_OUT="/tmp/rngtest_output.txt"
ENTROPY_MB=10
RNG_SOURCE="/dev/urandom" # Use /dev/random if you want slow but highest entropy

grep 'count of bits' /tmp/rngtest_output.txt | awk '{print $NF}' > /tmp/rngtest_value.txt
log_info "Generating ${ENTROPY_MB}MB entropy input from $RNG_SOURCE using dd..."
if ! dd if="$RNG_SOURCE" of="$TMP_BIN" bs=1M count="$ENTROPY_MB" status=none 2>/dev/null; then
log_fail "$TESTNAME : Failed to read random data from $RNG_SOURCE"
echo "$TESTNAME FAIL" > "$res_file"
rm -f "$TMP_BIN"
exit 1
fi

value=$(cat /tmp/rngtest_value.txt)
log_info "Running rngtest -c 1000 < $TMP_BIN"
if ! rngtest -c 1000 < "$TMP_BIN" > "$TMP_OUT" 2>&1; then
log_fail "$TESTNAME : rngtest execution failed"
echo "$TESTNAME FAIL" > "$res_file"
rm -f "$TMP_BIN" "$TMP_OUT"
exit 1
fi

# Check for entropy errors or source drained
if grep -q "entropy source drained" "$TMP_OUT"; then
log_fail "rngtest: entropy source drained, input too small"
echo "$TESTNAME FAIL" > "$res_file"
rm -f "$TMP_BIN" "$TMP_OUT"
exit 1
fi

if [ "$value" -lt 10 ]; then
log_pass "$TESTNAME : Test Passed"
# Parse FIPS 140-2 successes (robust to output variations)
successes=$(awk '/FIPS 140-2 successes:/ {print $NF}' "$TMP_OUT" | head -n1)

if [ -z "$successes" ] || ! echo "$successes" | grep -Eq '^[0-9]+$'; then
log_fail "rngtest did not return a valid integer for successes; got: '$successes'"
echo "$TESTNAME FAIL" > "$res_file"
rm -f "$TMP_BIN" "$TMP_OUT"
exit 1
fi

log_info "rngtest: FIPS 140-2 successes = $successes"
# You can tune this threshold as needed (10 means <1% fail allowed)
if [ "$successes" -ge 10 ]; then
log_pass "$TESTNAME : Test Passed ($successes FIPS 140-2 successes)"
echo "$TESTNAME PASS" > "$res_file"
exit 0
else
log_fail "$TESTNAME : Test Failed"
log_fail "$TESTNAME : Test Failed ($successes FIPS 140-2 successes)"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi

rm -f "$TMP_BIN" "$TMP_OUT"

log_info "-------------------Completed $TESTNAME Testcase----------------------------"
Loading