mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-10-04 20:13:25 +00:00
Co-authored-by: nguyenha935 <208228297+nguyenha935@users.noreply.github.com>
109 lines
2.9 KiB
Go
109 lines
2.9 KiB
Go
package agent
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/nextlevelbuilder/goclaw/internal/config"
|
|
"github.com/nextlevelbuilder/goclaw/internal/providers"
|
|
)
|
|
|
|
type deadlineCapturingProvider struct {
|
|
capturingProvider
|
|
deadline time.Time
|
|
hasDeadline bool
|
|
}
|
|
|
|
func (d *deadlineCapturingProvider) Chat(ctx context.Context, req providers.ChatRequest) (*providers.ChatResponse, error) {
|
|
d.deadline, d.hasDeadline = ctx.Deadline()
|
|
return d.capturingProvider.Chat(ctx, req)
|
|
}
|
|
|
|
func TestCompactMessagesInPlace_UsesDefaultTimeout(t *testing.T) {
|
|
provider := &deadlineCapturingProvider{
|
|
capturingProvider: capturingProvider{response: "Summary of conversation."},
|
|
}
|
|
loop := &Loop{
|
|
provider: provider,
|
|
model: "claude-3-5-sonnet",
|
|
}
|
|
|
|
start := time.Now()
|
|
result := loop.compactMessagesInPlace(context.Background(), compactableMessages())
|
|
if result == nil {
|
|
t.Fatal("compactMessagesInPlace returned nil; expected compaction to succeed")
|
|
}
|
|
|
|
assertDeadlineWithin(t, provider, start, 120*time.Second)
|
|
}
|
|
|
|
func TestCompactMessagesInPlace_UsesConfiguredTimeout(t *testing.T) {
|
|
provider := &deadlineCapturingProvider{
|
|
capturingProvider: capturingProvider{response: "Summary of conversation."},
|
|
}
|
|
loop := &Loop{
|
|
provider: provider,
|
|
model: "claude-3-5-sonnet",
|
|
compactionCfg: &config.CompactionConfig{
|
|
TimeoutSeconds: 45,
|
|
},
|
|
}
|
|
|
|
start := time.Now()
|
|
result := loop.compactMessagesInPlace(context.Background(), compactableMessages())
|
|
if result == nil {
|
|
t.Fatal("compactMessagesInPlace returned nil; expected compaction to succeed")
|
|
}
|
|
|
|
assertDeadlineWithin(t, provider, start, 45*time.Second)
|
|
}
|
|
|
|
func TestCompactMessagesInPlace_NonPositiveTimeoutFallsBackToDefault(t *testing.T) {
|
|
provider := &deadlineCapturingProvider{
|
|
capturingProvider: capturingProvider{response: "Summary of conversation."},
|
|
}
|
|
loop := &Loop{
|
|
provider: provider,
|
|
model: "claude-3-5-sonnet",
|
|
compactionCfg: &config.CompactionConfig{
|
|
TimeoutSeconds: -1,
|
|
},
|
|
}
|
|
|
|
start := time.Now()
|
|
result := loop.compactMessagesInPlace(context.Background(), compactableMessages())
|
|
if result == nil {
|
|
t.Fatal("compactMessagesInPlace returned nil; expected compaction to succeed")
|
|
}
|
|
|
|
assertDeadlineWithin(t, provider, start, 120*time.Second)
|
|
}
|
|
|
|
func compactableMessages() []providers.Message {
|
|
msgs := make([]providers.Message, 10)
|
|
for i := range msgs {
|
|
if i%2 == 0 {
|
|
msgs[i] = providers.Message{Role: "user", Content: "user message"}
|
|
} else {
|
|
msgs[i] = providers.Message{Role: "assistant", Content: "assistant reply"}
|
|
}
|
|
}
|
|
return msgs
|
|
}
|
|
|
|
func assertDeadlineWithin(t *testing.T, provider *deadlineCapturingProvider, start time.Time, want time.Duration) {
|
|
t.Helper()
|
|
|
|
if !provider.hasDeadline {
|
|
t.Fatal("provider context has no deadline")
|
|
}
|
|
|
|
got := provider.deadline.Sub(start)
|
|
lower := want - time.Second
|
|
upper := want + time.Second
|
|
if got < lower || got > upper {
|
|
t.Fatalf("deadline duration = %s, want within [%s, %s]", got, lower, upper)
|
|
}
|
|
}
|