Files
AetherForge/server/internal/db/stale_agents_test.go
AetherForge 72ae457cca
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Add scale limit constants, stale-agent indexed query, and tests.
Extract fleet caps (128 hosts, sem=16, 250ms coalesce, syscheck=20) into
named constants with Go tests; wire ListStaleOnlineAgents for stale sweeps
instead of full ListAgents scans.
2026-06-07 06:40:12 -07:00

128 lines
2.8 KiB
Go

package db
import (
"fmt"
"testing"
"time"
"crypto-miner-server/internal/models"
)
func TestListStaleOnlineAgents_IndexedQuery(t *testing.T) {
d, err := New(t.TempDir())
if err != nil {
t.Fatal(err)
}
defer d.Close()
staleTime := time.Now().Add(-5 * time.Minute)
freshTime := time.Now()
agents := []*models.Agent{
{ID: "stale-online", Name: "stale", Status: "online", LastSeen: staleTime},
{ID: "fresh-online", Name: "fresh", Status: "online", LastSeen: freshTime},
{ID: "stale-offline", Name: "off", Status: "offline", LastSeen: staleTime},
}
for _, a := range agents {
if err := d.UpsertAgent(a); err != nil {
t.Fatal(err)
}
}
got, err := d.ListStaleOnlineAgents(3 * time.Minute)
if err != nil {
t.Fatal(err)
}
if len(got) != 1 {
t.Fatalf("ListStaleOnlineAgents: want 1 stale online, got %d", len(got))
}
if got[0].ID != "stale-online" {
t.Fatalf("got %q, want stale-online", got[0].ID)
}
}
func TestMarkStaleAgentsOffline(t *testing.T) {
d, err := New(t.TempDir())
if err != nil {
t.Fatal(err)
}
defer d.Close()
staleTime := time.Now().Add(-5 * time.Minute)
freshTime := time.Now()
for _, a := range []*models.Agent{
{ID: "stale-online", Name: "stale", Status: "online", LastSeen: staleTime},
{ID: "fresh-online", Name: "fresh", Status: "online", LastSeen: freshTime},
} {
if err := d.UpsertAgent(a); err != nil {
t.Fatal(err)
}
}
n, err := d.MarkStaleAgentsOffline(3 * time.Minute)
if err != nil {
t.Fatal(err)
}
if n != 1 {
t.Fatalf("MarkStaleAgentsOffline: want 1 updated, got %d", n)
}
fresh, err := d.GetAgent("fresh-online")
if err != nil {
t.Fatal(err)
}
if fresh.Status != "online" {
t.Fatalf("fresh-online status = %q, want online", fresh.Status)
}
stale, err := d.GetAgent("stale-online")
if err != nil {
t.Fatal(err)
}
if stale.Status != "offline" {
t.Fatalf("stale-online status = %q, want offline", stale.Status)
}
}
func TestListStaleOnlineAgents_AtScale(t *testing.T) {
d, err := New(t.TempDir())
if err != nil {
t.Fatal(err)
}
defer d.Close()
const total = 500
staleTime := time.Now().Add(-5 * time.Minute)
for i := 0; i < total; i++ {
status := "offline"
lastSeen := time.Now()
if i%5 == 0 {
status = "online"
lastSeen = staleTime
}
a := &models.Agent{
ID: fmt.Sprintf("agent-%d", i),
Name: "n",
Status: status,
LastSeen: lastSeen,
}
if err := d.UpsertAgent(a); err != nil {
t.Fatal(err)
}
}
start := time.Now()
got, err := d.ListStaleOnlineAgents(3 * time.Minute)
elapsed := time.Since(start)
if err != nil {
t.Fatal(err)
}
if len(got) != total/5 {
t.Fatalf("want %d stale online, got %d", total/5, len(got))
}
if elapsed > 2*time.Second {
t.Fatalf("ListStaleOnlineAgents too slow at %d rows: %v", total, elapsed)
}
}