增加排查日志
This commit is contained in:
1 parent
2a64dc7395
commit
26caa7435f
2 files changed
+284
-1
No files matched your search
@@ -4,6 +4,7 @@ import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
@@ -466,6 +467,139 @@ func TestProviderErrorsAreGenericAndDoNotLeakSecrets(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSeedreamServiceFailureLogsOnlySafeDiagnosticFields(t *testing.T) {
|
||||
var output bytes.Buffer
|
||||
previousOutput, previousFlags := log.Writer(), log.Flags()
|
||||
log.SetOutput(&output)
|
||||
log.SetFlags(0)
|
||||
t.Cleanup(func() {
|
||||
log.SetOutput(previousOutput)
|
||||
log.SetFlags(previousFlags)
|
||||
})
|
||||
|
||||
client := roundTripFunc(func(*http.Request) (*http.Response, error) {
|
||||
return &http.Response{
|
||||
StatusCode: http.StatusBadRequest,
|
||||
Body: io.NopCloser(strings.NewReader(`{
|
||||
"error": {
|
||||
"code": "InvalidParameter",
|
||||
"type": "BadRequest",
|
||||
"message": "private prompt rejected for https://private.test/source.png?Signature=private-signature"
|
||||
},
|
||||
"request_id": "request-safe-seedream-1"
|
||||
}`)),
|
||||
Header: http.Header{},
|
||||
}, nil
|
||||
})
|
||||
adapter := NewSeedream(Config{
|
||||
BaseURL: "https://ark.test/api/v3", APIKey: "private-api-key", Model: Seedream50ProModel,
|
||||
}, client)
|
||||
|
||||
_, err := adapter.Submit(context.Background(), Request{
|
||||
Prompt: "private prompt",
|
||||
InputURLs: []string{"https://private.test/source.png?Signature=private-signature"},
|
||||
})
|
||||
if err == nil {
|
||||
t.Fatal("expected Seedream service error")
|
||||
}
|
||||
if strings.Contains(err.Error(), "InvalidParameter") || strings.Contains(err.Error(), "private") {
|
||||
t.Fatalf("provider error leaks upstream detail: %v", err)
|
||||
}
|
||||
|
||||
got := output.String()
|
||||
for _, expected := range []string{
|
||||
"provider=seedream",
|
||||
"operation=submit",
|
||||
"status=400",
|
||||
`code="InvalidParameter"`,
|
||||
`requestId="request-safe-seedream-1"`,
|
||||
`errorType="BadRequest"`,
|
||||
"errorClass=service",
|
||||
"elapsedMs=",
|
||||
} {
|
||||
if !strings.Contains(got, expected) {
|
||||
t.Fatalf("log %q does not contain %q", got, expected)
|
||||
}
|
||||
}
|
||||
for _, secret := range []string{
|
||||
"private-api-key",
|
||||
"private prompt",
|
||||
"private.test",
|
||||
"private-signature",
|
||||
"Signature=",
|
||||
"rejected",
|
||||
} {
|
||||
if strings.Contains(got, secret) {
|
||||
t.Fatalf("log leaks %q: %s", secret, got)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSeedreamServiceFailureUsesSafeHeaderRequestIDFallback(t *testing.T) {
|
||||
var output bytes.Buffer
|
||||
previousOutput, previousFlags := log.Writer(), log.Flags()
|
||||
log.SetOutput(&output)
|
||||
log.SetFlags(0)
|
||||
t.Cleanup(func() {
|
||||
log.SetOutput(previousOutput)
|
||||
log.SetFlags(previousFlags)
|
||||
})
|
||||
|
||||
client := roundTripFunc(func(*http.Request) (*http.Response, error) {
|
||||
return &http.Response{
|
||||
StatusCode: http.StatusBadRequest,
|
||||
Body: io.NopCloser(strings.NewReader(`{"error":{"code":"InvalidImage","message":"private response detail"}}`)),
|
||||
Header: http.Header{"X-Tt-Logid": []string{"request-header-seedream-1"}},
|
||||
}, nil
|
||||
})
|
||||
adapter := NewSeedream(Config{BaseURL: "https://ark.test/api/v3", APIKey: "private-api-key", Model: Seedream50ProModel}, client)
|
||||
|
||||
if _, err := adapter.Submit(context.Background(), Request{Prompt: "private prompt"}); err == nil {
|
||||
t.Fatal("expected Seedream service error")
|
||||
}
|
||||
got := output.String()
|
||||
for _, expected := range []string{`code="InvalidImage"`, `requestId="request-header-seedream-1"`} {
|
||||
if !strings.Contains(got, expected) {
|
||||
t.Fatalf("log %q does not contain %q", got, expected)
|
||||
}
|
||||
}
|
||||
if strings.Contains(got, "private") {
|
||||
t.Fatalf("log leaks private detail: %s", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSeedreamTimeoutLogsSafeClassificationAndRetainsCause(t *testing.T) {
|
||||
var output bytes.Buffer
|
||||
previousOutput, previousFlags := log.Writer(), log.Flags()
|
||||
log.SetOutput(&output)
|
||||
log.SetFlags(0)
|
||||
t.Cleanup(func() {
|
||||
log.SetOutput(previousOutput)
|
||||
log.SetFlags(previousFlags)
|
||||
})
|
||||
|
||||
client := roundTripFunc(func(*http.Request) (*http.Response, error) {
|
||||
return nil, context.DeadlineExceeded
|
||||
})
|
||||
adapter := NewSeedream(Config{BaseURL: "https://ark.test/api/v3", APIKey: "private-api-key", Model: Seedream50ProModel}, client)
|
||||
|
||||
_, err := adapter.Submit(context.Background(), Request{Prompt: "private prompt"})
|
||||
if !errors.Is(err, context.DeadlineExceeded) {
|
||||
t.Fatalf("error does not retain deadline cause: %v", err)
|
||||
}
|
||||
got := output.String()
|
||||
for _, expected := range []string{"provider=seedream", "operation=submit", "status=0", "errorClass=timeout", "elapsedMs="} {
|
||||
if !strings.Contains(got, expected) {
|
||||
t.Fatalf("log %q does not contain %q", got, expected)
|
||||
}
|
||||
}
|
||||
for _, secret := range []string{"private-api-key", "private prompt", "deadline exceeded"} {
|
||||
if strings.Contains(got, secret) {
|
||||
t.Fatalf("log leaks %q: %s", secret, got)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestBailianUsesThePreparedRequestModelForImageAndVideo(t *testing.T) {
|
||||
models := []string{}
|
||||
client := roundTripFunc(func(r *http.Request) (*http.Response, error) {
|
||||
|
||||
Reference in new issue
Block a user