# Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. function Wait-UntilTrue { [CmdletBinding()] param ( [ScriptBlock]$sb, [int]$TimeoutInMilliseconds = 10000, [int]$IntervalInMilliseconds = 1000 ) # Get the current time $startTime = [DateTime]::Now # Loop until the script block evaluates to true while (-not ($sb.Invoke())) { # If the timeout period has passed, return false if (([DateTime]::Now - $startTime).TotalMilliseconds -gt $timeoutInMilliseconds) { return $false } # Sleep for the specified interval Start-Sleep -Milliseconds $intervalInMilliseconds } return $true } function Wait-FileToBePresent { [CmdletBinding()] param ( [string]$File, [int]$TimeoutInSeconds = 10, [int]$IntervalInMilliseconds = 100 ) Wait-UntilTrue -sb { Test-Path $File } -TimeoutInMilliseconds ($TimeoutInSeconds*1000) -IntervalInMilliseconds $IntervalInMilliseconds > $null } function Test-IsElevated { $IsElevated = $False if ( $IsWindows ) { # on Windows we can determine whether we're executing in an # elevated context $identity = [System.Security.Principal.WindowsIdentity]::GetCurrent() $windowsPrincipal = new-object 'Security.Principal.WindowsPrincipal' $identity if ($windowsPrincipal.IsInRole("Administrators") -eq 1) { $IsElevated = $true } } else { # on Linux, tests run via sudo will generally report "root" for whoami if ( (whoami) -match "root" ) { $IsElevated = $true } } return $IsElevated } #This function follows the pester naming convention function ShouldBeErrorId { param([Parameter(ValueFromPipeline, Mandatory)] [ScriptBlock] $sb, [Parameter(Mandatory, Position=0)] [string] $FullyQualifiedErrorId) try { & $sb | Out-Null Throw "No Exception!" } catch { $_.FullyQualifiedErrorId | Should Be $FullyQualifiedErrorId | Out-Null # Write the exception to output that allow us to check later other properies of the exception Write-Output $_ } } function Get-RandomFileName { [System.IO.Path]::GetFileNameWithoutExtension([IO.Path]::GetRandomFileName()) } # # Testhook setting functions # note these manipulate private data in the PowerShell engine which will # enable us to not actually alter the system or mock returned data # $SCRIPT:TesthookType = [system.management.automation.internal.internaltesthooks] function Test-TesthookIsSet { param ( [ValidateNotNullOrEmpty()] [Parameter(Mandatory=$true)] $testhookName ) try { return ${Script:TesthookType}.GetField($testhookName, "NonPublic,Static").GetValue($null) } catch { # fall through } return $false } function Enable-Testhook { param ( [ValidateNotNullOrEmpty()] [Parameter(Mandatory=$true)] $testhookName ) ${Script:TesthookType}::SetTestHook($testhookName, $true) } function Disable-Testhook { param ( [ValidateNotNullOrEmpty()] [Parameter(Mandatory=$true)] $testhookName ) ${Script:TesthookType}::SetTestHook($testhookName, $false) } function Set-TesthookResult { param ( [ValidateNotNullOrEmpty()] [Parameter(Mandatory=$true)] $testhookName, [ValidateNotNullOrEmpty()] [Parameter(Mandatory=$true)] $value ) ${Script:TesthookType}::SetTestHook($testhookName, $value) }