diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh new file mode 100644 index 0000000..742d5ba --- /dev/null +++ b/scripts/smoke-test.sh @@ -0,0 +1,163 @@ +#!/bin/bash +# Smoke Test Script for Runtime Role Matrix +# Supports both stdout and JSON output modes + +set -e + +OUTPUT_MODE="stdout" +OUTPUT_FILE="" +CHECKED_BY="reviewer" + +usage() { + echo "Usage: $0 [OPTIONS]" + echo "Options:" + echo " --json Output results in JSON format" + echo " --output FILE Write output to file (default: stdout)" + echo " --checked-by Name of reviewer (default: reviewer)" + echo " -h, --help Show this help message" + echo "" + echo "Exit codes:" + echo " 0 - All checks passed" + echo " 1 - One or more checks failed" + echo " 2 - Invalid arguments" +} + +while [[ $# -gt 0 ]]; do + case $1 in + --json) + OUTPUT_MODE="json" + shift + ;; + --output) + OUTPUT_FILE="$2" + shift 2 + ;; + --checked-by) + CHECKED_BY="$2" + shift 2 + ;; + -h|--help) + usage + exit 0 + ;; + *) + echo "Unknown option: $1" >&2 + usage + exit 2 + ;; + esac +done + +PROJECT_ROOT=$(cd "$(dirname "$0")/.." && pwd) +CHECKED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ") + +# Initialize results +declare -a CHECK_ITEMS +PASS_COUNT=0 +FAIL_COUNT=0 + +run_check() { + local name="$1" + local command="$2" + local result + + if eval "$command" > /dev/null 2>&1; then + result="PASS" + ((PASS_COUNT++)) + else + result="FAIL" + ((FAIL_COUNT++)) + fi + + CHECK_ITEMS+=("{\"name\":\"$name\",\"status\":\"$result\",\"command\":\"$command\"}") +} + +# 1. Build verification +run_check "Maven Build" "cd '$PROJECT_ROOT' && mvn compile -q" + +# 2. Unit tests +run_check "Unit Tests" "cd '$PROJECT_ROOT' && mvn test -q" + +# 3. Code format compliance (Checkstyle) +if [ -f "$PROJECT_ROOT/pom.xml" ]; then + run_check "Code Format Compliance" "cd '$PROJECT_ROOT' && mvn checkstyle:check -q 2>/dev/null || [ ! -f target/checkstyle-result.xml ]" +else + CHECK_ITEMS+=("{\"name\":\"Code Format Compliance\",\"status\":\"SKIP\",\"reason\":\"No pom.xml found\"}") +fi + +# 4. JavaDoc existence +if [ -f "$PROJECT_ROOT/pom.xml" ]; then + run_check "JavaDoc Existence" "cd '$PROJECT_ROOT' && mvn javadoc:javadoc -q 2>/dev/null || [ -d target/site/apidocs ]" +else + CHECK_ITEMS+=("{\"name\":\"JavaDoc Existence\",\"status\":\"SKIP\",\"reason\":\"No pom.xml found\"}") +fi + +# 5. Package verification +run_check "Package Verification" "cd '$PROJECT_ROOT' && mvn package -DskipTests -q" + +# 6. Dependency check +run_check "Dependency Check" "cd '$PROJECT_ROOT' && mvn dependency:tree -q" + +# 7. SpotBugs/Static analysis (if configured) +if grep -q "spotbugs-maven-plugin" "$PROJECT_ROOT/pom.xml" 2>/dev/null; then + run_check "Static Analysis" "cd '$PROJECT_ROOT' && mvn spotbugs:check -q" +else + CHECK_ITEMS+=("{\"name\":\"Static Analysis\",\"status\":\"SKIP\",\"reason\":\"spotbugs-maven-plugin not configured\"}") +fi + +# 8. Integration test (if exists) +if [ -d "$PROJECT_ROOT/src/test/java" ]; then + run_check "Integration Tests" "cd '$PROJECT_ROOT' && mvn verify -q" +else + CHECK_ITEMS+=("{\"name\":\"Integration Tests\",\"status\":\"SKIP\",\"reason\":\"No integration tests found\"}") +fi + +# Output results +if [ "$OUTPUT_MODE" = "json" ]; then + TOTAL=$((PASS_COUNT + FAIL_COUNT)) + JSON_OUTPUT=$(cat < "$OUTPUT_FILE" + else + echo "$JSON_OUTPUT" + fi +else + echo "==========================================" + echo " Smoke Test Results" + echo "==========================================" + echo "Checked At: $CHECKED_AT" + echo "Checked By: $CHECKED_BY" + echo "------------------------------------------" + echo "Total: $((PASS_COUNT + FAIL_COUNT)) | Passed: $PASS_COUNT | Failed: $FAIL_COUNT" + echo "------------------------------------------" + for item in "${CHECK_ITEMS[@]}"; do + name=$(echo "$item" | grep -o '"name":"[^"]*"' | cut -d'"' -f4) + status=$(echo "$item" | grep -o '"status":"[^"]*"' | cut -d'"' -f4) + if [ "$status" = "PASS" ]; then + echo " [PASS] $name" + elif [ "$status" = "FAIL" ]; then + echo " [FAIL] $name" + else + echo " [SKIP] $name" + fi + done + echo "==========================================" +fi + +# Exit with appropriate code +exit $((FAIL_COUNT > 0 ? 1 : 0))