name: SOP interoperability test suite

on:
  pull_request:
    branches: [ main ]

jobs:

  build-gosop:
    name: Build gosop from branch
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Build gosop from branch
        uses: ./.github/actions/build-gosop
        with: 
          binary-location: ./gosop-${{ github.sha }}
      # Upload as artifact
      - name: Upload gosop artifact
        uses: actions/upload-artifact@v3
        with:
          name: gosop-${{ github.sha }}
          path: ./gosop-${{ github.sha }}

  build-gosop-main:
    name: Build gosop from main
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Build gosop from branch
        uses: ./.github/actions/build-gosop
        with: 
          go-crypto-ref: main
          binary-location: ./gosop-main
      # Upload as artifact
      - name: Upload gosop-main artifact
        uses: actions/upload-artifact@v3
        with:
          name: gosop-main
          path: ./gosop-main
    

  test-suite:
    name: Run interoperability test suite
    runs-on: ubuntu-latest
    container: 
      image: ghcr.io/protonmail/openpgp-interop-test-docker:v1.1.1
      credentials:
        username: ${{ github.actor }}
        password: ${{ secrets.github_token }}
    needs: 
      - build-gosop
      - build-gosop-main
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      # Fetch gosop from main
      - name: Download gosop-main
        uses: actions/download-artifact@v3
        with:
          name: gosop-main
      # Test gosop-main
      - name: Make gosop-main executable
        run: chmod +x gosop-main
      - name: Print gosop-main version
        run: ./gosop-main version --extended
      # Fetch gosop from branch
      - name: Download gosop-branch
        uses: actions/download-artifact@v3
        with:
          name: gosop-${{ github.sha }}
      - name: Rename gosop-branch
        run: mv gosop-${{ github.sha }} gosop-branch
      # Test gosop-branch
      - name: Make gosop-branch executable
        run: chmod +x gosop-branch
      - name: Print gosop-branch version
        run: ./gosop-branch version --extended
      # Run test suite
      - name: Prepare test configuration
        run: ./.github/test-suite/prepare_config.sh $CONFIG_TEMPLATE $CONFIG_OUTPUT $GITHUB_WORKSPACE/gosop-branch $GITHUB_WORKSPACE/gosop-main
        env:
         CONFIG_TEMPLATE: .github/test-suite/config.json.template
         CONFIG_OUTPUT: .github/test-suite/config.json
      - name: Display configuration
        run: cat .github/test-suite/config.json
      - name: Run interoperability test suite
        run: cd $TEST_SUITE_DIR && $TEST_SUITE --config $GITHUB_WORKSPACE/$CONFIG --json-out $GITHUB_WORKSPACE/$RESULTS_JSON --html-out $GITHUB_WORKSPACE/$RESULTS_HTML
        env:
         CONFIG: .github/test-suite/config.json
         RESULTS_JSON: .github/test-suite/test-suite-results.json
         RESULTS_HTML: .github/test-suite/test-suite-results.html
      # Upload results
      - name: Upload test results json artifact
        uses: actions/upload-artifact@v3
        with:
          name: test-suite-results.json
          path: .github/test-suite/test-suite-results.json
      - name: Upload test results html artifact
        uses: actions/upload-artifact@v3
        with:
          name: test-suite-results.html
          path: .github/test-suite/test-suite-results.html

  compare-with-main:
    name: Compare with main
    runs-on: ubuntu-latest
    needs: test-suite
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Download test results json artifact
        id: download-test-results
        uses: actions/download-artifact@v3
        with:
          name: test-suite-results.json
      - name: Compare with baseline
        uses: ProtonMail/openpgp-interop-test-analyzer@v1
        with: 
          results: ${{ steps.download-test-results.outputs.download-path }}/test-suite-results.json
          output: baseline-comparison.json
          baseline: gosop-main
          target: gosop-branch
