package stdio import ( "encoding/json" "errors" "strings" "testing" ) // Design 47 G ยง576: the words are read once, an unknown-call answer reads as none, and a word not stated fails naming it // and the node (from MESH_NODE). func subACapabilityWordIsReadOnceAndNamedWhenNotStated(t *testing.T) { t.Setenv("MESH_NODE", "ace") asked := 0 var c capabilityWords ask := func() (json.RawMessage, error) { asked++; return json.RawMessage(`{"words":["put-sessions"]}`), nil } if err := c.require(CapPutSessions, ask); err != nil { t.Fatal(err) } err := c.require(CapFindingCalls, ask) if err == nil || !strings.Contains(err.Error(), CapFindingCalls) || !strings.Contains(err.Error(), "ace") || asked != 1 { t.Errorf("a word not stated: %v after %d asks", err, asked) } var old capabilityWords unknown := func() (json.RawMessage, error) { asked++ return nil, &refused{message: "no mesh/capabilities", code: CodeNoMethod} } if err := old.require(CapPutSessions, unknown); err == nil || !strings.Contains(err.Error(), CapPutSessions) { t.Errorf("a tool runner of before G stated %v", err) } var failing capabilityWords if err := failing.require(CapPutSessions, func() (json.RawMessage, error) { return nil, errors.New("pipe closed") }); err == nil || !strings.Contains(err.Error(), "pipe closed") || failing.read { t.Errorf("a failed read: %v, kept %v", err, failing.read) } }