Files
felhom-agent/internal/hub/hostmetrics_test.go
T

72 lines
2.5 KiB
Go

package hub
import (
"context"
"errors"
"testing"
)
// fakeTemp is a TempReader returning a fixed (nullable) value.
type fakeTemp struct{ c *int }
func (f fakeTemp) CPUTempC(context.Context) *int { return f.c }
func intp(v int) *int { return &v }
// HostMetricsNow returns a fresh host block with cpu% from NodeStatus and the temp from the reader.
func TestHostMetricsNow_PopulatesTemp(t *testing.T) {
px := &fakePx{node: "demo-felhom", ns: newTestNodeStatus()}
c := NewCollector(px, fakeProber{status: "running", detail: "connected"}, nil, nil, nil, nil, "h", "0.14.0", quietLogger()).
SetTempReader(fakeTemp{c: intp(46)})
h, err := c.HostMetricsNow(context.Background())
if err != nil {
t.Fatalf("HostMetricsNow: %v", err)
}
if h.Node != "demo-felhom" || h.CPUPercent != 5 {
t.Errorf("host = %+v", h)
}
if h.CPUTempC == nil || *h.CPUTempC != 46 {
t.Fatalf("cpu_temp_c = %v, want 46", h.CPUTempC)
}
if h.MemoryPercent != 25 {
t.Errorf("mem%% = %v, want 25", h.MemoryPercent)
}
}
// A missing temp sensor gracefully nulls cpu_temp_c without failing the host read.
func TestHostMetricsNow_GracefulNullTemp(t *testing.T) {
px := &fakePx{node: "n", ns: newTestNodeStatus()}
c := NewCollector(px, fakeProber{status: "running", detail: "connected"}, nil, nil, nil, nil, "h", "0.14.0", quietLogger()).
SetTempReader(fakeTemp{c: nil})
h, err := c.HostMetricsNow(context.Background())
if err != nil {
t.Fatalf("HostMetricsNow: %v", err)
}
if h.CPUTempC != nil {
t.Fatalf("cpu_temp_c = %v, want nil (n/a)", h.CPUTempC)
}
}
// A NodeStatus failure is a hard error (no useful host view).
func TestHostMetricsNow_NodeStatusErrorIsHard(t *testing.T) {
px := &fakePx{node: "n", nsErr: errors.New("proxmox down")}
c := NewCollector(px, fakeProber{status: "running", detail: "connected"}, nil, nil, nil, nil, "h", "0.14.0", quietLogger())
if _, err := c.HostMetricsNow(context.Background()); err == nil {
t.Fatal("NodeStatus failure must be a hard error")
}
}
// Collect() (the hub report) also carries the temp now — the operator freebie.
func TestCollect_HostReportCarriesTemp(t *testing.T) {
px := &fakePx{node: "n", ns: newTestNodeStatus()}
c := NewCollector(px, fakeProber{status: "running", detail: "connected"}, nil, nil, nil, nil, "h", "0.14.0", quietLogger()).
SetTempReader(fakeTemp{c: intp(51)})
r, err := c.Collect(context.Background())
if err != nil {
t.Fatalf("Collect: %v", err)
}
if r.Host.CPUTempC == nil || *r.Host.CPUTempC != 51 {
t.Fatalf("report host cpu_temp_c = %v, want 51", r.Host.CPUTempC)
}
}