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) } }