35 lines
1.3 KiB
Go
35 lines
1.3 KiB
Go
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)
|
|
}
|