返回 DeepSeek-Reasonix
capabilities_http_test.go
根目录 / internal / browser / capabilities_http_test.go
1 package browser
2
3 import (
4 "context"
5 "encoding/json"
6 "errors"
7 "net/http"
8 "net/http/httptest"
9 "testing"
10 )
11
12 type enhancedHTTPFake struct {
13 *fakeExecutor
14 session string
15 calls int
16 }
17
18 func (f *enhancedHTTPFake) BrowserCapability(ctx context.Context, name string, args json.RawMessage) (json.RawMessage, error) {
19 f.session = SessionFromContext(ctx)
20 f.calls++
21 return json.RawMessage(`{"count":2,"ambiguous":true}`), nil
22 }
23 func TestCapabilityRemoteNegotiationAndNoReplay(t *testing.T) {
24 fake := &enhancedHTTPFake{fakeExecutor: &fakeExecutor{}}
25 client, _ := newRoundTrip(t, fake)
26 result, err := client.(CapabilityExecutor).BrowserCapability(WithSession(context.Background(), "session"), "query", json.RawMessage(`{"tabId":"tab-1"}`))
27 if err != nil || !json.Valid(result) || fake.session != "session" || fake.calls != 1 {
28 t.Fatalf("%s %v %+v", result, err, fake)
29 }
30 old, _ := newRoundTrip(t, &fakeExecutor{})
31 _, err = old.(CapabilityExecutor).BrowserCapability(context.Background(), "record", json.RawMessage(`{"action":"start"}`))
32 if !errors.Is(err, errCapabilityUnsupported) || errors.Is(err, ErrUnknownOutcome) {
33 t.Fatalf("old host: %v", err)
34 }
35 for _, status := range []int{404, 500} {
36 calls := 0
37 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { calls++; w.WriteHeader(status) }))
38 remote := NewHTTPExecutor(server.URL, "token", server.Client()).(CapabilityExecutor)
39 _, err = remote.BrowserCapability(context.Background(), "pointer", json.RawMessage(`{"action":"click"}`))
40 server.Close()
41 if calls != 1 {
42 t.Fatalf("write replayed %d times", calls)
43 }
44 if status == 404 && !errors.Is(err, errCapabilityUnsupported) || status == 500 && !errors.Is(err, ErrUnknownOutcome) {
45 t.Fatalf("status %d: %v", status, err)
46 }
47 }
48 }
49
50 func TestCapabilityCancelledWritePreservesUnknownAndTransportCause(t *testing.T) {
51 for _, name := range []string{"pointer", "viewport", "record"} {
52 t.Run(name, func(t *testing.T) {
53 entered := make(chan struct{})
54 release := make(chan struct{})
55 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
56 close(entered)
57 <-release
58 }))
59 defer server.Close()
60 defer close(release)
61 ctx, cancel := context.WithCancel(context.Background())
62 defer cancel()
63 remote := NewHTTPExecutor(server.URL, "token", server.Client()).(CapabilityExecutor)
64 done := make(chan error, 1)
65 go func() {
66 _, err := remote.BrowserCapability(ctx, name, json.RawMessage(`{"action":"start"}`))
67 done <- err
68 }()
69 <-entered // The write reached the server; cancellation cannot prove no effect.
70 cancel()
71 err := <-done
72 var transport *transportError
73 if !errors.Is(err, ErrUnknownOutcome) || !errors.Is(err, context.Canceled) || !errors.As(err, &transport) {
74 t.Fatalf("lost unknown outcome or underlying cancellation: %v", err)
75 }
76 })
77 }
78 }
79
79 lines GO