Centralize source manifest validation

This commit is contained in:
2026-05-31 03:22:20 +00:00
parent 61a40ab656
commit bda5f6ac6a
7 changed files with 183 additions and 58 deletions

View File

@@ -4,6 +4,7 @@ import (
"os"
"strings"
"testing"
"time"
"gitea.maximumdirect.net/eric/distributor/internal/storage"
)
@@ -92,6 +93,75 @@ func TestParseManifestRejectsDuplicatePaths(t *testing.T) {
assertErrorContains(t, err, "duplicates")
}
func TestValidateManifestAcceptsValidFixture(t *testing.T) {
manifest := validFixtureManifest(t)
if err := ValidateManifest(manifest); err != nil {
t.Fatalf("ValidateManifest() error = %v", err)
}
}
func TestValidateManifestRejectsInvalidManifest(t *testing.T) {
tests := map[string]func(Manifest) Manifest{
"schema version": func(manifest Manifest) Manifest {
manifest.SchemaVersion = 2
return manifest
},
"empty id": func(manifest Manifest) Manifest {
manifest.ID = ""
return manifest
},
"bad digest": func(manifest Manifest) Manifest {
manifest.Digest = "SHA256:099b205780d2b050024868399961b05731729a548d5d6329c7b06a6740dd75fe"
return manifest
},
"zero created": func(manifest Manifest) Manifest {
manifest.Created = time.Time{}
return manifest
},
"empty files": func(manifest Manifest) Manifest {
manifest.Files = nil
manifest.Digest = BundleDigest(manifest.Files)
return manifest
},
"unsafe path": func(manifest Manifest) Manifest {
manifest.Files[0].Path = "../report.md"
manifest.Digest = BundleDigest(manifest.Files)
return manifest
},
"duplicate path": func(manifest Manifest) Manifest {
manifest.Files[1].Path = manifest.Files[0].Path
manifest.Digest = BundleDigest(manifest.Files)
return manifest
},
"negative size": func(manifest Manifest) Manifest {
manifest.Files[0].Size = -1
manifest.Digest = BundleDigest(manifest.Files)
return manifest
},
"digest mismatch": func(manifest Manifest) Manifest {
manifest.Digest = "sha256:0000000000000000000000000000000000000000000000000000000000000000"
return manifest
},
}
for name, mutate := range tests {
t.Run(name, func(t *testing.T) {
err := ValidateManifest(mutate(validFixtureManifest(t)))
if err == nil {
t.Fatal("ValidateManifest() error = nil, want error")
}
})
}
}
func validFixtureManifest(t *testing.T) Manifest {
t.Helper()
manifest, err := ParseManifest(readFixture(t, "testdata/valid_bundle/manifest.json"))
if err != nil {
t.Fatalf("ParseManifest() error = %v", err)
}
return manifest
}
func readFixture(t *testing.T, path string) []byte {
t.Helper()
data, err := os.ReadFile(path)