Why: U1 I3 needs a DB-side instance identity anchor matching manifest.instance_id so wrong/missing DB blocks startup (I4). Evidence: go test ./internal/store/ ./internal/app/; CLI smoke ensure/verify on SQLite temp dir. Impact: migration v26; store Ensure/Verify; identity subcommand; serve checks AGENT_SYSTEM_INSTANCE_ID when set. Refs: docs/recovery/u1-identity-manifest.md §5.2; Dev feature/recovery-u1-db-identity Co-authored-by: Cursor <cursoragent@cursor.com>
71 lines
2.0 KiB
Go
71 lines
2.0 KiB
Go
package store
|
|
|
|
import (
|
|
"errors"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestSystemIdentityEnsureVerifySQLite(t *testing.T) {
|
|
st, err := OpenSQLite(filepath.Join(t.TempDir(), "id.db"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer st.Close()
|
|
|
|
if err := st.VerifySystemIdentity("svc-a-aaaaaa", "sqlite"); !errors.Is(err, ErrSystemIdentityMissing) {
|
|
t.Fatalf("empty verify: want missing, got %v", err)
|
|
}
|
|
if err := st.EnsureSystemIdentity("svc-a-aaaaaa", "sqlite"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := st.EnsureSystemIdentity("svc-a-aaaaaa", "sqlite"); err != nil {
|
|
t.Fatalf("idempotent ensure: %v", err)
|
|
}
|
|
if err := st.VerifySystemIdentity("svc-a-aaaaaa", "sqlite"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := st.EnsureSystemIdentity("svc-b-bbbbbb", "sqlite"); !errors.Is(err, ErrSystemIdentityMismatch) {
|
|
t.Fatalf("wrong id ensure: want mismatch, got %v", err)
|
|
}
|
|
if err := st.VerifySystemIdentity("svc-a-aaaaaa", "pg:other"); !errors.Is(err, ErrSystemIdentityMismatch) {
|
|
t.Fatalf("wrong dbref verify: want mismatch, got %v", err)
|
|
}
|
|
row, err := st.GetSystemIdentity()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if row.InstanceID != "svc-a-aaaaaa" || row.DBRef != "sqlite" {
|
|
t.Fatalf("row=%+v", row)
|
|
}
|
|
if row.SchemaVersion != latestMigrationVersion() {
|
|
t.Fatalf("schema_version=%d want %d", row.SchemaVersion, latestMigrationVersion())
|
|
}
|
|
}
|
|
|
|
func TestSystemIdentityMigrationCreatesTable(t *testing.T) {
|
|
st, err := OpenSQLite(filepath.Join(t.TempDir(), "mig.db"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer st.Close()
|
|
versions, err := st.MigrationStatus()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
found := false
|
|
for _, v := range versions {
|
|
if v == 26 {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
t.Fatalf("migration v26 not applied: %v", versions)
|
|
}
|
|
var name string
|
|
if err := st.DB().QueryRow(`SELECT name FROM sqlite_master WHERE type='table' AND name='agent_system_identity'`).Scan(&name); err != nil || name != "agent_system_identity" {
|
|
t.Fatalf("table missing: name=%q err=%v", name, err)
|
|
}
|
|
}
|