package release import ( "bytes" "os" "path/filepath" "strings" "testing" ) func TestPlan14Fix3RetainRunningPrevious(t *testing.T) { for _, running := range []string{"v1", "v2", "v0", "../escape"} { t.Run(running, func(t *testing.T) { opt := t.TempDir() host := "console.example" for _, v := range []string{"v0", "v1", "v2", "v3"} { if err := StageArtifact(opt, "bab", v, "console", []byte(v)); err != nil { t.Fatal(err) } } for _, v := range []string{"v1", "v2"} { if err := PointLive(opt, host, "bab", v, "console"); err != nil { t.Fatal(err) } } err := PointLive(opt, host, "bab", "v3", "console", running) live, e := LiveVersion(opt, host) if e != nil { t.Fatal(e) } previous, e := os.Readlink(filepath.Join(opt, "previous", host)) if e != nil { t.Fatal(e) } if running == "v0" || running == "../escape" { if err == nil || live != "v2" || previous != VersionPath(opt, "bab", "v1", "console") { t.Fatal("unpointed build acquired authority", err, live, previous) } } else { if err != nil || live != "v3" || previous != VersionPath(opt, "bab", running, "console") { t.Fatal("running pointer lost", err, live, previous) } pins, err := LivePins(opt) if err != nil || !pins[running] || !pins["v3"] { t.Fatal(pins, err) } } }) } } func TestPlan14Fix3OrdinaryFailureDoesNotClaimOutage(t *testing.T) { for _, unit := range []string{"", "console.service"} { t.Run(unit, func(t *testing.T) { host := "console.example.com" ctx, reg, store, pub, opt := startUnitFixture(t, host) rt, err := reg.Get(host) if err != nil { t.Fatal(err) } rt.Unit = unit if err := reg.Upsert(*rt); err != nil { t.Fatal(err) } fail := func(string) error { return os.ErrPermission } var output bytes.Buffer withCapturedStdout(t, &output, func() { if err := Pass(ctx, reg, store, pub, opt, fail, WithStartUnit(fail)); err != nil { t.Fatal(err) } }) if !strings.Contains(output.String(), "could not start it") || strings.Contains(output.String(), "may be serving nothing") != (unit != "") { t.Fatal(output.String()) } }) } }