package host import ( "golang.org/x/sys/unix" "os" "path/filepath" "testing" "time" "github.com/carlosframework/platform/internal/hostwrite" "github.com/carlosframework/platform/internal/release" "github.com/carlosframework/platform/internal/rootstate" ) func TestPlan14ProductionReleaseInitialization(t *testing.T) { if !plan14RootFixture(t) { return } for _, mode := range []string{"fresh", "old-private", "symlink", "writable", "foreign"} { t.Run(mode, func(t *testing.T) { if err := os.MkdirAll("/var/lib", 0755); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := os.RemoveAll(release.RootHealthyDir); err != nil { t.Error(err) } }) switch mode { case "old-private": if err := os.Mkdir(release.RootHealthyDir, 0700); err != nil { t.Fatal(err) } case "symlink": if err := os.Symlink(t.TempDir(), release.RootHealthyDir); err != nil { t.Fatal(err) } case "writable": if err := os.Mkdir(release.RootHealthyDir, 0777); err != nil { t.Fatal(err) } if err := os.Chmod(release.RootHealthyDir, 0777); err != nil { t.Fatal(err) } case "foreign": if err := os.Mkdir(release.RootHealthyDir, 0755); err != nil { t.Fatal(err) } if err := unix.Mount("/foreign-dir", release.RootHealthyDir, "", unix.MS_BIND, ""); err != nil { t.Fatal(err) } t.Cleanup(func() { if err := unix.Unmount(release.RootHealthyDir, 0); err != nil { t.Error(err) } }) } c := productionRootRestartChecks(&fakeUnits{}, "/opt/carlos") err := recoverRootRestarts(t.Context(), &fakeUnits{}, "/opt/carlos", func(string) string { return "" }, c, hostwrite.Config{}) good := mode == "fresh" || mode == "old-private" if !good { if err == nil { t.Fatal("unsafe parent repaired") } return } if err != nil { t.Fatal(err) } b := release.HealthyBuild{SHA256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", Version: "v1", How: "live", At: time.Now()} if err := release.RecordHealthy(release.RootHealthyDir, "", "console", b); err != nil { t.Fatal(err) } if got := release.ReadHealthy(release.RootHealthyDir, "", "console"); len(got) != 1 || got[0].SHA256 != b.SHA256 { t.Fatal(got) } if _, err := os.Stat(rootRestartState); !os.IsNotExist(err) { t.Fatal("no-census initialization created restart state", err) } for path, mode := range map[string]os.FileMode{release.RootHealthyDir: 0755, filepath.Join(release.RootHealthyDir, "healthy"): 0755} { info, err := os.Stat(path) if err != nil || info.Mode().Perm() != mode { t.Fatalf("%s mode: %v %v", path, info, err) } } f, err := rootstate.OpenTrustedFile(filepath.Join(release.RootHealthyDir, "healthy", release.OpsAccount, "console.json")) if err != nil { t.Fatal(err) } f.Close() }) } }