76 lines
2.6 KiB
Go
76 lines
2.6 KiB
Go
//go:build integration
|
|
|
|
package link
|
|
|
|
import (
|
|
"context"
|
|
"crypto/ed25519"
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/nats-io/nats.go"
|
|
"github.com/novox/mesh-controller/internal/broker"
|
|
"github.com/novox/mesh-controller/internal/testbus"
|
|
)
|
|
|
|
func TestAHandOverIsAskedOfTheMachineAndItsAnswerComesBack(t *testing.T) {
|
|
url := testbus.URL(t)
|
|
conn, err := nats.Connect(url)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(conn.Close)
|
|
|
|
signer, public := testSigner(t)
|
|
var heard HandOverAsk
|
|
engine, err := conn.Subscribe(broker.AskHandOverSubject("laptop"), func(msg *nats.Msg) {
|
|
var signed SignedHandOver
|
|
_ = json.Unmarshal(msg.Data, &signed)
|
|
if !ed25519.Verify(public, append([]byte(HandOverContext), signed.Ask...), signed.Signature) {
|
|
_ = msg.Respond([]byte(`{"refused":"not the mesh's signature"}`))
|
|
return
|
|
}
|
|
_ = json.Unmarshal(signed.Ask, &heard)
|
|
switch heard.Path {
|
|
case "/srv/notes":
|
|
body, _ := json.Marshal(HandOverAnswer{Said: "/srv/notes (notes.data) is handed to the mesh by " + heard.By})
|
|
_ = msg.Respond(body)
|
|
case "/srv/empty":
|
|
_ = msg.Respond([]byte(`{}`))
|
|
default:
|
|
body, _ := json.Marshal(HandOverAnswer{Refused: heard.Path + " is not a directory this machine uses as found; nothing was handed over"})
|
|
_ = msg.Respond(body)
|
|
}
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { _ = engine.Unsubscribe() })
|
|
|
|
ctx := context.Background()
|
|
a, err := AskHandOver(ctx, conn, signer, "laptop", "/srv/notes", "jo through mesh-cli on anchor", 5*time.Second)
|
|
if err != nil || a.Refused != "" || !strings.Contains(a.Said, "handed to the mesh by jo through mesh-cli on anchor") {
|
|
t.Fatalf("answered %+v, %v", a, err)
|
|
}
|
|
if heard.Node != "laptop" || heard.Path != "/srv/notes" || heard.By != "jo through mesh-cli on anchor" {
|
|
t.Fatalf("the engine heard %+v", heard)
|
|
}
|
|
a, err = AskHandOver(ctx, conn, signer, "laptop", "/srv/other", "jo", 5*time.Second)
|
|
if err != nil || a.Said != "" || !strings.Contains(a.Refused, "nothing was handed over") {
|
|
t.Fatalf("a refusal came back as %+v, %v", a, err)
|
|
}
|
|
if _, err := AskHandOver(ctx, conn, signer, "laptop", "/srv/empty", "jo", 5*time.Second); err == nil ||
|
|
!strings.Contains(err.Error(), "neither") {
|
|
t.Fatalf("an empty answer was taken: %v", err)
|
|
}
|
|
if _, err := AskHandOver(ctx, conn, signer, "anchor", "/srv/notes", "jo", 5*time.Second); err == nil ||
|
|
!strings.Contains(err.Error(), "node-engine") {
|
|
t.Fatalf("a machine with no engine listening: %v", err)
|
|
}
|
|
if _, err := AskHandOver(ctx, nil, signer, "anchor", "/srv/notes", "jo", time.Second); err == nil {
|
|
t.Fatal("asked with no bus")
|
|
}
|
|
}
|