105 lines
2.4 KiB
Go
105 lines
2.4 KiB
Go
package lib
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestCollectPayload(t *testing.T) {
|
|
cfg := TelemetryConfig{
|
|
FreqSeconds: 60,
|
|
Host: "http://localhost:9999",
|
|
Token: "test-token",
|
|
DataDir: t.TempDir(),
|
|
}
|
|
startTime := time.Now().Add(-5 * time.Minute)
|
|
|
|
payload := CollectPayload(cfg, startTime)
|
|
|
|
if payload.Version == "" {
|
|
t.Error("version should not be empty")
|
|
}
|
|
if payload.Hostname == "" {
|
|
t.Error("hostname should not be empty")
|
|
}
|
|
if payload.UptimeSeconds < 299 {
|
|
t.Errorf("uptime should be ~300s, got %d", payload.UptimeSeconds)
|
|
}
|
|
if payload.Timestamp == "" {
|
|
t.Error("timestamp should not be empty")
|
|
}
|
|
if payload.System.OS == "" {
|
|
t.Error("OS should not be empty")
|
|
}
|
|
if payload.System.CPUs < 1 {
|
|
t.Errorf("CPUs should be >= 1, got %d", payload.System.CPUs)
|
|
}
|
|
if payload.System.MemTotalMB <= 0 {
|
|
t.Errorf("memory total should be > 0, got %d", payload.System.MemTotalMB)
|
|
}
|
|
|
|
// Verify JSON roundtrip.
|
|
data, err := json.Marshal(payload)
|
|
if err != nil {
|
|
t.Fatalf("marshal: %v", err)
|
|
}
|
|
var decoded TelemetryPayload
|
|
if err := json.Unmarshal(data, &decoded); err != nil {
|
|
t.Fatalf("unmarshal: %v", err)
|
|
}
|
|
if decoded.Hostname != payload.Hostname {
|
|
t.Errorf("hostname mismatch after roundtrip")
|
|
}
|
|
}
|
|
|
|
func TestPostTelemetry(t *testing.T) {
|
|
var mu sync.Mutex
|
|
var received TelemetryPayload
|
|
var authHeader string
|
|
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
authHeader = r.Header.Get("Authorization")
|
|
body, _ := io.ReadAll(r.Body)
|
|
json.Unmarshal(body, &received)
|
|
w.WriteHeader(http.StatusOK)
|
|
}))
|
|
defer server.Close()
|
|
|
|
cfg := TelemetryConfig{
|
|
FreqSeconds: 1,
|
|
Host: server.URL,
|
|
Token: "secret-token",
|
|
DataDir: t.TempDir(),
|
|
}
|
|
|
|
StartTelemetry(cfg)
|
|
|
|
// Wait for the first post.
|
|
time.Sleep(500 * time.Millisecond)
|
|
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
|
|
if authHeader != "Bearer secret-token" {
|
|
t.Errorf("expected Bearer secret-token, got %q", authHeader)
|
|
}
|
|
if received.Version == "" {
|
|
t.Error("version should not be empty")
|
|
}
|
|
}
|
|
|
|
// Verify that StartTelemetry does nothing when disabled.
|
|
func TestTelemetryDisabled(t *testing.T) {
|
|
// Should not panic or start goroutines.
|
|
StartTelemetry(TelemetryConfig{})
|
|
StartTelemetry(TelemetryConfig{FreqSeconds: 0, Host: "http://example.com"})
|
|
StartTelemetry(TelemetryConfig{FreqSeconds: 60, Host: ""})
|
|
}
|