variables:
  Prerelease: 'ci'
  buildId: "1$(Build.BuildId)"
  buildProjects: '**/src/**/*.csproj'

jobs:
- job: Linux_Build_Test_SonarCloud

  pool:
    vmImage: 'Ubuntu-latest'

  steps:
  - script: |
      echo "BuildId = $(buildId)"
    displayName: 'Print buildId'

  - task: CmdLine@2
    displayName: 'Install .NET Aspire workload'
    inputs:
      script: 'dotnet workload install aspire'

  - script: |
      dotnet tool install --global dotnet-sonarscanner
      dotnet tool install --global dotnet-coverage
    displayName: 'Install dotnet tools'

  - task: PowerShell@2
    displayName: "Use JDK17 by default"
    inputs:
      targetType: 'inline'
      script: |
        $jdkPath = $env:JAVA_HOME_17_X64
        Write-Host "##vso[task.setvariable variable=JAVA_HOME]$jdkPath"

  - script: |
      dotnet dev-certs https --trust || true
    displayName: 'dotnet dev-certs https'
  
  # See: https://docs.sonarsource.com/sonarcloud/enriching/test-coverage/dotnet-test-coverage
  - script: |
      dotnet sonarscanner begin /k:"WireMock-Net_WireMock.Net" /o:"wiremock-net" /d:sonar.branch.name=$(Build.SourceBranchName) /d:sonar.host.url="https://sonarcloud.io" /d:sonar.token="$(SONAR_TOKEN)" /d:sonar.pullrequest.provider=github /d:sonar.cs.vscoveragexml.reportsPaths=**/wiremock-coverage-*.xml /d:sonar.verbose=true
    displayName: 'Begin analysis on SonarCloud'
    condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) # Do not run for PullRequests
  
  - task: DotNetCoreCLI@2
    displayName: 'Build Unit tests'
    inputs:
      command: 'build'
      projects: '**/test/**/*.csproj'
      arguments: '--configuration Debug --framework net8.0'

  - task: CmdLine@2
    inputs:
      script: |
          dotnet-coverage collect "dotnet test ./test/WireMock.Net.Tests/WireMock.Net.Tests.csproj --configuration Debug --no-build --framework net8.0" -f xml -o "wiremock-coverage-xunit.xml"
    displayName: 'WireMock.Net.Tests with Coverage'

  - task: CmdLine@2
    inputs:
      script: |
          dotnet-coverage collect "dotnet test ./test/WireMock.Net.TUnitTests/WireMock.Net.TUnitTests.csproj --configuration Debug --no-build --framework net8.0" -f xml -o "wiremock-coverage-tunit.xml"
    displayName: 'WireMock.Net.TUnitTests with Coverage'

  - task: CmdLine@2
    inputs:
      script: |
          dotnet-coverage collect "dotnet test ./test/WireMock.Net.Middleware.Tests/WireMock.Net.Middleware.Tests.csproj --configuration Debug --no-build --framework net8.0" -f xml -o "wiremock-coverage-middleware.xml"
    displayName: 'WireMock.Net.Middleware.Tests with Coverage'

  - task: CmdLine@2
    inputs:
      script: |
          dotnet-coverage collect "dotnet test ./test/WireMock.Net.Aspire.Tests/WireMock.Net.Aspire.Tests.csproj --configuration Debug --no-build" -f xml -o "wiremock-coverage-aspire.xml"
    displayName: 'WireMock.Net.Aspire.Tests with Coverage'

  - task: CmdLine@2
    displayName: 'Merge coverage files'
    inputs:
      script: 'dotnet coverage merge **/wiremock-coverage-*.xml --output ./test/wiremock-coverage.xml --output-format xml'

  - script: |
      dotnet sonarscanner end /d:sonar.token="$(SONAR_TOKEN)"
    displayName: 'End analysis on SonarCloud'
    condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) # Do not run for PullRequests
  
  - task: whitesource.ws-bolt.bolt.wss.WhiteSource Bolt@19
    displayName: 'WhiteSource Bolt'
    condition: and(succeeded(), eq(variables['RUN_WHITESOURCE'], 'yes'))
 
  - script: |
      bash <(curl https://codecov.io/bash) -t $(CODECOV_TOKEN) -f ./test/wiremock-coverage.xml
    displayName: 'Upload coverage results to codecov'
  
  - task: PublishTestResults@2
    condition: and(succeeded(), eq(variables['PUBLISH_TESTRESULTS'], 'yes'))
    inputs:
      testRunner: VSTest
      testResultsFiles: '**/*.trx'
  
  - task: PublishBuildArtifacts@1
    displayName: Publish coverage files
    inputs:
      PathtoPublish: './test/WireMock.Net.Tests/coverage.net8.0.opencover.xml'

- job: Windows_Build_Test

  pool:
    vmImage: 'windows-2022'

  steps:
  - task: UseDotNet@2
    displayName: Use .NET 8.0
    inputs:
      packageType: 'sdk'
      version: '8.0.x'

  - task: DotNetCoreCLI@2
    displayName: 'WireMock.Net.Tests with Coverage'
    inputs:
      command: 'test'
      projects: './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj'
      arguments: '--configuration Debug --framework net8.0 --collect:"XPlat Code Coverage" --logger trx'

  - task: DotNetCoreCLI@2
    displayName: 'WireMock.Net.TUnitTests with Coverage'
    inputs:
      command: 'test'
      projects: './test/WireMock.Net.TUnitTests/WireMock.Net.TUnitTests.csproj'
      arguments: '--configuration Debug --framework net8.0 --collect:"XPlat Code Coverage" --logger trx'

  - task: DotNetCoreCLI@2
    displayName: 'WireMock.Net.Middleware.Tests with Coverage'
    inputs:
      command: 'test'
      projects: './test/WireMock.Net.Middleware.Tests/WireMock.Net.Middleware.Tests.csproj'
      arguments: '--configuration Debug --framework net8.0 --collect:"XPlat Code Coverage" --logger trx'
  
- job: Windows_Release_to_MyGet
  dependsOn: Windows_Build_Test

  pool:
    vmImage: 'windows-2022'

  steps:
  - task: UseDotNet@2
    displayName: Use .NET 8.0
    inputs:
      packageType: 'sdk'
      version: '8.0.x'

  - task: DotNetCoreCLI@2
    displayName: Build Release
    inputs:
      command: 'build'
      arguments: /p:Configuration=Release
      projects: $(buildProjects)

  - task: DotNetCoreCLI@2
    displayName: Pack
    condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) # Do not run for PullRequests
    inputs:
      command: pack
      configuration: 'Release'
      packagesToPack: $(buildProjects)
      nobuild: true
      packDirectory: '$(Build.ArtifactStagingDirectory)/packages'
      verbosityPack: 'normal'
  
  - task: PublishBuildArtifacts@1
    displayName: Publish Artifacts
    condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) # Do not run for PullRequests
    inputs:
      PathtoPublish: '$(Build.ArtifactStagingDirectory)'
  
  - task: DotNetCoreCLI@2
    displayName: Push to MyGet
    condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) # Do not run for PullRequests
    inputs:
      command: custom
      custom: nuget
      arguments: push $(Build.ArtifactStagingDirectory)\packages\*.nupkg -n -s https://www.myget.org/F/wiremock-net/api/v3/index.json -k $(MyGetKey)