package store import "testing" func TestListContainerStatsSamplesByWorkload_ScopedToWorkload(t *testing.T) { s := newTestStore(t) wa := seedWorkload(t, s, "wa") wb := seedWorkload(t, s, "wb") ca, err := s.CreateContainer(Container{WorkloadID: wa.ID, WorkloadKind: "image", ContainerID: "da", Host: "local", State: "running"}) if err != nil { t.Fatalf("CreateContainer a: %v", err) } cb, err := s.CreateContainer(Container{WorkloadID: wb.ID, WorkloadKind: "image", ContainerID: "db", Host: "local", State: "running"}) if err != nil { t.Fatalf("CreateContainer b: %v", err) } // owner_id is the container ROW id. mustInsertSample(t, s, ca.ID, 100, 12.5, 2048) mustInsertSample(t, s, ca.ID, 200, 15.0, 3072) mustInsertSample(t, s, cb.ID, 150, 99.0, 9999) got, err := s.ListContainerStatsSamplesByWorkload(wa.ID, 0) if err != nil { t.Fatalf("ListContainerStatsSamplesByWorkload: %v", err) } if len(got) != 2 { t.Fatalf("expected 2 samples for workload a, got %d", len(got)) } // ts ascending. if got[0].TS != 100 || got[1].TS != 200 { t.Fatalf("expected ts-ascending 100,200, got %d,%d", got[0].TS, got[1].TS) } for _, sm := range got { if sm.OwnerID != ca.ID { t.Fatalf("leaked a sample from another workload: %+v", sm) } } // Since-cutoff filters older samples. recent, _ := s.ListContainerStatsSamplesByWorkload(wa.ID, 150) if len(recent) != 1 || recent[0].TS != 200 { t.Fatalf("expected only ts=200 after cutoff, got %+v", recent) } } func mustInsertSample(t *testing.T, s *Store, ownerID string, ts int64, cpu float64, mem int64) { t.Helper() if err := s.InsertContainerStatsSample(ContainerStatsSample{ ContainerID: "c-" + ownerID, OwnerType: "instance", OwnerID: ownerID, TS: ts, CPUPercent: cpu, MemoryUsage: mem, MemoryLimit: mem * 2, }); err != nil { t.Fatalf("InsertContainerStatsSample: %v", err) } }