upgrade-regression-reproduction_test.go.txt 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package service
  2. import (
  3. "bytes"
  4. "context"
  5. "io"
  6. "net/http"
  7. "net/http/httptest"
  8. "strings"
  9. "testing"
  10. "github.com/Wei-Shaw/sub2api/internal/config"
  11. "github.com/gin-gonic/gin"
  12. "github.com/stretchr/testify/require"
  13. )
  14. // Reproduces the reported compatibility failure through the unmodified upgrade
  15. // Forward path. The recorder proves whether an upstream request was attempted.
  16. func TestReproduceUpgradeMode1CompatibilityRegression(t *testing.T) {
  17. gin.SetMode(gin.TestMode)
  18. for _, tc := range []struct{name, body string}{
  19. {"string_input", `{"model":"gpt-5.2","input":"Return OK","stream":true}`},
  20. {"token_budget", `{"model":"gpt-5.2","input":[{"role":"user","content":[{"type":"input_text","text":"Return OK"}]}],"max_output_tokens":100,"stream":true}`},
  21. } {
  22. for _, enabled := range []bool{false,true} {
  23. state := "off"; if enabled { state = "on" }
  24. t.Run(tc.name+"/protection_"+state, func(t *testing.T) {
  25. c, _ := gin.CreateTestContext(httptest.NewRecorder())
  26. body:=[]byte(tc.body)
  27. c.Request=httptest.NewRequest("POST","/v1/responses",bytes.NewReader(body))
  28. c.Request.Header.Set("User-Agent","relay-regression/1.0")
  29. a:=mode1TestAccount(1)
  30. a.Credentials=map[string]any{"access_token":"dummy","chatgpt_account_id":"dummy"}
  31. a.Extra["openai_passthrough"]=false
  32. a.Extra[AntiDegradeMarkerExtraKey].(map[string]any)["enabled"]=enabled
  33. u:=&mode1ForwardRecorder{httpUpstreamRecorder:httpUpstreamRecorder{resp:&http.Response{StatusCode:200,Header:http.Header{"Content-Type":[]string{"text/event-stream"}},Body:io.NopCloser(strings.NewReader("data: {\"type\":\"response.output_text.delta\",\"delta\":\"OK\"}\n\ndata: {\"type\":\"response.completed\",\"response\":{\"id\":\"test\",\"status\":\"completed\",\"output\":[]}}\n\ndata: [DONE]\n\n"))}}}
  34. cfg:=&config.Config{}; cfg.Gateway.TLSFingerprint.Enabled=true
  35. gw:=&OpenAIGatewayService{cfg:cfg,httpUpstream:u,toolCorrector:NewCodexToolCorrector()}
  36. _,err:=gw.Forward(context.Background(),c,a,body)
  37. if enabled {
  38. require.ErrorContains(t,err,"模式一阻止")
  39. require.Nil(t,u.lastReq,"failure must occur before any upstream request")
  40. t.Logf("REPRODUCED: protection=%v upstream_attempted=false error=%v",enabled,err)
  41. } else {
  42. require.NoError(t,err)
  43. require.NotNil(t,u.lastReq)
  44. t.Log("CONTROL: protection=false upstream_attempted=true")
  45. }
  46. })
  47. }
  48. }
  49. }