name: e2e tests

on:
  pull_request:
    paths-ignore:
      - '**.md'
  push:
    branches:
      - main
      - releases/*
    paths-ignore:
      - '**.md'

jobs:
  test-setup-multiple-versions:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Setup dotnet 8.0.416, 8.0.x, 9.0.308 and 10.0.101
        uses: ./
        with:
          dotnet-version: |
            8.0.416
            8.0.x
            9.0.308
            10.0.101
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^8.0.416$", "^9.0.308$", "^10.0.101$", "^8.0"
  test-setup-full-version:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      # Side-by-side install of 9.0 and 10.0 used for the test project
      - name: Setup dotnet 9.0.308
        uses: ./
        with:
          dotnet-version: 9.0.308
      - name: Setup dotnet 10.0.101
        uses: ./
        with:
          dotnet-version: 10.0.101
          # We are including this variable to force the generation of the nuget config file to verify that it is created in the correct place
          source-url: https://api.nuget.org/v3/index.json
        env:
          NUGET_AUTH_TOKEN: NOTATOKEN
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^10.0.101$", "^9.0.308$" -CheckNugetConfig
  test-setup-without-patch-version:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      # 9.0, 10.0 needs to be in single quotes to interpret as a string instead of as an integer
      - name: Setup dotnet '9.0'
        uses: ./
        with:
          dotnet-version: '9.0'
      - name: Setup dotnet '10.0'
        uses: ./
        with:
          dotnet-version: '10.0'
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^9.0", "^10.0"
  test-setup-prerelease-version:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Setup dotnet '10.0.100-preview.7.25380.108'
        uses: ./
        with:
          dotnet-version: '10.0.100-preview.7.25380.108'
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "10.0.100-preview.7.25380.108"
  test-setup-latest-patch-version:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Setup dotnet 9.0.x
        uses: ./
        with:
          dotnet-version: 9.0.x
      - name: Setup dotnet 10.0.X
        uses: ./
        with:
          dotnet-version: 10.0.X
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^9.0", "^10.0"

  test-ABCxx-syntax:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}

      - name: Setup dotnet 10.0.1xx
        uses: ./
        with:
          dotnet-version: '10.0.1xx'
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^10\.0\.1\d{2}"

  test-setup-with-wildcard:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Setup dotnet 9.0.*
        uses: ./
        with:
          dotnet-version: 9.0.*
      - name: Setup dotnet 10.0.*
        uses: ./
        with:
          dotnet-version: 10.0.*
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^9.0", "^10.0"

  test-setup-global-json-specified-and-version:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Write global.json
        shell: bash
        run: |
          mkdir subdirectory
          echo '{"sdk":{"version": "9.0.308"}}' > ./subdirectory/global.json
      - name: Setup dotnet
        uses: ./
        with:
          dotnet-version: '10.0'
          global-json-file: ./subdirectory/global.json
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^9.0", "^10.0"

  test-setup-global-json-rollforward-latestmajor:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system: [ubuntu-latest, windows-latest, macos-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Write global.json
        shell: bash
        run: |
          mkdir subdirectory
          echo '{"sdk":{"version": "8.0.100","rollForward": "latestMajor"}}' > ./subdirectory/global.json
      - name: Setup dotnet
        uses: ./
        with:
          global-json-file: ./subdirectory/global.json
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^(?!8)"

  test-setup-global-json-rollforward-latestfeature:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system: [ubuntu-latest, windows-latest, macos-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Write global.json
        shell: bash
        run: |
          mkdir subdirectory
          echo '{"sdk":{"version": "10.0.100","rollForward": "latestFeature"}}' > ./subdirectory/global.json
      - name: Setup dotnet
        uses: ./
        with:
          global-json-file: ./subdirectory/global.json
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^10.0.(?!1)"

  test-setup-global-json-rollforward-latestpatch:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system: [ubuntu-latest, windows-latest, macos-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Write global.json
        shell: bash
        run: |
          mkdir subdirectory
          echo '{"sdk":{"version": "10.0.100","rollForward": "latestPatch"}}' > ./subdirectory/global.json
      - name: Setup dotnet
        uses: ./
        with:
          global-json-file: ./subdirectory/global.json
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^10.0.1(?!00)"

  test-global-json-with-comments:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Write global.json
        shell: bash
        run: |
          mkdir subdirectory
          echo '/* should support comments */ {"sdk":{"version": "10.0.101"}} // should support comments' > ./subdirectory/global.json
      - name: Setup dotnet
        uses: ./
        with:
          global-json-file: ./subdirectory/global.json
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^10.0"

  test-setup-with-dotnet-quality:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}

      - name: Setup dotnet 10.0 with preview quality
        uses: ./
        with:
          dotnet-version: '10.0'
          dotnet-quality: 'preview'
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^10\.0\.\d+-"

  test-setup-with-cache:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    env:
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Copy NuGet lock file to root
        shell: bash
        run: cp ./__tests__/e2e-test-csproj/packages.lock.json ./packages.lock.json
      - name: Setup .NET Core 10.0
        id: setup-dotnet
        uses: ./
        with:
          dotnet-version: '10.0'
          cache: true
      - name: Verify Cache
        if: steps.setup-dotnet.outputs.cache-hit == 'true'
        shell: bash
        run: if [[ -e ${NUGET_PACKAGES} ]]; then exit 0; else exit 1; fi
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^10.0"

  test-setup-with-cache-dependency-path:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    env:
      NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Setup .NET Core 10.0
        id: setup-dotnet
        uses: ./
        with:
          dotnet-version: '10.0'
          cache: true
          cache-dependency-path: './__tests__/e2e-test-csproj/packages.lock.json'
      - name: Verify Cache
        if: steps.setup-dotnet.outputs.cache-hit == 'true'
        shell: bash
        run: if [[ -e ${NUGET_PACKAGES} ]]; then exit 0; else exit 1; fi
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^10.0"

  test-dotnet-version-output-during-single-version-installation:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}

      - name: Setup dotnet 10.0.101
        uses: ./
        id: step1
        with:
          dotnet-version: '10.0.101'

      - name: Verify value of the dotnet-version output
        shell: pwsh
        run: |
          $version = & dotnet --version
          Write-Host "Installed version: $version"
          if (-not ($version -eq '${{steps.step1.outputs.dotnet-version}}')) { throw "Unexpected output value" }

  test-dotnet-version-output-during-multiple-version-installation:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}

      - name: Setup dotnet 8.0.402, 9.0.308, 10.0.101
        uses: ./
        id: step2
        with:
          dotnet-version: |
            10.0.101
            9.0.308
            8.0.402

      - name: Verify value of the dotnet-version output
        shell: pwsh
        run: |
          $version = "10.0.101"
          if (-not ($version -eq '${{steps.step2.outputs.dotnet-version}}')) { throw "Unexpected output value" }

  test-proxy:
    runs-on: ubuntu-22.04
    container:
      image: mcr.microsoft.com/devcontainers/dotnet:10.0
      options: --dns 127.0.0.1
    services:
      squid-proxy:
        image: ubuntu/squid:latest
        ports:
          - 3128:3128
        options: >-
          --health-cmd "bash -c '</dev/tcp/localhost/3128'"
          --health-interval 5s
          --health-timeout 3s
          --health-retries 10
    env:
      https_proxy: http://squid-proxy:3128
      http_proxy: http://squid-proxy:3128
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Setup dotnet 10.0
        uses: ./
        with:
          dotnet-version: 10.0
          source-url: https://api.nuget.org/v3/index.json
        env:
          NUGET_AUTH_TOKEN: NOTATOKEN
      - name: Verify dotnet
        shell: pwsh
        run: |
          __tests__/verify-dotnet.ps1 -Patterns "^10.0" -CheckNugetConfig

  test-bypass-proxy:
    runs-on: ubuntu-latest
    env:
      https_proxy: http://no-such-proxy:3128
      no_proxy: github.com,download.visualstudio.microsoft.com,api.nuget.org,builds.dotnet.microsoft.com,ci.dot.net
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Setup dotnet 10.0.101
        uses: ./
        with:
          dotnet-version: 10.0.101
          source-url: https://api.nuget.org/v3/index.json
        env:
          NUGET_AUTH_TOKEN: NOTATOKEN
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^10.0.101$" -CheckNugetConfig

  test-sequential-version-installation:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [
            ubuntu-22.04,
            ubuntu-latest,
            windows-latest,
            macos-latest,
            macos-15-intel
          ]
        lower-version: ['9.0.308']
        higher-version: ['10.0.101']
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      # Install one version, use it for something, then switch to next version
      - name: Setup dotnet (lower version)
        uses: ./
        with:
          dotnet-version: ${{ matrix.lower-version }}
      - name: Verify dotnet (lower version)
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^${{ matrix.lower-version }}$"
      - name: Setup dotnet (higher version)
        uses: ./
        with:
          dotnet-version: ${{ matrix.higher-version }}
      - name: Verify dotnet (higher version)
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^${{ matrix.lower-version }}$", "^${{ matrix.higher-version }}$"

  test-setup-with-workloads-input:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system:
          [ubuntu-latest, windows-latest, macos-15-intel, macos-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}

      - name: Setup dotnet 9.0 with workloads
        uses: ./
        id: setup-dotnet
        with:
          dotnet-version: '9.0'
          workloads: wasm-tools
      - name: Verify workload
        shell: pwsh
        run: |
          $output = dotnet workload list | Out-String
          Write-Host "Workload list output:"
          Write-Host $output
          if ($output -notmatch "wasm-tools") {
            throw "Expected workload 'wasm-tools' not found"
          }
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^9\.0"

  test-setup-with-architecture-input:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest, windows-latest]
        arch: [x64, arm64]
        exclude:
          - os: windows-latest
            arch: arm64
          - os: ubuntu-latest
            arch: arm64

    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}

      - name: Setup dotnet (${{ matrix.arch }})
        uses: ./
        with:
          dotnet-version: |
            8.0.416
            8.0.x
            9.0.308
            10.0.101
          architecture: ${{ matrix.arch }}

      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^8.0.416$", "^9.0.308$", "^10.0.101$", "^8.0"

  test-setup-latest-version:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system: [ubuntu-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Setup dotnet latest
        uses: ./
        with:
          dotnet-version: latest
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^\d+\.\d+\.\d+"

  test-setup-latest-with-channel-abcxx:
    runs-on: ${{ matrix.operating-system }}
    strategy:
      fail-fast: false
      matrix:
        operating-system: [macos-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
      - name: Clear toolcache
        shell: pwsh
        run: __tests__/clear-toolcache.ps1 ${{ runner.os }}
      - name: Setup dotnet latest with A.B.Cxx channel
        uses: ./
        with:
          dotnet-version: latest
          dotnet-channel: '9.0.1xx'
      - name: Verify dotnet
        shell: pwsh
        run: __tests__/verify-dotnet.ps1 -Patterns "^9\.0\.1\d{2}"
