package audit import ( "bytes" "context" "encoding/json" "errors" "git.yuntuo.hk/k2safe/go-omni/logx" "io" "sync" "testing" ) type failedWriter struct{} func (failedWriter) Write([]byte) (int, error) { return 0, io.ErrClosedPipe } func TestAllowlistCorrelationAndWriteFailure(t *testing.T) { var buf bytes.Buffer sink, _ := NewJSONSink(&buf) recorder, _ := New(sink, "status") ctx := logx.WithRequestID(context.Background(), "r1") ctx = logx.WithTraceID(ctx, "t1") event := Event{ActorID: "u1", Action: "update", Resource: "object:1", Outcome: "success", Fields: map[string]string{"status": "ok", "password": "secret"}} var wg sync.WaitGroup for i := 0; i < 20; i++ { wg.Add(1) go func() { defer wg.Done() if err := recorder.Record(ctx, event); err != nil { t.Error(err) } }() } wg.Wait() decoder := json.NewDecoder(&buf) for i := 0; i < 20; i++ { var got Event if err := decoder.Decode(&got); err != nil { t.Fatal(err) } if got.Fields["password"] != "" || got.RequestID != "r1" || got.TraceID != "t1" || got.Time.IsZero() { t.Fatal(got) } } bad, _ := NewJSONSink(failedWriter{}) recorder, _ = New(bad) if err := recorder.Record(ctx, event); !errors.Is(err, io.ErrClosedPipe) { t.Fatal(err) } }