check / check (push) Failing after 1s
Add the standard scaffold and bring the tree to a clean lint under the vendored `default: all` config. New: `script/` Scripts-to-Rule-Them-All entrypoints with the `Makefile` reduced to thin shims; a `Dockerfile` whose `lint` and `test` phases gate the build (final stage depends on both); a `.gitea/workflows/` CI running `script/cibuild`; the vendored `.golangci.yml`; `REPO_POLICIES.md`; `.editorconfig`; `.dockerignore`; a `LICENSE` (WTFPL) and `TODO.md`; and a comprehensive `.gitignore`. The 211 lint findings were fixed, not suppressed: package-level state became functions/fields/a command constructor, magic numbers became named constants, `ctx` is threaded into the probes, the loop functions were split to cut complexity, and the deprecated `+build` tags were dropped. Behavior is unchanged. The only annotations are justified `//nolint:gosec` on the `ping`/`curl` subprocess calls (G204, fixed argv) and the operator-chosen log file (G304), matching the reference repos. `make check` is green (lint and tests run in Docker). Model: opus-4-8
112 lines
2.4 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|