package mock import ( "context" "net" "os" "path/filepath" "tera-clone/services/tera-api/internal/domain" "tera-clone/services/tera-api/internal/logservice" "tera-clone/services/tera-api/internal/logstorage" "testing" ) func TestClearLinkLogsInvalidatesOtherClientCaches(t *testing.T) { journal, err := logstorage.Open(logstorage.Options{Root: t.TempDir(), Clock: fixedClock}) if err != nil { t.Fatal(err) } dir, err := os.MkdirTemp("", "link-clear-") if err != nil { t.Fatal(err) } defer os.RemoveAll(dir) socket := filepath.Join(dir, "log.sock") listener, err := net.Listen("unix", socket) if err != nil { t.Fatal(err) } done := make(chan error, 1) go func() { done <- (logservice.Server{Store: journal}).Serve(listener) }() defer func() { listener.Close(); <-done }() options := StoreOptions{LogJournal: logservice.NewClient(socket)} first, err := NewStoreWithOptions(fixedClock, options) if err != nil { t.Fatal(err) } defer first.Close() second, err := NewStoreWithOptions(fixedClock, options) if err != nil { t.Fatal(err) } defer second.Close() event := domain.LinkLogEvent{Timestamp: fixedClock(), Kind: "serial", Resource: "CH01", State: "down", PreviousState: "up", Signal: "dcd", EventType: "transition", Message: "test down"} if _, err := journal.Append(logstorage.ClassLink, event.Timestamp, event); err != nil { t.Fatal(err) } ctx := context.Background() if rows, err := second.LinkLogEvents(ctx, domain.LinkLogFilter{}); err != nil || len(rows) != 1 { t.Fatalf("prime %v %v", rows, err) } if result, err := first.ClearLinkLogs(ctx); err != nil || result.Deleted != 1 { t.Fatalf("clear %v %v", result, err) } if rows, err := second.LinkLogEvents(ctx, domain.LinkLogFilter{}); err != nil || len(rows) != 0 { t.Fatalf("stale %v %v", rows, err) } event.State = "up" event.PreviousState = "down" if _, err := journal.Append(logstorage.ClassLink, event.Timestamp, event); err != nil { t.Fatal(err) } if rows, err := second.LinkLogEvents(ctx, domain.LinkLogFilter{}); err != nil || len(rows) != 1 { t.Fatalf("new %v %v", rows, err) } }