返回 DeepSeek-Reasonix
compaction_chunk_budget_test.go
根目录 / internal / agent / compaction_chunk_budget_test.go
1 package agent
2
3 import (
4 "context"
5 "errors"
6 "reflect"
7 "strings"
8 "testing"
9 "testing/synctest"
10 "time"
11
12 "reasonix/internal/event"
13 "reasonix/internal/provider"
14 )
15
16 type timedExtractProvider struct {
17 extractStubProvider
18 started int
19 }
20
21 func (p *timedExtractProvider) Stream(ctx context.Context, req provider.Request) (<-chan provider.Chunk, error) {
22 p.started++
23 delay := 40 * time.Second
24 if p.started == 1 {
25 delay = 4 * time.Minute
26 }
27 select {
28 case <-ctx.Done():
29 return nil, ctx.Err()
30 case <-time.After(delay):
31 return p.extractStubProvider.Stream(ctx, req)
32 }
33 }
34
35 func TestManualChunkedFallbackSharesInitialSummaryDeadline(t *testing.T) {
36 synctest.Test(t, func(t *testing.T) {
37 p := &timedExtractProvider{extractStubProvider: extractStubProvider{failFirst: 1, reply: "digest"}}
38 sess := NewSession("sys")
39 for range 12 {
40 sess.Add(provider.Message{Role: provider.RoleUser, Content: strings.Repeat("u", 6000)})
41 sess.Add(provider.Message{Role: provider.RoleAssistant, Content: strings.Repeat("a", 6000)})
42 }
43 original := sess.Snapshot()
44 a := New(p, nil, sess, Options{ContextWindow: 100000, RecentKeep: 2}, event.Discard)
45 started := time.Now()
46 err := a.CompactNow(t.Context(), "")
47 if !errors.Is(err, errSummaryBudget) || time.Since(started) != compactionBudget {
48 t.Fatalf("elapsed=%s err=%v", time.Since(started), err)
49 }
50 if p.started != 3 {
51 t.Fatalf("requests=%d, want initial + two fragment attempts", p.started)
52 }
53 if !reflect.DeepEqual(original, sess.Snapshot()) || a.currentProjectionVersion() != 0 {
54 t.Fatal("incomplete chunk tree changed transcript or projection")
55 }
56 })
57 }
58
58 lines GO