package ping import ( "context" "net" "testing" "time" "internetpressure.io/probe-agent/internal/protocol" ) func TestSummarise(t *testing.T) { m := protocol.Measurement{} summarise(&m, []time.Duration{10 * time.Millisecond, 12 * time.Millisecond, 11 * time.Millisecond, 13 * time.Millisecond}, 5) if !m.OK || m.Error != "" || *m.Sent != 5 || *m.Received != 4 { t.Fatalf("%+v", m) } if *m.PacketLoss != 0.2 || *m.RTTMinMs != 10 || *m.RTTMaxMs != 13 || *m.RTTAvgMs != 11.5 { t.Fatalf("stats: loss=%v min=%v avg=%v max=%v", *m.PacketLoss, *m.RTTMinMs, *m.RTTAvgMs, *m.RTTMaxMs) } // successive diffs: |12-10|=2, |11-12|=1, |13-11|=2 → mean 5/3 if got := *m.JitterMs; got < 1.666 || got > 1.667 { t.Fatalf("jitter=%v", got) } m = protocol.Measurement{} summarise(&m, nil, 5) if m.OK || m.Error != protocol.ErrUnreachable || *m.PacketLoss != 1 { t.Fatalf("unreachable: %+v", m) } } func TestTCPConnects(t *testing.T) { ln, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { t.Fatal(err) } defer ln.Close() go func() { for { c, err := ln.Accept() if err != nil { return } c.Close() } }() port := ln.Addr().(*net.TCPAddr).Port c := &Checker{} m := c.RunTCP(context.Background(), protocol.Target{TargetID: "t", Hostname: "localhost", IP: strPtr("127.0.0.1"), Port: port}) if !m.OK || m.Kind != "tcp" || *m.Received != Count || m.ResolvedIP != "127.0.0.1" { t.Fatalf("%+v", m) } // Closed port → refused → unreachable ln.Close() m = c.RunTCP(context.Background(), protocol.Target{TargetID: "t", Hostname: "localhost", IP: strPtr("127.0.0.1"), Port: port}) if m.OK || m.Error != protocol.ErrUnreachable { t.Fatalf("closed port: %+v", m) } } // Loopback ICMP echo; skipped when the platform does not allow unprivileged ICMP sockets. func TestICMPLoopback(t *testing.T) { if !Detect() { t.Skip("unprivileged ICMP not available here") } c := &Checker{ICMP: true} m := c.Run(context.Background(), protocol.Target{TargetID: "lo", Hostname: "localhost", IP: strPtr("127.0.0.1")}) if m.Kind != "ping" { t.Fatalf("expected icmp ping, got %+v", m) } if !m.OK || *m.Received == 0 { t.Fatalf("loopback ping failed: %+v", m) } } func strPtr(s string) *string { return &s }