Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ _How to test the changes_

### Relevant Links

Any links from your research that help explain the changes
_Any links from your research that help explain the changes_

## Checklist

Expand Down
118 changes: 70 additions & 48 deletions Tests/BuildkitTools.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,13 @@ Describe "BuildkitTools.psm1" {
Mock Test-ServiceRegistered -ModuleName 'BuildkitTools' -MockWith { return $true }
}

BeforeEach {
Remove-Item -Path "$TestDrive" -Re -Force -ErrorAction Ignore
}

AfterEach {
$ENV:PESTER = $false
Remove-Item -Path "$TestDrive" -Re -Force -ErrorAction Ignore
}

AfterAll {
Expand Down Expand Up @@ -124,7 +129,11 @@ Describe "BuildkitTools.psm1" {
Install-Buildkit -Setup -Force -Confirm:$false

Should -Invoke Register-BuildkitdService -Times 1 -Exactly -Scope It -ModuleName 'BuildkitTools' `
-ParameterFilter { $BuildKitPath -eq "$Env:ProgramFiles\Buildkit" -and $WinCNIPath -eq "" }
-ParameterFilter {
$BuildKitPath -eq "$Env:ProgramFiles\Buildkit" -and
$WinCNIPath -eq "$ENV:ProgramFiles\Containerd\cni"
$Start -eq $true
}
}

It "Should uninstall tool if it is already installed" {
Expand Down Expand Up @@ -164,10 +173,8 @@ Describe "BuildkitTools.psm1" {

Context "Register-BuildkitdService" -Tag "Register-BuildkitdService" {
BeforeAll {
$MockBuildKitPath = "$TestDrive\Program Files\Buildkit"
New-Item -Path "$MockBuildKitPath\bin\buildkitd.exe" -ItemType 'File' -Force | Out-Null
New-Item -Path 'TestDrive:\Program Files\Containerd\cni\conf' -ItemType 'Directory' -Force | Out-Null
Set-Content -Path "TestDrive:\Program Files\Containerd\cni\conf\0-containerd-nat.conf" -Value 'Nat config data here' -Force
$MockBuildKitPath = "C:\Program Files\Buildkit"
$expectedExecutablePath = "$MockBuildKitPath\bin\buildkitd.exe"

Mock Test-Path -ModuleName "BuildkitTools" { return $true }
Mock Add-MpPreference -ModuleName "BuildkitTools"
Expand All @@ -176,7 +183,7 @@ Describe "BuildkitTools.psm1" {
-MockWith { return $MockBuildKitPath } `
-ParameterFilter { $Tool -eq "Buildkit" }
Mock Get-DefaultInstallPath -ModuleName "BuildkitTools" `
-MockWith { return "$TestDrive\Program Files\Containerd" } `
-MockWith { return "C:\Program Files\Containerd" } `
-ParameterFilter { $Tool -eq "containerd" }

$obj = New-MockObject -Type 'System.Diagnostics.Process' -Properties @{ ExitCode = 0 }
Expand All @@ -188,36 +195,39 @@ Describe "BuildkitTools.psm1" {
Mock Test-ServiceRegistered -ModuleName 'BuildkitTools' -MockWith { return $false }
}

AfterAll {
Get-ChildItem -Path 'TestDrive:\' | Remove-Item -Recurse -Force
}

It "Should successfully register buildkitd service using defaults" {
$MockWinCNIPath = "$TestDrive\Program Files\Containerd\cni"
$MockCniBinDir = "$MockWinCNIPath\bin"
$MockCniConfPath = "$MockWinCNIPath\conf\0-containerd-nat.conf"

Register-BuildkitdService -Force

$expectedExecutablePath = "$TestDrive\Program Files\buildkit\bin\buildkitd.exe"
$expectedCommandArguments = "--register-service --debug --containerd-worker=true --containerd-cni-config-path=`"$MockCniConfPath`" --containerd-cni-binary-dir=`"$MockCniBinDir`" --service-name buildkitd"
# The default path for Buildkit is $Env:ProgramFiles\Buildkit.
# Since tests are run as a user (not as admin), it is not possible to create a conf file in the default path.
$expectedCommandArguments = "--register-service --debug --containerd-worker=true --service-name buildkitd"

Should -Invoke Invoke-ExecutableCommand -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { ($Executable -eq $expectedExecutablePath ) -and ($Arguments -eq $expectedCommandArguments) }
Should -Invoke Invoke-ExecutableCommand -Times 1 -Scope It -ModuleName "BuildkitTools" -ParameterFilter {
($Executable -eq $expectedExecutablePath ) -and
($Arguments -eq $expectedCommandArguments)
}
Should -Invoke Start-BuildkitdService -Times 0 -Scope It -ModuleName "BuildkitTools"
}

It "Should successfully register buildkitd service using custom values" {
# Create mock .conf file
$MockWinCNIPath = "$TestDrive\Program Files\Containerd\cni"
$MockCniBinDir = "$MockWinCNIPath\bin"
$MockCniConfPath = "$TestDrive\Program Files\Containerd\cni\conf\0-containerd-nat.conf"
$MockCniConfDir = "$MockWinCNIPath\conf"
$MockCniConfPath = "$MockCniConfDir\0-containerd-nat.conf"
New-Item -Path "$MockCniConfDir" -ItemType 'Directory' -Force | Out-Null
Set-Content -Path "$MockCniConfPath" -Value 'Nat config data here' -Force

Register-BuildkitdService -WinCNIPath $MockWinCNIPath -BuildKitPath $MockBuildKitPath -Start -Force

$expectedExecutablePath = "$MockBuildKitPath\bin\buildkitd.exe"
$expectedCommandArguments = "--register-service --debug --containerd-worker=true --containerd-cni-config-path=`"$MockCniConfPath`" --containerd-cni-binary-dir=`"$MockCniBinDir`" --service-name buildkitd"
Write-Host "'$expectedCommandArguments'" -ForegroundColor Magenta
Should -Invoke Invoke-ExecutableCommand -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { ($Executable -eq $expectedExecutablePath ) -and ($Arguments -eq $expectedCommandArguments) }
-ParameterFilter {
($Executable -eq $expectedExecutablePath ) -and
($Arguments -eq $expectedCommandArguments)
}
Should -Invoke Start-BuildkitdService -Times 1 -Scope It -ModuleName "BuildkitTools"
}

Expand Down Expand Up @@ -252,12 +262,14 @@ Describe "BuildkitTools.psm1" {
Mock Test-ConfFileEmpty -ModuleName "BuildkitTools" { return $true }
Mock Get-ConsentToRegisterBuildkit -ModuleName "BuildkitTools" { return $yesValue }

Register-BuildkitdService -WinCNIPath "$TestDrive\SomeOtherFolder" -Force
Register-BuildkitdService -WinCNIPath $MockWinCNIPath -BuildKitPath $MockBuildKitPath -Start -Force

$expectedExecutablePath = "$MockBuildKitPath\bin\buildkitd.exe"
$expectedCommandArguments = '--register-service --debug --containerd-worker=true --service-name buildkitd'
Should -Invoke Invoke-ExecutableCommand -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { ($Executable -eq $expectedExecutablePath ) -and ($Arguments -eq $expectedCommandArguments) }
-ParameterFilter {
($Executable -eq $expectedExecutablePath ) -and
($Arguments -eq $expectedCommandArguments)
}
}

It "Should throw an error if user does not consent to registering buildkitd service without NAT conf file" {
Expand Down Expand Up @@ -302,35 +314,36 @@ Describe "BuildkitTools.psm1" {
}

It "Should successfully uninstall Buildkit" {
Mock Uninstall-BuildkitHelper -ModuleName 'BuildkitTools'
Uninstall-Buildkit -Path 'TestDrive:\Custom\Buildkit\' -Confirm:$false -Force

# Should stop and deregister the buildkitd service
Should -Invoke Stop-BuildkitdService -Times 1 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Unregister-Buildkitd -Times 1 -Scope It -ModuleName "BuildkitTools"

Uninstall-Buildkit -Path 'TestDrive:\Program Files\Buildkit' -Confirm:$false -Force
# Should remove buildkit dir
Should -Invoke Remove-Item -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq 'TestDrive:\Custom\Buildkit\bin' }

Should -Invoke Uninstall-BuildkitHelper -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq 'TestDrive:\Program Files\Buildkit' }
# Should not purge program data
Should -Invoke Remove-Item -Times 0 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq 'HKLM:\SYSTEM\CurrentControlSet\Services\buildkit' }
Should -Invoke Uninstall-ProgramFiles -Times 0 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq "$ENV:ProgramData\Buildkit" }
Should -Invoke Remove-FeatureFromPath -Times 0 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Feature -eq "buildkit" }
}

It "Should successfully uninstall Buildkit from default path" {
Mock Uninstall-BuildkitHelper -ModuleName 'BuildkitTools'

Uninstall-Buildkit -Confirm:$false -Force

Should -Invoke Uninstall-BuildkitHelper -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq 'TestDrive:\Program Files\Buildkit' }
Should -Invoke Remove-Item -Times 0 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq 'TestDrive:\Program Files\Buildkit\bin' }
}

It "Should throw an error if user does not consent to uninstalling Buildkit" {
$ENV:PESTER = $true
{ Uninstall-Buildkit -Path 'TestDrive:\Program Files\Buildkit' -Confirm:$false -Force:$false } | Should -Throw "Buildkit uninstallation cancelled."
}
It "Should successfully purge program data" {
Uninstall-Buildkit -Path 'TestDrive:\Program Files\Buildkit' -Confirm:$false -Force -Purge

It "Should successfully call uninstall Buildkit helper function" {
Uninstall-BuildkitHelper -Path 'TestDrive:\Program Files\Buildkit'

Should -Invoke Stop-BuildkitdService -Times 1 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Unregister-Buildkitd -Times 1 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Remove-Item -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq 'HKLM:\SYSTEM\CurrentControlSet\Services\buildkit' }
# Should purge program data
Should -Invoke Remove-Item -Times 1 -Scope It -ModuleName "BuildkitTools" `
-ParameterFilter { $Path -eq 'TestDrive:\Program Files\Buildkit' }
Should -Invoke Uninstall-ProgramFiles -Times 1 -Scope It -ModuleName "BuildkitTools" `
Expand All @@ -339,26 +352,35 @@ Describe "BuildkitTools.psm1" {
-ParameterFilter { $Feature -eq "buildkit" }
}

It "Should do nothing if user does not consent to uninstalling Buildkit" {
$ENV:PESTER = $true
Uninstall-Buildkit -Path 'TestDrive:\Program Files\Buildkit' -Confirm:$false -Force:$false

# Should NOT stop and deregister the buildkit service
Should -Invoke Stop-BuildkitdService -Times 0 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Unregister-Buildkitd -Times 0 -Scope It -ModuleName "BuildkitTools"

# Should NOT remove buildkit binaries/dir
Should -Invoke Remove-Item -Times 0 -Scope It -ModuleName "BuildkitTools"
}

It "Should do nothing if buildkit is not installed at specified path" {
Mock Test-EmptyDirectory -ModuleName 'BuildkitTools' -MockWith { return $true }

Uninstall-BuildkitHelper -Path 'TestDrive:\Program Files\Buildkit'
Uninstall-Buildkit -Path 'TestDrive:\Program Files\Buildkit' -Confirm:$false

Should -Invoke Stop-BuildkitdService -Times 0 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Unregister-Buildkitd -Times 0 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Remove-Item -Times 0 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Remove-FeatureFromPath -Times 0 -Scope It -ModuleName "BuildkitTools"

$Error[0].Exception.Message | Should -BeExactly 'Buildkit does not exist at TestDrive:\Program Files\Buildkit or the directory is empty.'
}

It "Should throw an error if buildkitd service stop or unregister was unsuccessful" {
Mock Stop-BuildkitdService -ModuleName 'BuildkitTools' -MockWith { Throw 'Error' }

{ Uninstall-BuildkitHelper -Path 'TestDrive:\Program Files\Buildkit' } | Should -Throw "Could not stop or unregister buildkitd service.*"
{ Uninstall-Buildkit -Path 'TestDrive:\Program Files\Buildkit' -Confirm:$false -Force -Purge } | Should -Throw "*Could not stop or unregister buildkitd service.*"
Should -Invoke Unregister-Buildkitd -Times 0 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Remove-Item -Times 0 -Scope It -ModuleName "BuildkitTools"
Should -Invoke Remove-FeatureFromPath -Times 0 -Scope It -ModuleName "BuildkitTools"
}
}
}
}
40 changes: 19 additions & 21 deletions Tests/ContainerNetworkTools.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,8 @@ Describe "ContainerNetworkTools.psm1" {
Mock New-HNSNetwork -ModuleName 'ContainerNetworkTools'
Mock Restart-Service -ModuleName 'ContainerNetworkTools'
Mock Install-WinCNIPlugin -ModuleName 'ContainerNetworkTools'
Mock Set-Content -ModuleName 'ContainerNetworkTools' -ParameterFilter {
$Path -eq "$ENV:ProgramFiles\Containerd\cni\conf\0-containerd-nat.conf" }
}

It "Should use defaults" {
Expand All @@ -169,9 +171,14 @@ Describe "ContainerNetworkTools.psm1" {
$Gateway -eq '99.2.0.8'
$AddressPrefix -eq '99.2.0.0/16'
}

# NOTE: Since we are running as non-admin, we are not able to write to the default path
# "C:\Program Files\Containerd\cni\conf\0-containerd-nat.conf". Instead, we test that
# Set-Content is called with the correct parameters.
$MockConfFilePath = "C:\Program Files\Containerd\cni\conf\0-containerd-nat.conf"
$MockConfFilePath | Should -Exist
$MockConfFilePath | Should -FileContentMatch "`"cniVersion`": `"1.0.0`""
Should -Invoke Set-Content -ModuleName 'ContainerNetworkTools' -ParameterFilter {
$Path -eq $MockConfFilePath
}
}

It "Should use user-specified values" {
Expand Down Expand Up @@ -257,42 +264,33 @@ Describe "ContainerNetworkTools.psm1" {
}

It "Should successfully uninstall WinCNI plugins" {
Mock Uninstall-WinCNIPluginHelper -ModuleName 'ContainerNetworkTools'
Uninstall-WinCNIPlugin -Path 'TestDrive:\Program Files' -Confirm:$false -Force

Uninstall-WinCNIPlugin -Confirm:$false -Path 'TestDrive:\Program Files\cni' -Force

Should -Invoke Uninstall-WinCNIPluginHelper -Times 1 -Scope It -ModuleName "ContainerNetworkTools" `
# Should remove containerd/cni dir
Should -Invoke Remove-Item -Times 1 -Scope It -ModuleName "ContainerNetworkTools" `
-ParameterFilter { $Path -eq 'TestDrive:\Program Files\cni' }
}

It "Should successfully uninstall WinCNI plugins from default path" {
Mock Uninstall-WinCNIPluginHelper -ModuleName 'ContainerNetworkTools'

Uninstall-WinCNIPlugin -Confirm:$false -Force

Should -Invoke Uninstall-WinCNIPluginHelper -Times 1 -Scope It -ModuleName "ContainerNetworkTools" `
-ParameterFilter { $Path -eq 'TestDrive:\Program Files\Containerd\cni' }
Should -Invoke Remove-Item -Times 1 -Scope It -ModuleName "ContainerNetworkTools" `
-ParameterFilter { $Path -eq "$ENV:ProgramFiles\Containerd\cni" }
}

It "Should throw an error if user does not consent to uninstalling WinCNIPlugin" {
It "Should do nothing if user does not consent to uninstalling WinCNIPlugin" {
$ENV:PESTER = $true
{ Uninstall-WinCNIPlugin -Confirm:$false -Path 'TestDrive:\Program Files\cni' -Force:$false } | Should -Throw "Windows CNI plugins uninstallation cancelled."
}

It "Should successfully call uninstall WinCNIPlugin helper function" {
Uninstall-WinCNIPluginHelper -Path 'TestDrive:\TestDir\cni'
Uninstall-WinCNIPlugin -Confirm:$false -Force:$false

Should -Invoke Remove-Item -Times 1 -Scope It -ModuleName "ContainerNetworkTools" `
-ParameterFilter { $Path -eq 'TestDrive:\TestDir\cni' }
# Should NOT remove WinCNIPlugin binaries/dir
Should -Invoke Remove-Item -Times 0 -Scope It -ModuleName "ContainerNetworkTools"
}

It "Should do nothing if WinCNI plugins is not installed at specified path" {
Mock Test-EmptyDirectory -ModuleName 'ContainerNetworkTools' -MockWith { return $true }

Uninstall-WinCNIPluginHelper -Path 'TestDrive:\TestDir\cni'
Uninstall-WinCNIPlugin -Path 'TestDrive:\TestDir\cni' -Confirm:$false
Should -Invoke Remove-Item -Times 0 -Scope It -ModuleName "ContainerNetworkTools"

$Error[0].Exception.Message | Should -Be 'Windows CNI plugin does not exist at TestDrive:\TestDir\cni or the directory is empty.'
}
}
}
Loading