Release / update-version (push) Has been cancelled
Release / build-frontend (push) Has been cancelled
Release / release (push) Has been cancelled
Release / sync-version-file (push) Has been cancelled
CI / shell (push) Canceled after 0s
CI / test (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / golangci-lint (push) Canceled after 0s
Security Scan / backend-security (push) Canceled after 0s
Security Scan / frontend-security (push) Canceled after 0s
50 lines
1.7 KiB
Go
50 lines
1.7 KiB
Go
package service
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestSanitizeOpsUpstreamErrorsForQueueBoundsAndRedacts(t *testing.T) {
|
|
entry := &OpsInsertErrorLogInput{}
|
|
for i := 0; i < 20; i++ {
|
|
entry.UpstreamErrors = append(entry.UpstreamErrors, &OpsUpstreamErrorEvent{
|
|
Platform: strings.Repeat("p", 100),
|
|
AccountName: strings.Repeat("a", 300),
|
|
UpstreamStatusCode: 500,
|
|
UpstreamURL: strings.Repeat("u", 3000),
|
|
UpstreamResponseBody: `{"authorization":"Bearer secret","message":"` + strings.Repeat("x", 10_000) + `"}`,
|
|
Message: strings.Repeat("m", 3000),
|
|
Detail: `{"api_key":"secret","detail":"` + strings.Repeat("y", 10_000) + `"}`,
|
|
})
|
|
}
|
|
|
|
if err := SanitizeOpsUpstreamErrorsForQueue(entry); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if entry.UpstreamErrors != nil {
|
|
t.Fatal("raw upstream event slice must be released before queueing")
|
|
}
|
|
if entry.UpstreamErrorsJSON == nil {
|
|
t.Fatal("sanitized upstream event JSON is missing")
|
|
}
|
|
events, err := ParseOpsUpstreamErrors(*entry.UpstreamErrorsJSON)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(events) != 16 {
|
|
t.Fatalf("event count = %d, want 16", len(events))
|
|
}
|
|
for _, event := range events {
|
|
if len(event.Platform) > 32 || len(event.AccountName) > 128 || len(event.UpstreamURL) > 2048 || len(event.Message) > 2048 {
|
|
t.Fatalf("event fields were not bounded: %+v", event)
|
|
}
|
|
if len(event.UpstreamResponseBody) > OpsErrorLogQueueBodyMaxBytes || len(event.Detail) > OpsErrorLogQueueBodyMaxBytes {
|
|
t.Fatal("event body/detail exceeded queue limit")
|
|
}
|
|
if strings.Contains(event.UpstreamResponseBody, "Bearer secret") || strings.Contains(event.Detail, `"secret"`) {
|
|
t.Fatal("credential material was not redacted")
|
|
}
|
|
}
|
|
}
|