package hostbox import ( "os" "path/filepath" "testing" ) func TestPlan14GenerationLaunchInventory(t *testing.T) { for _, attack := range []string{"none", "unknown-field", "wrong-key", "oversize", "replaced-path", "missing-table"} { t.Run(attack, func(t *testing.T) { j, r := roleLaunchFixture(t) if err := j.IntendUnit(t.Context(), r); err != nil { t.Fatal(err) } switch attack { case "unknown-field": _, err := j.db.Exec("UPDATE launches SET body=json_set(body,'$.unknown',true)") if err != nil { t.Fatal(err) } case "wrong-key": _, err := j.db.Exec("UPDATE launches SET identity='other'") if err != nil { t.Fatal(err) } case "oversize": _, err := j.db.Exec("UPDATE launches SET body=zeroblob(1048577)") if err != nil { t.Fatal(err) } case "replaced-path": if err := os.Rename(j.path, j.path+".old"); err != nil { t.Fatal(err) } if err := os.WriteFile(j.path, []byte("replacement"), 0600); err != nil { t.Fatal(err) } case "missing-table": _, err := j.db.Exec("DROP TABLE launches") if err != nil { t.Fatal(err) } } got, err := j.GenerationLaunches(t.Context()) if attack == "none" { if err != nil || len(got) != 1 || len(got[0].Reservations) != 1 { t.Fatalf("inventory: %+v %v", got, err) } } else if err == nil { t.Fatal("incomplete inventory accepted") } }) } } func TestPlan14GenerationReaderDoesNotInitialize(t *testing.T) { path := filepath.Join(t.TempDir(), "empty.db") if err := os.WriteFile(path, nil, 0600); err != nil { t.Fatal(err) } j, err := OpenGenerationLaunchReader(path) if err != nil { return } defer j.Close() if _, err := j.GenerationLaunches(t.Context()); err == nil { t.Fatal("missing schema was initialized as complete") } if info, err := os.Stat(path); err != nil || info.Size() != 0 { t.Fatalf("reader changed empty database: %v %v", info, err) } }