package host import ( "bytes" "context" "encoding/json" "errors" "github.com/carlosframework/platform/internal/hostbox" "net/http" "net/http/httptest" "testing" ) func TestPlan11RootWriterClosureSurvivesAdmissionRefusal(t *testing.T) { f := newLaunchFixture(t, servingOp()) service, err := hostbox.NewJournalService(f.journal) if err != nil { t.Fatal(err) } root := ClaimRootHTTP{Journals: service, Stop: ClaimStopHTTP{Coordinator: ClaimStopCoordinator{Guard: f.root.Guard}}, RequireNewWork: func(context.Context) error { return errors.New("no new work") }} root.Reconcile.Box = f.target.Box root.Reconcile.Enrollment = f.target.Enrollment var q hostbox.JournalRequest remote, _ := hostbox.RemoteJournals(func(_ context.Context, prepared hostbox.JournalRequest) (hostbox.JournalResponse, error) { q = prepared return hostbox.JournalResponse{V: 1, ID: prepared.ID}, nil }) if err := remote.CloseWriters(t.Context(), f.target); err != nil { t.Fatal(err) } raw, err := json.Marshal(q) if err != nil { t.Fatal(err) } wrong := f.peer wrong.ControllerID = "other-controller" w := httptest.NewRecorder() root.serveJournal(w, httptest.NewRequest(http.MethodPost, "/claim/journal", bytes.NewReader(raw)), wrong) got, err := f.journal.Read(t.Context(), f.target) if err != nil || got.WritersClosed { t.Fatal("foreign controller changed the closure") } w = httptest.NewRecorder() root.serveJournal(w, httptest.NewRequest(http.MethodPost, "/claim/journal", bytes.NewReader(raw)), f.peer) var out hostbox.JournalResponse if w.Code != http.StatusOK || json.Unmarshal(w.Body.Bytes(), &out) != nil || out.Error != "" { t.Fatalf("closure blocked by new-work gate: %d %s", w.Code, w.Body.String()) } got, err = f.journal.Read(t.Context(), f.target) if err != nil || !got.WritersClosed { t.Fatal("closure not recorded") } }