mirror of
https://github.com/PowerShell/openssh-portable.git
synced 2025-08-25 03:38:36 +02:00
PowerShell/Win32-OpenSSH#1211 PowerShell/Win32-OpenSSH#1082 Added support for posix_spawnp that executes the command directly instead of appending path. (SH_ASKPASS and proxy command use this). Refactored posix spawn commandline building logic to automatically account for Windows CRT escaping rules on all arguments.
232 lines
10 KiB
PowerShell
232 lines
10 KiB
PowerShell
If ($PSVersiontable.PSVersion.Major -le 2) {$PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path}
|
|
Import-Module $PSScriptRoot\CommonUtils.psm1 -Force
|
|
#covered -i -p -q -r -v -c -S -C
|
|
#todo: -F, -l and -P should be tested over the network
|
|
$tI = 0
|
|
$suite = "SCP"
|
|
Describe "Tests for scp command" -Tags "CI" {
|
|
BeforeAll {
|
|
if($OpenSSHTestInfo -eq $null)
|
|
{
|
|
Throw "`$OpenSSHTestInfo is null. Please run Set-OpenSSHTestEnvironment to set test environments."
|
|
}
|
|
|
|
$testDir = "$($OpenSSHTestInfo["TestDataPath"])\$suite"
|
|
$fileName1 = "test.txt"
|
|
$fileName2 = "test2.txt"
|
|
$fileName3 = "test3.txt"
|
|
$wildcardFileName1 = "te?t.txt"
|
|
$wildcardFileName2 = "test*"
|
|
$SourceDirName = "SourceDir"
|
|
$SourceDir = Join-Path $testDir $SourceDirName
|
|
$SourceFilePath = Join-Path $SourceDir $fileName1
|
|
$SourceFilePath3 = Join-Path $SourceDir $fileName3
|
|
$SourceFileWildCardFile1 = Join-Path $SourceDir $wildcardFileName1
|
|
$DestinationDir = Join-Path "$($OpenSSHTestInfo["TestDataPath"])\SCP" "DestDir"
|
|
$DestinationDirWildcardPath = Join-Path "$($OpenSSHTestInfo["TestDataPath"])\SCP" "DestD?r"
|
|
$DestinationFilePath = Join-Path $DestinationDir $fileName1
|
|
$NestedSourceDir= Join-Path $SourceDir "nested"
|
|
$NestedSourceFilePath = Join-Path $NestedSourceDir $fileName2
|
|
$null = New-Item $SourceDir -ItemType directory -Force -ErrorAction SilentlyContinue
|
|
$null = New-Item $NestedSourceDir -ItemType directory -Force -ErrorAction SilentlyContinue
|
|
$null = New-item -path $SourceFilePath -ItemType file -force -ErrorAction SilentlyContinue
|
|
$null = New-item -path $NestedSourceFilePath -ItemType file -force -ErrorAction SilentlyContinue
|
|
"Test content111" | Set-content -Path $SourceFilePath
|
|
"Test content333" | Set-content -Path $SourceFilePath3
|
|
"Test content in nested dir" | Set-content -Path $NestedSourceFilePath
|
|
$null = New-Item $DestinationDir -ItemType directory -Force -ErrorAction SilentlyContinue
|
|
$sshcmd = (get-command ssh).Path
|
|
|
|
$server = $OpenSSHTestInfo["Target"]
|
|
$port = $OpenSSHTestInfo["Port"]
|
|
$ssouser = $OpenSSHTestInfo["SSOUser"]
|
|
|
|
$testData = @(
|
|
@{
|
|
Title = 'Simple copy local file to local file'
|
|
Source = $SourceFilePath
|
|
Destination = $DestinationFilePath
|
|
},
|
|
@{
|
|
Title = 'Simple copy local file to remote file'
|
|
Source = $SourceFilePath
|
|
Destination = "test_target:$DestinationFilePath"
|
|
Options = "-S `"$sshcmd`""
|
|
},
|
|
@{
|
|
Title = 'Simple copy remote file to local file'
|
|
Source = "test_target:$SourceFilePath"
|
|
Destination = $DestinationFilePath
|
|
Options = "-p -c aes128-ctr -C"
|
|
},
|
|
@{
|
|
Title = 'Simple copy local file to local dir'
|
|
Source = $SourceFilePath
|
|
Destination = $DestinationDir
|
|
},
|
|
@{
|
|
Title = 'simple copy local file to remote dir'
|
|
Source = $SourceFilePath
|
|
Destination = "test_target:$DestinationDir"
|
|
Options = "-C -q"
|
|
},
|
|
@{
|
|
Title = 'simple copy remote file to local dir'
|
|
Source = "test_target:$SourceFilePath"
|
|
Destination = $DestinationDir
|
|
},
|
|
@{
|
|
Title = 'Simple copy local file with wild card name to local dir'
|
|
Source = $SourceFileWildCardFile1
|
|
Destination = $DestinationDir
|
|
},
|
|
@{
|
|
Title = 'simple copy remote file with wild card name to local dir'
|
|
Source = "test_target:$SourceFileWildCardFile1"
|
|
Destination = $DestinationDir
|
|
},
|
|
@{
|
|
Title = 'simple copy local file to remote dir with wild card name'
|
|
Source = $SourceFilePath
|
|
Destination = "test_target:$DestinationFilePath"
|
|
Options = "-C -q"
|
|
}
|
|
)
|
|
|
|
$testData1 = @(
|
|
@{
|
|
Title = 'copy from local dir to remote dir'
|
|
Source = $sourceDir
|
|
Destination = "test_target:$DestinationDir"
|
|
Options = "-r -p -c aes128-ctr"
|
|
},
|
|
@{
|
|
Title = 'copy from local dir to local dir'
|
|
Source = $sourceDir
|
|
Destination = $DestinationDir
|
|
Options = "-r "
|
|
},
|
|
@{
|
|
Title = 'copy from remote dir to local dir'
|
|
Source = "test_target:$sourceDir"
|
|
Destination = $DestinationDir
|
|
Options = "-C -r -q"
|
|
}
|
|
)
|
|
|
|
# for the first time, delete the existing log files.
|
|
if ($OpenSSHTestInfo['DebugMode'])
|
|
{
|
|
Clear-Content "$env:ProgramData\ssh\logs\ssh-agent.log" -Force -ErrorAction SilentlyContinue
|
|
Clear-Content "$env:ProgramData\ssh\logs\sshd.log" -Force -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
function CheckTarget {
|
|
param([string]$target)
|
|
if(-not (Test-path $target))
|
|
{
|
|
if( $OpenSSHTestInfo["DebugMode"])
|
|
{
|
|
Copy-Item "$env:ProgramData\ssh\logs\ssh-agent.log" "$testDir\failedagent$tI.log" -Force -ErrorAction SilentlyContinue
|
|
Copy-Item "$env:ProgramData\ssh\logs\sshd.log" "$testDir\failedsshd$tI.log" -Force -ErrorAction SilentlyContinue
|
|
|
|
# clear the ssh-agent, sshd logs so that next testcase will get fresh logs.
|
|
Clear-Content "$env:ProgramData\ssh\logs\ssh-agent.log" -Force -ErrorAction SilentlyContinue
|
|
Clear-Content "$env:ProgramData\ssh\logs\sshd.log" -Force -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
return $false
|
|
}
|
|
return $true
|
|
}
|
|
}
|
|
AfterAll {
|
|
|
|
if($OpenSSHTestInfo -eq $null)
|
|
{
|
|
#do nothing
|
|
}
|
|
elseif( -not $OpenSSHTestInfo['DebugMode'])
|
|
{
|
|
if(-not [string]::IsNullOrEmpty($SourceDir))
|
|
{
|
|
Get-Item $SourceDir | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
|
|
}
|
|
if(-not [string]::IsNullOrEmpty($DestinationDir))
|
|
{
|
|
Get-Item $DestinationDir | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
|
|
}
|
|
}
|
|
}
|
|
|
|
BeforeAll {
|
|
$null = New-Item $DestinationDir -ItemType directory -Force -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
AfterEach {
|
|
Get-ChildItem $DestinationDir -Recurse | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
|
|
Start-Sleep 1
|
|
$tI++
|
|
}
|
|
|
|
|
|
It 'File copy: <Title> ' -TestCases:$testData {
|
|
param([string]$Title, $Source, $Destination, [string]$Options)
|
|
|
|
iex "scp $Options $Source $Destination"
|
|
$LASTEXITCODE | Should Be 0
|
|
#validate file content. DestPath is the path to the file.
|
|
CheckTarget -target $DestinationFilePath | Should Be $true
|
|
|
|
$equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath) (Get-ChildItem -path $DestinationFilePath) -Property Name, Length ).Length -eq 0
|
|
$equal | Should Be $true
|
|
|
|
if($Options.contains("-p "))
|
|
{
|
|
$equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath).LastWriteTime.DateTime (Get-ChildItem -path $DestinationFilePath).LastWriteTime.DateTime ).Length -eq 0
|
|
$equal | Should Be $true
|
|
}
|
|
}
|
|
|
|
It 'Directory recursive copy: <Title> ' -TestCases:$testData1 {
|
|
param([string]$Title, $Source, $Destination, [string]$Options)
|
|
|
|
iex "scp $Options $Source $Destination"
|
|
$LASTEXITCODE | Should Be 0
|
|
CheckTarget -target (join-path $DestinationDir $SourceDirName) | Should Be $true
|
|
|
|
$equal = @(Compare-Object (Get-Item -path $SourceDir ) (Get-Item -path (join-path $DestinationDir $SourceDirName) ) -Property Name, Length).Length -eq 0
|
|
$equal | Should Be $true
|
|
|
|
if($Options.contains("-p "))
|
|
{
|
|
$equal = @(Compare-Object (Get-Item -path $SourceDir).LastWriteTime.DateTime (Get-Item -path (join-path $DestinationDir $SourceDirName)).LastWriteTime.DateTime).Length -eq 0
|
|
$equal | Should Be $true
|
|
}
|
|
|
|
$equal = @(Compare-Object (Get-ChildItem -Recurse -path $SourceDir) (Get-ChildItem -Recurse -path (join-path $DestinationDir $SourceDirName) ) -Property Name, Length).Length -eq 0
|
|
$equal | Should Be $true
|
|
|
|
if($Options.contains("-p ") -and ($platform -eq [PlatformType]::Windows) -and ($PSVersionTable.PSVersion.Major -gt 2))
|
|
{
|
|
$equal = @(Compare-Object (Get-ChildItem -Recurse -path $SourceDir).LastWriteTime.DateTime (Get-ChildItem -Recurse -path (join-path $DestinationDir $SourceDirName) ).LastWriteTime.DateTime).Length -eq 0
|
|
$equal | Should Be $true
|
|
}
|
|
}
|
|
|
|
It 'File copy: path contains wildcards ' {
|
|
$Source = Join-Path $SourceDir $wildcardFileName2
|
|
scp -p $Source $DestinationDir
|
|
$LASTEXITCODE | Should Be 0
|
|
#validate file content. DestPath is the path to the file.
|
|
CheckTarget -target $DestinationFilePath | Should Be $true
|
|
CheckTarget -target (Join-path $DestinationDir $fileName3) | Should Be $true
|
|
|
|
$equal = @(Compare-Object (Get-ChildItem -path $Source) (Get-ChildItem -path (join-path $DestinationDir $wildcardFileName2)) -Property Name, Length ).Length -eq 0
|
|
$equal | Should Be $true
|
|
|
|
$equal = @(Compare-Object (Get-ChildItem -path $Source).LastWriteTime.DateTime (Get-ChildItem -path (join-path $DestinationDir $wildcardFileName3)).LastWriteTime.DateTime ).Length -eq 0
|
|
$equal | Should Be $true
|
|
}
|
|
}
|