From fa2d280932d36090042557d721dcef5e7f2e6d2c Mon Sep 17 00:00:00 2001 From: Srikanth Muppandam Date: Tue, 17 Jun 2025 12:39:47 +0530 Subject: [PATCH] runner: Robustify rngtest and fix SKIP reporting in run-test.sh - rngtest/run.sh: Use dd to source entropy data for more reliable testing, improve output parsing, and enhance error handling for missing or malformed rngtest output. - run-test.sh: Detect and report SKIP results in test summary by parsing .res files, so that SKIPped tests are no longer counted as pass or fail. - Print SKIPPED section in summary for clearer CI/test visibility. - Ensures correct reporting of pass, fail, and skip for all test cases, and makes rngtest reliable across platforms. Signed-off-by: Srikanth Muppandam --- Runner/run-test.sh | 43 ++++++++++---- .../FunctionalArea/baseport/rngtest/run.sh | 56 +++++++++++++++---- 2 files changed, 76 insertions(+), 23 deletions(-) diff --git a/Runner/run-test.sh b/Runner/run-test.sh index 19c383db..ab3a5c90 100755 --- a/Runner/run-test.sh +++ b/Runner/run-test.sh @@ -34,6 +34,7 @@ fi # Store results RESULTS_PASS="" RESULTS_FAIL="" +RESULTS_SKIP="" execute_test_case() { test_path=$1 @@ -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" @@ -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 "==================================" } diff --git a/Runner/suites/Kernel/FunctionalArea/baseport/rngtest/run.sh b/Runner/suites/Kernel/FunctionalArea/baseport/rngtest/run.sh index 817a45ff..6a6a9c60 100755 --- a/Runner/suites/Kernel/FunctionalArea/baseport/rngtest/run.sh +++ b/Runner/suites/Kernel/FunctionalArea/baseport/rngtest/run.sh @@ -20,19 +20,16 @@ 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 "-----------------------------------------------------------------------------------------" @@ -40,22 +37,57 @@ 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----------------------------"