| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- package service
- import (
- "encoding/json"
- "fmt"
- "testing"
- "time"
- )
- // TestWsPayloadScale compares the websocket broadcast payload paths the
- // traffic job runs every 5s while a browser is connected: the full snapshot
- // (GetAllClientTraffics + full last-online map) against the delta variant
- // (GetActiveClientTraffics on this poll's active emails). Payload sizes are
- // logged against the hub's 10MB drop threshold.
- func TestWsPayloadScale(t *testing.T) {
- setupScaleDB(t)
- svc := &InboundService{}
- const hubPayloadLimit = 10 * 1024 * 1024
- for _, n := range scaleSizes(t, 10000, 100000) {
- t.Run(fmt.Sprintf("N=%d", n), func(t *testing.T) {
- ds := seedScaleDataset(t, n, 1)
- k := min(10000, n)
- activeEmails := sampleEmails(ds.emails, k)
- start := time.Now()
- all, err := svc.GetAllClientTraffics()
- if err != nil {
- t.Fatalf("GetAllClientTraffics: %v", err)
- }
- fetchAll := time.Since(start)
- if len(all) != n {
- t.Fatalf("GetAllClientTraffics rows = %d, want %d", len(all), n)
- }
- start = time.Now()
- snapshot, err := json.Marshal(map[string]any{"clients": all})
- if err != nil {
- t.Fatalf("marshal snapshot: %v", err)
- }
- marshalAll := time.Since(start)
- verdict := "delivered"
- if len(snapshot) > hubPayloadLimit {
- verdict = "DROPPED by hub (>10MB)"
- }
- t.Logf("N=%-7d snapshot: fetch=%-9v marshal=%-9v payload=%.1fMB %s",
- n, fetchAll.Round(time.Millisecond), marshalAll.Round(time.Millisecond),
- float64(len(snapshot))/(1<<20), verdict)
- start = time.Now()
- active, err := svc.GetActiveClientTraffics(activeEmails)
- if err != nil {
- t.Fatalf("GetActiveClientTraffics: %v", err)
- }
- fetchActive := time.Since(start)
- if len(active) != k {
- t.Fatalf("GetActiveClientTraffics rows = %d, want %d", len(active), k)
- }
- start = time.Now()
- delta, err := json.Marshal(map[string]any{"clients": active})
- if err != nil {
- t.Fatalf("marshal delta: %v", err)
- }
- marshalActive := time.Since(start)
- t.Logf("N=%-7d delta(K=%d): fetch=%-9v marshal=%-9v payload=%.1fMB",
- n, k, fetchActive.Round(time.Millisecond), marshalActive.Round(time.Millisecond),
- float64(len(delta))/(1<<20))
- start = time.Now()
- lastOnline, err := svc.GetClientsLastOnline()
- if err != nil {
- t.Fatalf("GetClientsLastOnline: %v", err)
- }
- fullMap := time.Since(start)
- if len(lastOnline) != n {
- t.Fatalf("GetClientsLastOnline entries = %d, want %d", len(lastOnline), n)
- }
- start = time.Now()
- activeLastOnline := make(map[string]int64, len(active))
- for _, ct := range active {
- activeLastOnline[ct.Email] = ct.LastOnline
- }
- activeMap := time.Since(start)
- t.Logf("N=%-7d lastOnline: fullMap=%-9v activeMap(K=%d)=%v",
- n, fullMap.Round(time.Millisecond), k, activeMap.Round(time.Microsecond))
- start = time.Now()
- if _, err := svc.GetInboundsTrafficSummary(); err != nil {
- t.Fatalf("GetInboundsTrafficSummary: %v", err)
- }
- t.Logf("N=%-7d inboundsSummary=%v", n, time.Since(start).Round(time.Millisecond))
- })
- }
- }
|