11 "github.com/stretchr/testify/require"
14 // DaemonMessageTest owns test agents and the loops selected by Start.
15 type DaemonMessageTest struct {
18 events []*TurnEventRecorder
19 messages *DaemonMessages
21 cancel context.CancelFunc
25 func newDaemonMessageTest(t *testing.T, dir string, server *ModelFake) *DaemonMessageTest {
28 _, err := os.Stat(filepath.Join(dir, daemonAgentDirName, "children"))
29 if errors.Is(err, os.ErrNotExist) {
30 daemonChildConfig(t, dir, "Garden")
31 daemonChildConfig(t, dir, "Library")
33 require.NoError(t, err)
36 test := &DaemonMessageTest{
40 test.agents, err = openDaemonAgents(t.Context(), dir, server.URL, ModelAPIKey(modelTestKey), defaultConfig().Compactor, newTestClock().Now, daemonTestLogger(test.logs))
41 require.NoError(t, err)
46 for _, agent := range test.agents {
47 events := &TurnEventRecorder{}
48 loop, err := agent.Loop(nil, events.Add)
49 require.NoError(t, err)
51 test.events = append(test.events, events)
52 test.loops = append(test.loops, loop)
55 test.messages, err = openDaemonMessages(test.loops)
56 require.NoError(t, err)
61 func (r *DaemonMessageTest) Start(t *testing.T, indices ...int) {
64 ctx, cancel := context.WithCancel(t.Context())
66 for _, index := range indices {
67 done := make(chan error, 1)
68 r.done = append(r.done, done)
70 done <- r.loops[index].Run(ctx)
75 func (r *DaemonMessageTest) Queue(t *testing.T) DaemonMessageFile {
78 data, err := os.ReadFile(r.messages.path)
79 require.NoError(t, err)
81 var file DaemonMessageFile
83 require.NoError(t, json.Unmarshal(data, &file))
88 func (r *DaemonMessageTest) Close(t *testing.T) {
94 for _, done := range r.done {
95 require.ErrorIs(t, <-done, context.Canceled)
102 require.NoError(t, r.agents.Close())