version: 3.0.1.{build} image: Visual Studio 2017 clone_folder: C:\ProxSpace\pm3 init: - ps: >- $psversiontable #Get-ChildItem Env: $releasename="" $env:APPVEYOR_REPO_COMMIT_SHORT = $env:APPVEYOR_REPO_COMMIT.Substring(0, 8) if ($env:appveyor_repo_tag -match "true"){ $releasename=$env:APPVEYOR_REPO_TAG_NAME + "/" } $releasename+=$env:APPVEYOR_BUILD_VERSION + " [" + $env:APPVEYOR_REPO_COMMIT_SHORT + "]" Write-Host "repository: $env:appveyor_repo_name branch:$env:APPVEYOR_REPO_BRANCH release: $releasename" -ForegroundColor Yellow Add-AppveyorMessage -Message "[$env:APPVEYOR_REPO_COMMIT_SHORT]$env:appveyor_repo_name($env:APPVEYOR_REPO_BRANCH)" -Category Information -Details "repository: $env:appveyor_repo_name branch: $env:APPVEYOR_REPO_BRANCH release: $releasename" iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) clone_script: - ps: >- Write-Host "Removing ProxSpace..." -NoNewLine cd \ Remove-Item -Recurse -Force -Path c:\ProxSpace\* Write-Host "[ OK ]" -ForegroundColor Green Write-Host "Git clone ProxSpace..." -NoNewLine git clone -q https://github.com/Gator96100/ProxSpace c:\ProxSpace Write-Host "[ OK ]" -ForegroundColor Green Write-Host "Removing pm3 dir..." -NoNewLine Remove-Item -Recurse -Force -Path c:\ProxSpace\pm3\* Write-Host "[ OK ]" -ForegroundColor Green Write-Host "Cloning repository <$env:appveyor_repo_name> to $env:appveyor_build_folder ..." -NoNewLine if(-not $env:appveyor_pull_request_number) { git clone -q --branch=$env:appveyor_repo_branch https://github.com/$env:appveyor_repo_name.git $env:appveyor_build_folder cd $env:appveyor_build_folder git checkout -qf $env:appveyor_repo_commit } else { git clone -q https://github.com/$env:appveyor_repo_name.git $env:appveyor_build_folder cd $env:appveyor_build_folder git fetch -q origin +refs/pull/$env:appveyor_pull_request_number/merge: git checkout -qf FETCH_HEAD } Write-Host "[ OK ]" -ForegroundColor Green Write-Host "Fill msys2\etc\fstab file..." -NoNewLine New-Item c:\ProxSpace\msys2\etc\fstab -type file -force -value "# For a description of the file format, see the Users Guide`n# http://cygwin.com/cygwin-ug-net/using.html#mount-table`nnone / cygdrive binary,posix=0,noacl,user 0 0 `nC:\ProxSpace\pm3 /pm3 ntfs noacl 0 0 `nC:\ProxSpace\gcc-arm-none-eabi /gcc-arm-none-eabi ntfs noacl 0 0 `n" Write-Host "[ OK ]" -ForegroundColor Green Write-Host "Update msys2 packages..." $env:Path = "C:\ProxSpace\msys2\usr\bin;C:\ProxSpace\msys2\mingw32\bin;C:\ProxSpace\gcc-arm-none-eabi\bin;$env:Path" Function ExecUpdate($Name, $Cmd, $ErrorLine) { Write-Host "Exec [$Name]... " -NoNewLine #--- begin Job $Job = Start-Job -Name "$Name" -ScriptBlock { $env:Path = "C:\ProxSpace\msys\bin;$env:Path" Set-Location $using:PWD $sb=[scriptblock]::Create("$using:Cmd") #execute scriptblock $Cond=&$sb return $Cond } #--- end Job $JobTime=[System.Environment]::TickCount while($true) { Try { $Res = Receive-Job -Job $Job -Keep 2>&1 6>&1 } Catch { $Res = "" Write-host "error in Receive-Job" } if ($Res -is "String" -and $Res -like "*$ErrorLine*"){ Write-host "Exit by stop phrase" -ForegroundColor Green break } if ($Res -is [Object]){ [bool]$needexit = $false ForEach($line in $Res){ if ($line -like "*$ErrorLine*"){ Write-host "Exit by stop phrase [obj]" -ForegroundColor Green $needexit = $true break } } if ($needexit) { break } } if(Wait-Job $Job -Timeout 5){ Write-host "Exit by end job" -ForegroundColor Green break } if ([System.Environment]::TickCount-$JobTime -gt 1000000) { Write-host "Exit by timeout" -ForegroundColor Yellow break } } Remove-Job -Force $Job } ExecUpdate "update1" "C:\ProxSpace\msys2\msys2_shell.cmd -mingw32 -defterm -no-start /dev/null" "terminate?MSYS2" ExecUpdate "update2" "C:\ProxSpace\msys2\msys2_shell.cmd -mingw32 -defterm -no-start /dev/null" "terminate?MSYS2" Write-Host "Update " -NoNewLine Write-Host "[ OK ]" -ForegroundColor Green install: - ps: >- function Exec-External { param( [Parameter(Position=0,Mandatory=1)][scriptblock] $command ) & $command if ($LASTEXITCODE -ne 0) { throw ("Command returned non-zero error-code ${LASTEXITCODE}: $command") } } build_script: - ps: >- "C:\ProxSpace\msys2\usr\bin;C:\ProxSpace\msys2\mingw32\bin;C:\ProxSpace\gcc-arm-none-eabi\bin;$env:Path" $env:MINGW_HOME="C:\ProxSpace\msys2\mingw32" $env:MSYS_HOME="C:\ProxSpace\msys2" $env:MSYSTEM="MINGW32" $env:MINGW_PREFIX="/mingw32" $env:SHELL="/bin/bash" $env:MSYSTEM_CHOST="i686-w64-mingw32" #make bash -c -i 'pwd;make clean;make all' #some checks if(!(Test-Path C:\ProxSpace\pm3\client\proxmark3.exe)){ throw "Main file proxmark3.exe not exists." } if(!(Test-Path C:\ProxSpace\pm3\armsrc\obj\fullimage.elf)){ throw "ARM file fullimage.elf not exists." } if(!(Test-Path C:\ProxSpace\pm3\client\resources\hardnested_tables\*.bin.z)){ throw "Files in client\resources\hardnested_tables is not exists." } #install Write-Host "Installing..." -NoNewLine -ForegroundColor Yellow New-Item -ItemType Directory -Force -Path C:\ProxSpace\pm3\Release\bin bash -c -i 'make install DESTDIR=Release PREFIX=' # dll files Copy-Item C:\ProxSpace\msys2\mingw32\bin\libgcc_s_dw2-1.dll C:\ProxSpace\pm3\Release\bin Copy-Item C:\ProxSpace\msys2\mingw32\bin\libstdc++-6.dll C:\ProxSpace\pm3\Release\bin Copy-Item C:\ProxSpace\msys2\mingw32\bin\libwinpthread-1.dll C:\ProxSpace\pm3\Release\bin Copy-Item C:\ProxSpace\msys2\mingw32\bin\Qt5Core.dll C:\ProxSpace\pm3\Release\bin Copy-Item C:\ProxSpace\msys2\mingw32\bin\Qt5Gui.dll C:\ProxSpace\pm3\Release\bin Copy-Item C:\ProxSpace\msys2\mingw32\bin\Qt5Widgets.dll C:\ProxSpace\pm3\Release\bin Copy-Item C:\ProxSpace\msys2\mingw32\bin\libreadline*.dll C:\ProxSpace\pm3\Release\bin Copy-Item C:\ProxSpace\msys2\mingw32\bin\libtermcap-0.dll C:\ProxSpace\pm3\Release\bin Write-Host "[ OK ]" -ForegroundColor Green #archive and push $releasename="" if ($env:appveyor_repo_tag -match "true"){ $releasename=$env:APPVEYOR_REPO_TAG_NAME + "/" } $releasename+=$env:APPVEYOR_BUILD_VERSION + " [" + $env:APPVEYOR_REPO_COMMIT.Substring(0, 7) + "]" Write-Host "Archive and publish release files ($releasename)..." -NoNewLine -ForegroundColor Yellow cd C:\ProxSpace 7z a release.zip C:\ProxSpace\pm3\Release Push-AppveyorArtifact release.zip -DeploymentName "$releasename" Write-Host "[ OK ]" -ForegroundColor Green Write-Host "Builded..." -ForegroundColor Yellow test_script: - ps: >- $env:Path = "C:\ProxSpace\msys\bin;$env:Path" cd c:\ProxSpace\pm3 $global:TestsPassed=$true Function ExecTest($Name, $File, $Cmd, $CheckResult) { #--- begin Job $Job = Start-Job -ScriptBlock { [bool]$res=$false $TestTime=[System.Environment]::TickCount $env:Path = "C:\ProxSpace\msys\bin;$env:Path" Set-Location $using:PWD $sb=[scriptblock]::Create("$using:Cmd") #execute scriptblock Write-host "Test [$using:Name] job: $using:Cmd" $Cond=&$sb if ($Cond -eq $null){ } ElseIf($using:CheckResult -ne $null) { [String]$searchstr="" if ($Cond -is [Object]){ ForEach($line in $Cond){ Write-host $line -ForegroundColor Gray $searchstr += $line } }else{ Write-host "$Cond" -ForegroundColor Gray $searchstr = $Cond } If($searchstr -like "*$using:CheckResult*") { $res=$true } $Cond="*$using:CheckResult*" } Else { If (!($Cond -is [bool] -or $Cond -is [byte] -or $Cond -is [int16] -or $Cond -is [int32] -or $Cond -is [int64] -or $Cond -is [float])){ if ($Cond -is "String" -and $Cond -like "*passed*"){ $res= $true } if ($Cond -is "String" -and $Cond -like "*true*"){ $res= $true } ForEach($line in $Cond){ if ($line -like "*passed*"){ $res = $true $Cond = $line break } } } Else { $res=$Cond } } If ($res) { Write-host "Result[$using:Name]: $Cond" -ForegroundColor Green Add-AppveyorTest -Name "$using:Name" -Framework NUnit -Filename "$using:File" -Outcome Passed -Duration "$([System.Environment]::TickCount-$TestTime)" }Else { Write-host "Result[$using:Name]: $Cond" -ForegroundColor Red Add-AppveyorTest -Name "$using:Name" -Framework NUnit -Filename "$using:File" -Outcome Failed -Duration "$([System.Environment]::TickCount-$TestTime)" -ErrorMessage "command:$using:Cmd`nresult:$Cond" } return $res } #--- end Job [bool]$res=$false # Wait 180 sec timeout for Job if(Wait-Job $Job -Timeout 180){ $Results = $Job | Receive-Job if($Results -like "true"){ $res=$true } } else { Write-host "Test [$Name] timeout" -ForegroundColor Red Add-AppveyorTest -Name "$Name" -Framework NUnit -Filename "$File" -Outcome Failed -Duration 60000 -ErrorMessage "timeout" } Remove-Job -Force $Job if(!$res){ Write-host "--------------------- tests fail" -ForegroundColor Red $global:TestsPassed=$false } } Write-Host "Running tests..." -ForegroundColor Yellow #file test ExecTest "proxmark3 exists" "proxmark3.exe" {Test-Path C:\ProxSpace\pm3\Release\bin\proxmark3.exe} ExecTest "arm bootrom exists" "bootrom.elf" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\firmware\bootrom.elf} ExecTest "arm image exists" "fullimage.elf" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\firmware\fullimage.elf} ExecTest "arm recovery image exists" "proxmark3_recovery.bin" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\firmware\proxmark3_recovery.bin} ExecTest "hardnested tables exists" "hardnested" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\resources\hardnested_tables\*.z} ExecTest "release exists" "release.zip" {Test-Path C:\ProxSpace\release.zip} #proxmark logic tests ExecTest "proxmark help" "proxmark3 -h" {bash -lc 'cd ~/client;./proxmark3 -h 2>&1 | grep -q wait && echo passed || echo failed'} ExecTest "proxmark help text ISO7816" "proxmark3 -t" {bash -lc 'cd ~/client;./proxmark3 -t 2>&1 | grep -q ISO7816 && echo passed || echo failed'} ExecTest "proxmark help text hardnested" "proxmark3 -t" {bash -lc 'cd ~/client;./proxmark3 -t 2>&1 | grep -q hardnested && echo passed || echo failed'} ExecTest "hf mf offline text" "hf mf" {bash -lc "cd ~/client;./proxmark3 -c 'hf mf'"} "at_enc" ExecTest "hf mf hardnested" "hf mf hardnested" {bash -lc "cd ~/client;./proxmark3 -c 'hf mf hardnested t 1 000000000000'"} "found:" ExecTest "hf mf iclass" "hf mf iclass" {bash -lc "cd ~/client;./proxmark3 -c 'hf iclass loclass t'"} "verified ok" #proxmark crypto tests ExecTest "emv test" "emv test" {bash -lc "cd ~/client;./proxmark3 -c 'emv test'"} "Test?s? ? OK" if ($global:TestsPassed) { Write-Host "Tests [ OK ]" -ForegroundColor Green } else { Write-Host "Tests [ ERROR ]" -ForegroundColor Red throw "Tests error." } on_success: - ps: Write-Host "Build success..." -ForegroundColor Green on_failure: - ps: Write-Host "Build error." -ForegroundColor Red on_finish: - ps: $blockRdp = $false; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))