Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
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.
128 lines
2.8 KiB
Go
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)
|
|
}
|
|
}
|