Move ssh-client's tests and dependencies onto the SDK's forgekey (issue 1480), part 3 of 17
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"git.novox.be/novox/mesh-sdk/go/forgekey"
|
||||
)
|
||||
|
||||
// Issue 1480: the bundle's keeper is go/forgekey's, kind machine; no copy of it is left in this module.
|
||||
|
||||
type recordState struct{ puts map[string][]byte }
|
||||
|
||||
func (r *recordState) Put(key string, value any) (uint64, error) {
|
||||
raw, _ := json.Marshal(value)
|
||||
if r.puts == nil {
|
||||
r.puts = map[string][]byte{}
|
||||
}
|
||||
r.puts[key] = raw
|
||||
return uint64(len(r.puts)), nil
|
||||
}
|
||||
|
||||
// keygenStandIn writes the pair ssh-keygen -f names, as ssh-keygen would.
|
||||
func keygenStandIn(ctx context.Context, env []string, name string, args ...string) forgekey.Ran {
|
||||
var file, comment string
|
||||
for i, a := range args {
|
||||
switch a {
|
||||
case "-f":
|
||||
file = args[i+1]
|
||||
case "-C":
|
||||
comment = args[i+1]
|
||||
}
|
||||
}
|
||||
if name != "ssh-keygen" || file == "" {
|
||||
return forgekey.Ran{Status: 1, Stderr: "unexpected"}
|
||||
}
|
||||
os.WriteFile(file, []byte("PRIVATE\n"), 0o600)
|
||||
os.WriteFile(file+".pub", []byte(ed25519Line(7, comment)+"\n"), 0o644)
|
||||
return forgekey.Ran{}
|
||||
}
|
||||
|
||||
// 1480/AC1
|
||||
func TestTheBundlesKeeperIsForgekeysOfKindMachineWithItsEntryAtNodeAccount(t *testing.T) {
|
||||
home, st := t.TempDir(), &recordState{}
|
||||
k := keeperFor(home, "g14", "nox", keygenStandIn, st)
|
||||
k.Now = func() time.Time { return time.Date(2026, 10, 20, 12, 0, 0, 0, time.UTC) }
|
||||
if err := k.Once(context.Background()); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := os.Stat(filepath.Join(home, ".ssh", "mesh_ed25519")); err != nil {
|
||||
t.Errorf("the key file mesh_ed25519 was not made in an empty home: %v", err)
|
||||
}
|
||||
raw, ok := st.puts["g14.nox"]
|
||||
if !ok || len(st.puts) != 1 {
|
||||
t.Fatalf("entries = %v, want one at g14.nox", st.puts)
|
||||
}
|
||||
var e forgekey.KeyEntry
|
||||
if err := json.Unmarshal(raw, &e); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if e.Kind != "machine" || e.Node != "g14" || e.Account != "nox" || !strings.HasSuffix(e.Public, " nox@g14 (mesh)") {
|
||||
t.Errorf("entry = %s", raw)
|
||||
}
|
||||
}
|
||||
|
||||
// 1480/AC2
|
||||
func TestNoCopyOfTheKeeperIsLeftInThisModule(t *testing.T) {
|
||||
copyOf := regexp.MustCompile(`(?m)^(type (KeyKeeper|KeyEntry|Runner|Ran)\b|func ParseKeyLine\b|func ExecRunner\b)`)
|
||||
files, _ := filepath.Glob("*.go")
|
||||
for _, f := range files {
|
||||
raw, _ := os.ReadFile(f)
|
||||
if m := copyOf.Find(raw); m != nil {
|
||||
t.Errorf("%s declares %q, which go/forgekey holds", f, m)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user