package releasekit_test import ( "context" "errors" "io" "net/http" "net/http/httptest" "runtime" "strings" "testing" releasekit "go.maximumdirect.net/releasekit" ) func TestDeliveryPreservesAssetInspectionCauses(t *testing.T) { repository := newTaggedDeliveryConsumer(t) prebuilt, err := releasekit.Build(context.Background(), releasekit.BuildRequest{ RepositoryDir: repository, Version: "v1.2.3", OutputDir: t.TempDir(), Spec: releasekit.BuildSpec{MainPackage: "./cmd/app", BinaryName: "fixture", Targets: []releasekit.Target{{OS: runtime.GOOS, Arch: runtime.GOARCH}}}, }) if err != nil { t.Fatal(err) } filename := prebuilt.Artifacts[0].Filename for _, cause := range []error{context.Canceled, io.ErrUnexpectedEOF} { t.Run(cause.Error(), func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() state := &facadeDeliveryServer{data: facadeDeliveryData{ t: t, commit: prebuilt.CandidateCommit, tag: prebuilt.Tag, version: prebuilt.Version, noteBody: "# Fixture v1.2.3\n\nDelivery fixture.\n", pages: map[string]bool{prebuilt.Tag: true}, assets: map[string][]byte{filename: []byte("data")}, }} server := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if strings.HasPrefix(r.URL.Path, "/files/") { if cause == context.Canceled { cancel() <-r.Context().Done() return } w.Header().Set("Content-Length", "100") _, _ = w.Write([]byte("truncated")) return } state.serveHTTP(w, r) })) state.data.url = "http://" + server.Listener.Addr().String() server.Start() defer server.Close() result, err := releasekit.Deliver(ctx, releasekit.DeliveryRequest{ RepositoryDir: repository, Product: "Fixture", Version: "v1.2.3", Destination: facadeDeliveryDestination(server.URL), Prebuilt: &prebuilt, }) if !errors.Is(err, cause) || !strings.Contains(err.Error(), filename) { t.Fatalf("Deliver() error = %v, want cause %v and asset context", err, cause) } if result.State != releasekit.DeliveryNotAttempted || len(result.Uncertain) != 1 || result.Uncertain[0].Filename != filename || state.snapshot().writes != 0 { t.Fatalf("result = %#v, want read-only uncertain asset without write", result) } }) } }