Files
llmgw/internal/agent/watchexits_test.go
T
2026-10-04 11:50:09 +02:00

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")
}
}