sorcery-go/pkg/state/state_test.go

88 lines
2.8 KiB
Go
Executable File

package state
import (
"path/filepath"
"testing"
)
func TestOpenAndJournal(t *testing.T) {
mgr, err := Open(filepath.Join(t.TempDir(), "state.db"))
if err != nil {
t.Fatal(err)
}
defer mgr.Close()
if err := mgr.RecordJournal(JournalEntry{
SpellName: "wget", Variant: "v1",
Status: StateCasting,
}); err != nil {
t.Fatal(err)
}
got, err := mgr.GetJournal("wget", "v1")
if err != nil {
t.Fatal(err)
}
if got == nil || got.Status != StateCasting {
t.Fatalf("unexpected journal entry: %+v", got)
}
}
func TestTablet(t *testing.T) {
mgr, _ := Open(filepath.Join(t.TempDir(), "state.db"))
defer mgr.Close()
if _, ok := mgr.GetTablet("wget", "ssl"); ok {
t.Fatal("tablet should be empty initially")
}
if err := mgr.SaveTablet("wget", "ssl", true); err != nil {
t.Fatal(err)
}
val, ok := mgr.GetTablet("wget", "ssl")
if !ok || !val {
t.Fatalf("expected ssl=true, got %v (%v)", val, ok)
}
answers := mgr.ListTablet("wget")
if len(answers) != 1 || !answers["ssl"] {
t.Fatalf("ListTablet: %+v", answers)
}
}
func TestManifestAndWhoOwns(t *testing.T) {
mgr, _ := Open(filepath.Join(t.TempDir(), "state.db"))
defer mgr.Close()
files := []string{"/usr/bin/wget", "/usr/share/man/wget.1"}
if err := mgr.SaveManifest("wget", "v1", files); err != nil {
t.Fatal(err)
}
got, err := mgr.GetManifest("wget", "v1")
if err != nil {
t.Fatal(err)
}
if len(got) != 2 {
t.Fatalf("expected 2 files, got %d", len(got))
}
spell, variant, err := mgr.WhoOwns("/usr/bin/wget")
if err != nil || spell != "wget" || variant != "v1" {
t.Fatalf("WhoOwns: %s %s %v", spell, variant, err)
}
}
func TestRecover(t *testing.T) {
mgr, _ := Open(filepath.Join(t.TempDir(), "state.db"))
defer mgr.Close()
_ = mgr.RecordJournal(JournalEntry{SpellName: "a", Variant: "v", Status: StateCasting})
_ = mgr.RecordJournal(JournalEntry{SpellName: "b", Variant: "v", Status: StateInstalled})
_ = mgr.RecordJournal(JournalEntry{SpellName: "c", Variant: "v", Status: StateFailed})
pending, err := mgr.Recover()
if err != nil {
t.Fatal(err)
}
// Only "a" should be pending (Casting). "b" is Installed, "c" is Failed.
if len(pending) != 1 || pending[0].SpellName != "a" {
t.Fatalf("Recover: %+v", pending)
}
}