name: 'run-tests'
description: 'Runs go test and upload a step summary'
inputs:
  filter:
    description: 'The go test pattern for the tests to run'
    required: false
    default: ''
  upload-logs-name:
    description: 'Choose the name of the log artifact'
    required: false
    default: logs-${{ github.job }}-${{ strategy.job-index }}
  upload-logs:
    description: 'If true uploads logs of each tests as an artifact'
    required: false
    default: 'true'
runs:
  using: composite
  steps:
    - uses: actions/github-script@v6
      with:
        github-token: none # No reason to grant access to the GITHUB_TOKEN
        script: |
          let myOutput = '';
          var fs = require('fs');
          var uploadLogs = process.env.UPLOAD_LOGS === 'true';
          if(uploadLogs) {
            await io.mkdirP('logs');
          }
          var filename = null;
          const options = {};
          options.ignoreReturnCode = true;
          options.env = Object.assign({}, process.env);
          delete options.env.ACTIONS_RUNTIME_URL;
          delete options.env.ACTIONS_RUNTIME_TOKEN;
          delete options.env.ACTIONS_CACHE_URL;
          options.listeners = {
            stdout: (data) => {
              for(line of data.toString().split('\n')) {
                if(/^\s*(===\s[^\s]+\s|---\s[^\s]+:\s)/.test(line)) {
                  if(uploadLogs) {
                    var runprefix = "=== RUN   ";
                    if(line.startsWith(runprefix)) {
                      filename = "logs/" + line.substring(runprefix.length).replace(/[^A-Za-z0-9]/g, '-') + ".txt";
                      fs.writeFileSync(filename, line + "\n");
                    } else if(filename) {
                      fs.appendFileSync(filename, line + "\n");
                      filename = null;
                    }
                  }
                  myOutput += line + "\n";
                } else if(filename) {
                  fs.appendFileSync(filename, line + "\n");
                }
              }
            }
          };
          var args = ['test', '-v', '-cover', '-coverprofile=coverage.txt', '-covermode=atomic', '-timeout', '20m'];
          var filter = process.env.FILTER;
          if(filter) {
            args.push('-run');
            args.push(filter);
          }
          args.push('./...');
          var exitcode = await exec.exec('go', args, options);
          if(process.env.GITHUB_STEP_SUMMARY) {
            core.summary.addCodeBlock(myOutput);
            await core.summary.write();
          }
          process.exit(exitcode);
      env:
        FILTER: ${{ inputs.filter }}
        UPLOAD_LOGS: ${{ inputs.upload-logs }}
    - uses: actions/upload-artifact@v3
      if: always() && inputs.upload-logs == 'true' && !env.ACT
      with:
        name: ${{ inputs.upload-logs-name }}
        path: logs