name: PR-$(System.PullRequest.PullRequestNumber)-$(Date:yyyyMMdd)$(Rev:.rr)
trigger:
  # Batch merge builds together while a merge build is running
  batch: true
  branches:
    include:
    - master
    - release*
    - feature*
  paths:
    include:
    - '*'
    exclude:
    - /.vsts-ci/misc-analysis.yml
    - /.github/ISSUE_TEMPLATE/*
    - /.dependabot/config.yml
pr:
  branches:
    include:
    - master
    - release*
    - feature*
  paths:
    include:
    - '*'
    exclude:
    - /.vsts-ci/misc-analysis.yml
    - /.github/ISSUE_TEMPLATE/*
    - /.dependabot/config.yml

variables:
  GIT_CONFIG_PARAMETERS: "'core.autocrlf=false'"
  DOTNET_CLI_TELEMETRY_OPTOUT: 1
  POWERSHELL_TELEMETRY_OPTOUT: 1
  # Avoid expensive initialization of dotnet cli, see: https://donovanbrown.com/post/Stop-wasting-time-during-NET-Core-builds
  DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
  __SuppressAnsiEscapeSequences: 1

resources:
- repo: self
  clean: true

stages:
- stage: BuildWin
  displayName: Build for Windows
  jobs:
  - template: templates/ci-build.yml

- stage: TestWin
  displayName: Test for Windows
  variables:
  - group: CLR-CAP
  jobs:
  - job: win_test
    pool:
      vmImage: vs2017-win2016
    displayName: Windows Test
    timeoutInMinutes: 90

    steps:
    - pwsh: |
        Get-ChildItem -Path env:
      displayName: 'Capture Environment'
      condition: succeededOrFailed()

    - task: DownloadBuildArtifacts@0
      displayName: 'Download Build Artifacts'
      inputs:
        downloadType: specific
        itemPattern: |
          build/**/*
          xunit/**/*
        downloadPath: '$(System.ArtifactsDirectory)'

    - pwsh: |
        Get-ChildItem "$(System.ArtifactsDirectory)\*" -Recurse
      displayName: 'Capture Artifacts Directory'
      continueOnError: true

    - pwsh: |
        $capRootDir = Join-Path ([System.IO.Path]::GetTempPath()) "CAP"
        $capUtilDir = Join-Path $capRootDir "Utils"

        if (Test-Path $capRootDir) { Remove-Item $capRootDir -Recurse -Force }
        New-Item $capUtilDir -ItemType Directory > $null

        $capZipFile = Join-Path $capRootDir "cap.zip"
        Invoke-WebRequest -Uri https://pscoretestdata.blob.core.windows.net/dotnet-cap/windows.zip -OutFile $capZipFile
        Unblock-File -Path $capZipFile
        Expand-Archive -Path $capZipFile -DestinationPath $capUtilDir -Force

        Write-Host "=== Capture CAP Util Directory ==="
        Get-ChildItem $capUtilDir -Recurse

        Write-Host "##vso[task.setvariable variable=CapRootDir]$capRootDir"
        Write-Host "##vso[task.setvariable variable=CapUtilDir]$capUtilDir"
      displayName: 'Download CAP package'
      condition: succeededOrFailed()

    # must be run frow Windows PowerShell
    - powershell: |
        # Remove "Program Files\dotnet" from the env variable PATH, so old SDKs won't affect us.
        Write-Host "Old Path:"
        Write-Host $env:Path

        $dotnetPath = Join-Path $env:SystemDrive 'Program Files\dotnet'
        $paths = $env:Path -split ";" | Where-Object { -not $_.StartsWith($dotnetPath) }
        $env:Path = $paths -join ";"

        Write-Host "New Path:"
        Write-Host $env:Path

        Import-Module .\tools\ci.psm1
        Invoke-CIInstall
      displayName: Bootstrap
      condition: succeededOrFailed()

    - pwsh: |
        Import-Module .\build.psm1
        Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json'
        $path = Split-Path -Parent (Get-PSOutput -Options (Get-PSOptions))
        $rootPath = Split-Path -Path $path
        Expand-Archive -Path '$(System.ArtifactsDirectory)\build\build.zip' -DestinationPath $rootPath -Force
      displayName: 'Unzip Build'
      condition: succeeded()

    - pwsh: |
        Import-Module $(CapUtilDir)\CAPService.psm1
        $dataDir = Start-TraceCollection -RootDir $(CapRootDir)
        Write-Host "##vso[task.setvariable variable=CapDataDir]$dataDir"
      displayName: 'Start CLR Trace Collection'
      condition: succeeded()

    - pwsh: |
        Import-Module .\tools\ci.psm1
        Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json'
        Invoke-CITest -Purpose UnelevatedPesterTests -TagSet CI
      displayName: Test - UnelevatedPesterTests - CI
      condition: succeeded()

    - pwsh: |
        Import-Module .\tools\ci.psm1
        Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json'
        Invoke-CITest -Purpose ElevatedPesterTests -TagSet CI
      displayName: Test - ElevatedPesterTests - CI
      condition: succeededOrFailed()

    - pwsh: |
        Import-Module .\tools\ci.psm1
        Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json'
        Invoke-CITest -Purpose UnelevatedPesterTests -TagSet Others
      displayName: Test - UnelevatedPesterTests - Others
      condition: succeededOrFailed()

    - pwsh: |
        Import-Module .\tools\ci.psm1
        Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json'
        Invoke-CITest -Purpose ElevatedPesterTests -TagSet Others
      displayName: Test - ElevatedPesterTests - Others
      condition: succeededOrFailed()

    - pwsh: |
        Import-Module .\build.psm1
        $xUnitTestResultsFile = '$(System.ArtifactsDirectory)\xunit\xUnitTestResults.xml'
        Test-XUnitTestResults -TestResultsFile $xUnitTestResultsFile
      displayName: Verify xUnit Test Results
      condition: succeededOrFailed()

    - pwsh: |
        $capDataDir = '$(CapDataDir)'
        $capModuleFile = '$(CapUtilDir)\CAPService.psm1'

        if ((Test-Path $capModuleFile) -and (Test-Path $capDataDir)) {
            Import-Module $capModuleFile
            Stop-TraceCollection -DataDir $capDataDir -RepoRoot $pwd -IngressToken '$(CapIngressToken)'
        }
      displayName: 'Upload CLR Trace'
      condition: always()
