github.com/AliyunContainerService/cli@v0.0.0-20181009023821-814ced4b30d0/cli/manifest/store/store_test.go (about)

     1  package store
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/docker/cli/cli/manifest/types"
     9  	"github.com/docker/distribution/reference"
    10  	"github.com/google/go-cmp/cmp"
    11  	"gotest.tools/assert"
    12  	is "gotest.tools/assert/cmp"
    13  )
    14  
    15  type fakeRef struct {
    16  	name string
    17  }
    18  
    19  func (f fakeRef) String() string {
    20  	return f.name
    21  }
    22  
    23  func (f fakeRef) Name() string {
    24  	return f.name
    25  }
    26  
    27  func ref(name string) fakeRef {
    28  	return fakeRef{name: name}
    29  }
    30  
    31  func sref(t *testing.T, name string) *types.SerializableNamed {
    32  	named, err := reference.ParseNamed("example.com/" + name)
    33  	assert.NilError(t, err)
    34  	return &types.SerializableNamed{Named: named}
    35  }
    36  
    37  func newTestStore(t *testing.T) (Store, func()) {
    38  	tmpdir, err := ioutil.TempDir("", "manifest-store-test")
    39  	assert.NilError(t, err)
    40  
    41  	return NewStore(tmpdir), func() { os.RemoveAll(tmpdir) }
    42  }
    43  
    44  func getFiles(t *testing.T, store Store) []os.FileInfo {
    45  	infos, err := ioutil.ReadDir(store.(*fsStore).root)
    46  	assert.NilError(t, err)
    47  	return infos
    48  }
    49  
    50  func TestStoreRemove(t *testing.T) {
    51  	store, cleanup := newTestStore(t)
    52  	defer cleanup()
    53  
    54  	listRef := ref("list")
    55  	data := types.ImageManifest{Ref: sref(t, "abcdef")}
    56  	assert.NilError(t, store.Save(listRef, ref("manifest"), data))
    57  	assert.Assert(t, is.Len(getFiles(t, store), 1))
    58  
    59  	assert.Check(t, store.Remove(listRef))
    60  	assert.Check(t, is.Len(getFiles(t, store), 0))
    61  }
    62  
    63  func TestStoreSaveAndGet(t *testing.T) {
    64  	store, cleanup := newTestStore(t)
    65  	defer cleanup()
    66  
    67  	listRef := ref("list")
    68  	data := types.ImageManifest{Ref: sref(t, "abcdef")}
    69  	err := store.Save(listRef, ref("exists"), data)
    70  	assert.NilError(t, err)
    71  
    72  	var testcases = []struct {
    73  		listRef     reference.Reference
    74  		manifestRef reference.Reference
    75  		expected    types.ImageManifest
    76  		expectedErr string
    77  	}{
    78  		{
    79  			listRef:     listRef,
    80  			manifestRef: ref("exists"),
    81  			expected:    data,
    82  		},
    83  		{
    84  			listRef:     listRef,
    85  			manifestRef: ref("exist:does-not"),
    86  			expectedErr: "No such manifest: exist:does-not",
    87  		},
    88  		{
    89  			listRef:     ref("list:does-not-exist"),
    90  			manifestRef: ref("manifest:does-not-exist"),
    91  			expectedErr: "No such manifest: manifest:does-not-exist",
    92  		},
    93  	}
    94  
    95  	for _, testcase := range testcases {
    96  		t.Run(testcase.manifestRef.String(), func(t *testing.T) {
    97  			actual, err := store.Get(testcase.listRef, testcase.manifestRef)
    98  			if testcase.expectedErr != "" {
    99  				assert.Error(t, err, testcase.expectedErr)
   100  				assert.Check(t, IsNotFound(err))
   101  				return
   102  			}
   103  			assert.NilError(t, err)
   104  			assert.DeepEqual(t, testcase.expected, actual, cmpReferenceNamed)
   105  		})
   106  	}
   107  }
   108  
   109  var cmpReferenceNamed = cmp.Transformer("namedref", func(r reference.Named) string {
   110  	return r.String()
   111  })
   112  
   113  func TestStoreGetList(t *testing.T) {
   114  	store, cleanup := newTestStore(t)
   115  	defer cleanup()
   116  
   117  	listRef := ref("list")
   118  	first := types.ImageManifest{Ref: sref(t, "first")}
   119  	assert.NilError(t, store.Save(listRef, ref("first"), first))
   120  	second := types.ImageManifest{Ref: sref(t, "second")}
   121  	assert.NilError(t, store.Save(listRef, ref("exists"), second))
   122  
   123  	list, err := store.GetList(listRef)
   124  	assert.NilError(t, err)
   125  	assert.Check(t, is.Len(list, 2))
   126  }
   127  
   128  func TestStoreGetListDoesNotExist(t *testing.T) {
   129  	store, cleanup := newTestStore(t)
   130  	defer cleanup()
   131  
   132  	listRef := ref("list")
   133  	_, err := store.GetList(listRef)
   134  	assert.Error(t, err, "No such manifest: list")
   135  	assert.Check(t, IsNotFound(err))
   136  }