package hostbox import ( "context" "database/sql" "errors" "os" "path/filepath" "testing" "github.com/carlosframework/platform/internal/hostclaim" "github.com/carlosframework/platform/internal/registry" ) func TestFreeCensusProvesAbsenceWithoutInitializing(t *testing.T) { ctx := context.Background() db, err := OpenStopInventoryDB(filepath.Join(t.TempDir(), "inventory.db")) if err != nil { t.Fatal(err) } defer db.Close() reg, err := registry.Open(filepath.Join(t.TempDir(), "registry.db")) if err != nil { t.Fatal(err) } defer reg.Close() launches, err := OpenLaunchJournal(filepath.Join(t.TempDir(), "launches.db")) if err != nil { t.Fatal(err) } defer launches.Close() c := EmptyInstallationCensus{Inventory: db, Registry: reg, Launches: launches, Box: "box", Enrollment: "enrollment", DirectoryRevision: "revision", Roots: map[string]string{"data": t.TempDir(), "opt": t.TempDir(), "units": t.TempDir()}} obs := hostclaim.Observed{Host: "shop.example", Claim: &hostclaim.Claim{V: 2, Host: "shop.example", Gen: 1}} selected := RecordSelection{Host: obs.Host, Incarnation: "prior-inc"} if err = c.CheckLocal(ctx, obs, selected); err != nil { t.Fatal(err) } if err = c.Initialize(ctx, obs, selected); !errors.Is(err, ErrChanged) { t.Fatalf("free claim initialized: %v", err) } if _, err = db.ReadStopInventory(ctx, obs.Host); !errors.Is(err, sql.ErrNoRows) { t.Fatalf("cleanup census wrote inventory: %v", err) } // Prior complete inventory never suppresses physical examination for a Free claim. if err = db.WriteStopInventory(ctx, StopInventory{Complete: true, Host: obs.Host, Incarnation: selected.Incarnation, InstallationStamp: 1, Box: "box", Enrollment: "enrollment", DirectoryRevision: "revision"}); err != nil { t.Fatal(err) } path := filepath.Join(c.Roots["opt"], "unclassified") if err = os.WriteFile(path, []byte("leftover"), 0600); err != nil { t.Fatal(err) } if err = c.CheckLocal(ctx, obs, selected); !errors.Is(err, ErrTypedInventory) { t.Fatalf("complete metadata hid artifact: %v", err) } if err = os.Remove(path); err != nil { t.Fatal(err) } if err = c.CheckLocal(ctx, obs, selected); err != nil { t.Fatal(err) } obs.Claim.Op = hostclaim.Op{Kind: hostclaim.KindPurging, ID: "purge"} if err = c.CheckLocal(ctx, obs, selected); err == nil { t.Fatal("holderless active purge counted as Free") } }