#!/usr/bin/env bash # Regenerates every file in docs/output/. # # docs/output/00, 01, 02, 04, 05 come straight from `mvn test` -- the four committed test # classes write them via Capture.write() as a side effect of their own assertions. # # docs/output/03, 06, 07 come from three scratch classes that are deliberately NOT part of the # committed suite (a bogus display-name placeholder, and two deterministic "flaky test" demos). # This script recreates them in a throwaway directory, compiles and runs them against the # JUnit Platform Console Standalone launcher, captures the real output, and cleans up -- so the # committed suite stays green at 14/14 while every number in docs/output/ still traces back to a # real run. # # Requires: JDK 17+ on PATH (JUnit 6 requires Java 17; this module was built on JDK 25), network # access to download the console-standalone jar on first run. set -euo pipefail cd "$(dirname "$0")/.." JUNIT_VERSION="6.1.3" JAR_DIR="$(mktemp -d)" STANDALONE_JAR="${JAR_DIR}/junit-platform-console-standalone-${JUNIT_VERSION}.jar" trap 'rm -rf "${JAR_DIR}"' EXIT echo "== 1/3: committed suite (mvn test) ==" mvn -q test mvn test > "${JAR_DIR}/full-run.txt" 2>&1 || true grep -v '^Picked up JAVA_TOOL_OPTIONS' "${JAR_DIR}/full-run.txt" | tail -20 > docs/output/00-full-test-run.txt sed -i '1i# mvn test -- full committed suite (ReliabilityTest, CustomNameTest, LifecycleTest, MetadataTest)\n' docs/output/00-full-test-run.txt echo "== 2/3: downloading junit-platform-console-standalone ${JUNIT_VERSION} ==" curl -fsSL -o "${STANDALONE_JAR}" \ "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console-standalone/${JUNIT_VERSION}/junit-platform-console-standalone-${JUNIT_VERSION}.jar" echo "== 3/3: scratch classes (written, run, captured, discarded) ==" SCRATCH_SRC="${JAR_DIR}/scratch-src" SCRATCH_CLASSES="${JAR_DIR}/scratch-classes" PKG_DIR="${SCRATCH_SRC}/com/ankurm/tutorials/junit/repeated" mkdir -p "${PKG_DIR}" "${SCRATCH_CLASSES}" cat > "${PKG_DIR}/ScratchPlaceholderTest.java" <<'EOF' package com.ankurm.tutorials.junit.repeated; import org.junit.jupiter.api.RepeatedTest; class ScratchPlaceholderTest { @RepeatedTest(value = 2, name = "{shortDisplayname} test") void bogusPlaceholderTest() { } } EOF cat > "${PKG_DIR}/FlakyDetectionDemoTest.java" <<'EOF' package com.ankurm.tutorials.junit.repeated; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.RepetitionInfo; import static org.junit.jupiter.api.Assertions.fail; class FlakyDetectionDemoTest { @RepeatedTest(10) void intermittentRaceCondition(RepetitionInfo info) { int current = info.getCurrentRepetition(); if (current == 4 || current == 8) { fail("simulated race condition reproduced on repetition " + current); } } } EOF cat > "${PKG_DIR}/FailureThresholdStopsRemainingDemoTest.java" <<'EOF' package com.ankurm.tutorials.junit.repeated; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.RepetitionInfo; import static org.junit.jupiter.api.Assertions.fail; class FailureThresholdStopsRemainingDemoTest { @RepeatedTest(value = 10, failureThreshold = 2) void intermittentRaceCondition(RepetitionInfo info) { int current = info.getCurrentRepetition(); if (current == 4 || current == 8) { fail("simulated race condition reproduced on repetition " + current); } } } EOF javac -cp "${STANDALONE_JAR}" -d "${SCRATCH_CLASSES}" "${PKG_DIR}"/*.java run_scratch() { # These scratch runs are EXPECTED to report test failures (that's the point of 06 and 07), # so capture output via command substitution with `|| true` rather than a raw pipe -- under # `set -o pipefail` a piped non-zero exit from `java` would otherwise abort this script. local class_name="$1" out_file="$2" header="$3" raw_out raw_out="$(java -jar "${STANDALONE_JAR}" execute \ -cp "${SCRATCH_CLASSES}" \ --select-class="com.ankurm.tutorials.junit.repeated.${class_name}" \ --details=tree --disable-ansi-colors 2>&1 || true)" { echo "${header}" echo printf '%s\n' "${raw_out}" | grep -v '^Picked up JAVA_TOOL_OPTIONS' } > "docs/output/${out_file}" } run_scratch "ScratchPlaceholderTest" "03-bogus-placeholder-scratch.txt" \ "# Scratch run: {shortDisplayname} is not a real placeholder (ScratchPlaceholderTest, removed before commit)" run_scratch "FlakyDetectionDemoTest" "06-flaky-detected.txt" \ "# Scratch run: @RepeatedTest with no failureThreshold -- all 10 repetitions still run even though 2 fail (FlakyDetectionDemoTest, removed before commit)" run_scratch "FailureThresholdStopsRemainingDemoTest" "07-failure-threshold-skips-remaining.txt" \ "# Scratch run: @RepeatedTest(failureThreshold = 2) -- after the 2nd failure (repetition 8), repetitions 9 and 10 are SKIPPED, not invoked (FailureThresholdStopsRemainingDemoTest, removed before commit)" echo "Done -- docs/output/ regenerated."