Skip to content

Add support for checking out non-existent branches in JUnit reports w… #119

Add support for checking out non-existent branches in JUnit reports w…

Add support for checking out non-existent branches in JUnit reports w… #119

name: Integration tests
on:
push:
branches: [ "**" ]
concurrency:
group: integration-test-${{ github.ref }}
cancel-in-progress: true
env:
split-total: 4
jobs:
checkout-junit-reports-test:
name: Checkout JUnit reports
runs-on: ubuntu-latest
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- name: Create JUnit reports branch
run: |
BRANCH=junit-reports-it-${{ github.sha }}-download
echo "Creating branch $BRANCH"
git switch --orphan $BRANCH
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor }}@users.noreply.github.com"
touch first.xml
git add *.xml
git commit -m "Initial commit for JUnit reports branch"
SHA=$(git rev-parse HEAD)
git push origin --set-upstream $BRANCH
git switch ${{ github.ref_name }}
echo "Saving expexted JUnit reports SHA $SHA"
echo "expected-junit-reports-sha=${SHA}" >> "$GITHUB_ENV"
- name: Checkout JUnit reports (split-index 1)
uses: ./checkout-junit-reports
with:
split-index: 1
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-first-index-1
- name: Checkout JUnit reports (split-index 0a)
uses: ./checkout-junit-reports
with:
split-index: 0
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-first-index-0
- name: Checkout JUnit reports (split-index 2)
uses: ./checkout-junit-reports
with:
split-index: 2
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-first-index-2
- name: Checkout JUnit reports (split-index 0b)
uses: ./checkout-junit-reports
with:
split-index: 0
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-first-index-3
- name: Checkout JUnit reports (split-index 0c)
uses: ./checkout-junit-reports
with:
split-index: 0
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-first-index-4
upload-artifact: false
- name: Assert JUnit reports
run: |
for SPLIT_INDEX in {0..3}; do
echo "Checking JUnit reports for split-index $SPLIT_INDEX"
cd junit-reports-first-index-$SPLIT_INDEX
REPORT_FILE="first.xml"
if [[ ! -f "$REPORT_FILE" ]]; then
echo "Error: JUnit report $REPORT_FILE not found!"
ls -l
exit 1
fi
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 1 ]]; then
echo "Error: Expected 1 JUnit reports, but found $FILE_COUNT files!"
ls -l
exit 1
fi
cd ..
done
- name: Update JUnit reports
working-directory: junit-reports-first-index-0
run: |
touch second.xml
git add *.xml
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor }}@users.noreply.github.com"
git commit -m "Second commit for JUnit reports branch"
git push origin HEAD:junit-reports-it-${{ github.sha }}-download
- name: Download JUnit reports
uses: ./checkout-junit-reports
with:
split-index: 0
git-branch: junit-reports-it-${{ github.sha }}-download
path: junit-reports-second
- name: Assert JUnit reports
working-directory: junit-reports-second
run: |
REPORT_FILE="first.xml"
if [[ ! -f "$REPORT_FILE" ]]; then
echo "Error: JUnit report $REPORT_FILE not found!"
ls -l
exit 1
fi
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 1 ]]; then
echo "Error: Expected 1 JUnit reports, but found $FILE_COUNT files!"
ls -l
exit 1
fi
- name: Download JUnit reports SHA artifact
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
name: junit-xml-reports-sha
path: junit-xml-reports-sha-artifact-assertion
- name: Assert JUnit reports SHA artifact
working-directory: junit-xml-reports-sha-artifact-assertion
run: |
SHA_FILE="junit-reports-sha.txt"
if [[ ! -f "$SHA_FILE" ]]; then
echo "Error: JUnit reports SHA file $SHA_FILE not found!"
ls -l
exit 1
fi
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 1 ]]; then
echo "Error: Expected 1 JUnit reports SHA file, but found $FILE_COUNT files!"
ls -l
exit 1
fi
ARTIFACT_SHA=$(cat $SHA_FILE)
if [ "$ARTIFACT_SHA" != "${{ env.expected-junit-reports-sha }}" ]; then
echo "Error: JUnit reports SHA $ARTIFACT_SHA in artifact does not match expected SHA ${{ env.expected-junit-reports-sha }}"
exit 1
fi
- name: Clean up JUnit reports branch
if: always()
run: |
git push origin --delete junit-reports-it-${{ github.sha }}-download || true
- name: Clean up JUnit reports artifact
uses: geekyeggo/delete-artifact@f275313e70c08f6120db482d7a6b98377786765b #v5
with:
name: junit-xml-reports-sha
failOnError: false
checkout-junit-reports-nonexistent-branch-test:
name: Checkout JUnit reports with non-existent branch
runs-on: ubuntu-latest
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- name: Checkout JUnit reports (non-existent branch)
uses: ./checkout-junit-reports
with:
split-index: 0
git-branch: junit-reports-it-${{ github.sha }}-nonexistent
path: junit-reports-nonexistent-branch
upload-artifact: false
- name: Assert non-existent branch checkout
run: |
echo "Verifying that checkout with non-existent branch succeeded"
if [ ! -d "junit-reports-nonexistent-branch" ]; then
echo "Error: Directory junit-reports-nonexistent-branch was not created!"
exit 1
fi
cd junit-reports-nonexistent-branch
# Should be on the default branch, verify we have the action files
if [ ! -f "action.yml" ]; then
echo "Error: action.yml not found - checkout didn't work properly!"
ls -la
exit 1
fi
# Verify we're not on the non-existent branch
CURRENT_BRANCH=$(git branch --show-current)
if [ "$CURRENT_BRANCH" == "junit-reports-it-${{ github.sha }}-nonexistent" ]; then
echo "Error: Should not be on the non-existent branch!"
exit 1
fi
echo "Successfully verified checkout with non-existent branch stays on default branch"
generate-split-index-json:
name: Generate split indexes
runs-on: ubuntu-latest
needs:
- checkout-junit-reports-test
- checkout-junit-reports-nonexistent-branch-test
outputs:
json: ${{ steps.generate.outputs.split-index-json }}
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- name: Generate split index list
id: generate
uses: ./generate-split-index-json
with:
split-total: ${{ env.split-total }}
integration-test:
name: "Test #${{ matrix.split-index }}"
runs-on: ubuntu-latest
needs:
- generate-split-index-json
permissions:
contents: read
checks: write
strategy:
fail-fast: false
matrix:
split-index: ${{ fromjson(needs.generate-split-index-json.outputs.json) }}
env:
DOWNLOAD_JAR: false
JAR_PATH: split-tests-java/build/libs/split-tests-java.jar
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- name: Checkout split-tests-java
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
with:
repository: Donnerbart/split-tests-java
path: split-tests-java
- name: Set up JDK 21
uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5
with:
distribution: temurin
java-version: 21
- name: Set up Gradle
uses: gradle/actions/setup-gradle@ed408507eac070d1f99cc633dbcf757c94c7933a # v4
- name: Compile split-tests-java
working-directory: split-tests-java
run: ./gradlew shadowJar
- name: Split tests
id: split-tests
uses: ./
with:
split-index: ${{ matrix.split-index }}
split-total: ${{ env.split-total }}
glob: '**/integration-test/tests/*Test.java'
exclude-glob: '**/NoClassNameTest.java'
junit-glob: '**/integration-test/reports/*.xml'
format: 'list'
new-test-time: 'average'
calculate-optimal-total-split: true
debug: true
- name: Assert split tests
env:
SPLIT_INDEX: ${{ matrix.split-index }}
ACTUAL: ${{ steps.split-tests.outputs.test-suite }}
run: |
case "$SPLIT_INDEX" in
"0")
EXPECTED="de.donnerbart.example.SlowestTest"
;;
"1")
EXPECTED="NoPackageTest de.donnerbart.example.ThirdPartyLibraryTest"
;;
"2")
EXPECTED="de.donnerbart.example.NoTimingOneTest de.donnerbart.example.WhitespaceClassDefinitionTest"
;;
"3")
EXPECTED="de.donnerbart.example.NoTimingTwoTest de.donnerbart.example.SlowTest de.donnerbart.example.FastTest"
;;
*)
echo "Unexpected split index"
exit 1
;;
esac
echo "Expected: $EXPECTED"
echo "Actual: $ACTUAL"
if [ "$ACTUAL" != "$EXPECTED" ]; then
echo "The split tests are not matching"
exit 1
fi
- name: Create simulated JUnit report
run: |
mkdir -p build/reports/test-results
CLASS="de.donnerbart.example.ActionSplit${{ matrix.split-index }}Test"
FILE="build/reports/test-results/TEST-$CLASS.xml"
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > $FILE
echo "<testsuite name=\"$CLASS\" tests=\"1\" skipped=\"0\" failures=\"0\" errors=\"0\" timestamp=\"1970-01-01T00:00:00\" hostname=\"foobar\" time=\"23.42\">" >> $FILE
echo " <properties/>" >> $FILE
echo " <testcase name=\"testMethod()\" classname=\"$CLASS\" time=\"23.42\">" >> $FILE
echo " <system-out><![CDATA[00:00:00.000 [Test] INFO Test log for split ${{ matrix.split-index }}" >> $FILE
echo "00:00:00.001 [Test] INFO Done" >> $FILE
echo "]]></system-out>" >> $FILE
echo " <system-err><![CDATA[]]></system-err>" >> $FILE
echo " </testcase>" >> $FILE
echo "</testsuite>" >> $FILE
- name: Upload JUnit report artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: junit-xml-reports-${{ matrix.split-index }}
path: build/reports/test-results/*.xml
merge-junit-reports-with-existing-branch:
name: Merge JUnit reports with existing branch
runs-on: ubuntu-latest
needs:
- integration-test
permissions:
contents: write
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- name: Create JUnit reports branch
run: |
BRANCH=junit-reports-it-${{ github.sha }}-existing
echo "Creating branch $BRANCH"
git switch --orphan $BRANCH
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor }}@users.noreply.github.com"
git commit --allow-empty -m "Initial commit for JUnit reports branch"
git push origin --set-upstream $BRANCH
git switch ${{ github.ref_name }}
- name: Merge JUnit reports
uses: ./merge-junit-reports
with:
git-branch: junit-reports-it-${{ github.sha }}-existing
artifact-name: junit-xml-report-existing
split-artifact-pattern: junit-xml-reports-*
split-artifact-delete-merged: false
- name: Checkout JUnit reports
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
with:
path: junit-reports-assertion
ref: junit-reports-it-${{ github.sha }}-existing
- name: Assert JUnit reports
working-directory: junit-reports-assertion
run: |
for SPLIT_INDEX in {0..3}; do
REPORT_FILE="TEST-de.donnerbart.example.ActionSplit${SPLIT_INDEX}Test.xml"
SEARCH_STRING='name="de.donnerbart.example.ActionSplit'${SPLIT_INDEX}'Test"'
if [[ ! -f "$REPORT_FILE" ]]; then
echo "Error: JUnit report $REPORT_FILE not found!"
ls -l
exit 1
fi
if ! grep -q "$SEARCH_STRING" "$REPORT_FILE"; then
echo "Error: JUnit report $REPORT_FILE does not contain the required string '$SEARCH_STRING'!"
cat $REPORT_FILE
exit 1
fi
echo "JUnit report $REPORT_FILE is valid"
done
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 4 ]]; then
echo "Error: Expected 4 JUnit reports, but found $FILE_COUNT files!"
ls -l
exit 1
fi
- name: Clean up JUnit reports branch
if: always()
run: |
git push origin --delete junit-reports-it-${{ github.sha }}-existing || true
merge-junit-reports-with-new-branch:
name: Merge JUnit reports with new branch
runs-on: ubuntu-latest
needs:
- merge-junit-reports-with-existing-branch
permissions:
contents: write
steps:
- name: Checkout split-tests-java-action
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
- name: Merge JUnit reports
uses: ./merge-junit-reports
with:
git-branch: junit-reports-it-${{ github.sha }}-new
artifact-name: junit-xml-report-new
split-artifact-pattern: junit-xml-reports-*
- name: Checkout JUnit reports
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
with:
path: junit-reports-assertion
ref: junit-reports-it-${{ github.sha }}-new
- name: Assert JUnit reports
working-directory: junit-reports-assertion
run: |
for SPLIT_INDEX in {0..3}; do
REPORT_FILE="TEST-de.donnerbart.example.ActionSplit${SPLIT_INDEX}Test.xml"
SEARCH_STRING='name="de.donnerbart.example.ActionSplit'${SPLIT_INDEX}'Test"'
if [[ ! -f "$REPORT_FILE" ]]; then
echo "Error: JUnit report $REPORT_FILE not found!"
ls -l
exit 1
fi
if ! grep -q "$SEARCH_STRING" "$REPORT_FILE"; then
echo "Error: JUnit report $REPORT_FILE does not contain the required string '$SEARCH_STRING'!"
cat $REPORT_FILE
exit 1
fi
echo "JUnit report $REPORT_FILE is valid"
done
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 4 ]]; then
echo "Error: Expected 4 JUnit reports, but found $FILE_COUNT files!"
ls -l
exit 1
fi
- name: Download JUnit reports artifact
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5
with:
name: junit-xml-report-new
path: junit-reports-artifact-assertion
- name: Assert JUnit reports artifact
working-directory: junit-reports-artifact-assertion
run: |
for SPLIT_INDEX in {0..3}; do
REPORT_FILE="TEST-de.donnerbart.example.ActionSplit${SPLIT_INDEX}Test.xml"
SEARCH_STRING='name="de.donnerbart.example.ActionSplit'${SPLIT_INDEX}'Test"'
if [[ ! -f "$REPORT_FILE" ]]; then
echo "Error: JUnit report $REPORT_FILE not found!"
ls -l
exit 1
fi
if ! grep -q "$SEARCH_STRING" "$REPORT_FILE"; then
echo "Error: JUnit report $REPORT_FILE does not contain the required string '$SEARCH_STRING'!"
cat $REPORT_FILE
exit 1
fi
echo "JUnit report $REPORT_FILE is valid"
done
FILE_COUNT=$(ls -1 | wc -l)
if [[ "$FILE_COUNT" -ne 4 ]]; then
echo "Error: Expected 4 JUnit reports, but found $FILE_COUNT files!"
ls -l
exit 1
fi
- name: Clean up JUnit reports branch
if: always()
run: |
git push origin --delete junit-reports-it-${{ github.sha }}-new || true