返回 DeepSeek-Reasonix
deadline_test.go
根目录 / internal / imageinput / deadline_test.go
1 package imageinput
2
3 import (
4 "context"
5 "errors"
6 "reasonix/internal/event"
7 "testing"
8 "time"
9 )
10
11 func TestImageDeadlineReleasesQueueWithoutCaching(t *testing.T) {
12 p := &fakeProvider{entered: make(chan struct{}, 2), release: make(chan struct{})}
13 s := service(p)
14 ctx, cancel := context.WithTimeout(context.Background(), 25*time.Millisecond)
15 defer cancel()
16 done := make(chan error, 1)
17 go func() {
18 _, err := s.Understand(ctx, "text/model", []string{"data:image/png;base64,QUFB"}, nil, event.Discard)
19 done <- err
20 }()
21 <-p.entered
22 if err := <-done; !errors.Is(err, context.DeadlineExceeded) {
23 t.Fatal(err)
24 }
25 if len(s.cached) != 0 {
26 t.Fatal("deadline result cached")
27 }
28 close(p.release)
29 if _, err := s.Understand(context.Background(), "text/model", []string{"data:image/png;base64,QUFB"}, nil, event.Discard); err != nil {
30 t.Fatal(err)
31 }
32 if p.calls.Load() != 2 {
33 t.Fatal("request after deadline reused stale result")
34 }
35 }
36
37 func TestWaitingImageCancellationLeavesActiveRequestRunning(t *testing.T) {
38 p := &fakeProvider{entered: make(chan struct{}, 2), release: make(chan struct{})}
39 s := service(p)
40 done := make(chan error, 1)
41 go func() {
42 _, err := s.Understand(context.Background(), "text/model", []string{"data:image/png;base64,QUFB"}, nil, event.Discard)
43 done <- err
44 }()
45 <-p.entered
46 ctx, cancel := context.WithTimeout(context.Background(), 25*time.Millisecond)
47 defer cancel()
48 if _, err := s.Understand(ctx, "text/model", []string{"data:image/png;base64,QUFB"}, nil, event.Discard); !errors.Is(err, context.DeadlineExceeded) {
49 t.Fatal(err)
50 }
51 close(p.release)
52 if err := <-done; err != nil {
53 t.Fatal(err)
54 }
55 if p.calls.Load() != 1 {
56 t.Fatal("waiting cancellation dispatched another request")
57 }
58 }
59
59 lines GO