2020-03-24 19:08:37 +01:00
|
|
|
# Copyright (c) Microsoft Corporation.
|
2020-03-11 22:45:14 +01:00
|
|
|
# Licensed under the MIT License.
|
|
|
|
|
|
|
|
Describe "SSHRemoting Basic Tests" -tags CI {
|
|
|
|
|
|
|
|
# SSH remoting is set up to automatically authenticate current user via SSH keys
|
|
|
|
# All tests connect back to localhost machine
|
|
|
|
|
|
|
|
function VerifySession {
|
|
|
|
param (
|
|
|
|
[System.Management.Automation.Runspaces.PSSession] $session
|
|
|
|
)
|
|
|
|
|
|
|
|
$session.State | Should -BeExactly 'Opened'
|
|
|
|
$session.ComputerName | Should -BeExactly 'localhost'
|
|
|
|
$session.Transport | Should -BeExactly 'SSH'
|
|
|
|
Invoke-Command -Session $session -ScriptBlock { whoami } | Should -BeExactly $(whoami)
|
|
|
|
$psRemoteVersion = Invoke-Command -Session $session -ScriptBlock { $PSSenderInfo.ApplicationArguments.PSVersionTable.PSVersion }
|
|
|
|
$psRemoteVersion.Major | Should -BeExactly $PSVersionTable.PSVersion.Major
|
|
|
|
$psRemoteVersion.Minor | Should -BeExactly $PSVersionTable.PSVersion.Minor
|
|
|
|
}
|
|
|
|
|
|
|
|
Context "New-PSSession Tests" {
|
|
|
|
|
|
|
|
AfterEach {
|
2020-05-07 14:00:30 +02:00
|
|
|
if ($script:session -ne $null) { Remove-PSSession -Session $script:session }
|
|
|
|
if ($script:sessions -ne $null) { Remove-PSSession -Session $script:sessions }
|
2020-03-11 22:45:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
It "Verifies new connection with implicit current User" {
|
|
|
|
$script:session = New-PSSession -HostName localhost -ErrorVariable err
|
|
|
|
$err | Should -HaveCount 0
|
|
|
|
VerifySession $script:session
|
|
|
|
}
|
|
|
|
|
|
|
|
It "Verifies new connection with explicit User parameter" {
|
|
|
|
$script:session = New-PSSession -HostName localhost -UserName (whoami) -ErrorVariable err
|
|
|
|
$err | Should -HaveCount 0
|
|
|
|
VerifySession $script:session
|
|
|
|
}
|
|
|
|
|
|
|
|
It "Verifies explicit Name parameter" {
|
|
|
|
$sessionName = 'TestSessionNameA'
|
|
|
|
$script:session = New-PSSession -HostName localhost -Name $sessionName -ErrorVariable err
|
|
|
|
$err | Should -HaveCount 0
|
|
|
|
VerifySession $script:session
|
|
|
|
$script:session.Name | Should -BeExactly $sessionName
|
|
|
|
}
|
|
|
|
|
|
|
|
It "Verifies explicit Port parameter" {
|
|
|
|
$portNum = 22
|
|
|
|
$script:session = New-PSSession -HostName localhost -Port $portNum -ErrorVariable err
|
|
|
|
$err | Should -HaveCount 0
|
|
|
|
VerifySession $script:session
|
|
|
|
}
|
|
|
|
|
|
|
|
It "Verifies explicit Subsystem parameter" {
|
|
|
|
$portNum = 22
|
|
|
|
$subSystem = 'powershell'
|
|
|
|
$script:session = New-PSSession -HostName localhost -Port $portNum -SubSystem $subSystem -ErrorVariable err
|
|
|
|
$err | Should -HaveCount 0
|
|
|
|
VerifySession $script:session
|
|
|
|
}
|
|
|
|
|
|
|
|
It "Verifies explicit KeyFilePath parameter" {
|
|
|
|
$keyFilePath = "$HOME/.ssh/id_rsa"
|
|
|
|
$portNum = 22
|
|
|
|
$subSystem = 'powershell'
|
|
|
|
$script:session = New-PSSession -HostName localhost -Port $portNum -SubSystem $subSystem -KeyFilePath $keyFilePath -ErrorVariable err
|
|
|
|
$err | Should -HaveCount 0
|
|
|
|
VerifySession $script:session
|
|
|
|
}
|
|
|
|
|
|
|
|
It "Verifies SSHConnection hash table parameters" {
|
|
|
|
$sshConnection = @(
|
|
|
|
@{
|
|
|
|
HostName = 'localhost'
|
|
|
|
UserName = whoami
|
|
|
|
Port = 22
|
|
|
|
KeyFilePath = "$HOME/.ssh/id_rsa"
|
|
|
|
Subsystem = 'powershell'
|
|
|
|
},
|
|
|
|
@{
|
|
|
|
HostName = 'localhost'
|
|
|
|
KeyFilePath = "$HOME/.ssh/id_rsa"
|
|
|
|
Subsystem = 'powershell'
|
|
|
|
})
|
|
|
|
$script:sessions = New-PSSession -SSHConnection $sshConnection -Name 'Connection1','Connection2' -ErrorVariable err
|
|
|
|
$err | Should -HaveCount 0
|
|
|
|
$script:sessions | Should -HaveCount 2
|
|
|
|
$script:sessions[0].Name | Should -BeLike 'Connection*'
|
|
|
|
$script:sessions[1].Name | Should -BeLike 'Connection*'
|
|
|
|
VerifySession $script:sessions[0]
|
|
|
|
VerifySession $script:sessions[1]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function VerifyRunspace {
|
|
|
|
param (
|
|
|
|
[runspace] $rs
|
|
|
|
)
|
|
|
|
|
|
|
|
$rs.RunspaceStateInfo.State | Should -BeExactly 'Opened'
|
|
|
|
$rs.RunspaceAvailability | Should -BeExactly 'Available'
|
|
|
|
$rs.RunspaceIsRemote | Should -BeTrue
|
|
|
|
$ps = [powershell]::Create()
|
|
|
|
try
|
|
|
|
{
|
|
|
|
$ps.Runspace = $rs
|
|
|
|
$psRemoteVersion = $ps.AddScript('$PSSenderInfo.ApplicationArguments.PSVersionTable.PSVersion').Invoke()
|
|
|
|
$psRemoteVersion.Major | Should -BeExactly $PSVersionTable.PSVersion.Major
|
|
|
|
$psRemoteVersion.Minor | Should -BeExactly $PSVersionTable.PSVersion.Minor
|
|
|
|
|
|
|
|
$ps.Commands.Clear()
|
|
|
|
$ps.AddScript('whoami').Invoke() | Should -BeExactly $(whoami)
|
|
|
|
}
|
|
|
|
finally
|
|
|
|
{
|
|
|
|
$ps.Dispose()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Context "SSH Remoting API Tests" {
|
|
|
|
|
|
|
|
AfterEach {
|
|
|
|
if ($script:rs -ne $null) { $script:rs.Dispose() }
|
|
|
|
}
|
|
|
|
|
|
|
|
$testCases = @(
|
|
|
|
@{
|
|
|
|
testName = 'Verifies connection with implicit user'
|
|
|
|
UserName = $null
|
|
|
|
ComputerName = 'localhost'
|
|
|
|
KeyFilePath = $null
|
|
|
|
Port = 0
|
|
|
|
Subsystem = $null
|
|
|
|
},
|
|
|
|
@{
|
|
|
|
testName = 'Verifies connection with UserName'
|
|
|
|
UserName = whoami
|
|
|
|
ComputerName = 'localhost'
|
|
|
|
KeyFilePath = $null
|
|
|
|
Port = 0
|
|
|
|
Subsystem = $null
|
|
|
|
},
|
|
|
|
@{
|
|
|
|
testName = 'Verifies connection with KeyFilePath'
|
|
|
|
UserName = whoami
|
|
|
|
ComputerName = 'localhost'
|
|
|
|
KeyFilePath = "$HOME/.ssh/id_rsa"
|
|
|
|
Port = 0
|
|
|
|
Subsystem = $null
|
|
|
|
},
|
|
|
|
@{
|
|
|
|
testName = 'Verifies connection with Port specified'
|
|
|
|
UserName = whoami
|
|
|
|
ComputerName = 'localhost'
|
|
|
|
KeyFilePath = "$HOME/.ssh/id_rsa"
|
|
|
|
Port = 22
|
|
|
|
Subsystem = $null
|
|
|
|
},
|
|
|
|
@{
|
|
|
|
testName = 'Verifies connection with Subsystem specified'
|
|
|
|
UserName = whoami
|
|
|
|
ComputerName = 'localhost'
|
|
|
|
KeyFilePath = "$HOME/.ssh/id_rsa"
|
|
|
|
Port = 22
|
|
|
|
Subsystem = 'powershell'
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
It "<testName>" -TestCases $testCases {
|
|
|
|
param (
|
|
|
|
$UserName,
|
|
|
|
$ComputerName,
|
|
|
|
$KeyFilePath,
|
|
|
|
$Port,
|
|
|
|
$SubSystem
|
|
|
|
)
|
|
|
|
|
|
|
|
$ci = [System.Management.Automation.Runspaces.SSHConnectionInfo]::new($UserName, $ComputerName, $KeyFilePath, $Port, $Subsystem)
|
|
|
|
$script:rs = [runspacefactory]::CreateRunspace($host, $ci)
|
|
|
|
$script:rs.Open()
|
|
|
|
VerifyRunspace $script:rs
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|