package for manipulating OCI images
Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
This commit is contained in:
168
oci/oci_test.go
Normal file
168
oci/oci_test.go
Normal file
@@ -0,0 +1,168 @@
|
||||
package oci
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/containerd/containerd/fs/fstest"
|
||||
"github.com/opencontainers/go-digest"
|
||||
"github.com/opencontainers/image-spec/specs-go"
|
||||
spec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestInitError(t *testing.T) {
|
||||
tmp, err := ioutil.TempDir("", "oci")
|
||||
assert.Nil(t, err)
|
||||
defer os.RemoveAll(tmp)
|
||||
err = Init(tmp, "")
|
||||
assert.Error(t, err, "file exists")
|
||||
}
|
||||
|
||||
func TestInit(t *testing.T) {
|
||||
tmp, err := ioutil.TempDir("", "oci")
|
||||
assert.Nil(t, err)
|
||||
defer os.RemoveAll(tmp)
|
||||
img := filepath.Join(tmp, "foo")
|
||||
err = Init(img, "")
|
||||
assert.Nil(t, err)
|
||||
ociLayout, err := json.Marshal(spec.ImageLayout{Version: spec.ImageLayoutVersion})
|
||||
assert.Nil(t, err)
|
||||
indexJSON, err := json.Marshal(spec.Index{Versioned: specs.Versioned{SchemaVersion: 2}})
|
||||
applier := fstest.Apply(
|
||||
fstest.CreateDir("/foo", 0755),
|
||||
fstest.CreateDir("/foo/blobs", 0755),
|
||||
fstest.CreateDir("/foo/blobs/"+string(digest.Canonical), 0755),
|
||||
fstest.CreateFile("/foo/oci-layout", ociLayout, 0644),
|
||||
fstest.CreateFile("/foo/index.json", indexJSON, 0644),
|
||||
)
|
||||
err = fstest.CheckDirectoryEqualWithApplier(tmp, applier)
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
func TestWriteReadDeleteBlob(t *testing.T) {
|
||||
tmp, err := ioutil.TempDir("", "oci")
|
||||
assert.Nil(t, err)
|
||||
defer os.RemoveAll(tmp)
|
||||
img := filepath.Join(tmp, "foo")
|
||||
err = Init(img, "")
|
||||
assert.Nil(t, err)
|
||||
testBlob := []byte("test")
|
||||
// Write
|
||||
d, err := WriteBlob(img, testBlob)
|
||||
applier := fstest.Apply(
|
||||
fstest.CreateFile("/"+d.Hex(), testBlob, 0444),
|
||||
)
|
||||
err = fstest.CheckDirectoryEqualWithApplier(filepath.Join(img, "blobs", string(digest.Canonical)), applier)
|
||||
assert.Nil(t, err)
|
||||
// Read
|
||||
b, err := ReadBlob(img, d)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, testBlob, b)
|
||||
// Delete
|
||||
err = DeleteBlob(img, d)
|
||||
assert.Nil(t, err)
|
||||
applier = fstest.Apply()
|
||||
err = fstest.CheckDirectoryEqualWithApplier(filepath.Join(img, "blobs", string(digest.Canonical)), applier)
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
func TestBlobWriter(t *testing.T) {
|
||||
tmp, err := ioutil.TempDir("", "oci")
|
||||
assert.Nil(t, err)
|
||||
defer os.RemoveAll(tmp)
|
||||
img := filepath.Join(tmp, "foo")
|
||||
err = Init(img, "")
|
||||
assert.Nil(t, err)
|
||||
testBlob := []byte("test")
|
||||
w, err := NewBlobWriter(img, digest.Canonical)
|
||||
_, err = w.Write(testBlob)
|
||||
assert.Nil(t, err)
|
||||
// blob is not written until closing
|
||||
applier := fstest.Apply()
|
||||
err = fstest.CheckDirectoryEqualWithApplier(filepath.Join(img, "blobs", string(digest.Canonical)), applier)
|
||||
// digest is unavailable until closing
|
||||
assert.Panics(t, func() { w.Digest() })
|
||||
// close and calculate the digest
|
||||
err = w.Close()
|
||||
assert.Nil(t, err)
|
||||
d := w.Digest()
|
||||
applier = fstest.Apply(
|
||||
fstest.CreateFile("/"+d.Hex(), testBlob, 0444),
|
||||
)
|
||||
err = fstest.CheckDirectoryEqualWithApplier(filepath.Join(img, "blobs", string(digest.Canonical)), applier)
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
|
||||
func TestIndex(t *testing.T) {
|
||||
tmp, err := ioutil.TempDir("", "oci")
|
||||
assert.Nil(t, err)
|
||||
defer os.RemoveAll(tmp)
|
||||
img := filepath.Join(tmp, "foo")
|
||||
err = Init(img, "")
|
||||
assert.Nil(t, err)
|
||||
descs := []spec.Descriptor{
|
||||
{
|
||||
MediaType: spec.MediaTypeImageManifest,
|
||||
Annotations: map[string]string{
|
||||
spec.AnnotationRefName: "foo",
|
||||
"dummy": "desc0",
|
||||
},
|
||||
},
|
||||
{
|
||||
MediaType: spec.MediaTypeImageManifest,
|
||||
Annotations: map[string]string{
|
||||
// will be removed later
|
||||
spec.AnnotationRefName: "bar",
|
||||
"dummy": "desc1",
|
||||
},
|
||||
},
|
||||
{
|
||||
MediaType: spec.MediaTypeImageManifest,
|
||||
Annotations: map[string]string{
|
||||
// duplicated ref name
|
||||
spec.AnnotationRefName: "foo",
|
||||
"dummy": "desc2",
|
||||
},
|
||||
},
|
||||
{
|
||||
MediaType: spec.MediaTypeImageManifest,
|
||||
Annotations: map[string]string{
|
||||
// no ref name
|
||||
"dummy": "desc3",
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, desc := range descs {
|
||||
err := PutManifestDescriptorToIndex(img, desc)
|
||||
assert.Nil(t, err)
|
||||
}
|
||||
err = RemoveManifestDescriptorFromIndex(img, "bar")
|
||||
assert.Nil(t, err)
|
||||
expected := spec.Index{
|
||||
Versioned: specs.Versioned{SchemaVersion: 2},
|
||||
Manifests: []spec.Descriptor{
|
||||
{
|
||||
MediaType: spec.MediaTypeImageManifest,
|
||||
Annotations: map[string]string{
|
||||
// duplicated ref name
|
||||
spec.AnnotationRefName: "foo",
|
||||
"dummy": "desc2",
|
||||
},
|
||||
},
|
||||
{
|
||||
MediaType: spec.MediaTypeImageManifest,
|
||||
Annotations: map[string]string{
|
||||
// no ref name
|
||||
"dummy": "desc3",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
idx, err := ReadIndex(img)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expected, idx)
|
||||
}
|
||||
Reference in New Issue
Block a user