2024-01-12 01:01:40 +03:00
|
|
|
<#
|
|
|
|
|
|
|
|
NOTE:
|
|
|
|
|
|
|
|
This script assumes the latest MsQuic commit is built and downloaded as artifacts in the current session.
|
|
|
|
|
|
|
|
.PARAMETER LogProfile
|
|
|
|
Configures the logging scope for the test. None by default.
|
|
|
|
|
|
|
|
.PARAMETER MsQuicCommit
|
|
|
|
The MsQuic commit to use for the test. Defaults to "manual" which means the latest commit built and downloaded as artifacts in the current session.
|
|
|
|
|
|
|
|
.PARAMETER plat
|
|
|
|
The platform (linux or windows) this test is running on.
|
|
|
|
|
|
|
|
.PARAMETER os
|
|
|
|
The full OS name and version being tested (i.e., ubuntu-20.04).
|
|
|
|
|
|
|
|
.PARAMETER arch
|
|
|
|
The architecture being tested (i.e., x64).
|
|
|
|
|
|
|
|
.PARAMETER tls
|
|
|
|
The TLS library being used (openssl or schannel). Not all libraries are supported on all platforms.
|
|
|
|
|
2024-01-19 22:09:04 +03:00
|
|
|
.PARAMETER io
|
|
|
|
The network IO interface to be used (not all are supported on all platforms).
|
|
|
|
|
2024-01-12 01:01:40 +03:00
|
|
|
#>
|
|
|
|
|
|
|
|
# Import the helper module.
|
|
|
|
Using module .\secnetperf-helpers.psm1
|
|
|
|
|
|
|
|
param (
|
|
|
|
[ValidateSet("", "NULL", "Basic.Light", "Datapath.Light", "Datapath.Verbose", "Stacks.Light", "Stacks.Verbose", "RPS.Light", "RPS.Verbose", "Performance.Light", "Basic.Verbose", "Performance.Light", "Performance.Verbose", "Full.Light", "Full.Verbose", "SpinQuic.Light", "SpinQuicWarnings.Light")]
|
|
|
|
[string]$LogProfile = "",
|
|
|
|
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
|
|
[string]$MsQuicCommit = "manual",
|
|
|
|
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
|
|
[ValidateSet("windows", "linux")]
|
|
|
|
[string]$plat = "windows",
|
|
|
|
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
|
|
[string]$os = "windows-2022",
|
|
|
|
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
|
|
[ValidateSet("x64", "arm64")]
|
|
|
|
[string]$arch = "x64",
|
|
|
|
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
|
|
[ValidateSet("openssl", "openssl3", "schannel")]
|
|
|
|
[string]$tls = "schannel",
|
|
|
|
|
2024-01-19 22:09:04 +03:00
|
|
|
[Parameter(Mandatory = $false)]
|
|
|
|
[ValidateSet("", "iocp", "rio", "xdp", "qtip", "wsk", "epoll", "kqueue")]
|
|
|
|
[string]$io = "",
|
|
|
|
|
2024-01-12 01:01:40 +03:00
|
|
|
[Parameter(Mandatory = $false)]
|
|
|
|
[string]$RemoteName = "netperf-peer"
|
|
|
|
)
|
|
|
|
|
2024-01-16 18:09:22 +03:00
|
|
|
Set-StrictMode -Version 'Latest'
|
|
|
|
$PSDefaultParameterValues['*:ErrorAction'] = 'Stop'
|
|
|
|
|
2024-01-12 01:01:40 +03:00
|
|
|
# Set up some important paths.
|
|
|
|
$RemoteDir = "C:/_work/quic"
|
|
|
|
if (!$isWindows) {
|
|
|
|
$RemoteDir = "/home/secnetperf/_work/quic"
|
|
|
|
}
|
|
|
|
$SecNetPerfDir = "artifacts/bin/$plat/$($arch)_Release_$tls"
|
|
|
|
$SecNetPerfPath = "$SecNetPerfDir/secnetperf"
|
2024-01-19 22:09:04 +03:00
|
|
|
if ($io -eq "") {
|
|
|
|
if ($isWindows) {
|
|
|
|
$io = "iocp"
|
|
|
|
} else {
|
|
|
|
$io = "epoll"
|
|
|
|
}
|
|
|
|
}
|
2024-01-12 01:01:40 +03:00
|
|
|
|
|
|
|
# Set up the connection to the peer over remote powershell.
|
2024-01-19 22:09:04 +03:00
|
|
|
Write-Host "Connecting to $RemoteName"
|
2024-01-12 01:01:40 +03:00
|
|
|
if ($isWindows) {
|
|
|
|
$Session = New-PSSession -ComputerName $RemoteName -ConfigurationName PowerShell.7
|
|
|
|
} else {
|
|
|
|
$Session = New-PSSession -HostName $RemoteName -UserName secnetperf -SSHTransport
|
|
|
|
}
|
|
|
|
if ($null -eq $Session) {
|
|
|
|
Write-GHError "Failed to create remote session"
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
# Make sure nothing is running from a previous run.
|
2024-01-22 21:49:16 +03:00
|
|
|
Cleanup-State $Session $RemoteDir
|
|
|
|
|
|
|
|
if ($io -eq "wsk") {
|
|
|
|
# WSK also needs the kernel mode binaries in the usermode path.
|
|
|
|
Write-Host "Moving kernel binaries to usermode path"
|
|
|
|
$KernelDir = "artifacts/bin/winkernel/$($arch)_Release_$tls"
|
|
|
|
Copy-Item "$KernelDir/secnetperfdrvpriv.sys" $SecNetPerfDir
|
|
|
|
Copy-Item "$KernelDir/secnetperfdrvpriv.pdb" $SecNetPerfDir
|
|
|
|
Copy-Item "$KernelDir/msquicpriv.sys" $SecNetPerfDir
|
|
|
|
Copy-Item "$KernelDir/msquicpriv.pdb" $SecNetPerfDir
|
|
|
|
# Remove all the other kernel binaries since we don't need them any more.
|
|
|
|
Remove-Item -Force -Recurse $KernelDir | Out-Null
|
2024-01-12 01:01:40 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
# Copy the artifacts to the peer.
|
2024-01-19 22:09:04 +03:00
|
|
|
Write-Host "Copying files to peer"
|
2024-01-12 01:01:40 +03:00
|
|
|
Invoke-Command -Session $Session -ScriptBlock {
|
2024-01-23 18:16:56 +03:00
|
|
|
if (Test-Path $Using:RemoteDir) {
|
|
|
|
Remove-Item -Force -Recurse $Using:RemoteDir | Out-Null
|
|
|
|
}
|
2024-01-12 01:01:40 +03:00
|
|
|
mkdir $Using:RemoteDir | Out-Null
|
|
|
|
}
|
|
|
|
Copy-Item -ToSession $Session ./artifacts -Destination "$RemoteDir/artifacts" -Recurse
|
|
|
|
Copy-Item -ToSession $Session ./scripts -Destination "$RemoteDir/scripts" -Recurse
|
|
|
|
Copy-Item -ToSession $Session ./src/manifest/MsQuic.wprp -Destination "$RemoteDir/scripts"
|
|
|
|
|
2024-01-16 18:09:22 +03:00
|
|
|
$SQL = @"
|
|
|
|
INSERT OR IGNORE INTO Secnetperf_builds (Secnetperf_Commit, Build_date_time, TLS_enabled, Advanced_build_config)
|
|
|
|
VALUES ('$MsQuicCommit', '$(Get-Date -Format "yyyy-MM-dd HH:mm:ss")', 1, 'TODO');
|
|
|
|
"@
|
|
|
|
$json = @{}
|
|
|
|
$allTests = @(
|
|
|
|
"-exec:maxtput -up:10s -ptput:1",
|
|
|
|
"-exec:maxtput -down:10s -ptput:1",
|
|
|
|
"-exec:maxtput -rconn:1 -share:1 -conns:100 -run:10s -prate:1",
|
|
|
|
"-exec:lowlat -rstream:1 -up:512 -down:4000 -run:10s -plat:1"
|
|
|
|
)
|
|
|
|
$env = $isWindows ? 1 : 2
|
|
|
|
$hasFailures = $false
|
2024-01-12 01:01:40 +03:00
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
mkdir ./artifacts/logs | Out-Null
|
|
|
|
|
|
|
|
# Prepare the machines for the testing.
|
2024-01-22 21:49:16 +03:00
|
|
|
if ($isWindows) {
|
2024-01-19 22:09:04 +03:00
|
|
|
Write-Host "Preparing local machine for testing"
|
2024-01-22 21:49:16 +03:00
|
|
|
./scripts/prepare-machine.ps1 -ForTest -InstallSigningCertificates
|
2024-01-12 01:01:40 +03:00
|
|
|
|
2024-01-19 22:09:04 +03:00
|
|
|
Write-Host "Preparing peer machine for testing"
|
2024-01-12 01:01:40 +03:00
|
|
|
Invoke-Command -Session $Session -ScriptBlock {
|
2024-01-22 21:49:16 +03:00
|
|
|
& "$Using:RemoteDir/scripts/prepare-machine.ps1" -ForTest -InstallSigningCertificates
|
2024-01-12 01:01:40 +03:00
|
|
|
}
|
2024-01-19 22:09:04 +03:00
|
|
|
|
|
|
|
$HasTestSigning = $false
|
|
|
|
try { $HasTestSigning = ("$(bcdedit)" | Select-String -Pattern "testsigning\s+Yes").Matches.Success } catch { }
|
|
|
|
if (!$HasTestSigning) { Write-Host "Test Signing Not Enabled!" }
|
2024-01-12 01:01:40 +03:00
|
|
|
}
|
|
|
|
|
2024-01-16 18:09:22 +03:00
|
|
|
# Configure the dump collection.
|
|
|
|
Configure-DumpCollection $Session
|
|
|
|
|
2024-01-22 21:49:16 +03:00
|
|
|
# Install any dependent drivers.
|
|
|
|
if ($io -eq "xdp") { Install-XDP $Session $RemoteDir }
|
|
|
|
if ($io -eq "wsk") { Install-Kernel $Session $RemoteDir $SecNetPerfDir }
|
2024-01-19 22:09:04 +03:00
|
|
|
|
2024-01-12 01:01:40 +03:00
|
|
|
if (!$isWindows) {
|
|
|
|
# Make sure the secnetperf binary is executable.
|
2024-01-19 22:09:04 +03:00
|
|
|
Write-Host "Updating secnetperf permissions"
|
2024-01-12 01:01:40 +03:00
|
|
|
Invoke-Command -Session $Session -ScriptBlock {
|
|
|
|
$env:LD_LIBRARY_PATH = "${env:LD_LIBRARY_PATH}:$Using:RemoteDir/$Using:SecNetPerfDir"
|
|
|
|
chmod +x "$Using:RemoteDir/$Using:SecNetPerfPath"
|
|
|
|
}
|
2024-01-19 22:09:04 +03:00
|
|
|
$fullPath = Repo-Path $SecNetPerfDir
|
2024-01-18 23:32:54 +03:00
|
|
|
$env:LD_LIBRARY_PATH = "${env:LD_LIBRARY_PATH}:$fullPath"
|
2024-01-12 01:01:40 +03:00
|
|
|
chmod +x "./$SecNetPerfPath"
|
2024-01-18 23:32:54 +03:00
|
|
|
|
|
|
|
if ((Get-Content "/etc/security/limits.conf") -notcontains "root soft core unlimited") {
|
|
|
|
# Enable core dumps for the system.
|
2024-01-19 22:09:04 +03:00
|
|
|
Write-Host "Setting core dump size limit"
|
2024-01-18 23:32:54 +03:00
|
|
|
sudo sh -c "echo 'root soft core unlimited' >> /etc/security/limits.conf"
|
|
|
|
sudo sh -c "echo 'root hard core unlimited' >> /etc/security/limits.conf"
|
|
|
|
sudo sh -c "echo '* soft core unlimited' >> /etc/security/limits.conf"
|
|
|
|
sudo sh -c "echo '* hard core unlimited' >> /etc/security/limits.conf"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Set the core dump pattern.
|
2024-01-19 22:09:04 +03:00
|
|
|
Write-Host "Setting core dump pattern"
|
2024-01-18 23:32:54 +03:00
|
|
|
sudo sh -c "echo -n '%e.%p.%t.core' > /proc/sys/kernel/core_pattern"
|
2024-01-12 01:01:40 +03:00
|
|
|
}
|
|
|
|
|
2024-01-16 18:09:22 +03:00
|
|
|
# Run all the test cases.
|
2024-01-19 22:09:04 +03:00
|
|
|
Write-Host "Setup complete! Running all tests"
|
2024-01-16 18:09:22 +03:00
|
|
|
for ($i = 0; $i -lt $allTests.Count; $i++) {
|
2024-01-19 22:09:04 +03:00
|
|
|
$ExeArgs = $allTests[$i] + " -io:$io"
|
|
|
|
$Output = Invoke-Secnetperf $Session $RemoteName $RemoteDir $SecNetPerfPath $LogProfile $ExeArgs $io
|
2024-01-16 18:09:22 +03:00
|
|
|
$Test = $Output[-1]
|
|
|
|
if ($Test.HasFailures) { $hasFailures = $true }
|
|
|
|
|
|
|
|
# Process the results and add them to the SQL and JSON.
|
|
|
|
$TestId = $i + 1
|
|
|
|
$SQL += @"
|
|
|
|
`nINSERT OR IGNORE INTO Secnetperf_tests (Secnetperf_test_ID, Kernel_mode, Run_arguments) VALUES ($TestId, 0, "$ExeArgs -tcp:0");
|
|
|
|
INSERT OR IGNORE INTO Secnetperf_tests (Secnetperf_test_ID, Kernel_mode, Run_arguments) VALUES ($TestId, 0, "$ExeArgs -tcp:1");
|
2024-01-12 01:01:40 +03:00
|
|
|
"@
|
|
|
|
|
2024-01-16 18:09:22 +03:00
|
|
|
for ($tcp = 0; $tcp -lt $Test.Values.Length; $tcp++) {
|
2024-01-19 22:09:04 +03:00
|
|
|
if ($Test.Values[$tcp].Length -eq 0) { continue }
|
2024-01-16 18:09:22 +03:00
|
|
|
$transport = $tcp -eq 1 ? "tcp" : "quic"
|
2024-01-17 05:49:55 +03:00
|
|
|
$json["$($Test.Metric)-$transport"] = $Test.Values[$tcp]
|
|
|
|
if ($Test.Metric.startsWith("throughput")) {
|
|
|
|
foreach ($item in $Test.Values[$tcp]) {
|
2024-01-16 18:09:22 +03:00
|
|
|
$SQL += @"
|
|
|
|
`nINSERT INTO Secnetperf_test_runs (Secnetperf_test_ID, Secnetperf_commit, Client_environment_ID, Server_environment_ID, Result, Secnetperf_latency_stats_ID)
|
|
|
|
VALUES ($TestId, '$MsQuicCommit', $env, $env, $item, NULL);
|
|
|
|
"@
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-01-12 01:01:40 +03:00
|
|
|
|
2024-01-16 18:09:22 +03:00
|
|
|
Write-Host "Tests complete!"
|
2024-01-12 01:01:40 +03:00
|
|
|
|
|
|
|
} catch {
|
2024-01-16 18:09:22 +03:00
|
|
|
Write-GHError "Exception while running tests!"
|
2024-01-12 01:01:40 +03:00
|
|
|
Write-GHError $_
|
2024-01-16 18:09:22 +03:00
|
|
|
Get-Error
|
|
|
|
$_ | Format-List *
|
|
|
|
$hasFailures = $true
|
2024-01-12 01:01:40 +03:00
|
|
|
} finally {
|
2024-01-19 22:09:04 +03:00
|
|
|
|
2024-01-22 21:49:16 +03:00
|
|
|
# Perform any necessary cleanup.
|
|
|
|
try { Cleanup-State $Session $RemoteDir } catch { }
|
|
|
|
|
|
|
|
try {
|
|
|
|
if (Get-ChildItem -Path ./artifacts/logs -File -Recurse) {
|
|
|
|
# Logs or dumps were generated. Copy the necessary symbols/files to
|
|
|
|
# the same direcotry be able to open them.
|
|
|
|
Write-Host "Copying debugging files to logs directory"
|
|
|
|
if ($isWindows) {
|
|
|
|
Copy-Item "$SecNetPerfDir/*.pdb" ./artifacts/logs
|
|
|
|
} else {
|
|
|
|
Copy-Item "$SecNetPerfDir/libmsquic.so" ./artifacts/logs
|
|
|
|
Copy-Item "$SecNetPerfDir/secnetperf" ./artifacts/logs
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch { }
|
2024-01-19 22:09:04 +03:00
|
|
|
|
2024-01-16 18:09:22 +03:00
|
|
|
# Save the test results (sql and json).
|
2024-01-19 22:09:04 +03:00
|
|
|
Write-Host "`Writing test-results-$plat-$os-$arch-$tls-$io.sql"
|
|
|
|
$SQL | Set-Content -Path "test-results-$plat-$os-$arch-$tls-$io.sql"
|
|
|
|
Write-Host "`Writing json-test-results-$plat-$os-$arch-$tls-$io.json"
|
|
|
|
$json | ConvertTo-Json | Set-Content -Path "json-test-results-$plat-$os-$arch-$tls-$io.json"
|
2024-01-12 01:01:40 +03:00
|
|
|
}
|
|
|
|
|
2024-01-23 18:16:56 +03:00
|
|
|
# Clear out any exit codes from previous commands.
|
|
|
|
$global:LastExitCode = 0
|
|
|
|
|
2024-01-16 18:09:22 +03:00
|
|
|
if ($hasFailures) {
|
2024-01-12 01:01:40 +03:00
|
|
|
exit 1
|
|
|
|
}
|