github.com/uber/kraken@v0.1.4/lib/dockerregistry/storage_driver_test.go (about)

     1  // Copyright (c) 2016-2019 Uber Technologies, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  package dockerregistry
    15  
    16  import (
    17  	"context"
    18  	"fmt"
    19  	"io/ioutil"
    20  	"log"
    21  	"math/rand"
    22  	"testing"
    23  	"time"
    24  
    25  	"github.com/uber/kraken/core"
    26  	"github.com/stretchr/testify/require"
    27  )
    28  
    29  func TestStorageDriverGetContent(t *testing.T) {
    30  	td, cleanup := newTestDriver()
    31  	defer cleanup()
    32  
    33  	sd, testImage := td.setup()
    34  
    35  	var sa startedAtMetadata
    36  	if err := td.cas.GetUploadFileMetadata(testImage.upload, &sa); err != nil {
    37  		log.Panic(err)
    38  	}
    39  	uploadTime, err := sa.Serialize()
    40  	if err != nil {
    41  		log.Panic(err)
    42  	}
    43  
    44  	testCases := []struct {
    45  		input string
    46  		data  []byte
    47  		err   error
    48  	}{
    49  		{genLayerLinkPath(testImage.layer1.Digest.Hex()), []byte(testImage.layer1.Digest.String()), nil},
    50  		{genUploadStartedAtPath(testImage.upload), uploadTime, nil},
    51  		{genUploadHashStatesPath(testImage.upload), []byte(hashStateContent), nil},
    52  		{genManifestTagCurrentLinkPath(testImage.repo, testImage.tag, testImage.manifest), []byte("sha256:" + testImage.manifest), nil},
    53  		{genManifestRevisionLinkPath(testImage.repo, testImage.manifest), []byte("sha256:" + testImage.manifest), nil},
    54  		{genBlobDataPath(testImage.layer1.Digest.Hex()), testImage.layer1.Content, nil},
    55  	}
    56  
    57  	for _, tc := range testCases {
    58  		t.Run(fmt.Sprintf("GetContent %s", tc.input), func(t *testing.T) {
    59  			require := require.New(t)
    60  			data, err := sd.GetContent(contextFixture(), tc.input)
    61  			if tc.err == nil {
    62  				require.NoError(err)
    63  				return
    64  			}
    65  			require.Equal(tc.data, data)
    66  			require.Equal(tc.err, err)
    67  		})
    68  	}
    69  }
    70  
    71  func TestStorageDriverReader(t *testing.T) {
    72  	td, cleanup := newTestDriver()
    73  	defer cleanup()
    74  
    75  	sd, testImage := td.setup()
    76  
    77  	testCases := []struct {
    78  		input string
    79  		data  []byte
    80  		err   error
    81  	}{
    82  		{genUploadDataPath(testImage.upload), []byte(uploadContent), nil},
    83  		{genBlobDataPath(testImage.layer1.Digest.Hex()), testImage.layer1.Content, nil},
    84  	}
    85  
    86  	for _, tc := range testCases {
    87  		t.Run(fmt.Sprintf("GetReader %s", tc.input), func(t *testing.T) {
    88  			require := require.New(t)
    89  			reader, err := sd.Reader(contextFixture(), tc.input, 0)
    90  			data, err := ioutil.ReadAll(reader)
    91  			require.Equal(tc.data, data)
    92  			require.Equal(tc.err, err)
    93  		})
    94  	}
    95  }
    96  
    97  func TestStorageDriverPutContent(t *testing.T) {
    98  	td, cleanup := newTestDriver()
    99  	defer cleanup()
   100  
   101  	sd, testImage := td.setup()
   102  
   103  	r := rand.New(rand.NewSource(time.Now().UnixNano()))
   104  	imageID := r.Int()
   105  	repo := fmt.Sprintf("repo-%d", imageID)
   106  	tag := fmt.Sprintf("tag-%d", imageID)
   107  	upload := fmt.Sprintf("upload-%d", imageID)
   108  
   109  	testCases := []struct {
   110  		inputPath    string
   111  		inputContent []byte
   112  		err          error
   113  	}{
   114  		{genUploadStartedAtPath(upload), nil, nil},
   115  		{genUploadHashStatesPath(testImage.upload), []byte{}, nil},
   116  		{genLayerLinkPath(testImage.layer1.Digest.Hex()), nil, nil},
   117  		{genBlobDataPath(testImage.layer1.Digest.Hex()), testImage.layer1.Content, nil},
   118  		{genManifestRevisionLinkPath(repo, testImage.manifest), nil, nil},
   119  		{genManifestTagShaLinkPath(repo, tag, testImage.manifest), nil, nil},
   120  		{genManifestTagCurrentLinkPath(repo, tag, testImage.manifest), nil, nil},
   121  	}
   122  
   123  	for _, tc := range testCases {
   124  		t.Run(fmt.Sprintf("PutContent %s", tc.inputPath), func(t *testing.T) {
   125  			require.Equal(t, tc.err, sd.PutContent(contextFixture(), tc.inputPath, tc.inputContent))
   126  		})
   127  	}
   128  
   129  	// TODO (@evelynl): check content written
   130  }
   131  
   132  func TestStorageDriverWriter(t *testing.T) {
   133  	td, cleanup := newTestDriver()
   134  	defer cleanup()
   135  
   136  	sd, testImage := td.setup()
   137  
   138  	testCases := []struct {
   139  		input string
   140  		data  []byte
   141  		err   error
   142  	}{
   143  		{genUploadDataPath(testImage.upload), []byte(uploadContent), nil},
   144  		{genBlobDataPath(testImage.layer1.Digest.Hex()), nil, InvalidRequestError{genBlobDataPath(testImage.layer1.Digest.Hex())}},
   145  	}
   146  
   147  	content := []byte("this is a test for upload writer")
   148  	for _, tc := range testCases {
   149  		t.Run(fmt.Sprintf("GetWriter %s", tc.input), func(t *testing.T) {
   150  			require := require.New(t)
   151  			w, err := sd.Writer(contextFixture(), tc.input, false)
   152  			require.Equal(tc.err, err)
   153  			if err != nil {
   154  				return
   155  			}
   156  			w.Write(content)
   157  			w.Close()
   158  			r, err := sd.Reader(contextFixture(), tc.input, 0)
   159  			require.NoError(err)
   160  			defer r.Close()
   161  			data, err := ioutil.ReadAll(r)
   162  			require.NoError(err)
   163  			require.Equal(content, data)
   164  		})
   165  	}
   166  }
   167  
   168  func TestStorageDriverStat(t *testing.T) {
   169  	td, cleanup := newTestDriver()
   170  	defer cleanup()
   171  
   172  	sd, testImage := td.setup()
   173  
   174  	testCases := []struct {
   175  		input string
   176  		path  string
   177  		size  int64
   178  		err   error
   179  	}{
   180  		{genBlobDataPath(testImage.layer1.Digest.Hex()), testImage.layer1.Digest.Hex(), int64(len(testImage.layer1.Content)), nil},
   181  		{genUploadDataPath(testImage.upload), testImage.upload, int64(len(uploadContent)), nil},
   182  	}
   183  
   184  	for _, tc := range testCases {
   185  		t.Run(fmt.Sprintf("GetStat %s", tc.input), func(t *testing.T) {
   186  			require := require.New(t)
   187  			fi, err := sd.Stat(contextFixture(), tc.input)
   188  			require.Equal(tc.err, err)
   189  			if err != nil {
   190  				return
   191  			}
   192  			require.Equal(tc.path, fi.Path())
   193  			require.Equal(tc.size, fi.Size())
   194  		})
   195  	}
   196  }
   197  
   198  func TestStorageDriverList(t *testing.T) {
   199  	td, cleanup := newTestDriver()
   200  	defer cleanup()
   201  
   202  	sd, testImage := td.setup()
   203  
   204  	testCases := []struct {
   205  		input string
   206  		list  []string
   207  		err   error
   208  	}{
   209  		{genUploadHashStatesPath(testImage.upload), []string{genUploadHashStatesPath(testImage.upload)}, nil},
   210  		{genManifestListPath(testImage.repo), []string{testImage.tag}, nil},
   211  	}
   212  
   213  	for _, tc := range testCases {
   214  		t.Run(fmt.Sprintf("List %s", tc.input), func(t *testing.T) {
   215  			require := require.New(t)
   216  			list, err := sd.List(contextFixture(), tc.input)
   217  			require.Equal(tc.err, err)
   218  			require.Equal(tc.list, list)
   219  		})
   220  	}
   221  }
   222  
   223  func TestStorageDriverMove(t *testing.T) {
   224  	require := require.New(t)
   225  
   226  	td, cleanup := newTestDriver()
   227  	defer cleanup()
   228  
   229  	sd, testImage := td.setup()
   230  
   231  	d, err := core.NewDigester().FromBytes([]byte(uploadContent))
   232  	require.NoError(err)
   233  
   234  	require.NoError(sd.Move(context.TODO(), genUploadDataPath(testImage.upload), genBlobDataPath(d.Hex())))
   235  
   236  	reader, err := td.cas.GetCacheFileReader(d.Hex())
   237  	require.NoError(err)
   238  	data, err := ioutil.ReadAll(reader)
   239  	require.NoError(err)
   240  	require.Equal(uploadContent, string(data))
   241  }