package host import ( "crypto/sha256" "fmt" "github.com/carlosframework/platform/internal/hostclaim" "github.com/carlosframework/platform/internal/instancectl" "github.com/carlosframework/platform/internal/release" "os" "path/filepath" "testing" ) func TestPlan11Fix1RootBindsHostApp(t *testing.T) { for _, shape := range []string{"own", "other-account", "other-app", "root-binary", "missing-provider"} { t.Run(shape, func(t *testing.T) { f := newLaunchFixture(t, servingOp()) opt := t.TempDir() path := release.VersionPath(opt, "bap", "v1", "app-a") switch shape { case "other-account": path = release.VersionPath(opt, "cat", "v1", "app-a") case "other-app": path = release.VersionPath(opt, "bap", "v1", "app-b") case "root-binary": path = filepath.Join(opt, "bin", "helper") } if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil { t.Fatal(err) } data := []byte("fixture executable") if err := os.WriteFile(path, data, 0700); err != nil { t.Fatal(err) } f.req.Executable, f.req.Spec.Executable, f.kernel.path = path, path, path digest := fmt.Sprintf("%x", sha256.Sum256(data)) f.req.Spec.Digest, f.kernel.digest = digest, digest hash, err := f.req.Spec.Hash() if err != nil { t.Fatal(err) } f.req.Reservation.Inputs = hash f.claims.set(func(c *hostclaim.Claim) { c.Holder.WakeRetry.Attempt.LaunchInputs = hash }) server := &instancectl.Server{OptDir: opt, HostApp: func(string) (string, string, error) { return "bap", "app-a", nil }} f.root.ValidateExecutable = claimStagedExecutable(server) if shape == "missing-provider" { f.root.ValidateExecutable = nil } _, err = f.root.Serve(t.Context(), f.peer, f.req) if shape == "own" { if err != nil { t.Fatal(err) } return } if err == nil { t.Fatal("root accepted a build outside the host app") } f.noReservation(t, shape) }) } }