394 lines
10 KiB
PowerShell
394 lines
10 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Run regressin test on Windows.
|
|
.DESCRIPTION
|
|
Build test programs and run them.
|
|
.PARAMETER Target
|
|
Specify the target of MSBuild. "Build&Go"(default), "Build" or
|
|
"Clean" is available.
|
|
.PARAMETER TestList
|
|
Specify the list of test cases. If this parameter isn't specified(default),
|
|
all test cases are executed.
|
|
.PARAMETER Ansi
|
|
Specify this switch in case of testing Ansi drivers.
|
|
.PARAMETER DeclareFetch
|
|
Specify Use Declare/Fetch mode. "On"(default), "off" or "both" is available.
|
|
.PARAMETER VCVersion
|
|
Used Visual Studio version is determined automatically unless this
|
|
option is specified.
|
|
.PARAMETER Platform
|
|
Specify platforms to test. "x64"(default), "Win32" or "both" is available.
|
|
.PARAMETER Toolset
|
|
MSBuild PlatformToolset is determined automatically unless this
|
|
option is specified. Currently "v100", "Windows7.1SDK", "v110",
|
|
"v110_xp", "v120", "v120_xp", "v140" or "v140_xp" is available.
|
|
.PARAMETER MSToolsVersion
|
|
MSBuild ToolsVersion is detemrined automatically unless this
|
|
option is specified. Currently "4.0", "12.0", "14.0" or "15.0" is
|
|
available.
|
|
.PARAMETER Configuration
|
|
Specify "Release"(default) or "Debug".
|
|
.PARAMETER BuildConfigPath
|
|
Specify the configuration xml file name if you want to use
|
|
the configuration file other than standard one.
|
|
The relative path is relative to the current directory.
|
|
.EXAMPLE
|
|
> .\regress
|
|
Build with default or automatically selected parameters
|
|
and run tests.
|
|
.EXAMPLE
|
|
> .\regress Clean
|
|
Clean all generated files.
|
|
.EXAMPLE
|
|
> .\regress -TestList connect, deprected
|
|
Build and run connect-test and deprecated-test.
|
|
.EXAMPLE
|
|
> .\regress -Ansi
|
|
Build and run with ANSI version of drivers.
|
|
.EXAMPLE
|
|
> .\regress -V(CVersion) 14.0
|
|
Build using Visual Studio 14.0 environment and run tests.
|
|
.EXAMPLE
|
|
> .\regress -P(latform) x64
|
|
Build 64bit test programs and run them.
|
|
.NOTES
|
|
Author: Hiroshi Inoue
|
|
Date: August 2, 2016
|
|
#>
|
|
|
|
#
|
|
# build 32bit & 64bit dlls for VC10 or later
|
|
#
|
|
Param(
|
|
[ValidateSet("Build&Go", "Build", "Clean")]
|
|
[string]$Target="Build&Go",
|
|
[string[]]$TestList,
|
|
[switch]$Ansi,
|
|
[string]$VCVersion,
|
|
[ValidateSet("Win32", "x64", "both")]
|
|
[string]$Platform="x64",
|
|
[string]$Toolset,
|
|
[ValidateSet("", "4.0", "12.0", "14.0", "15.0")]
|
|
[string]$MSToolsVersion,
|
|
[ValidateSet("Debug", "Release")]
|
|
[String]$Configuration="Release",
|
|
[string]$BuildConfigPath,
|
|
[ValidateSet("off", "on", "both")]
|
|
[string]$DeclareFetch="on",
|
|
[string]$SpecificDsn
|
|
)
|
|
|
|
|
|
function testlist_make($testsf)
|
|
{
|
|
$testbins=@()
|
|
$testnames=@()
|
|
$dirnames=@()
|
|
$testexes=@()
|
|
$f = (Get-Content -Path $testsf) -as [string[]]
|
|
$nstart=$false
|
|
foreach ($l in $f) {
|
|
if ($l[0] -eq "#") {
|
|
continue
|
|
}
|
|
$sary=-split $l
|
|
if ($sary[0] -eq "#") {
|
|
continue
|
|
}
|
|
if ($sary[0] -eq "TESTBINS") {
|
|
$nstart=$true
|
|
$sary[0]=$null
|
|
if ($sary[1] -eq "=") {
|
|
$sary[1]=$null
|
|
}
|
|
}
|
|
if ($nstart) {
|
|
if ($sary[$sary.length - 1] -eq "\") {
|
|
$sary[$sary.length - 1] = $null
|
|
} else {
|
|
$nstart=$false
|
|
}
|
|
$testbins+=$sary
|
|
if (-not $nstart) {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
for ($i=0; $i -lt $testbins.length; $i++) {
|
|
Write-Debug "$i : $testbins[$i]"
|
|
}
|
|
|
|
foreach ($testbin in $testbins) {
|
|
if ("$testbin" -eq "") {
|
|
continue
|
|
}
|
|
$sary=$testbin.split("/")
|
|
$testname=$sary[$sary.length -1]
|
|
$dirname=""
|
|
for ($i=0;$i -lt $sary.length - 1;$i++) {
|
|
$dirname+=($sary[$i]+"`\")
|
|
}
|
|
Write-Debug "testbin=$testbin => testname=$testname dirname=$dirname"
|
|
$dirnames += $dirname
|
|
$testexes+=($dirname+$testname+".exe")
|
|
$testnames+=$testname.Replace("-test","")
|
|
}
|
|
|
|
return $testexes, $testnames, $dirnames
|
|
}
|
|
|
|
function vcxfile_make($testnames, $dirnames, $vcxfile)
|
|
{
|
|
# here-string
|
|
@'
|
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
<!--
|
|
This file is automatically generated by regress.ps1
|
|
and used by MSBuild.
|
|
-->
|
|
<PropertyGroup>
|
|
<Configuration>Release</Configuration>
|
|
<srcPath>..\test\src\</srcPath>
|
|
</PropertyGroup>
|
|
<Target Name="Build">
|
|
<MSBuild Projects="regress_one.vcxproj"
|
|
Targets="ClCompile"
|
|
Properties="TestName=common;Configuration=$(Configuration);srcPath=$(srcPath)"/>
|
|
'@ > $vcxfile
|
|
|
|
for ($i=0; $i -lt $testnames.length; $i++) {
|
|
$testname=$testnames[$i]
|
|
$dirname=$dirnames[$i]
|
|
$testname+="-test"
|
|
# here-string
|
|
@"
|
|
<MSBuild Projects="regress_one.vcxproj"
|
|
Targets="Build"
|
|
Properties="TestName=$testname;Configuration=`$(Configuration);srcPath=`$(srcPath);SubDir=$dirname"/>
|
|
"@ >> $vcxfile
|
|
}
|
|
# here-string
|
|
@'
|
|
<MSBuild Projects="regress_one.vcxproj"
|
|
Targets="Build"
|
|
Properties="TestName=runsuite;Configuration=$(Configuration);srcPath=$(srcPath)..\"/>
|
|
<MSBuild Projects="regress_one.vcxproj"
|
|
Targets="Build"
|
|
Properties="TestName=RegisterRegdsn;Configuration=$(Configuration);srcPath=$(srcPath)..\"/>
|
|
<!-- MSBuild Projects="regress_one.vcxproj"
|
|
Targets="Build"
|
|
Properties="TestName=ConfigDsn;Configuration=$(Configuration);srcPath=$(srcPath)..\"/-->
|
|
<MSBuild Projects="regress_one.vcxproj"
|
|
Targets="Build"
|
|
Properties="TestName=reset-db;Configuration=$(Configuration);srcPath=$(srcPath)..\"/>
|
|
</Target>
|
|
<Target Name="Clean">
|
|
<MSBuild Projects="regress_one.vcxproj"
|
|
Targets="Clean"
|
|
Properties="Configuration=$(Configuration);srcPath=$(srcPath)"/>
|
|
</Target>
|
|
</Project>
|
|
'@ >> $vcxfile
|
|
|
|
}
|
|
|
|
function RunTest($scriptPath, $Platform, $testexes)
|
|
{
|
|
# Run regression tests
|
|
if ($Platform -eq "x64") {
|
|
$targetdir="test_x64"
|
|
} else {
|
|
$targetdir="test_x86"
|
|
}
|
|
$revsdir="..\"
|
|
$origdir="${revsdir}..\test"
|
|
|
|
pushd $scriptPath\$targetdir
|
|
|
|
try {
|
|
$regdiff="regression.diffs"
|
|
$RESDIR="results"
|
|
if (Test-Path $regdiff) {
|
|
Remove-Item $regdiff
|
|
}
|
|
New-Item $RESDIR -ItemType Directory -Force > $null
|
|
Get-Content "${origdir}\sampletables.sql" | .\reset-db
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "`treset_db error"
|
|
}
|
|
$cnstr = @()
|
|
switch ($DeclareFetch) {
|
|
"off" { $cnstr += "UseDeclareFetch=0" }
|
|
"on" { $cnstr += "UseDeclareFetch=1" }
|
|
"both" { $cnstr += "UseDeclareFetch=0"
|
|
$cnstr += "UseDeclareFetch=1" }
|
|
}
|
|
if ($cnstr.length -eq 0) {
|
|
$cnstr += $null;
|
|
}
|
|
for ($i = 0; $i -lt $cnstr.length; $i++)
|
|
{
|
|
$env:COMMON_CONNECTION_STRING_FOR_REGRESSION_TEST = $cnstr[$i]
|
|
if ("$SpecificDsn" -ne "") {
|
|
$env:COMMON_CONNECTION_STRING_FOR_REGRESSION_TEST += ";Database=contrib_regression;ConnSettings={set lc_messages='C'}"
|
|
}
|
|
write-host "`n`tSetting by env variable:$env:COMMON_CONNECTION_STRING_FOR_REGRESSION_TEST"
|
|
.\runsuite $testexes --inputdir=$origdir
|
|
}
|
|
} catch [Exception] {
|
|
throw $error[0]
|
|
} finally {
|
|
popd
|
|
$env:COMMON_CONNECTION_STRING_FOR_REGRESSION_TEST = $null
|
|
}
|
|
}
|
|
|
|
function SpecialDsn($testdsn, $testdriver)
|
|
{
|
|
function input-dsninfo($server="localhost", $uid="postgres", $passwd="postgres", $port="5432", $database="contrib_regression")
|
|
{
|
|
$in = read-host "Server [$server]"
|
|
if ("$in" -ne "") {
|
|
$server = $in
|
|
}
|
|
$in = read-host "Port [$port]"
|
|
if ("$in" -ne "") {
|
|
$port = $in
|
|
}
|
|
$in = read-host "Username [$uid]"
|
|
if ("$in" -ne "") {
|
|
$uid = $in
|
|
}
|
|
$in = read-host -assecurestring "Password [$passwd]"
|
|
if ("$in" -ne "") {
|
|
$ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($in)
|
|
$passwd = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ptr)
|
|
}
|
|
return "SERVER=${server}|DATABASE=${database}|PORT=${port}|UID=${uid}|PWD=${passwd}"
|
|
}
|
|
|
|
$regProgram = "./RegisterRegdsn.exe"
|
|
& $regProgram "existCheck" $testdsn
|
|
if ($LastExitCode -eq -1) {
|
|
Write-Host "`tAdding System DSN=$testdsn Driver=$testdriver"
|
|
$prop = input-dsninfo
|
|
$prop += "|Debug=0|Commlog=0|ConnSettings=set+lc_messages='C'"
|
|
$proc = Start-Process $regProgram -Verb runas -Wait -PassThru -ArgumentList "register_dsn $testdriver $testdsn $prop `"$dlldir`" Driver=${dllname}|Setup=${setup}"
|
|
if ($proc.ExitCode -ne 0) {
|
|
throw "`tAddDsn $testdsn error"
|
|
}
|
|
}
|
|
elseif ($LastExitCode -ne 0) {
|
|
throw "$regProgram error"
|
|
}
|
|
}
|
|
|
|
$scriptPath = (Split-Path $MyInvocation.MyCommand.Path)
|
|
$usingExe=$true
|
|
$testsf="$scriptPath\..\test\tests"
|
|
Write-Debug testsf=$testsf
|
|
$vcxfile="$scriptPath\generated_regress.vcxproj"
|
|
|
|
$arrays=testlist_make $testsf
|
|
if ($null -eq $TestList) {
|
|
$TESTEXES=$arrays[0]
|
|
$TESTNAMES=$arrays[1]
|
|
$DIRNAMES=$arrays[2]
|
|
} else {
|
|
$err=$false
|
|
$TESTNAMES=$TestList
|
|
$TESTEXES=@()
|
|
$DIRNAMES=@()
|
|
foreach ($l in $TestList) {
|
|
for ($i=0;$i -lt $arrays[1].length;$i++) {
|
|
if ($l -eq $arrays[1][$i]) {
|
|
$TESTEXES+=$arrays[0][$i]
|
|
$DIRNAMES+=$arrays[2][$i]
|
|
break
|
|
}
|
|
}
|
|
<# if ($i -ge $arrays[1].length) {
|
|
Write-Host "!! test case $l doesn't exist"
|
|
$err=$true
|
|
} #>
|
|
}
|
|
if ($err) {
|
|
return
|
|
}
|
|
}
|
|
vcxfile_make $TESTNAMES $DIRNAMES $vcxfile
|
|
|
|
Import-Module "$scriptPath\Psqlodbc-config.psm1"
|
|
$configInfo = LoadConfiguration $BuildConfigPath $scriptPath
|
|
Import-Module ${scriptPath}\MSProgram-Get.psm1
|
|
$msbuildexe=Find-MSBuild ([ref]$VCVersion) ([ref]$MSToolsVersion) ([ref]$Toolset) $configInfo
|
|
write-host "vcversion=$VCVersion toolset=$Toolset"
|
|
Remove-Module MSProgram-Get
|
|
Remove-Module Psqlodbc-config
|
|
|
|
if ($Platform -ieq "both") {
|
|
$pary = @("Win32", "x64")
|
|
} else {
|
|
$pary = @($Platform)
|
|
}
|
|
|
|
$vcx_target=$target
|
|
if ($target -ieq "Build&Go") {
|
|
$vcx_target="Build"
|
|
}
|
|
if ($Ansi) {
|
|
write-host ** testing Ansi driver **
|
|
$testdriver="postgres_deva"
|
|
$testdsn="psqlodbc_test_dsn_ansi"
|
|
$ansi_dir_part="ANSI"
|
|
$dllname="psqlsetupa.dll"
|
|
$setup="psqlsetupa.dll"
|
|
} else {
|
|
write-host ** testing unicode driver **
|
|
$testdriver="postgres_devw"
|
|
$testdsn="psqlodbc_test_dsn"
|
|
$ansi_dir_part="Unicode"
|
|
$dllname="psqlsetup.dll"
|
|
$setup="psqlsetup.dll"
|
|
}
|
|
if ("$SpecificDsn" -ne "") {
|
|
Write-Host "`tSpecific DSN=$SpecificDsn"
|
|
$testdsn=$SpecificDsn
|
|
}
|
|
foreach ($pl in $pary) {
|
|
cd $scriptPath
|
|
& ${msbuildexe} ${vcxfile} /tv:$MSToolsVersion "/p:Platform=$pl;Configuration=$Configuration;PlatformToolset=${Toolset}" /t:$vcx_target /p:VisualStudioVersion=${VCVersion} /Verbosity:minimal
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "`nCompile error"
|
|
}
|
|
|
|
if (($target -ieq "Clean") -or ($target -ieq "Build")) {
|
|
continue
|
|
}
|
|
|
|
switch ($pl) {
|
|
"Win32" {
|
|
$targetdir="test_x86"
|
|
$bit="32-bit"
|
|
$dlldir="$scriptPath\..\x86_${ansi_dir_part}_Release"
|
|
}
|
|
default {
|
|
$targetdir="test_x64"
|
|
$bit="64-bit"
|
|
$dlldir="$scriptPath\..\x64_${ansi_dir_part}_Release"
|
|
}
|
|
}
|
|
pushd $scriptPath\$targetdir
|
|
|
|
$env:PSQLODBC_TEST_DSN = $testdsn
|
|
try {
|
|
SpecialDsn $testdsn $testdriver
|
|
RunTest $scriptPath $pl $TESTEXES
|
|
} catch [Exception] {
|
|
throw $error[0]
|
|
} finally {
|
|
popd
|
|
$env:PSQLODBC_TEST_DSN = $null
|
|
}
|
|
}
|