`ctl weights --collect` answered "this control plane cannot ask nodes to delete files" against a real cluster, with the whole suite green. The controller is handed a dispatcherRef rather than the agent service — an indirection that exists to break a construction cycle, and one that satisfies the dispatcher interface by forwarding each method by hand. The controller reaches past that interface by type assertion to find capabilities beyond scheduling, and an assertion against dispatcherRef fails for anything nobody remembered to forward. Nothing could have caught it below the wiring. The dispatchers the tests use do not implement the capability either, so its absence there is the expected case and looks identical to this bug. The test therefore asserts on the production types themselves: that the forwarding dispatcher carries the capability, and that the service it forwards to has one to carry. Checked by deleting the method and watching it fail. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
33 lines
1.3 KiB
Go
33 lines
1.3 KiB
Go
package cli
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"gitea.mynodes.xyz/ilker/llmgw/internal/control"
|
|
"gitea.mynodes.xyz/ilker/llmgw/internal/control/agentsvc"
|
|
)
|
|
|
|
func TestTheForwardingDispatcherCarriesEveryCapability(t *testing.T) {
|
|
// dispatcherRef exists to break a construction cycle, and it satisfies the
|
|
// dispatcher interface by forwarding each method by hand. That makes it a
|
|
// place where capabilities go missing silently: the controller reaches
|
|
// past the interface by type assertion, and an assertion against this type
|
|
// fails for anything nobody remembered to forward.
|
|
//
|
|
// It happened. `ctl weights --collect` returned "this control plane cannot
|
|
// ask nodes to delete files" against a real cluster, while every unit test
|
|
// passed — because the test dispatchers do not implement the capability
|
|
// either, so its absence looked exactly like the expected case.
|
|
var ref any = &dispatcherRef{}
|
|
if _, ok := ref.(control.WeightRemover); !ok {
|
|
t.Error("dispatcherRef drops WeightRemover, so the control plane cannot reclaim disk")
|
|
}
|
|
|
|
// And the thing it forwards to must have it, or the forwarding has nothing
|
|
// to reach.
|
|
var svc any = &agentsvc.Service{}
|
|
if _, ok := svc.(control.WeightRemover); !ok {
|
|
t.Error("the agent service does not implement WeightRemover")
|
|
}
|
|
}
|