package link import ( "errors" "strings" "testing" "time" ) // What one reply means to a node enrolling (novox/hq issue 083): accepted is done; "try again" is // asked again, until the node's patience runs out and it says the token was not spent; anything // else is a refusal. func TestAnEnrollingNodeAsksAgainWhileTheMeshSaysNotNow(t *testing.T) { if again, err := answered(EnrolReply{Accepted: true}, 0); again || err != nil { t.Fatalf("an accepted enrolment was not done: again=%v err=%v", again, err) } if again, err := answered(EnrolReply{TryAgain: true}, time.Second); !again || err != nil { t.Fatalf("a mesh saying not now was not asked again: again=%v err=%v", again, err) } again, err := answered(EnrolReply{TryAgain: true, Refusal: "restarting"}, EnrolPatience) if again || !errors.Is(err, ErrNotNow) { t.Fatalf("a mesh saying not now past the node's patience did not stop it: again=%v err=%v", again, err) } if !errorsMention(err, "not spent") { t.Errorf("giving up did not say the token can be used again: %v", err) } if again, err := answered(EnrolReply{Refusal: "that token cannot be used"}, 0); again || !errors.Is(err, ErrRefused) { t.Fatalf("a refusal was not a refusal: again=%v err=%v", again, err) } } func errorsMention(err error, what string) bool { return err != nil && strings.Contains(err.Error(), what) }