package hostactors import "testing" func TestPlan13SignedHomeAgreement(t *testing.T) { for _, home := range []string{"", "ie", "ca", "@home", "IE"} { r := Roster{HomeRegion: "ie"} if r.MatchesHome(home) != (home == "ie") { t.Fatal(home) } } if !(Roster{}).MatchesHome("") || (Roster{}).MatchesHome("ie") { t.Fatal("legacy roster grants alias") } } func TestPlan13HomeDesignationIsSignedAndOptional(t *testing.T) { d, sg, o := fixture(t) if _, err := d.Read(t.Context()); err != nil { t.Fatal("legacy roster", err) } next := Clone(o.Roster) next.HomeRegion = "ie" updated, err := d.Replace(t.Context(), sg, o, next) if err != nil { t.Fatal(err) } read, err := d.Read(t.Context()) if err != nil || !read.Roster.MatchesHome("ie") { t.Fatal(read, err) } next = Clone(updated.Roster) next.HomeRegion = "@home" if _, err := d.Replace(t.Context(), sg, updated, next); err == nil { t.Fatal("engine token accepted as designation") } } func TestPlan13HomeDesignationWriteOnce(t *testing.T) { t.Setenv("CARLOS_HOST_CLAIM", "1") for _, home := range []string{"ie", "uk", ""} { t.Run(home, func(t *testing.T) { d, sg, o := fixture(t) next := Clone(o.Roster) next.HomeRegion = "ie" o, err := d.Replace(t.Context(), sg, o, next) if err != nil { t.Fatal(err) } next = Clone(o.Roster) next.HomeRegion = home _, err = d.Replace(t.Context(), sg, o, next) if (err == nil) != (home == "ie") { t.Fatalf("change to %q: %v", home, err) } current, err := d.Read(t.Context()) if err != nil || current.Roster.HomeRegion != "ie" { t.Fatalf("designation changed: %+v %v", current, err) } if home != "ie" && current.ETag != o.ETag { t.Fatal("refusal wrote roster") } }) } } // With host claims off the roster keeps main's behaviour: the designation // can be changed or cleared like any other field. func TestPlan13HomeDesignationFlagOffIsUnpinned(t *testing.T) { t.Setenv("CARLOS_HOST_CLAIM", "") for _, home := range []string{"uk", ""} { t.Run(home, func(t *testing.T) { d, sg, o := fixture(t) next := Clone(o.Roster) next.HomeRegion = "ie" o, err := d.Replace(t.Context(), sg, o, next) if err != nil { t.Fatal(err) } next = Clone(o.Roster) next.HomeRegion = home if _, err := d.Replace(t.Context(), sg, o, next); err != nil { t.Fatalf("flag-off change to %q refused: %v", home, err) } current, err := d.Read(t.Context()) if err != nil || current.Roster.HomeRegion != home { t.Fatalf("flag-off designation = %+v %v, want %q", current.Roster.HomeRegion, err, home) } }) } }