# Copyright (c) Microsoft Corporation. # SPDX-License-Identifier: MIT # <# .SYNOPSIS End-to-End tests for the vcpkg executable. .DESCRIPTION These tests cover the command line interface and broad functions of vcpkg, including `install`, `remove` and certain binary caching scenarios. They use the vcpkg executable in the current directory. .PARAMETER Triplet The triplet to use for testing purposes. .PARAMETER WorkingRoot The location used as scratch space for testing. #> [CmdletBinding()] Param( [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$Triplet, [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string]$WorkingRoot ) $ErrorActionPreference = "Stop" $TestingRoot = Join-Path $WorkingRoot 'testing' $buildtreesRoot = Join-Path $TestingRoot 'buildtrees' $installRoot = Join-Path $TestingRoot 'installed' $packagesRoot = Join-Path $TestingRoot 'packages' $NuGetRoot = Join-Path $TestingRoot 'nuget' $NuGetRoot2 = Join-Path $TestingRoot 'nuget2' $ArchiveRoot = Join-Path $TestingRoot 'archives' $commonArgs = @( "--triplet", $Triplet, "--x-buildtrees-root=$buildtreesRoot", "--x-install-root=$installRoot", "--x-packages-root=$packagesRoot" ) $CurrentTest = 'unassigned' function Refresh-TestRoot { Remove-Item -Recurse -Force $TestingRoot -ErrorAction SilentlyContinue mkdir $TestingRoot mkdir $NuGetRoot } function Require-FileExists { [CmdletBinding()] Param( [string]$File ) if (-Not (Test-Path $File)) { throw "'$CurrentTest' failed to create file '$File'" } } function Require-FileNotExists { [CmdletBinding()] Param( [string]$File ) if (Test-Path $File) { throw "'$CurrentTest' should not have created file '$File'" } } function Throw-IfFailed { if ($LASTEXITCODE -ne 0) { throw "'$CurrentTest' had a step with a nonzero exit code" } } function Throw-IfNotFailed { if ($LASTEXITCODE -eq 0) { throw "'$CurrentTest' had a step with an unexpectedly zero exit code" } } function Run-Vcpkg { param([string[]]$TestArgs) $CurrentTest = "./vcpkg $($testArgs -join ' ')" Write-Host $CurrentTest ./vcpkg @testArgs } if (-not $IsLinux -and -not $IsMacOS) { Refresh-TestRoot # Test msbuild props and targets $CurrentTest = "zlib:x86-windows-static msbuild scripts\testing\integrate-install\..." Write-Host $CurrentTest ./vcpkg $commonArgs install zlib:x86-windows-static --x-binarysource=clear Throw-IfFailed foreach ($project in @("VcpkgTriplet", "VcpkgTriplet2", "VcpkgUseStatic", "VcpkgUseStatic2")) { $CurrentTest = "msbuild scripts\testing\integrate-install\$project.vcxproj" ./vcpkg $commonArgs env "msbuild scripts\testing\integrate-install\$project.vcxproj /p:VcpkgRoot=$TestingRoot /p:IntDir=$TestingRoot\int\ /p:OutDir=$TestingRoot\out\ " Throw-IfFailed Remove-Item -Recurse -Force $TestingRoot\int Remove-Item -Recurse -Force $TestingRoot\out } $CurrentTest = "zlib:x86-windows msbuild scripts\testing\integrate-install\..." Write-Host $CurrentTest ./vcpkg $commonArgs install zlib:x86-windows --x-binarysource=clear Throw-IfFailed foreach ($project in @("Project1", "NoProps")) { $CurrentTest = "msbuild scripts\testing\integrate-install\$project.vcxproj" Write-Host $CurrentTest ./vcpkg $commonArgs env "msbuild scripts\testing\integrate-install\$project.vcxproj /p:VcpkgRoot=$TestingRoot /p:IntDir=$TestingRoot\int\ /p:OutDir=$TestingRoot\out\ " Throw-IfFailed Remove-Item -Recurse -Force $TestingRoot\int Remove-Item -Recurse -Force $TestingRoot\out } } Refresh-TestRoot # Test simple installation Run-Vcpkg -TestArgs ($commonArgs + @("install", "rapidjson", "--binarycaching", "--x-binarysource=clear;files,$ArchiveRoot,write;nuget,$NuGetRoot,readwrite")) Throw-IfFailed Require-FileExists "$installRoot/$Triplet/include/rapidjson/rapidjson.h" # Test simple removal Run-Vcpkg -TestArgs ($commonArgs + @("remove", "rapidjson")) Throw-IfFailed Require-FileNotExists "$installRoot/$Triplet/include/rapidjson/rapidjson.h" # Test restoring from files archive Remove-Item -Recurse -Force $installRoot Remove-Item -Recurse -Force $buildtreesRoot Run-Vcpkg -TestArgs ($commonArgs + @("install","rapidjson","--binarycaching","--x-binarysource=clear;files,$ArchiveRoot,read")) Throw-IfFailed Require-FileExists "$installRoot/$Triplet/include/rapidjson/rapidjson.h" Require-FileNotExists "$buildtreesRoot/rapidjson/src" Require-FileExists "$buildtreesRoot/detect_compiler" # Test --no-binarycaching Remove-Item -Recurse -Force $installRoot Remove-Item -Recurse -Force $buildtreesRoot Run-Vcpkg -TestArgs ($commonArgs + @("install","rapidjson","--no-binarycaching","--x-binarysource=clear;files,$ArchiveRoot,read")) Throw-IfFailed Require-FileExists "$installRoot/$Triplet/include/rapidjson/rapidjson.h" Require-FileExists "$buildtreesRoot/rapidjson/src" Require-FileExists "$buildtreesRoot/detect_compiler" # Test --editable Remove-Item -Recurse -Force $installRoot Remove-Item -Recurse -Force $buildtreesRoot Run-Vcpkg -TestArgs ($commonArgs + @("install","rapidjson","--editable","--x-binarysource=clear;files,$ArchiveRoot,read")) Throw-IfFailed Require-FileExists "$installRoot/$Triplet/include/rapidjson/rapidjson.h" Require-FileExists "$buildtreesRoot/rapidjson/src" Require-FileNotExists "$buildtreesRoot/detect_compiler" # Test restoring from nuget Remove-Item -Recurse -Force $installRoot Remove-Item -Recurse -Force $buildtreesRoot Run-Vcpkg -TestArgs ($commonArgs + @("install", "rapidjson", "--binarycaching", "--x-binarysource=clear;nuget,$NuGetRoot")) Throw-IfFailed Require-FileExists "$installRoot/$Triplet/include/rapidjson/rapidjson.h" Require-FileNotExists "$buildtreesRoot/rapidjson/src" # Test four-phase flow Remove-Item -Recurse -Force $installRoot -ErrorAction SilentlyContinue Run-Vcpkg -TestArgs ($commonArgs + @("install", "rapidjson", "--dry-run", "--x-write-nuget-packages-config=$TestingRoot/packages.config")) Throw-IfFailed Require-FileNotExists "$installRoot/$Triplet/include/rapidjson/rapidjson.h" Require-FileNotExists "$buildtreesRoot/rapidjson/src" Require-FileExists "$TestingRoot/packages.config" if ($IsLinux -or $IsMacOS) { mono $(./vcpkg fetch nuget) restore $TestingRoot/packages.config -OutputDirectory "$NuGetRoot2" -Source "$NuGetRoot" } else { & $(./vcpkg fetch nuget) restore $TestingRoot/packages.config -OutputDirectory "$NuGetRoot2" -Source "$NuGetRoot" } Throw-IfFailed Remove-Item -Recurse -Force $NuGetRoot -ErrorAction SilentlyContinue mkdir $NuGetRoot Run-Vcpkg -TestArgs ($commonArgs + @("install", "rapidjson", "tinyxml", "--binarycaching", "--x-binarysource=clear;nuget,$NuGetRoot2;nuget,$NuGetRoot,write")) Throw-IfFailed Require-FileExists "$installRoot/$Triplet/include/rapidjson/rapidjson.h" Require-FileExists "$installRoot/$Triplet/include/tinyxml.h" Require-FileNotExists "$buildtreesRoot/rapidjson/src" Require-FileExists "$buildtreesRoot/tinyxml/src" if ((Get-ChildItem $NuGetRoot -Filter '*.nupkg' | Measure-Object).Count -ne 1) { throw "In '$CurrentTest': did not create exactly 1 NuGet package" } # Test export $CurrentTest = 'Prepare for export test' Write-Host $CurrentTest Require-FileNotExists "$TestingRoot/vcpkg-export-output" Require-FileNotExists "$TestingRoot/vcpkg-export.1.0.0.nupkg" Require-FileNotExists "$TestingRoot/vcpkg-export-output.zip" Run-Vcpkg -TestArgs ($commonArgs + @("export", "rapidjson", "tinyxml", "--nuget", "--nuget-id=vcpkg-export", "--nuget-version=1.0.0", "--output=vcpkg-export-output", "--raw", "--zip", "--output-dir=$TestingRoot")) Require-FileExists "$TestingRoot/vcpkg-export-output" Require-FileExists "$TestingRoot/vcpkg-export.1.0.0.nupkg" Require-FileExists "$TestingRoot/vcpkg-export-output.zip" # Test bad command lines Run-Vcpkg -TestArgs ($commonArgs + @("install", "zlib", "--vcpkg-rootttttt", "C:\")) Throw-IfNotFailed Run-Vcpkg -TestArgs ($commonArgs + @("install", "zlib", "--vcpkg-rootttttt=C:\")) Throw-IfNotFailed Run-Vcpkg -TestArgs ($commonArgs + @("install", "zlib", "--fast")) # NB: --fast is not a switch Throw-IfNotFailed $LASTEXITCODE = 0