a73x

internal/agent/state/hostkey_test.go

Ref:   Size: 2.4 KiB   History

package state

import (
	"os"
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestLoadOrCreateHostKeyIsStableAndPrivate(t *testing.T) {
	s, err := Open(t.TempDir())
	require.NoError(t, err)
	path := s.HostKeyPath("vm1")

	first, err := LoadOrCreateHostKey(path)
	require.NoError(t, err)
	assert.Contains(t, first.PrivatePEM, "OPENSSH PRIVATE KEY")
	assert.True(t, strings.HasPrefix(first.PublicLine, "ssh-ed25519 "), "got %q", first.PublicLine)
	assert.NotContains(t, first.PublicLine, "\n", "an authorized_keys line is one line")

	fi, err := os.Stat(path)
	require.NoError(t, err)
	assert.Equal(t, os.FileMode(0o600), fi.Mode().Perm())

	// Load-or-create: the second call must return the key the first one wrote,
	// or a certificate signed for the first key would be for nothing.
	second, err := LoadOrCreateHostKey(path)
	require.NoError(t, err)
	assert.Equal(t, first, second)
}

func TestLoadOrCreateHostKeyIsPerVM(t *testing.T) {
	s, err := Open(t.TempDir())
	require.NoError(t, err)
	a, err := LoadOrCreateHostKey(s.HostKeyPath("vm1"))
	require.NoError(t, err)
	b, err := LoadOrCreateHostKey(s.HostKeyPath("vm2"))
	require.NoError(t, err)
	assert.NotEqual(t, a.PublicLine, b.PublicLine)
}

func TestLoadOrCreateHostKeyRefusesGarbage(t *testing.T) {
	s, err := Open(t.TempDir())
	require.NoError(t, err)
	path := s.HostKeyPath("vm1")
	require.NoError(t, os.MkdirAll(s.VMDir("vm1"), 0o700))
	require.NoError(t, os.WriteFile(path, []byte("not a key"), 0o600))

	_, err = LoadOrCreateHostKey(path)
	require.Error(t, err, "an unreadable key must be reported, never silently replaced")
}

func TestDeleteVMTakesTheHostKeyWithIt(t *testing.T) {
	s, err := Open(t.TempDir())
	require.NoError(t, err)
	require.NoError(t, s.SaveVM(Record{Spec: VMSpec{VMID: "vm1"}}))
	_, err = LoadOrCreateHostKey(s.HostKeyPath("vm1"))
	require.NoError(t, err)

	require.NoError(t, s.DeleteVM("vm1"))
	_, err = os.Stat(s.HostKeyPath("vm1"))
	assert.True(t, os.IsNotExist(err))
}

func TestHostPubKeyRoundTripsThroughARecord(t *testing.T) {
	s, err := Open(t.TempDir())
	require.NoError(t, err)
	hk, err := LoadOrCreateHostKey(s.HostKeyPath("vm1"))
	require.NoError(t, err)
	require.NoError(t, s.SaveVM(Record{Spec: VMSpec{VMID: "vm1"}, HostPubKey: hk.PublicLine}))

	rec, ok, err := s.Get("vm1")
	require.NoError(t, err)
	require.True(t, ok)
	assert.Equal(t, hk.PublicLine, rec.HostPubKey)
}