forked from TrueCloudLab/distribution
1d33874951
Go 1.13 and up enforce import paths to be versioned if a project contains a go.mod and has released v2 or up. The current v2.x branches (and releases) do not yet have a go.mod, and therefore are still allowed to be imported with a non-versioned import path (go modules add a `+incompatible` annotation in that case). However, now that this project has a `go.mod` file, incompatible import paths will not be accepted by go modules, and attempting to use code from this repository will fail. This patch uses `v3` for the import-paths (not `v2`), because changing import paths itself is a breaking change, which means that the next release should increment the "major" version to comply with SemVer (as go modules dictate). Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
108 lines
2.5 KiB
Go
108 lines
2.5 KiB
Go
package schema1
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/distribution/distribution/v3/context"
|
|
"github.com/distribution/distribution/v3/manifest"
|
|
"github.com/distribution/distribution/v3/reference"
|
|
"github.com/docker/libtrust"
|
|
"github.com/opencontainers/go-digest"
|
|
)
|
|
|
|
func makeSignedManifest(t *testing.T, pk libtrust.PrivateKey, refs []Reference) *SignedManifest {
|
|
u := &Manifest{
|
|
Versioned: manifest.Versioned{
|
|
SchemaVersion: 1,
|
|
},
|
|
Name: "foo/bar",
|
|
Tag: "latest",
|
|
Architecture: "amd64",
|
|
}
|
|
|
|
for i := len(refs) - 1; i >= 0; i-- {
|
|
u.FSLayers = append(u.FSLayers, FSLayer{
|
|
BlobSum: refs[i].Digest,
|
|
})
|
|
u.History = append(u.History, History{
|
|
V1Compatibility: refs[i].History.V1Compatibility,
|
|
})
|
|
}
|
|
|
|
signedManifest, err := Sign(u, pk)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error signing manifest: %v", err)
|
|
}
|
|
return signedManifest
|
|
}
|
|
|
|
func TestReferenceBuilder(t *testing.T) {
|
|
pk, err := libtrust.GenerateECP256PrivateKey()
|
|
if err != nil {
|
|
t.Fatalf("unexpected error generating private key: %v", err)
|
|
}
|
|
|
|
r1 := Reference{
|
|
Digest: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
Size: 1,
|
|
History: History{V1Compatibility: "{\"a\" : 1 }"},
|
|
}
|
|
r2 := Reference{
|
|
Digest: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
Size: 2,
|
|
History: History{V1Compatibility: "{\"\a\" : 2 }"},
|
|
}
|
|
|
|
handCrafted := makeSignedManifest(t, pk, []Reference{r1, r2})
|
|
|
|
ref, err := reference.WithName(handCrafted.Manifest.Name)
|
|
if err != nil {
|
|
t.Fatalf("could not parse reference: %v", err)
|
|
}
|
|
ref, err = reference.WithTag(ref, handCrafted.Manifest.Tag)
|
|
if err != nil {
|
|
t.Fatalf("could not add tag: %v", err)
|
|
}
|
|
|
|
b := NewReferenceManifestBuilder(pk, ref, handCrafted.Manifest.Architecture)
|
|
_, err = b.Build(context.Background())
|
|
if err == nil {
|
|
t.Fatal("Expected error building zero length manifest")
|
|
}
|
|
|
|
err = b.AppendReference(r1)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = b.AppendReference(r2)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
refs := b.References()
|
|
if len(refs) != 2 {
|
|
t.Fatalf("Unexpected reference count : %d != %d", 2, len(refs))
|
|
}
|
|
|
|
// Ensure ordering
|
|
if refs[0].Digest != r2.Digest {
|
|
t.Fatalf("Unexpected reference : %v", refs[0])
|
|
}
|
|
|
|
m, err := b.Build(context.Background())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
built, ok := m.(*SignedManifest)
|
|
if !ok {
|
|
t.Fatalf("unexpected type from Build() : %T", built)
|
|
}
|
|
|
|
d1 := digest.FromBytes(built.Canonical)
|
|
d2 := digest.FromBytes(handCrafted.Canonical)
|
|
if d1 != d2 {
|
|
t.Errorf("mismatching canonical JSON")
|
|
}
|
|
}
|