f95370de80
- shell/bus/bus_test.go: tests de Subscribe/Send/Unsubscribe incluyendo idempotencia, canal cerrado tras unsubscribe y resubscribe posterior. - cmd/launcher/registry_test.go: tests para readReloadTarget (archivo ausente, vacío, '*', agentID, whitespace). - agents/lifecycle_test.go: tests para Agent.Stop()/Done() verificando que Stop() desbloquea Run y que es seguro llamarlo múltiples veces o con cancel nil. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
92 lines
2.1 KiB
Go
92 lines
2.1 KiB
Go
package bus_test
|
|
|
|
import (
|
|
"log/slog"
|
|
"testing"
|
|
|
|
"github.com/enmanuel/agents/shell/bus"
|
|
)
|
|
|
|
func newBus() *bus.Bus {
|
|
return bus.New(slog.Default())
|
|
}
|
|
|
|
func TestSubscribeAndSend(t *testing.T) {
|
|
b := newBus()
|
|
ch := b.Subscribe("agent-a")
|
|
|
|
msg := bus.AgentMessage{From: "orch", To: "agent-a", Kind: bus.KindTask, Payload: map[string]string{"k": "v"}}
|
|
if err := b.Send(msg); err != nil {
|
|
t.Fatalf("Send: %v", err)
|
|
}
|
|
|
|
got := <-ch
|
|
if got.Kind != bus.KindTask || got.Payload["k"] != "v" {
|
|
t.Fatalf("unexpected message: %+v", got)
|
|
}
|
|
}
|
|
|
|
func TestUnsubscribeClosesChannel(t *testing.T) {
|
|
b := newBus()
|
|
ch := b.Subscribe("agent-b")
|
|
|
|
b.Unsubscribe("agent-b")
|
|
|
|
// Channel must be closed — reading from a closed channel returns zero value + ok=false.
|
|
_, ok := <-ch
|
|
if ok {
|
|
t.Fatal("expected channel to be closed after Unsubscribe")
|
|
}
|
|
}
|
|
|
|
func TestUnsubscribeRemovesFromBus(t *testing.T) {
|
|
b := newBus()
|
|
b.Subscribe("agent-c")
|
|
b.Unsubscribe("agent-c")
|
|
|
|
// Sending after unsubscribe must return an error, not panic.
|
|
err := b.Send(bus.AgentMessage{To: "agent-c", Kind: "ping"})
|
|
if err == nil {
|
|
t.Fatal("expected error when sending to unsubscribed agent")
|
|
}
|
|
}
|
|
|
|
func TestUnsubscribeIdempotent(t *testing.T) {
|
|
b := newBus()
|
|
b.Subscribe("agent-d")
|
|
// Double unsubscribe must not panic.
|
|
b.Unsubscribe("agent-d")
|
|
b.Unsubscribe("agent-d")
|
|
}
|
|
|
|
func TestUnsubscribeNonExistent(t *testing.T) {
|
|
b := newBus()
|
|
// Unsubscribing an ID that was never subscribed must not panic.
|
|
b.Unsubscribe("does-not-exist")
|
|
}
|
|
|
|
func TestSendToUnknownAgent(t *testing.T) {
|
|
b := newBus()
|
|
err := b.Send(bus.AgentMessage{To: "ghost", Kind: "hello"})
|
|
if err == nil {
|
|
t.Fatal("expected error when sending to unknown agent")
|
|
}
|
|
}
|
|
|
|
func TestResubscribeAfterUnsubscribe(t *testing.T) {
|
|
b := newBus()
|
|
b.Subscribe("agent-e")
|
|
b.Unsubscribe("agent-e")
|
|
|
|
// Re-subscribe must work and deliver messages.
|
|
ch2 := b.Subscribe("agent-e")
|
|
msg := bus.AgentMessage{To: "agent-e", Kind: "ping"}
|
|
if err := b.Send(msg); err != nil {
|
|
t.Fatalf("Send after re-subscribe: %v", err)
|
|
}
|
|
got := <-ch2
|
|
if got.Kind != "ping" {
|
|
t.Fatalf("unexpected kind: %q", got.Kind)
|
|
}
|
|
}
|