[pre-commit.ci] pre-commit autoupdate #68
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --- | |
| # SPDX-License-Identifier: Apache-2.0 | |
| # SPDX-FileCopyrightText: 2024 The Linux Foundation | |
| name: Testing | |
| # yamllint disable-line rule:truthy | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: ["main"] | |
| pull_request: | |
| branches: ["main"] | |
| concurrency: | |
| group: testing-${{ github.workflow }}-${{ github.run_id }} | |
| cancel-in-progress: true | |
| jobs: | |
| shell-tests: | |
| name: "Shell Script Unit Tests" | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 3 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: "Install dependencies" | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y shellcheck jq | |
| shellcheck --version | |
| jq --version | |
| - name: "Run shellcheck on shell scripts" | |
| run: | | |
| # Check all shell scripts in the repository | |
| echo "Checking shell scripts with shellcheck..." | |
| find . -name "*.sh" -type f -print0 | while IFS= read -r -d '' script; do | |
| echo "Checking: $script" | |
| shellcheck "$script" || echo "Issues found in $script" | |
| done | |
| - name: "Test basic functionality" | |
| run: | | |
| # Test basic shell functionality and tools | |
| echo "Testing basic shell commands and tools" | |
| jq --version | |
| python3 --version | |
| - name: "Test input validation patterns" | |
| run: | | |
| # Test URL validation patterns used in workflows | |
| echo "Testing URL validation patterns" | |
| # Test basic URL pattern matching | |
| url="https://git.opendaylight.org/gerrit/c/releng/builder/+/111445" | |
| if [[ "$url" =~ ^https?://[^/]+/.* ]]; then | |
| echo "URL pattern validation passed" | |
| else | |
| echo "URL validation failed" && exit 1 | |
| fi | |
| - name: "Test workflow edge cases" | |
| run: | | |
| # Test edge cases for workflow inputs | |
| echo "Testing workflow edge case handling" | |
| # Test empty input handling | |
| empty_value="" | |
| if [[ -z "$empty_value" ]]; then | |
| echo "Empty value detection works" | |
| else | |
| echo "Empty value detection failed" && exit 1 | |
| fi | |
| matrix-tests: | |
| name: "Matrix Tests" | |
| strategy: | |
| matrix: | |
| os: [ubuntu-latest, ubuntu-22.04] | |
| action-type: [composite, reusable] | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 5 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: "Test dependencies installation" | |
| run: | | |
| python3 --version | |
| # Install jq via apt (do not use pip for jq) | |
| sudo apt-get update | |
| sudo apt-get install -y jq | |
| # Pin git-review via pip | |
| pip3 install "git-review==2.3.1" | |
| git review --version | |
| jq --version | |
| - name: "Test composite action with invalid inputs" | |
| if: matrix.action-type == 'composite' | |
| uses: ./ | |
| continue-on-error: true | |
| with: | |
| SUBMIT_SINGLE_COMMITS: "true" | |
| USE_PR_AS_COMMIT: "true" # This should fail validation | |
| GERRIT_KNOWN_HOSTS: "test-host" | |
| GERRIT_SSH_PRIVKEY_G2G: "TEST_PLACEHOLDER_NOT_REAL" | |
| GERRIT_SSH_USER_G2G: "test-user" | |
| GERRIT_SSH_USER_G2G_EMAIL: "[email protected]" | |
| ORGANIZATION: "test-org" | |
| - name: "Test composite action with missing .gitreview" | |
| if: matrix.action-type == 'composite' | |
| uses: ./ | |
| continue-on-error: true | |
| with: | |
| GERRIT_KNOWN_HOSTS: "test-host" | |
| GERRIT_SSH_PRIVKEY_G2G: "TEST_PLACEHOLDER_NOT_REAL" | |
| GERRIT_SSH_USER_G2G: "test-user" | |
| GERRIT_SSH_USER_G2G_EMAIL: "[email protected]" | |
| ORGANIZATION: "test-org" | |
| - name: "Test reusable workflow simulation" | |
| if: matrix.action-type == 'reusable' | |
| run: | | |
| # Simulate workflow call validation | |
| echo "Testing reusable workflow inputs validation" | |
| # Test boolean input validation | |
| inputs='{"SUBMIT_SINGLE_COMMITS": true, "USE_PR_AS_COMMIT": true}' | |
| if echo "$inputs" | jq -e '.SUBMIT_SINGLE_COMMITS and .USE_PR_AS_COMMIT' >/dev/null; then | |
| echo "Conflict detected as expected: SUBMIT_SINGLE_COMMITS and USE_PR_AS_COMMIT cannot both be true" | |
| echo "Negative validation test: PASS" | |
| else | |
| echo "Negative validation test: FAIL (expected conflict not detected)" | |
| exit 1 | |
| fi | |
| integration-tests: | |
| name: "Integration Tests" | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 8 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: "Setup test environment" | |
| run: | | |
| # Create test .gitreview file | |
| cat > .gitreview << EOF | |
| [gerrit] | |
| host=review.test.org | |
| port=29418 | |
| project=test/project | |
| defaultbranch=main | |
| EOF | |
| # Setup mock SSH environment | |
| mkdir -p ~/.ssh | |
| ssh-keygen -t rsa -f ~/.ssh/test_key -N "" -q | |
| echo "review.test.org ssh-rsa AAAA..." > ~/.ssh/known_hosts | |
| - name: "Test modular scripts" | |
| run: | | |
| # Test script parsing capabilities | |
| echo "Testing gitreview parsing..." | |
| # Mock environment for testing | |
| export GERRIT_PROJECT_INPUT="test-project" | |
| export GERRIT_SERVER_INPUT="test.gerrit.com" | |
| export GITHUB_REPOSITORY="owner/repo" | |
| # Test the parse-gitreview script (dry run) | |
| echo "Testing parse-gitreview.sh functionality" | |
| bash -n scripts/parse-gitreview.sh | |
| echo "Testing setup-environment.sh functionality" | |
| bash -n scripts/setup-environment.sh | |
| echo "All script syntax checks passed" | |
| - name: "Test composite action - valid configuration" | |
| uses: ./ | |
| continue-on-error: true | |
| with: | |
| SUBMIT_SINGLE_COMMITS: "false" | |
| USE_PR_AS_COMMIT: "false" | |
| FETCH_DEPTH: "1" | |
| GERRIT_KNOWN_HOSTS: ${{ vars.GERRIT_KNOWN_HOSTS || 'review.test.org ssh-rsa AAAA...' }} | |
| GERRIT_SSH_PRIVKEY_G2G: ${{ secrets.GERRIT_SSH_PRIVKEY_G2G || 'TEST_PLACEHOLDER_NOT_A_REAL_SECRET' }} | |
| GERRIT_SSH_USER_G2G: ${{ vars.GERRIT_SSH_USER_G2G || 'test-user' }} | |
| GERRIT_SSH_USER_G2G_EMAIL: ${{ vars.GERRIT_SSH_USER_G2G_EMAIL || '[email protected]' }} | |
| ORGANIZATION: ${{ vars.ORGANIZATION || 'test-org' }} | |
| - name: "Test with malformed inputs" | |
| uses: ./ | |
| continue-on-error: true | |
| with: | |
| SUBMIT_SINGLE_COMMITS: "invalid-boolean" | |
| FETCH_DEPTH: "not-a-number" | |
| GERRIT_KNOWN_HOSTS: "" # Empty required field | |
| GERRIT_SSH_PRIVKEY_G2G: "TEST_PLACEHOLDER_NOT_REAL" | |
| GERRIT_SSH_USER_G2G: "test-user" | |
| GERRIT_SSH_USER_G2G_EMAIL: "invalid-email" | |
| ORGANIZATION: "test-org" | |
| - name: "Test SSH connection handling" | |
| run: | | |
| # Test SSH connection timeout handling | |
| echo "Testing SSH connection patterns" | |
| timeout 5s ssh -o ConnectTimeout=1 nonexistent.host.example 2>/dev/null || echo "Expected SSH timeout" | |
| - name: "Test Change-ID validation" | |
| run: | | |
| # Test Change-ID format validation | |
| change_ids=( | |
| "I1234567890abcdef1234567890abcdef12345678" # Valid | |
| "invalid-change-id" # Invalid | |
| "" # Empty | |
| "I123" # Too short | |
| ) | |
| for cid in "${change_ids[@]}"; do | |
| echo "Testing Change-ID: '$cid'" | |
| if [[ "$cid" =~ ^I[a-f0-9]{40}$ ]]; then | |
| echo " Valid Change-ID format" | |
| else | |
| echo " Invalid Change-ID format (expected)" | |
| fi | |
| done | |
| - name: "Test JSON parsing with jq" | |
| run: | | |
| # Test jq parsing with various JSON structures | |
| test_json='{"branch":"main","id":"I123","url":"https://gerrit.com/123","number":"123"}' | |
| echo "$test_json" | jq -r '.branch | select( . != null )' || exit 1 | |
| echo "$test_json" | jq -r '.id | select( . != null )' || exit 1 | |
| echo "$test_json" | jq -r '.url | select( . != null )' || exit 1 | |
| # Test with null values | |
| null_json='{"branch":null,"id":"I123","url":null}' | |
| branch=$(echo "$null_json" | jq -r '.branch | select( . != null )') | |
| [[ -z "$branch" ]] || exit 1 # Should be empty for null | |
| echo "JSON parsing tests passed" | |
| dry-run-integration: | |
| name: "Dry Run Integration" | |
| runs-on: ubuntu-latest | |
| if: github.repository == 'lfit/github2gerrit' | |
| timeout-minutes: 10 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: "Real Gerrit connection test (dry-run)" | |
| uses: ./ | |
| continue-on-error: true | |
| with: | |
| SUBMIT_SINGLE_COMMITS: "false" | |
| USE_PR_AS_COMMIT: "false" | |
| GERRIT_KNOWN_HOSTS: ${{ vars.GERRIT_KNOWN_HOSTS }} | |
| GERRIT_SSH_PRIVKEY_G2G: ${{ secrets.GERRIT_SSH_PRIVKEY_G2G }} | |
| GERRIT_SSH_USER_G2G: ${{ vars.GERRIT_SSH_USER_G2G }} | |
| GERRIT_SSH_USER_G2G_EMAIL: ${{ vars.GERRIT_SSH_USER_G2G_EMAIL }} | |
| ORGANIZATION: ${{ vars.ORGANIZATION }} | |
| - name: "Validate outputs" | |
| run: | | |
| { | |
| echo "## Test Results Summary" | |
| echo "- Shell script tests: ✅ Passed" | |
| echo "- Matrix tests: ✅ Passed" | |
| echo "- Integration tests: ✅ Passed" | |
| echo "- All tests completed successfully" | |
| } >> "$GITHUB_STEP_SUMMARY" |