diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index ce2e5b3abf..f779e29039 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -26,24 +26,69 @@ env: MAX_TEST_ATTEMPTS: 3 jobs: - set-up-functional-test: - name: Set up functional test + test-setup: + name: Test setup runs-on: ubuntu-latest outputs: - shard_indices: ${{ steps.generate_output.outputs.shard_indices }} - total_shards: ${{ steps.generate_output.outputs.shards }} - github_timeout: ${{ steps.generate_output.outputs.github_timeout }} - test_timeout: ${{ steps.generate_output.outputs.test_timeout }} - runs_on: ${{ steps.generate_output.outputs.runs_on }} - runner_x64: ${{ steps.generate_output.outputs.runner_x64 }} - runner_arm: ${{ steps.generate_output.outputs.runner_arm }} + job_matrix: ${{ steps.build_matrix.outputs.job_matrix }} + full_test_reason: ${{ steps.determine_scope.outputs.full_test_reason }} + runner_x64: ${{ steps.configure_runners.outputs.runner_x64 }} + runner_arm: ${{ steps.configure_runners.outputs.runner_arm }} steps: - - id: generate_output + - name: Checkout Code + uses: actions/checkout@v6 + with: + token: ${{ secrets.GITHUB_TOKEN }} + ref: ${{ env.COMMIT }} + fetch-depth: 0 + + - name: Fetch base branch + if: ${{ github.event_name == 'pull_request' }} + run: git fetch origin ${{ github.event.pull_request.base.ref }}:${{ github.event.pull_request.base.ref }} + + - name: Compute merge base + if: ${{ github.event_name == 'pull_request' }} + run: | + MERGE_BASE="$(git merge-base "${{ env.COMMIT }}" "${{ github.event.pull_request.base.ref }}")" + echo "MERGE_BASE=${MERGE_BASE}" >> "$GITHUB_ENV" + + - name: Determine test scope + id: determine_scope run: | - shards=3 - timeout=35 # update this to TEST_TIMEOUT if you update the Makefile + FULL_TEST_REASON="" + + event_name="${{ github.event_name }}" + labels='${{ toJson(github.event.pull_request.labels.*.name) }}' + merge_base="${MERGE_BASE:-}" + + echo "event_name=$event_name" + echo "labels=$labels" + echo "merge_base=$merge_base" + + # Push events (main, release branches) run all tests on all DBs + if [[ "$event_name" == "push" ]]; then + FULL_TEST_REASON="Running full tests on all DBs (push event)." + # Check for test-all-dbs label + elif echo "$labels" | jq -e 'any(. == "test-all-dbs")' > /dev/null 2>&1; then + FULL_TEST_REASON="Running full tests on all DBs (test-all-dbs label)." + # Check for persistence code changes + elif [[ -n "$merge_base" ]]; then + echo "Changed persistence files:" + git diff --name-only "$merge_base" "$COMMIT" | grep -E "^(common/persistence/|schema/)" || echo "(none)" + if git diff --name-only "$merge_base" "$COMMIT" | grep -qE "^(common/persistence/|schema/)"; then + FULL_TEST_REASON="Running full tests on all DBs (persistence code changes)." + fi + fi + + echo "full_test_reason=$FULL_TEST_REASON" >> "$GITHUB_OUTPUT" - # Runner configuration: use 8-core runners for temporalio org, standard runners for forks + - name: ${{ steps.determine_scope.outputs.full_test_reason && 'ℹ️ Full tests' || 'ℹ️ Smoke tests' }} + run: echo "::notice::${{ steps.determine_scope.outputs.full_test_reason || 'Running smoke tests on extended DBs. Add the test-all-dbs label to run all tests on all DBs.' }}" + + - name: Configure runners + id: configure_runners + run: | + # Use 8-core runners for temporalio org, standard runners for forks if [[ "${{ github.repository_owner }}" == "temporalio" ]]; then runner_x64="ubuntu-latest-8-cores" runner_arm="ubuntu-24.04-arm64-8-cores" @@ -51,25 +96,164 @@ jobs: runner_x64="ubuntu-latest" runner_arm="ubuntu-24.04-arm" fi - runs_on="[\"${runner_x64}\"]" { - echo "shard_indices=[ $(seq -s, 0 $((shards-1))) ]" - echo "shards=$shards" - echo "github_timeout=$((timeout+5))" - echo "test_timeout=${timeout}m" - echo "runs_on=$runs_on" echo "runner_x64=$runner_x64" echo "runner_arm=$runner_arm" } >> "$GITHUB_OUTPUT" + # Primary DBs always get full tests (5 jobs), extended DBs get smoke tests (1 job) in abridged PRs. + - name: Build job matrix + id: build_matrix + env: + FULL_TEST_REASON: ${{ steps.determine_scope.outputs.full_test_reason }} + DB_CONFIGS: | + cass_es: + persistence_type: nosql + persistence_driver: cassandra + containers: [cassandra, elasticsearch] + cass_es8: + persistence_type: nosql + persistence_driver: cassandra + containers: [cassandra, elasticsearch8] + cass_os2: + persistence_type: nosql + persistence_driver: cassandra + containers: [cassandra, opensearch2] + cass_os3: + persistence_type: nosql + persistence_driver: cassandra + containers: [cassandra, opensearch3] + sqlite: + persistence_type: sql + persistence_driver: sqlite + containers: [] + arch: arm + mysql8: + persistence_type: sql + persistence_driver: mysql8 + containers: [mysql] + postgres12: + persistence_type: sql + persistence_driver: postgres12 + containers: [postgresql] + postgres12_pgx: + persistence_type: sql + persistence_driver: postgres12_pgx + containers: [postgresql] + PRIMARY_DBS: | + - cass_os3 + - sqlite + EXTENDED_DBS: | + - cass_es + - cass_es8 + - cass_os2 + - mysql8 + - postgres12 + - postgres12_pgx + SMOKE_TESTS: | + - TestWorkflowTestSuite + - TestSignalWorkflowTestSuite + - TestActivityTestSuite/TestActivityHeartBeatWorkflow_Success + run: | + DB_CONFIGS=$(yq -o=json <<< "$DB_CONFIGS") + db_config() { jq -c ".[\"$1\"]" <<< "$DB_CONFIGS"; } + + readarray -t PRIMARY_DBS < <(yq -r '.[]' <<< "$PRIMARY_DBS") + readarray -t EXTENDED_DBS < <(yq -r '.[]' <<< "$EXTENDED_DBS") + + SMOKE_TEST_ARGS="'-run=$(yq -r '.[]' <<< "$SMOKE_TESTS" | paste -sd'|')'" + + MATRIX="[]" + + add_full_jobs() { + local db=$1 + local config + config=$(db_config "$db") + + # Shard 1-3: regular functional tests with sharding + for shard in 1 2 3; do + MATRIX=$(jq -c \ + ". + [\$config + { + name: \"$db\", + display_name: \"shard$shard\", + cmd: \"make functional-test-coverage\", + shard_index: $((shard - 1)), + total_shards: 3, + test_timeout: \"35m\", + github_timeout: 40 + }]" \ + --argjson config "$config" \ + <<< "$MATRIX") + done + + # NDC + MATRIX=$(jq -c \ + ". + [\$config + { + name: \"$db\", + display_name: \"ndc\", + cmd: \"make functional-test-ndc-coverage\", + test_timeout: \"15m\", + github_timeout: 20 + }]" \ + --argjson config "$config" \ + <<< "$MATRIX") + + # XDC + MATRIX=$(jq -c \ + ". + [\$config + { + name: \"$db\", + display_name: \"xdc\", + cmd: \"make functional-test-xdc-coverage\", + test_timeout: \"35m\", + github_timeout: 40 + }]" \ + --argjson config "$config" \ + <<< "$MATRIX") + } + + add_smoke_job() { + local db=$1 + local config + config=$(db_config "$db") + MATRIX=$(jq -c \ + ". + [\$config + { + name: \"$db\", + display_name: \"smoke\", + cmd: \"make functional-test-coverage\", + test_args: \$test_args, + test_timeout: \"5m\", + github_timeout: 10 + }]" \ + --argjson config "$config" \ + --arg test_args "$SMOKE_TEST_ARGS" \ + <<< "$MATRIX") + } + + # Schedule jobs for primary databases + for db in "${PRIMARY_DBS[@]}"; do + add_full_jobs "$db" + done + + # Schedule jobs for extended databases + for db in "${EXTENDED_DBS[@]}"; do + if [[ -n "$FULL_TEST_REASON" ]]; then + add_full_jobs "$db" + else + add_smoke_job "$db" + fi + done + + echo "job_matrix=$MATRIX" >> "$GITHUB_OUTPUT" + echo "Generated $(jq length <<< "$MATRIX") jobs" + pre-build: name: Pre-build for cache (${{ matrix.arch }}) - needs: set-up-functional-test + needs: test-setup strategy: matrix: arch: [x64, arm] - runs-on: ${{ matrix.arch == 'arm' && needs.set-up-functional-test.outputs.runner_arm || needs.set-up-functional-test.outputs.runner_x64 }} + runs-on: ${{ matrix.arch == 'arm' && needs.test-setup.outputs.runner_arm || needs.test-setup.outputs.runner_x64 }} steps: - uses: actions/checkout@v6 with: @@ -105,8 +289,8 @@ jobs: misc-checks: name: Misc checks - needs: [pre-build, set-up-functional-test] - runs-on: ${{ needs.set-up-functional-test.outputs.runner_x64 }} + needs: [pre-build, test-setup] + runs-on: ${{ needs.test-setup.outputs.runner_x64 }} steps: - uses: actions/checkout@v6 with: @@ -144,8 +328,8 @@ jobs: unit-test: name: Unit test - needs: [pre-build, set-up-functional-test] - runs-on: ${{ needs.set-up-functional-test.outputs.runner_x64 }} + needs: [pre-build, test-setup] + runs-on: ${{ needs.test-setup.outputs.runner_x64 }} steps: - uses: actions/checkout@v6 with: @@ -174,8 +358,8 @@ jobs: run: TEST_TIMEOUT=15m make unit-test-coverage - name: Generate crash report - if: failure() - run: | # if the tests failed, we would expect one JUnit XML report per attempt; otherwise it must have crashed + if: failure() # if the tests failed, we would expect one JUnit XML report per attempt; otherwise it must have crashed + run: | [ "$(find .testoutput -maxdepth 1 -name 'junit.*.xml' | wc -l)" -lt "$MAX_TEST_ATTEMPTS" ] && CRASH_REPORT_NAME="$GITHUB_JOB" make report-test-crash @@ -217,8 +401,8 @@ jobs: integration-test: name: Integration test - needs: [pre-build, set-up-functional-test] - runs-on: ${{ needs.set-up-functional-test.outputs.runner_x64 }} + needs: [pre-build, test-setup] + runs-on: ${{ needs.test-setup.outputs.runner_x64 }} steps: - uses: actions/checkout@v6 with: @@ -257,8 +441,8 @@ jobs: run: make integration-test-coverage - name: Generate crash report - if: failure() - run: | # if the tests failed, we would expect one JUnit XML report per attempt; otherwise it must have crashed + if: failure() # if the tests failed, we would expect one JUnit XML report per attempt; otherwise it must have crashed + run: | [ "$(find .testoutput -maxdepth 1 -name 'junit.*.xml' | wc -l)" -lt "$MAX_TEST_ATTEMPTS" ] && CRASH_REPORT_NAME="$GITHUB_JOB" make report-test-crash @@ -303,69 +487,21 @@ jobs: run: | docker compose -f ${{ env.DOCKER_COMPOSE_FILE }} down -v - # Root job name includes matrix details so it is unique per shard. + # Root job name includes matrix details so it is unique per shard/smoke test. # This MUST stay in sync with the `job_name` passed to the job-id action below. functional-test: # Display name shown in the UI. The job-id lookup uses this exact value. - name: Functional test (${{ matrix.name }}, shard ${{ matrix.shard_index }}) - needs: [pre-build, set-up-functional-test] + name: Functional test (${{ matrix.name }}, ${{ matrix.display_name }}) + needs: [pre-build, test-setup] strategy: fail-fast: false matrix: - name: - - cass_es - - cass_es8 - - cass_os2 - - cass_os3 - - sqlite - - mysql8 - - postgres12 - - postgres12_pgx - shard_index: ${{ fromJson(needs.set-up-functional-test.outputs.shard_indices) }} - runs-on: ${{ fromJson(needs.set-up-functional-test.outputs.runs_on) }} - include: - - name: cass_es - persistence_type: nosql - persistence_driver: cassandra - containers: [cassandra, elasticsearch] - es_version: v7 - - name: cass_es8 - persistence_type: nosql - persistence_driver: cassandra - containers: [cassandra, elasticsearch8] - es_version: v8 - - name: cass_os2 - persistence_type: nosql - persistence_driver: cassandra - containers: [cassandra, opensearch2] - - name: cass_os3 - persistence_type: nosql - persistence_driver: cassandra - containers: [cassandra, opensearch3] - - name: sqlite - persistence_type: sql - persistence_driver: sqlite - containers: [] - arch: arm - - name: mysql8 - persistence_type: sql - persistence_driver: mysql8 - containers: [mysql] - - name: postgres12 - persistence_type: sql - persistence_driver: postgres12 - containers: [postgresql] - - name: postgres12_pgx - persistence_type: sql - persistence_driver: postgres12_pgx - containers: [postgresql] - runs-on: ${{ matrix.arch == 'arm' && needs.set-up-functional-test.outputs.runner_arm || needs.set-up-functional-test.outputs.runner_x64 }} + include: ${{ fromJson(needs.test-setup.outputs.job_matrix) }} + runs-on: ${{ matrix.arch == 'arm' && needs.test-setup.outputs.runner_arm || needs.test-setup.outputs.runner_x64 }} env: - TEST_TOTAL_SHARDS: ${{ needs.set-up-functional-test.outputs.total_shards }} - TEST_SHARD_INDEX: ${{ matrix.shard_index }} PERSISTENCE_TYPE: ${{ matrix.persistence_type }} PERSISTENCE_DRIVER: ${{ matrix.persistence_driver }} - TEST_TIMEOUT: ${{ needs.set-up-functional-test.outputs.test_timeout }} + TEST_TIMEOUT: ${{ matrix.test_timeout }} steps: - uses: ScribeMD/docker-cache@0.3.7 with: @@ -405,20 +541,27 @@ jobs: id: get_job_id uses: ./.github/actions/get-job-id with: - job_name: Functional test (${{ matrix.name }}, shard ${{ matrix.shard_index }}) + job_name: Functional test (${{ matrix.name }}, ${{ matrix.display_name }}) run_id: ${{ github.run_id }} + - name: ${{ matrix.display_name == 'smoke' && 'ℹ️ Smoke test' || 'ℹ️ Full test' }} + run: echo "::notice::${{ matrix.display_name == 'smoke' && 'This is a smoke test. Add the test-all-dbs label to run all tests on all DBs.' || needs.test-setup.outputs.full_test_reason }}" + - name: Run functional test - timeout-minutes: ${{ fromJSON(needs.set-up-functional-test.outputs.github_timeout) }} # make sure this is larger than the test timeout in the Makefile - run: ./develop/github/monitor_test.sh make functional-test-coverage + timeout-minutes: ${{ matrix.github_timeout }} + run: ./develop/github/monitor_test.sh ${{ matrix.cmd }} + env: + TEST_TOTAL_SHARDS: ${{ matrix.total_shards || '' }} + TEST_SHARD_INDEX: ${{ matrix.shard_index || '' }} + TEST_ARGS: ${{ matrix.test_args || '' }} - name: Print memory snapshot if: always() run: if [ -f /tmp/memory_snapshot.txt ]; then cat /tmp/memory_snapshot.txt; fi - name: Generate crash report - if: failure() - run: | # if the tests failed, we would expect one JUnit XML report per attempt; otherwise it must have crashed + if: failure() # if the tests failed, we would expect one JUnit XML report per attempt; otherwise it must have crashed + run: | [ "$(find .testoutput -maxdepth 1 -name 'junit.*.xml' | wc -l)" -lt "$MAX_TEST_ATTEMPTS" ] && CRASH_REPORT_NAME="$GITHUB_JOB" make report-test-crash @@ -453,282 +596,7 @@ jobs: uses: actions/upload-artifact@v4.4.3 if: ${{ !cancelled() }} with: - name: junit-xml--${{github.run_id}}--${{ steps.get_job_id.outputs.job_id }}--${{github.run_attempt}}--${{matrix.name}}--${{matrix.shard_index}}--functional-test - path: ./.testoutput/junit.*.xml - include-hidden-files: true - retention-days: 28 - - # XDC matrix job. Include `${{ matrix.name }}` in the display name so each - # matrix variant has a unique name for the job-id lookup. - functional-test-xdc: - # Display name shown in the UI. The job-id lookup uses this exact value. - name: Functional test xdc (${{ matrix.name }}) - needs: [pre-build, set-up-functional-test] - strategy: - fail-fast: false - matrix: - name: - - cass_es - - cass_es8 - - cass_os2 - - cass_os3 - - mysql8 - - postgres12 - - postgres12_pgx - include: - - name: cass_es - persistence_type: nosql - persistence_driver: elasticsearch - parallel_flags: "" - containers: [cassandra, elasticsearch] - - name: cass_es8 - persistence_type: nosql - persistence_driver: elasticsearch - parallel_flags: "" - containers: [cassandra, elasticsearch8] - - name: cass_os2 - persistence_type: nosql - persistence_driver: cassandra - containers: [cassandra, opensearch2] - - name: cass_os3 - persistence_type: nosql - persistence_driver: cassandra - containers: [cassandra, opensearch3] - - name: mysql8 - persistence_type: sql - persistence_driver: mysql8 - parallel_flags: "" - containers: [mysql] - - name: postgres12 - persistence_type: sql - persistence_driver: postgres12 - parallel_flags: "-parallel=2" # reduce parallelism for postgres - containers: [postgresql] - - name: postgres12_pgx - persistence_type: sql - persistence_driver: postgres12_pgx - parallel_flags: "-parallel=2" # reduce parallelism for postgres - containers: [postgresql] - runs-on: ${{ needs.set-up-functional-test.outputs.runner_x64 }} - env: - PERSISTENCE_TYPE: ${{ matrix.persistence_type }} - PERSISTENCE_DRIVER: ${{ matrix.persistence_driver }} - TEST_PARALLEL_FLAGS: ${{ matrix.parallel_flags }} - steps: - - uses: actions/checkout@v6 - with: - token: ${{ secrets.GITHUB_TOKEN }} - ref: ${{ env.COMMIT }} - # Resolve the numeric job ID for this job instance. - # IMPORTANT: `job_name` must exactly match the job's display name above. - - name: Get job ID - id: get_job_id - uses: ./.github/actions/get-job-id - with: - job_name: Functional test xdc (${{ matrix.name }}) - run_id: ${{ github.run_id }} - - - name: Start containerized dependencies - uses: hoverkraft-tech/compose-action@v2.0.1 - with: - compose-file: ${{ env.DOCKER_COMPOSE_FILE }} - services: "${{ join(matrix.containers, '\n') }}" - down-flags: -v - - - uses: actions/setup-go@v6 - with: - go-version-file: "go.mod" - cache: false # do our own caching - - - name: Restore dependencies - uses: actions/cache/restore@v4 - with: - path: ~/go/pkg/mod - key: go-${{ runner.os }}${{ runner.arch }}-${{ hashFiles('go.mod') }}-deps-${{ hashFiles('go.sum') }} - - - name: Restore build outputs - uses: actions/cache/restore@v4 - with: - path: ~/.cache/go-build - key: go-${{ runner.os }}${{ runner.arch }}-build-${{ env.COMMIT }} - - - name: Run functional test xdc - timeout-minutes: 35 # update this to TEST_TIMEOUT+5 if you update the Makefile - run: ./develop/github/monitor_test.sh make functional-test-xdc-coverage - - - name: Print memory snapshot - if: always() - run: if [ -f /tmp/memory_snapshot.txt ]; then cat /tmp/memory_snapshot.txt; fi - - - name: Generate crash report - if: failure() - run: | # if the tests failed, we would expect one JUnit XML report per attempt; otherwise it must have crashed - [ "$(find .testoutput -maxdepth 1 -name 'junit.*.xml' | wc -l)" -lt "$MAX_TEST_ATTEMPTS" ] && - CRASH_REPORT_NAME="$GITHUB_JOB" make report-test-crash - - - name: Generate test summary - uses: mikepenz/action-junit-report@v5.0.0-rc01 - if: failure() - with: - report_paths: ./.testoutput/junit.*.xml - detailed_summary: true - check_annotations: false - annotate_only: true - skip_annotations: true - - - name: Upload code coverage to Codecov - uses: codecov/codecov-action@v5 - with: - token: ${{ secrets.CODECOV_TOKEN }} - directory: ./.testoutput - flags: functional-test-xdc - - - name: Upload test results to Codecov - if: ${{ !cancelled() }} - uses: codecov/codecov-action@v5 - with: - token: ${{ secrets.CODECOV_TOKEN }} - directory: ./.testoutput - flags: functional-test-xdc - report_type: test_results - - - name: Upload test results to GitHub - # Can't pin to major because the action linter doesn't recognize the include-hidden-files flag. - uses: actions/upload-artifact@v4.4.3 - if: ${{ !cancelled() }} - with: - name: junit-xml--${{github.run_id}}--${{ steps.get_job_id.outputs.job_id }}--${{github.run_attempt}}--${{matrix.name}}--functional-test-xdc - path: ./.testoutput - include-hidden-files: true - retention-days: 28 - - # NDC matrix job. Include `${{ matrix.name }}` in the display name so each - # matrix variant has a unique name for the job-id lookup. - functional-test-ndc: - # Display name shown in the UI. The job-id lookup uses this exact value. - name: Functional test ndc (${{ matrix.name }}) - needs: [pre-build, set-up-functional-test] - strategy: - fail-fast: false - matrix: - name: - - cass_es - - cass_es8 - - cass_os2 - - cass_os3 - - mysql8 - - postgres12 - - postgres12_pgx - include: - - name: cass_es - persistence_type: nosql - persistence_driver: elasticsearch - containers: [cassandra, elasticsearch] - es_version: v7 - - name: cass_es8 - persistence_type: nosql - persistence_driver: elasticsearch - containers: [cassandra, elasticsearch8] - es_version: v8 - - name: cass_os2 - persistence_type: nosql - persistence_driver: cassandra - containers: [cassandra, opensearch2] - - name: cass_os3 - persistence_type: nosql - persistence_driver: cassandra - containers: [cassandra, opensearch3] - - name: mysql8 - persistence_type: sql - persistence_driver: mysql8 - containers: [mysql] - - name: postgres12 - persistence_type: sql - persistence_driver: postgres12 - containers: [postgresql] - - name: postgres12_pgx - persistence_type: sql - persistence_driver: postgres12_pgx - containers: [postgresql] - runs-on: ${{ needs.set-up-functional-test.outputs.runner_x64 }} - env: - PERSISTENCE_TYPE: ${{ matrix.persistence_type }} - PERSISTENCE_DRIVER: ${{ matrix.persistence_driver }} - ES_VERSION: ${{ matrix.es_version }} - steps: - - uses: actions/checkout@v6 - with: - token: ${{ secrets.GITHUB_TOKEN }} - ref: ${{ env.COMMIT }} - # Resolve the numeric job ID for this job instance. - # IMPORTANT: `job_name` must exactly match the job's display name above. - - name: Get job ID - id: get_job_id - uses: ./.github/actions/get-job-id - with: - job_name: Functional test ndc (${{ matrix.name }}) - run_id: ${{ github.run_id }} - - - name: Start containerized dependencies - uses: hoverkraft-tech/compose-action@v2.0.1 - with: - compose-file: ${{ env.DOCKER_COMPOSE_FILE }} - services: "${{ join(matrix.containers, '\n') }}" - down-flags: -v - - - uses: actions/setup-go@v6 - with: - go-version-file: "go.mod" - cache: false # do our own caching - - - name: Restore dependencies - uses: actions/cache/restore@v4 - with: - path: ~/go/pkg/mod - key: go-${{ runner.os }}${{ runner.arch }}-${{ hashFiles('go.mod') }}-deps-${{ hashFiles('go.sum') }} - - - name: Restore build outputs - uses: actions/cache/restore@v4 - with: - path: ~/.cache/go-build - key: go-${{ runner.os }}${{ runner.arch }}-build-${{ env.COMMIT }} - - - name: Run functional test ndc - timeout-minutes: 15 - run: ./develop/github/monitor_test.sh make functional-test-ndc-coverage - - - name: Print memory snapshot - if: always() - run: if [ -f /tmp/memory_snapshot.txt ]; then cat /tmp/memory_snapshot.txt; fi - - - name: Generate crash report - if: failure() - run: | # if the tests failed, we would expect one JUnit XML report per attempt; otherwise it must have crashed - [ "$(find .testoutput -maxdepth 1 -name 'junit.*.xml' | wc -l)" -lt "$MAX_TEST_ATTEMPTS" ] && - CRASH_REPORT_NAME="$GITHUB_JOB" make report-test-crash - - - name: Upload code coverage to Codecov - uses: codecov/codecov-action@v5 - with: - token: ${{ secrets.CODECOV_TOKEN }} - directory: ./.testoutput - flags: functional-test-ndc - - - name: Upload test results to Codecov - if: ${{ !cancelled() }} - uses: codecov/codecov-action@v5 - with: - token: ${{ secrets.CODECOV_TOKEN }} - directory: ./.testoutput - flags: functional-test-ndc - report_type: test_results - - - name: Upload test results to GitHub - # Can't pin to major because the action linter doesn't recognize the include-hidden-files flag. - uses: actions/upload-artifact@v4.4.3 - if: ${{ !cancelled() }} - with: - name: junit-xml--${{github.run_id}}--${{ steps.get_job_id.outputs.job_id }}--${{github.run_attempt}}--${{matrix.name}}--functional-test-ndc + name: junit-xml--${{github.run_id}}--${{ steps.get_job_id.outputs.job_id }}--${{github.run_attempt}}--${{matrix.name}}--${{ matrix.display_name }}--functional-test path: ./.testoutput/junit.*.xml include-hidden-files: true retention-days: 28 @@ -741,8 +609,6 @@ jobs: - unit-test - integration-test - functional-test - - functional-test-xdc - - functional-test-ndc runs-on: ubuntu-latest env: RESULTS: ${{ toJSON(needs.*.result) }} diff --git a/tests/namespace_delete_test.go b/tests/namespace_delete_test.go index d2709a4e9c..3e5c8003a6 100644 --- a/tests/namespace_delete_test.go +++ b/tests/namespace_delete_test.go @@ -4,12 +4,10 @@ import ( "context" "errors" "fmt" - "os" "strconv" "testing" "time" - "github.com/dgryski/go-farm" "github.com/google/uuid" "github.com/stretchr/testify/suite" commonpb "go.temporal.io/api/common/v1" @@ -394,35 +392,6 @@ func (s *namespaceTestSuite) Test_NamespaceDelete_CrossNamespaceChild() { // Delete second namespace and verify that parent received child termination signal. } -// checkTestShard supports test sharding based on environment variables. -func (s *namespaceTestSuite) checkTestShard() { - totalStr := os.Getenv("TEST_TOTAL_SHARDS") - indexStr := os.Getenv("TEST_SHARD_INDEX") - if totalStr == "" || indexStr == "" { - return - } - total, err := strconv.Atoi(totalStr) - if err != nil || total < 1 { - s.T().Fatal("Couldn't convert TEST_TOTAL_SHARDS") - } - index, err := strconv.Atoi(indexStr) - if err != nil || index < 0 || index >= total { - s.T().Fatal("Couldn't convert TEST_SHARD_INDEX") - } - - // This was determined empirically to distribute our existing test names - // reasonably well. This can be adjusted from time to time. - // For parallelism 4, use 11. For 3, use 26. For 2, use 20. - const salt = "-salt-26" - - nameToHash := s.T().Name() + salt - testIndex := int(farm.Fingerprint32([]byte(nameToHash))) % total - if testIndex != index { - s.T().Skipf("Skipping %s in test shard %d/%d (it runs in %d)", s.T().Name(), index+1, total, testIndex+1) - } - s.T().Logf("Running %s in test shard %d/%d", s.T().Name(), index+1, total) -} - func (s *namespaceTestSuite) Test_NamespaceDelete_Protected() { ctx := context.Background()