97 lines
3.5 KiB
Go
97 lines
3.5 KiB
Go
//go:build integration
|
|
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/novox/mesh-controller/internal/inventory"
|
|
"github.com/novox/mesh-controller/internal/link"
|
|
"github.com/novox/mesh-controller/internal/secrets"
|
|
)
|
|
|
|
func TestAnIssuedValueIsTakenSealedFromTheProviderAndSent(t *testing.T) {
|
|
var r issuedRecorder
|
|
words, err := r.taker(t, issuedSealed(t, "the-servers-own-token")).take("plex-api")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(r.kept) != 1 || r.kept[0] != "the-servers-own-token" {
|
|
t.Fatalf("the provider's value was not kept: %d kept", len(r.kept))
|
|
}
|
|
if len(r.sent) != 1 || strings.Join(r.sent[0], ",") != "ace" {
|
|
t.Fatalf("the holders' machines were not sent: %v", r.sent)
|
|
}
|
|
if len(r.acts) != 1 || r.acts[0].Verb != handActIssued {
|
|
t.Fatalf("the change was not recorded in the hand-act log: %+v", r.acts)
|
|
}
|
|
for _, said := range []string{words, r.acts[0].Why, strings.Join(r.acts[0].Args, " ")} {
|
|
if strings.Contains(said, "the-servers-own-token") || strings.Contains(said, inventory.IssuedStamp("the-servers-own-token")) {
|
|
t.Fatalf("the value or its fingerprint was said: %q", said)
|
|
}
|
|
}
|
|
if !strings.Contains(words, "kometa on ace") || !strings.Contains(words, "tautulli on ace") {
|
|
t.Fatalf("the answer does not name the holders: %q", words)
|
|
}
|
|
}
|
|
|
|
func TestAnIssuedValueEveryHolderHoldsSendsNobody(t *testing.T) {
|
|
r := issuedRecorder{again: true}
|
|
words, err := r.taker(t, issuedSealed(t, "the-servers-own-token")).take("plex-api")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(r.sent) != 0 || len(r.acts) != 0 {
|
|
t.Fatalf("an unchanged value was sent or recorded: %v %v", r.sent, r.acts)
|
|
}
|
|
if !strings.Contains(words, "nothing was sent") {
|
|
t.Fatalf("the answer does not say nothing was sent: %q", words)
|
|
}
|
|
}
|
|
|
|
func TestOnlyAValueSealedToTheCallIsTaken(t *testing.T) {
|
|
other, _, _ := secrets.Keypair()
|
|
elsewhere, _ := secrets.Seal(other, []byte("somebody's value"))
|
|
raw, _ := json.Marshal(map[string]string{"sealed": elsewhere})
|
|
plain, _ := json.Marshal(map[string]string{"value": "the-servers-own-token"})
|
|
for name, ask := range map[string]func(issuedProvider, map[string]any) (link.Answer, error){
|
|
"sealed to another key": func(issuedProvider, map[string]any) (link.Answer, error) { return link.Answer{Result: raw}, nil },
|
|
"answered in the clear": func(issuedProvider, map[string]any) (link.Answer, error) { return link.Answer{Result: plain}, nil },
|
|
"refused": func(issuedProvider, map[string]any) (link.Answer, error) {
|
|
return link.Answer{Error: "the controller alone"}, nil
|
|
},
|
|
"not reached": func(issuedProvider, map[string]any) (link.Answer, error) {
|
|
return link.Answer{}, errors.New("503 no responders")
|
|
},
|
|
"sealed empty": issuedSealed(t, " "),
|
|
} {
|
|
var r issuedRecorder
|
|
if _, err := r.taker(t, ask).take("plex-api"); err == nil {
|
|
t.Errorf("%s: taken", name)
|
|
}
|
|
if len(r.kept) != 0 || len(r.sent) != 0 {
|
|
t.Errorf("%s: something was kept or sent", name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestAProvisionNoOfferSaysIsIssuedIsRefused(t *testing.T) {
|
|
asked := false
|
|
taker := issuedTaker{
|
|
providers: func(string) ([]issuedProvider, bool, error) { return nil, false, nil },
|
|
ask: func(issuedProvider, map[string]any) (link.Answer, error) {
|
|
asked = true
|
|
return link.Answer{}, nil
|
|
},
|
|
}
|
|
if _, err := taker.take("postgres-database"); err == nil || !strings.Contains(err.Error(), "ADR 0305") {
|
|
t.Fatalf("expected a refusal naming the record, got %v", err)
|
|
}
|
|
if asked {
|
|
t.Fatal("a provider was asked for a provision no offer says its software issues")
|
|
}
|
|
}
|