Tasks/BuiltIn/Network/Test-Connection.ps1

<#
.SYNOPSIS
    Tests network connectivity to a target host.
 
.DESCRIPTION
    Performs ping tests to verify network connectivity and measures response times.
 
.PARAMETER TargetHost
    Target hostname or IP address to test.
 
.PARAMETER Count
    Number of ping attempts (default: 4).
 
.PARAMETER TimeoutSeconds
    Timeout for each ping in seconds (default: 5).
 
.NOTES
    TaskName: Network.TestConnection
    Version: 1.0.0
    Author: Toolbox
    Tags: Network, Ping, ICMP, Connectivity
    RequiresElevation: False
    SupportedOS: Windows, Linux, MacOS
    PSEdition: Desktop, Core
    MinPSVersion: 5.1
    Timeout: 30
 
.EXAMPLE
    Invoke-Task -TaskName 'Network.TestConnection' -Computers 'localhost'
#>

[CmdletBinding()]
param(
    [Parameter(Mandatory)]
    [string]$TargetHost,
    
    [Parameter()]
    [int]$Count = 4,
    
    [Parameter()]
    [int]$TimeoutSeconds = 5
)

try {
    Write-Verbose "Testing connectivity to $TargetHost ($Count attempts)..."
    
    # Use Test-Connection (compatible with both PowerShell versions)
    if ($PSVersionTable.PSVersion.Major -ge 6) {
        # PowerShell Core has different parameters
        $pingResults = Test-Connection -TargetName $TargetHost -Count $Count -TimeoutSeconds $TimeoutSeconds -ErrorAction SilentlyContinue
    }
    else {
        # Windows PowerShell
        $pingResults = Test-Connection -ComputerName $TargetHost -Count $Count -ErrorAction SilentlyContinue
    }
    
    $successful = @($pingResults | Where-Object { $_.StatusCode -eq 0 -or $_.Status -eq 'Success' })
    $successRate = if ($pingResults) { 
        [math]::Round(($successful.Count / $Count) * 100, 2) 
    } else { 
        0 
    }
    
    $result = [PSCustomObject]@{
        TargetHost = $TargetHost
        Reachable = $successful.Count -gt 0
        SuccessRate = $successRate
        PacketsSent = $Count
        PacketsReceived = $successful.Count
        PacketsLost = $Count - $successful.Count
        MinResponseTime = if ($successful) { ($successful | Measure-Object -Property ResponseTime -Minimum).Minimum } else { $null }
        MaxResponseTime = if ($successful) { ($successful | Measure-Object -Property ResponseTime -Maximum).Maximum } else { $null }
        AvgResponseTime = if ($successful) { [math]::Round(($successful | Measure-Object -Property ResponseTime -Average).Average, 2) } else { $null }
        TestedAt = Get-Date -Format 'o'
    }
    
    if ($result.Reachable) {
        Write-Verbose "Host is reachable (Success rate: $successRate%)"
    }
    else {
        Write-Verbose "Host is not reachable"
    }
    
    return $result
}
catch {
    Write-Error "Failed to test connection: $_"
    throw
}