|
|
|
|
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 TestSystemClearInvalidatesAllAPICachesAndClearsAudit(t *testing.T) {
|
|
|
|
|
journal, err := logstorage.Open(logstorage.Options{Root: t.TempDir(), Clock: fixedClock})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
dir, err := os.MkdirTemp("", "sys-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()
|
|
|
|
|
ctx := context.Background()
|
|
|
|
|
if _, err := first.RecordSystemLog(ctx, domain.SystemLogEvent{Category: "system", Severity: "info", Source: "test", Message: "old"}); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
_, err = first.RecordAudit(ctx, domain.AuditEvent{Action: "auth.login", Target: "login", Result: "failed", Message: "keep"})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if rows, err := second.SystemLogEvents(ctx, domain.SystemLogFilter{}); err != nil || len(rows) != 2 {
|
|
|
|
|
t.Fatalf("prime cache=%+v,%v", rows, err)
|
|
|
|
|
}
|
|
|
|
|
if result, err := first.ClearSystemLogs(ctx); err != nil || result.Deleted != 2 {
|
|
|
|
|
t.Fatalf("clear=%+v,%v", result, err)
|
|
|
|
|
}
|
|
|
|
|
rows, err := second.SystemLogEvents(ctx, domain.SystemLogFilter{})
|
|
|
|
|
if err != nil || len(rows) != 0 {
|
|
|
|
|
t.Fatalf("stale cache or lost audit=%+v,%v", rows, err)
|
|
|
|
|
}
|
|
|
|
|
if _, err := second.RecordSystemLog(ctx, domain.SystemLogEvent{Category: "system", Severity: "info", Source: "test", Message: "new"}); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
rows, err = first.SystemLogEvents(ctx, domain.SystemLogFilter{})
|
|
|
|
|
if err != nil || len(rows) != 1 {
|
|
|
|
|
t.Fatalf("new capture=%+v,%v", rows, err)
|
|
|
|
|
}
|
|
|
|
|
}
|