add content-addressed hak source mode (#7)
test-image / build-image (push) Successful in 46s
test / test (push) Successful in 1m26s
build-binaries / build-binaries (push) Successful in 2m20s
build-image / publish (push) Successful in 31s

Reviewed-on: #7
Co-authored-by: vickydotbat <vickydotbat@tutamail.com>
Co-committed-by: vickydotbat <vickydotbat@tutamail.com>
This commit was merged in pull request #7.
This commit is contained in:
2026-06-19 20:56:36 +00:00
committed by archvillainette
parent 223b9831c5
commit cdbbba3181
11 changed files with 975 additions and 61 deletions
+160
View File
@@ -0,0 +1,160 @@
package pipeline
import (
"encoding/json"
"path/filepath"
"testing"
"git.westgate.pw/ShadowsOverWestgate/sow-tools/internal/buildinfo"
)
const validAsset = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
// directManifestFixture returns a minimal valid direct source manifest using the
// running builder identity, so validation does not reject it on builder mismatch.
func directManifestFixture() *SourceBuildManifest {
return &SourceBuildManifest{
Schema: 1,
BuilderID: buildinfo.String(),
ModuleHAKs: []string{"core_01"},
HAKs: []SourceManifestHAK{
{
Name: "core_01",
Group: "core",
Priority: 1,
MaxBytes: 1024,
Assets: []string{"core/a.tga"},
},
},
AssetSources: map[string]SourceAsset{
"core/a.tga": {SHA256: validAsset, SizeBytes: 4},
},
}
}
func writeManifestFixture(t *testing.T, manifest *SourceBuildManifest) string {
t.Helper()
raw, err := json.Marshal(manifest)
if err != nil {
t.Fatalf("marshal fixture: %v", err)
}
path := filepath.Join(t.TempDir(), "build-source-manifest.json")
mustWriteFile(t, path, string(raw))
return path
}
func TestLoadSourceBuildManifestDirect(t *testing.T) {
path := writeManifestFixture(t, directManifestFixture())
manifest, err := loadSourceBuildManifest(path)
if err != nil {
t.Fatalf("load: %v", err)
}
if manifest.Schema != 1 {
t.Fatalf("schema = %d, want 1", manifest.Schema)
}
if manifest.BuilderID != buildinfo.String() {
t.Fatalf("builder_id = %q, want %q", manifest.BuilderID, buildinfo.String())
}
if len(manifest.HAKs) != 1 || manifest.HAKs[0].Name != "core_01" {
t.Fatalf("unexpected haks: %#v", manifest.HAKs)
}
source, ok := manifest.AssetSources["core/a.tga"]
if !ok || source.SHA256 != validAsset || source.SizeBytes != 4 {
t.Fatalf("unexpected asset source: %#v", manifest.AssetSources)
}
if err := validateDirectSourceManifest(manifest); err != nil {
t.Fatalf("validate valid manifest: %v", err)
}
}
func TestValidateDirectSourceManifestRejectsUnsupportedSchema(t *testing.T) {
manifest := directManifestFixture()
manifest.Schema = 2
if err := validateDirectSourceManifest(manifest); err == nil {
t.Fatal("expected schema rejection")
}
}
func TestValidateDirectSourceManifestRejectsBadSHA(t *testing.T) {
manifest := directManifestFixture()
manifest.AssetSources["core/a.tga"] = SourceAsset{SHA256: "NOTHEX", SizeBytes: 4}
if err := validateDirectSourceManifest(manifest); err == nil {
t.Fatal("expected bad sha rejection")
}
}
func TestValidateDirectSourceManifestRejectsNegativeSize(t *testing.T) {
manifest := directManifestFixture()
manifest.AssetSources["core/a.tga"] = SourceAsset{SHA256: validAsset, SizeBytes: -1}
if err := validateDirectSourceManifest(manifest); err == nil {
t.Fatal("expected negative size rejection")
}
}
func TestValidateDirectSourceManifestRejectsMissingSource(t *testing.T) {
manifest := directManifestFixture()
delete(manifest.AssetSources, "core/a.tga")
if err := validateDirectSourceManifest(manifest); err == nil {
t.Fatal("expected missing source rejection")
}
}
func TestValidateDirectSourceManifestRejectsUnusedSource(t *testing.T) {
manifest := directManifestFixture()
manifest.AssetSources["core/orphan.tga"] = SourceAsset{SHA256: validAsset, SizeBytes: 4}
if err := validateDirectSourceManifest(manifest); err == nil {
t.Fatal("expected unused source rejection")
}
}
func TestValidateDirectSourceManifestRejectsDuplicateAssetAcrossHAKs(t *testing.T) {
manifest := directManifestFixture()
manifest.HAKs = append(manifest.HAKs, SourceManifestHAK{
Name: "core_02",
Group: "core",
Priority: 1,
MaxBytes: 1024,
Assets: []string{"core/a.tga"},
})
if err := validateDirectSourceManifest(manifest); err == nil {
t.Fatal("expected duplicate-asset rejection")
}
}
func TestValidateDirectSourceManifestRejectsTraversalPath(t *testing.T) {
manifest := directManifestFixture()
manifest.HAKs[0].Assets = []string{"../escape.tga"}
manifest.AssetSources = map[string]SourceAsset{
"../escape.tga": {SHA256: validAsset, SizeBytes: 4},
}
if err := validateDirectSourceManifest(manifest); err == nil {
t.Fatal("expected traversal rejection")
}
}
func TestValidateDirectSourceManifestRejectsBuilderMismatch(t *testing.T) {
manifest := directManifestFixture()
manifest.BuilderID = "crucible deadbeef"
if err := validateDirectSourceManifest(manifest); err == nil {
t.Fatal("expected builder mismatch rejection")
}
}
func TestContentAddressedBlobPath(t *testing.T) {
root := "/var/cache/blobs"
got, err := contentAddressedBlobPath(root, validAsset)
if err != nil {
t.Fatalf("blob path: %v", err)
}
want := filepath.Join(root, "sha256", "aa", "aa", validAsset)
if got != want {
t.Fatalf("blob path = %q, want %q", got, want)
}
if _, err := contentAddressedBlobPath(root, "NOTHEX"); err == nil {
t.Fatal("expected invalid sha rejection")
}
if _, err := contentAddressedBlobPath("", validAsset); err == nil {
t.Fatal("expected empty root rejection")
}
}