Files
rtnetmon/internal/monitor/monitor_test.go
T
clawbot 7dd4ac798d
check / check (push) Failing after 0s
Adopt repo standards: scaffold, policies, lint-clean (closes #1)
Standard scaffold: script/ entrypoints with the Makefile as thin shims, a Dockerfile whose lint and test phases gate the build, a Gitea CI workflow running script/cibuild, REPO_POLICIES.md, TODO.md, .editorconfig, .dockerignore, LICENSE, wider .gitignore. .golangci.yml is byte-identical to the canonical copy in the prompts repo.

211 lint findings fixed in code: package globals became functions/fields and a cobra command constructor, magic numbers became named constants, ctx is threaded into the probes, monitor loops split. Tests moved to external _test packages with export_test.go. Behavior unchanged.

Readers will trip over: make lint/test/check now need a Docker daemon; the personal rsync copy/run targets are gone and make run runs locally.
Disclosure: four //nolint:gosec remain on the fixed-argv ping/curl calls and the operator-chosen log file, as the reference repo annotates the same class.
Disclosure: module path left as-is.

Model: opus-4-8 (implementation); fable-5-1 (merge)
2026-09-21 09:22:28 +02:00

112 lines
2.4 KiB
Go

//go:build linux
package monitor_test
import (
"testing"
"git.eeqj.de/sneak/rtnetmon/internal/monitor"
)
func TestNewMonitor(t *testing.T) {
t.Parallel()
mon := monitor.NewMonitor("test0", "Test Interface A", "test1",
"Test Interface B", "/tmp/test.log")
if mon.InterfaceA() == nil {
t.Fatal("interfaceA is nil")
}
if mon.InterfaceB() == nil {
t.Fatal("interfaceB is nil")
}
if mon.InterfaceA().Name != "test0" {
t.Errorf("interfaceA.Name = %q, want %q", mon.InterfaceA().Name, "test0")
}
if mon.InterfaceB().Name != "test1" {
t.Errorf("interfaceB.Name = %q, want %q", mon.InterfaceB().Name, "test1")
}
if mon.ICMPTimeout.Milliseconds() != 500 {
t.Errorf("ICMPTimeout = %dms, want 500ms", mon.ICMPTimeout.Milliseconds())
}
if mon.PacketLossPings != 20 {
t.Errorf("PacketLossPings = %d, want 20", mon.PacketLossPings)
}
if mon.ReachabilityHosts() == nil {
t.Error("reachabilityHosts is nil")
}
if mon.PacketLossHosts() == nil {
t.Error("packetLossHosts is nil")
}
if mon.TCPHosts() == nil {
t.Error("tcpHosts is nil")
}
}
func TestAddHosts(t *testing.T) {
t.Parallel()
mon := monitor.NewMonitor("test0", "Test A", "test1", "Test B", "")
mon.AddReachabilityHost("8.8.8.8")
mon.AddReachabilityHost("google.com")
if len(mon.ReachabilityHosts()) != 2 {
t.Errorf("reachability hosts = %d, want 2", len(mon.ReachabilityHosts()))
}
mon.AddPacketLossHost("github.com")
if len(mon.PacketLossHosts()) != 1 {
t.Errorf("packet loss hosts = %d, want 1", len(mon.PacketLossHosts()))
}
mon.AddTCPHost("google.com:443")
mon.AddTCPHost("github.com:443")
if len(mon.TCPHosts()) != 2 {
t.Errorf("tcp hosts = %d, want 2", len(mon.TCPHosts()))
}
}
func TestMinMaxAvgStd(t *testing.T) {
t.Parallel()
tests := []struct {
name string
data []float64
wantMin, wantMax, wantAvg float64
}{
{"empty slice", []float64{}, 0, 0, 0},
{"single value", []float64{5.0}, 5.0, 5.0, 5.0},
{"multiple values", []float64{1.0, 2.0, 3.0, 4.0, 5.0}, 1.0, 5.0, 3.0},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
mn, mx, avg, _ := monitor.MinMaxAvgStd(tt.data)
if mn != tt.wantMin {
t.Errorf("min = %v, want %v", mn, tt.wantMin)
}
if mx != tt.wantMax {
t.Errorf("max = %v, want %v", mx, tt.wantMax)
}
if avg != tt.wantAvg {
t.Errorf("avg = %v, want %v", avg, tt.wantAvg)
}
})
}
}