| 1 | package host |
| 2 | |
| 3 | import ( |
| 4 | "context" |
| 5 | "testing" |
| 6 | "time" |
| 7 | |
| 8 | "github.com/carlosframework/platform/internal/apperr" |
| 9 | "github.com/carlosframework/platform/internal/applog" |
| 10 | "github.com/carlosframework/platform/internal/release" |
| 11 | ) |
| 12 | |
| 13 | func TestErrshipFlushWritesOneChunkPerApp(t *testing.T) { |
| 14 | s := release.NewDirStore(t.TempDir()) |
| 15 | now := time.Date(2026, 9, 7, 10, 0, 0, 0, time.UTC) |
| 16 | sink := apperr.NewSink("box1", func() time.Time { return now }) |
| 17 | sink.Add("bab", "web", apperr.Record{Source: apperr.SourceEdge, Kind: apperr.KindHTTP, Name: "500 GET /x", Host: "h1"}) |
| 18 | sink.Add("bab", "web", apperr.Record{Source: apperr.SourceEdge, Kind: apperr.KindHTTP, Name: "500 GET /x", Host: "h1"}) |
| 19 | pending := map[applog.AppKey][]apperr.Record{} |
| 20 | errshipGather(sink, pending) |
| 21 | errshipFlush(context.Background(), s, pending) |
| 22 | if len(pending) != 0 { |
| 23 | t.Fatalf("pending after flush = %d", len(pending)) |
| 24 | } |
| 25 | recs, _, err := apperr.ReadWindow(context.Background(), s, "bab", "web", apperr.Filter{Since: now.Add(-time.Minute)}, 100) |
| 26 | if err != nil || len(recs) != 1 || recs[0].Count != 2 { |
| 27 | t.Fatalf("read back = %+v, %v", recs, err) |
| 28 | } |
| 29 | } |
| 30 | |
| 31 | func TestErrshipFlushHoldsOnFailure(t *testing.T) { |
| 32 | pending := map[applog.AppKey][]apperr.Record{{Acct: "bab", App: "web"}: {{TS: time.Now(), Source: apperr.SourceEdge, Name: "x", FP: "f", Box: "box1", Seq: 1}}} |
| 33 | errshipFlush(context.Background(), failingStore{}, pending) |
| 34 | if len(pending) != 1 { |
| 35 | t.Fatal("a failed flush must keep its records for the next round") |
| 36 | } |
| 37 | } |
| 38 | |