name: Helix CI
on:
  push:
    branches: [ master ]
  schedule:
    - cron: '0 */12 * * *'

permissions: write-all

jobs:
  Merge_PR_CI:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: 11
    - name: Delete frontend-maven-plugin dir
      run: rm -rf .m2\repository\com\github\eirslett
    - name: Build with Maven
      run: mvn clean install -Dmaven.test.skip.exec=true -DretryFailedDeploymentCount=5
    - name: Run All Tests
      run: mvn -q -fae test
    - name: Upload to Codecov
      run: bash <(curl -s https://codecov.io/bash)
      if: ${{ github.repository == 'apache/helix' && github.event_name == 'push' && (success() || failure()) }}
    - name: Generate Test Report
      uses: dorny/test-reporter@v1
      if: ${{ success() || failure() }}
      with:
        name: Tests Results
        path: './**/target/surefire-reports/TEST-TestSuite.xml'
        reporter: java-junit
    - name: Upload Unit Test Results as Artifacts
      if: failure()
      uses: actions/upload-artifact@v2
      with:
        name: surefire-reports
        path: ./**/target/surefire-reports/
        if-no-files-found: ignore
    - name: Print Tests Results
      run: .github/scripts/printTestResult.sh
      if: ${{ success() || failure() }}
    - name: Report Failed Tests as GitHub Issues
      uses: actions/github-script@v4
      with:
        github-token: ${{secrets.GITHUB_TOKEN}}
        script: |
          const fs = require('fs');
          const readline = require('readline');
          
          var run_url = 'Unknown URL. Run ID is ' + context.runId
          if (process.env.GITHUB_SERVER_URL && process.env.GITHUB_REPOSITORY && process.env.GITHUB_RUN_ID ) {
            run_url = process.env.GITHUB_SERVER_URL + '/' + process.env.GITHUB_REPOSITORY + '/actions/runs/' + process.env.GITHUB_RUN_ID
          }

          const failureReportPath = './FailingTest.out'
          // 1. Search for any test failures
          if (!fs.existsSync(failureReportPath)) {
            console.log('No test failure report found.')
            return
          }

          var response = await github.issues.listForRepo({
            owner: context.repo.owner,
            repo: context.repo.repo,
            labels: ['FailedTestTracking'],
            state: ['all']
          })
          const existingIssues = response.data.filter((data) => !data.pull_request)

          const lineReader = readline.createInterface({
            input: fs.createReadStream('./FailingTest.out')
          });
          const failingTests = []
          for await (const line of lineReader) {
            failingTests.push(line)
          }

          for (failingTest of failingTests) {
            // 2. Creating issues for the failing tests
            console.log('Failing test identified:\n' + failingTest)
            if (failingTest) {
              const testInfo = failingTest.split(' ')[0]
              const issueTitle = '[Failed CI Test] ' + testInfo
              if (issueTitle) {
                console.log('Adding comment to issue: ' + issueTitle)
                var issue = null
                // 2.1. Check existing test issues, create new ones for the failing tests if not exist.
                for (existingIssue of existingIssues) {
                  if (existingIssue.title == issueTitle) {
                    issue = existingIssue
                    break
                  }
                }
                if (!issue) {
                  console.log('Creating issue: ' + issueTitle)
                  response = await github.issues.create({
                    owner: context.repo.owner,
                    repo: context.repo.repo,
                    labels: ['FailedTestTracking'],
                    title: issueTitle,
                    body: 'This issue is created for tracking unstable test: ' + testInfo
                  });
                  issue = response.data
                } else {
                  // 2.2. Reopen the tickets if needed.
                  if (issue.state != 'open') {
                    console.log('Reopen issue: ' + issueTitle)
                    await github.issues.update({
                      owner: context.repo.owner,
                      repo: context.repo.repo,
                      issue_number: issue.number,
                      state: 'open'
                    });
                  }
                }
                // 2.3. Adding the most recent failure to the ticket.
                console.log('Add comment to issue: ' + issueTitle)
                github.issues.createComment({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: issue.number,
                  body: 'This test fails in: ' + run_url
                });
              }
            }
          }
      if: ${{ github.repository == 'apache/helix' && (success() || failure()) }}
