# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# Runs Publish Test Results task for a specific framework

parameters:
  testProjectName: '' # The name of the test project
  framework: '' # The target framework for display purposes.
  osName: '' # The name of the operating system for display purposes.
  testResultsFormat: VSTest # Specify the format of the results files you want to publish. The following formats are supported: JUnit, NUnit, VSTest, XUnit, CTest
  testResultsArtifactName: 'testresults' # The name of the Azure DevOps build artifact where the test results will be published. Default 'testresults'.
  testResultsFileName: 'TestResults.trx' # The name of the file (not path) of the test results. Default 'TestResults.trx'.

steps:
#- powershell: |
#    function EnsureNotNullOrEmpty([string]$param, [string]$nameOfParam) {
#        if ([string]::IsNullOrEmpty($param)) {
#            Write-Host "##vso[task.logissue type=error;]Missing template parameter \"$nameOfParam\""
#            Write-Host "##vso[task.complete result=Failed;]"
#        }
#    }
#    EnsureNotNullOrEmpty('${{ parameters.testProjectName }}', 'testProjectName')
#    EnsureNotNullOrEmpty('${{ parameters.framework }}', 'framework')
#    EnsureNotNullOrEmpty('${{ parameters.osName }}', 'osName')
#    EnsureNotNullOrEmpty('${{ parameters.testResultsFormat }}', 'testResultsFormat')
#    EnsureNotNullOrEmpty('${{ parameters.testResultsArtifactName }}', 'testResultsArtifactName')
#    EnsureNotNullOrEmpty('${{ parameters.testResultsFileName }}', 'testResultsFileName')
#  displayName: 'Validate Template Parameters'

- template: 'show-all-files.yml' # Uncomment for debugging

- powershell: |
    $testResultsFileName = "$(Build.ArtifactStagingDirectory)/${{ parameters.testResultsArtifactName }}/${{ parameters.osName }}/${{ parameters.framework }}/${{ parameters.testProjectName }}/${{ parameters.testResultsFileName }}"
    $testResultsFileExists = Test-Path $testResultsFileName
    if ($testResultsFileExists) {

        $reader = [System.Xml.XmlReader]::Create($testResultsFileName)
        try {
            while ($reader.Read()) {
                if ($reader.NodeType -eq [System.Xml.XmlNodeType]::Element -and $reader.Name -eq 'Counters') {
                    $failed = $reader.GetAttribute('failed')
                    $passed = $reader.GetAttribute('passed')
                    $ignored = (([int]$reader.GetAttribute('total')) - ([int]$reader.GetAttribute('executed'))).ToString()
                    $testResults = "Tests failed: $failed, passed: $passed, ignored: $ignored"
                    Write-Host "##vso[task.setvariable variable=TestResults;]$testResults"
                    # Report a running total of failures
                    $totalFailures = ([int]$Env:TOTALFAILURES + [int]$failed).ToString()
                    Write-Host "##vso[task.setvariable variable=TotalFailures;]$totalFailures"
                    break;
                }
            }
        } finally {
            $reader.Dispose()
        }
    } else {
        Write-Host "WARNING: File not found: $testResultsFileName"
    }
    Write-Host "##vso[task.setvariable variable=TestResultsFileExists;]$testResultsFileExists"
  displayName: 'Parse Test Results File'

- task: PublishTestResults@2
  displayName: 'Publish Test Results ${{ parameters.testProjectName }},${{ parameters.framework }}'
  inputs:
    testResultsFormat: ${{ parameters.testResultsFormat }}
    testResultsFiles: '$(Build.ArtifactStagingDirectory)/${{ parameters.testResultsArtifactName }}/${{ parameters.osName }}/${{ parameters.framework }}/${{ parameters.testProjectName }}/${{ parameters.testResultsFileName }}'
    testRunTitle: '${{ parameters.testProjectName }} - ${{ parameters.framework }} - ${{ parameters.osName }} | $(TestResults)'
  condition: and(succeeded(), eq(variables['TestResultsFileExists'], 'true'))