51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
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)
|
|
}
|
|
}
|