diff options
-rw-r--r-- | .appveyor/build.ps1 | 2 | ||||
-rw-r--r-- | .appveyor/test.ps1 | 213 | ||||
-rw-r--r-- | appveyor.yml | 25 |
3 files changed, 239 insertions, 1 deletions
diff --git a/.appveyor/build.ps1 b/.appveyor/build.ps1 index 99caa6f..4e0ebd8 100644 --- a/.appveyor/build.ps1 +++ b/.appveyor/build.ps1 @@ -115,7 +115,7 @@ function Build-Driver { $solution_path = Get-DriverSolutionPath -ProjectDir $ProjectDir -DriverSpec $DriverSpec $Configuration = Get-DriverConfiguration -Configuration $Configuration - $msbuild_params = "/p:Configuration=$Configuration;Platform=$Platform" + $msbuild_params = "/p:Configuration=$Configuration;Platform=$Platform;SignMode=TestSign" cd $build_dir Invoke-Exe { msbuild.exe $msbuild_params $solution_path } diff --git a/.appveyor/test.ps1 b/.appveyor/test.ps1 new file mode 100644 index 0000000..71cb340 --- /dev/null +++ b/.appveyor/test.ps1 @@ -0,0 +1,213 @@ +param( + [string] $BuildDir = $null, + [string] $ProjectDir = $null, + [string] $Configuration = $null, + [string] $Platform = $null +) + +$ErrorActionPreference = "Stop"; +Set-PSDebug -Strict + +function Invoke-Exe { + param( + [ScriptBlock] $Cmd, + [int[]] $AllowedExitCodes = @(0) + ) + + $backupErrorActionPreference = $script:ErrorActionPreference + $script:ErrorActionPreference = 'Continue' + + try { + $result = & $Cmd + if ($AllowedExitCodes -notcontains $LastExitCode) { + throw "External command failed with exit code ${LastExitCode}: $Cmd" + } + return $result + } finally { + $script:ErrorActionPreference = $backupErrorActionPreference + } +} + +function Test-AppVeyor { + return Test-Path env:APPVEYOR +} + +function Set-AppVeyorDefaults { + $script:ProjectDir = $env:APPVEYOR_BUILD_FOLDER + $script:BuildDir = 'C:\Projects\build' + $script:Platform = $env:PLATFORM + $script:Configuration = $env:CONFIGURATION +} + +function Add-UtilsPath { + param( + [Parameter(Mandatory=$true)] + [string] $BuildDir, + [Parameter(Mandatory=$true)] + [string] $Configuration + ) + + $env:PATH = "$BuildDir\service\utils\$Configuration;${env:PATH}" + $env:PATH = "$BuildDir\wrappers\simple\utils\$Configuration;${env:PATH}" +} + +function Get-DriverName { + param( + [Parameter(Mandatory=$true)] + [string] $DriverSpec + ) + + return Split-Path -Path $DriverSpec -Leaf +} + +function Get-DriverBinDir { + param( + [Parameter(Mandatory=$true)] + [string] $ProjectDir, + [Parameter(Mandatory=$true)] + [string] $DriverSpec, + [Parameter(Mandatory=$true)] + [string] $Platform, + [Parameter(Mandatory=$true)] + [string] $Configuration + ) + + $Platform = switch ($Platform) { + 'Win32' { 'x86' } + 'x64' { 'x64' } + default { throw "Unsupported platform: $Platform" } + } + + $driver_name = Get-DriverName -DriverSpec $DriverSpec + + return "$ProjectDir\km\build\wdk8.1update\$DriverSpec\bin\Windows7\$Platform\$Configuration" +} + +function Get-DriverSysPath { + param( + [Parameter(Mandatory=$true)] + [string] $ProjectDir, + [Parameter(Mandatory=$true)] + [string] $DriverSpec, + [Parameter(Mandatory=$true)] + [string] $Platform, + [Parameter(Mandatory=$true)] + [string] $Configuration + ) + + $bin_dir = Get-DriverBinDir ` + -ProjectDir $ProjectDir ` + -DriverSpec $DriverSpec ` + -Platform $Platform ` + -Configuration $Configuration + $driver_name = Get-DriverName -DriverSpec $DriverSpec + + return "$bin_dir\$driver_name.vs12.sys" +} + +function Start-Driver { + param( + [Parameter(Mandatory=$true)] + [string] $ProjectDir, + [Parameter(Mandatory=$true)] + [string] $DriverSpec, + [Parameter(Mandatory=$true)] + [string] $Platform, + [Parameter(Mandatory=$true)] + [string] $Configuration + ) + + $service_name = Get-DriverName -DriverSpec $DriverSpec + $sys_path = Get-DriverSysPath ` + -ProjectDir $ProjectDir ` + -DriverSpec $DriverSpec ` + -Platform $Platform ` + -Configuration $Configuration + + Write-Host "Starting driver $service_name..." + Invoke-Exe { install_service.exe $service_name $sys_path } + Invoke-Exe { start_service.exe $service_name } +} + +function Stop-Driver { + param( + [Parameter(Mandatory=$true)] + [string] $DriverSpec + ) + + $service_name = Get-DriverName -DriverSpec $DriverSpec + + Write-Host "Stopping driver $service_name..." + Invoke-Exe { stop_service.exe $service_name } + Invoke-Exe { uninstall_service.exe $service_name } +} + +function Exchange-Ints { + param( + [Parameter(Mandatory=$true)] + [int] $NewInt + ) + + return Invoke-Exe { exchange_ints.exe $NewInt } +} + +function Verify-ExchangeInts { + param( + [Parameter(Mandatory=$true)] + [int] $NewInt, + [Parameter(Mandatory=$true)] + [int] $OldInt + ) + + $old_int = Invoke-Exe { exchange_ints.exe $NewInt } + if ($old_int -ne $OldInt) { + throw "Expected $OldInt, got: $old_int" + } else { + Write-Host "Previous integer: $old_int, new integer: $NewInt" + } +} + +function Run-ProjectTests { + param( + [Parameter(Mandatory=$true)] + [string] $ProjectDir, + [Parameter(Mandatory=$true)] + [string] $BuildDir, + [Parameter(Mandatory=$true)] + [string] $Platform, + [Parameter(Mandatory=$true)] + [string] $Configuration + ) + + Add-UtilsPath -BuildDir $BuildDir -Configuration $Configuration + Start-Driver ` + -ProjectDir $ProjectDir ` + -DriverSpec 'simple' ` + -Platform $Platform ` + -Configuration $Configuration + Verify-ExchangeInts -NewInt 69 -OldInt 42 + Verify-ExchangeInts -NewInt 100500 -OldInt 69 + Stop-Driver -DriverSpec 'simple' +} + +function Run-ProjectTestsAppVeyor { + if (Test-AppVeyor) { + Set-AppVeyorDefaults + $appveyor_cwd = pwd + } + + try { + Run-ProjectTests ` + -ProjectDir $script:ProjectDir ` + -BuildDir $script:BuildDir ` + -Platform $script:Platform ` + -Configuration $script:Configuration + } finally { + if (Test-AppVeyor) { + cd $appveyor_cwd + Set-PSDebug -Off + } + } +} + +Run-ProjectTestsAppVeyor diff --git a/appveyor.yml b/appveyor.yml index 20ee0ef..178db2b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,6 +5,12 @@ branches: only: - master +#environment: +# APPVEYOR_RDP_PASSWORD: 'FooBar01!' + +#on_finish: +# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) + platform: - Win32 - x64 @@ -15,3 +21,22 @@ configuration: build_script: - ps: .\.appveyor\build.ps1 + +# Workers are 64-bit, can't load 32-bit drivers. +for: +- + matrix: + only: + - platform: x64 + + # https://github.com/appveyor/ci/issues/715 + install: + - appveyor AddMessage "Enabling self-signed drivers..." + - bcdedit.exe /set TESTSIGNING ON + - appveyor AddMessage "Rebooting the worker..." + - ps: Restart-Computer -Force + - ps: Start-Sleep -s 10 + - appveyor AddMessage "OK" + + test_script: + - ps: .\.appveyor\test.ps1 |