Files
vault-tools/vcm/keyring_test.go
T
unkin-agent 42048ae6ee
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Encrypt cached tokens with a kernel keyring key
2026-10-23 23:07:35 +11:00

59 lines
1.5 KiB
Go

package main
import (
"bytes"
"errors"
"fmt"
"os"
"path/filepath"
"strings"
"testing"
"git.unkin.net/unkin/golib/keyring"
"git.unkin.net/unkin/vault-tools/shared"
"golang.org/x/sys/unix"
)
// TestMain seals tokens with a run-unique key, skipping outside CI where
// keyctl is unimplemented.
func TestMain(m *testing.M) {
shared.KeyringDesc = fmt.Sprintf("vault-tools-test:vcm:%d", os.Getpid())
k, err := keyring.Open(shared.KeyringDesc)
if errors.Is(err, unix.ENOSYS) && os.Getenv("CI") == "" {
fmt.Println("skipping: kernel keyring unavailable:", err)
os.Exit(0)
}
if err != nil {
fmt.Println(err)
os.Exit(1)
}
code := m.Run()
_ = k.Forget()
os.Exit(code)
}
func TestRunListLockedAndUnreadable(t *testing.T) {
setupVcm(t, vcmConfig)
dir := filepath.Join(shared.CacheDir(), "staging")
if err := os.MkdirAll(dir, 0o700); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(shared.CacheDir(), "sydney"), []byte(`{"token":"s.x"}`), 0o600); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(dir, "sydney"), []byte("\x01garbage"), 0o600); err != nil {
t.Fatal(err)
}
var buf bytes.Buffer
if err := runList(&buf); err != nil {
t.Fatal(err)
}
out := buf.String()
if !strings.Contains(out, "locked — run 'vcm login sydney'") {
t.Errorf("expected locked status for sydney:\n%s", out)
}
if !strings.Contains(out, "sealed data corrupt") {
t.Errorf("expected corrupt status for staging/sydney:\n%s", out)
}
}