59 lines
1.5 KiB
Go
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)
|
|
}
|
|
}
|