feat: runtime test #6
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Runtime Tests | |
| on: | |
| push: | |
| branches: [ main, master ] | |
| pull_request: | |
| branches: [ main, master ] | |
| jobs: | |
| runtime-tests: | |
| runs-on: windows-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup MSVC | |
| uses: ilammy/msvc-dev-cmd@v1 | |
| - name: Initialize test results | |
| run: | | |
| @" | |
| BUILD=⏳ | |
| HELP=⏳ | |
| VERSION=⏳ | |
| PID_TESTS=⏳ | |
| ERROR_HANDLING=⏳ | |
| PROCESS_LOOKUP=⏳ | |
| OUTPUT_VALIDATION=⏳ | |
| STRESS_TESTS=⏳ | |
| UNICODE=⏳ | |
| "@ | Out-File -FilePath test-results.txt | |
| - name: Build win-witr | |
| id: build | |
| continue-on-error: true | |
| run: | | |
| cl.exe /EHsc /std:c++20 main.cpp /Fe:win-witr.exe advapi32.lib iphlpapi.lib ws2_32.lib shell32.lib /DUNICODE /D_UNICODE | |
| if ($LASTEXITCODE -ne 0) { | |
| (Get-Content test-results.txt) -replace 'BUILD=⏳', 'BUILD=❌' | Set-Content test-results.txt | |
| throw "Build failed!" | |
| } | |
| (Get-Content test-results.txt) -replace 'BUILD=⏳', 'BUILD=✅' | Set-Content test-results.txt | |
| # ============ HELP COMMAND TESTS ============ | |
| - name: Test help commands | |
| id: help | |
| continue-on-error: true | |
| run: | | |
| Write-Host "Testing --help flag..." -ForegroundColor Cyan | |
| ./win-witr.exe --help | |
| if ($LASTEXITCODE -ne 0) { | |
| (Get-Content test-results.txt) -replace 'HELP=⏳', 'HELP=❌' | Set-Content test-results.txt | |
| throw "❌ Help command failed" | |
| } | |
| Write-Host "Testing -h flag..." -ForegroundColor Cyan | |
| ./win-witr.exe -h | |
| if ($LASTEXITCODE -ne 0) { | |
| (Get-Content test-results.txt) -replace 'HELP=⏳', 'HELP=❌' | Set-Content test-results.txt | |
| throw "❌ Short help failed" | |
| } | |
| (Get-Content test-results.txt) -replace 'HELP=⏳', 'HELP=✅' | Set-Content test-results.txt | |
| Write-Host "✅ Help tests passed" -ForegroundColor Green | |
| # ============ VERSION COMMAND TESTS ============ | |
| - name: Test version commands | |
| id: version | |
| continue-on-error: true | |
| run: | | |
| Write-Host "Testing --version flag..." -ForegroundColor Cyan | |
| $output = ./win-witr.exe --version | Out-String | |
| Write-Host $output | |
| if ($output -notmatch "win-witr v\d+\.\d+\.\d+") { | |
| (Get-Content test-results.txt) -replace 'VERSION=⏳', 'VERSION=❌' | Set-Content test-results.txt | |
| throw "❌ Version format incorrect: $output" | |
| } | |
| Write-Host "Testing -v flag..." -ForegroundColor Cyan | |
| ./win-witr.exe -v | |
| if ($LASTEXITCODE -ne 0) { | |
| (Get-Content test-results.txt) -replace 'VERSION=⏳', 'VERSION=❌' | Set-Content test-results.txt | |
| throw "❌ Short version failed" | |
| } | |
| (Get-Content test-results.txt) -replace 'VERSION=⏳', 'VERSION=✅' | Set-Content test-results.txt | |
| Write-Host "✅ Version tests passed" -ForegroundColor Green | |
| # ============ PID INSPECTION TESTS ============ | |
| - name: Test PID inspection | |
| id: pid | |
| continue-on-error: true | |
| run: | | |
| Write-Host "Testing --pid 0 (System Idle)..." -ForegroundColor Cyan | |
| ./win-witr.exe --pid 0 2>&1 | Out-Null | |
| Write-Host "Testing --pid 4 (System)..." -ForegroundColor Cyan | |
| ./win-witr.exe --pid 4 2>&1 | Out-Null | |
| Write-Host "Testing --pid with current process ($PID)..." -ForegroundColor Cyan | |
| $output = ./win-witr.exe --pid $PID | Out-String | |
| Write-Host $output | |
| if ($LASTEXITCODE -ne 0) { | |
| (Get-Content test-results.txt) -replace 'PID_TESTS=⏳', 'PID_TESTS=❌' | Set-Content test-results.txt | |
| throw "❌ Current process PID inspection failed" | |
| } | |
| if ($output -notmatch "Process Ancestry") { | |
| (Get-Content test-results.txt) -replace 'PID_TESTS=⏳', 'PID_TESTS=❌' | Set-Content test-results.txt | |
| throw "❌ Output missing 'Process Ancestry'" | |
| } | |
| Write-Host "Testing --pid with explorer.exe..." -ForegroundColor Cyan | |
| $explorerPid = (Get-Process explorer -ErrorAction SilentlyContinue | Select-Object -First 1).Id | |
| if ($explorerPid) { | |
| Write-Host "Found explorer.exe with PID: $explorerPid" | |
| ./win-witr.exe --pid $explorerPid 2>&1 | Out-Null | |
| } | |
| (Get-Content test-results.txt) -replace 'PID_TESTS=⏳', 'PID_TESTS=✅' | Set-Content test-results.txt | |
| Write-Host "✅ PID tests passed" -ForegroundColor Green | |
| # ============ ERROR HANDLING TESTS ============ | |
| - name: Test error handling | |
| id: errors | |
| continue-on-error: true | |
| run: | | |
| Write-Host "Testing --pid with non-existent PID (99999)..." -ForegroundColor Cyan | |
| $ErrorActionPreference = 'Continue' | |
| cmd /c "win-witr.exe --pid 99999 2>&1" > $null | |
| $exitCode = $LASTEXITCODE | |
| if ($exitCode -eq 0) { | |
| (Get-Content test-results.txt) -replace 'ERROR_HANDLING=⏳', 'ERROR_HANDLING=❌' | Set-Content test-results.txt | |
| throw "❌ Should fail with non-existent PID" | |
| } | |
| Write-Host "Testing --pid with non-numeric argument..." -ForegroundColor Cyan | |
| $output = cmd /c "win-witr.exe --pid notanumber 2>&1" | |
| $exitCode = $LASTEXITCODE | |
| if ($exitCode -eq 0) { | |
| (Get-Content test-results.txt) -replace 'ERROR_HANDLING=⏳', 'ERROR_HANDLING=❌' | Set-Content test-results.txt | |
| throw "❌ Should fail with non-numeric PID" | |
| } | |
| if (($output -join " ") -notmatch "not a valid number") { | |
| (Get-Content test-results.txt) -replace 'ERROR_HANDLING=⏳', 'ERROR_HANDLING=❌' | Set-Content test-results.txt | |
| throw "❌ Missing proper error message" | |
| } | |
| Write-Host "Testing --pid without argument..." -ForegroundColor Cyan | |
| $output = cmd /c "win-witr.exe --pid 2>&1" | |
| $exitCode = $LASTEXITCODE | |
| if ($exitCode -eq 0) { | |
| (Get-Content test-results.txt) -replace 'ERROR_HANDLING=⏳', 'ERROR_HANDLING=❌' | Set-Content test-results.txt | |
| throw "❌ Should fail when --pid has no argument" | |
| } | |
| if (($output -join " ") -notmatch "requires an argument") { | |
| (Get-Content test-results.txt) -replace 'ERROR_HANDLING=⏳', 'ERROR_HANDLING=❌' | Set-Content test-results.txt | |
| throw "❌ Missing 'requires argument' error" | |
| } | |
| (Get-Content test-results.txt) -replace 'ERROR_HANDLING=⏳', 'ERROR_HANDLING=✅' | Set-Content test-results.txt | |
| Write-Host "✅ Error handling tests passed" -ForegroundColor Green | |
| # ============ PROCESS NAME LOOKUP TESTS ============ | |
| - name: Test process name lookup | |
| id: lookup | |
| continue-on-error: true | |
| run: | | |
| Write-Host "Testing process name lookup for svchost.exe..." -ForegroundColor Cyan | |
| ./win-witr.exe svchost.exe 2>&1 | Out-Null | |
| Write-Host "Testing process name lookup for explorer.exe..." -ForegroundColor Cyan | |
| ./win-witr.exe explorer.exe 2>&1 | Out-Null | |
| Write-Host "Testing with non-existent process name..." -ForegroundColor Cyan | |
| $ErrorActionPreference = 'Continue' | |
| $output = cmd /c "win-witr.exe totallyFakeProcess.exe 2>&1" | |
| $exitCode = $LASTEXITCODE | |
| if ($exitCode -eq 0) { | |
| (Get-Content test-results.txt) -replace 'PROCESS_LOOKUP=⏳', 'PROCESS_LOOKUP=❌' | Set-Content test-results.txt | |
| throw "❌ Should fail for non-existent process" | |
| } | |
| if (($output -join " ") -notmatch "Could not find process") { | |
| (Get-Content test-results.txt) -replace 'PROCESS_LOOKUP=⏳', 'PROCESS_LOOKUP=❌' | Set-Content test-results.txt | |
| throw "❌ Missing proper error message" | |
| } | |
| (Get-Content test-results.txt) -replace 'PROCESS_LOOKUP=⏳', 'PROCESS_LOOKUP=✅' | Set-Content test-results.txt | |
| Write-Host "✅ Process lookup tests passed" -ForegroundColor Green | |
| # ============ OUTPUT FORMAT VALIDATION ============ | |
| - name: Test output validation | |
| id: output | |
| continue-on-error: true | |
| run: | | |
| Write-Host "Validating output format..." -ForegroundColor Cyan | |
| $output = ./win-witr.exe --pid $PID | Out-String | |
| $requiredFields = @("Executable Path", "Process Ancestry", "Started") | |
| foreach ($field in $requiredFields) { | |
| if ($output -notmatch [regex]::Escape($field)) { | |
| (Get-Content test-results.txt) -replace 'OUTPUT_VALIDATION=⏳', 'OUTPUT_VALIDATION=❌' | Set-Content test-results.txt | |
| throw "❌ Output missing required field: $field" | |
| } | |
| } | |
| Write-Host "Testing ancestry tree formatting..." -ForegroundColor Cyan | |
| if ($output -notmatch "PID") { | |
| (Get-Content test-results.txt) -replace 'OUTPUT_VALIDATION=⏳', 'OUTPUT_VALIDATION=❌' | Set-Content test-results.txt | |
| throw "❌ Ancestry tree not properly formatted" | |
| } | |
| Write-Host "Testing timestamp format..." -ForegroundColor Cyan | |
| if ($output -notmatch "ago") { | |
| (Get-Content test-results.txt) -replace 'OUTPUT_VALIDATION=⏳', 'OUTPUT_VALIDATION=❌' | Set-Content test-results.txt | |
| throw "❌ Timestamp format incorrect" | |
| } | |
| (Get-Content test-results.txt) -replace 'OUTPUT_VALIDATION=⏳', 'OUTPUT_VALIDATION=✅' | Set-Content test-results.txt | |
| Write-Host "✅ Output validation passed" -ForegroundColor Green | |
| # ============ STRESS TESTS ============ | |
| - name: Test stress and performance | |
| id: stress | |
| continue-on-error: true | |
| run: | | |
| Write-Host "Running stress test (50 rapid requests)..." -ForegroundColor Cyan | |
| for ($i = 0; $i -lt 50; $i++) { | |
| ./win-witr.exe --pid $PID | Out-Null | |
| if ($LASTEXITCODE -ne 0) { | |
| (Get-Content test-results.txt) -replace 'STRESS_TESTS=⏳', 'STRESS_TESTS=❌' | Set-Content test-results.txt | |
| throw "❌ Stress test failed at iteration $i" | |
| } | |
| } | |
| Write-Host "Testing against multiple running processes..." -ForegroundColor Cyan | |
| $processes = Get-Process | Where-Object { $_.Id -ne 0 -and $_.Id -ne 4 } | Select-Object -First 5 | |
| foreach ($proc in $processes) { | |
| Write-Host " Testing PID $($proc.Id) ($($proc.Name))..." | |
| ./win-witr.exe --pid $proc.Id 2>&1 | Out-Null | |
| } | |
| (Get-Content test-results.txt) -replace 'STRESS_TESTS=⏳', 'STRESS_TESTS=✅' | Set-Content test-results.txt | |
| Write-Host "✅ Stress tests passed (50 iterations)" -ForegroundColor Green | |
| # ============ UNICODE HANDLING ============ | |
| - name: Test Unicode handling | |
| id: unicode | |
| continue-on-error: true | |
| run: | | |
| Write-Host "Testing Unicode character handling..." -ForegroundColor Cyan | |
| [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 | |
| $output = ./win-witr.exe --pid $PID 2>&1 | Out-String | |
| if ($LASTEXITCODE -ne 0) { | |
| (Get-Content test-results.txt) -replace 'UNICODE=⏳', 'UNICODE=❌' | Set-Content test-results.txt | |
| throw "❌ Unicode handling failed" | |
| } | |
| (Get-Content test-results.txt) -replace 'UNICODE=⏳', 'UNICODE=✅' | Set-Content test-results.txt | |
| Write-Host "✅ Unicode test passed" -ForegroundColor Green | |
| # ============ FINAL SUMMARY ============ | |
| - name: Display summary | |
| if: always() | |
| run: | | |
| Write-Host "" | |
| Write-Host "========================================" -ForegroundColor Magenta | |
| Write-Host " 🎉 RUNTIME TESTS COMPLETED! 🎉" -ForegroundColor Magenta | |
| Write-Host "========================================" -ForegroundColor Magenta | |
| Get-Content test-results.txt | |
| Write-Host "" | |
| # ============ POST PR COMMENT ============ | |
| - name: Post PR comment with results | |
| if: github.event_name == 'pull_request' && always() | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| $results = Get-Content test-results.txt | ConvertFrom-StringData | |
| $allPassed = $true | |
| foreach ($value in $results.Values) { | |
| if ($value -ne '✅') { | |
| $allPassed = $false | |
| break | |
| } | |
| } | |
| $emoji = if ($allPassed) { '🎉' } else { '⚠️' } | |
| $status = if ($allPassed) { 'All Tests Passed!' } else { 'Some Tests Failed' } | |
| $comment = @" | |
| ## $emoji Runtime Tests Report | |
| **Status:** $status | |
| **Run:** [#${{ github.run_number }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) | |
| | Test Category | Result | | |
| |---------------|--------| | |
| | 🔨 Build | $($results.BUILD) | | |
| | 📖 Help Commands | $($results.HELP) | | |
| | 🏷️ Version Commands | $($results.VERSION) | | |
| | 🔍 PID Inspection | $($results.PID_TESTS) | | |
| | ⚠️ Error Handling | $($results.ERROR_HANDLING) | | |
| | 🔎 Process Lookup | $($results.PROCESS_LOOKUP) | | |
| | ✏️ Output Validation | $($results.OUTPUT_VALIDATION) | | |
| | 🚀 Stress Tests | $($results.STRESS_TESTS) | | |
| | 🌐 Unicode Handling | $($results.UNICODE) | | |
| --- | |
| <sub>🤖 Automated test report by GitHub Actions</sub> | |
| "@ | |
| $comment | Out-File -FilePath comment.txt -Encoding utf8 | |
| gh pr comment ${{ github.event.pull_request.number }} --body-file comment.txt | |
| Write-Host "✅ Posted comment to PR #${{ github.event.pull_request.number }}" -ForegroundColor Green |