Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
package agent
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
"os/exec"
|
|
"testing"
|
|
"time"
|
|
|
|
llmgwv1 "gitea.mynodes.xyz/ilker/llmgw/api/gen/llmgw/v1"
|
|
"gitea.mynodes.xyz/ilker/llmgw/internal/agent/engines"
|
|
"gitea.mynodes.xyz/ilker/llmgw/internal/agent/supervisor"
|
|
)
|
|
|
|
type alwaysReady struct{}
|
|
|
|
func (alwaysReady) Ready(context.Context, string, string, string) error { return nil }
|
|
|
|
func TestAnAdoptedEngineThatDiesIsReported(t *testing.T) {
|
|
sup, err := supervisor.New(supervisor.Config{WorkDir: t.TempDir(), RunAs: "-"}, alwaysReady{}, slog.New(slog.DiscardHandler))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// An engine a previous agent started: not this process's child.
|
|
cmd := exec.Command("sleep", "60")
|
|
if err := cmd.Start(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
go func() { _ = cmd.Wait() }()
|
|
sh, err := sup.Adopt(supervisor.Orphan{ShardID: "m-r0", ReplicaID: "m", PID: cmd.Process.Pid,
|
|
Spec: engines.ShardSpec{ReplicaID: "m", ShardID: "m-r0", HTTPPort: 1}, Alive: true})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := sup.WaitReady(t.Context(), sh, "http://127.0.0.1:1", "m", 5*time.Second); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
a := &Agent{sup: sup, log: slog.New(slog.DiscardHandler)}
|
|
out := make(chan *llmgwv1.AgentMessage, 4)
|
|
ctx, cancel := context.WithCancel(t.Context())
|
|
defer cancel()
|
|
go a.watchExits(ctx, out)
|
|
time.Sleep(1500 * time.Millisecond) // seen ready
|
|
_ = cmd.Process.Kill()
|
|
|
|
select {
|
|
case m := <-out:
|
|
s := m.GetShard()
|
|
if s.GetShardId() != "m-r0" || s.GetReplicaId() != "m" {
|
|
t.Errorf("reported %+v", s)
|
|
}
|
|
case <-time.After(10 * time.Second):
|
|
t.Fatal("the adopted engine died and nothing was reported")
|
|
}
|
|
}
|