github.com/dolthub/dolt/go@v0.40.5-0.20240520175717-68db7794bea6/store/blobstore/oci_test.go (about) 1 // Copyright 2019 Dolthub, 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 15 package blobstore 16 17 import ( 18 "bytes" 19 "context" 20 "crypto/rand" 21 "io" 22 "sort" 23 "sync" 24 25 "github.com/google/uuid" 26 "github.com/oracle/oci-go-sdk/v65/objectstorage" 27 assert "github.com/stretchr/testify/require" 28 29 "testing" 30 ) 31 32 type testUploadPart struct { 33 b []byte 34 cp objectstorage.CommitMultipartUploadPartDetails 35 } 36 37 type uploadCollector struct { 38 m *sync.Mutex 39 completedParts []testUploadPart 40 } 41 42 func (c *uploadCollector) Add(part testUploadPart) { 43 c.m.Lock() 44 defer c.m.Unlock() 45 c.completedParts = append(c.completedParts, part) 46 } 47 48 func (c *uploadCollector) Parts() []testUploadPart { 49 c.m.Lock() 50 defer c.m.Unlock() 51 sort.Slice(c.completedParts, func(i, j int) bool { 52 return *c.completedParts[i].cp.PartNum < *c.completedParts[j].cp.PartNum 53 }) 54 return c.completedParts 55 } 56 57 func TestUploadParts(t *testing.T) { 58 buf := make([]byte, 35*1024*1024) 59 _, err := rand.Read(buf) 60 assert.NoError(t, err) 61 62 r := bytes.NewReader(buf) 63 64 totalSize := int64(len(buf)) 65 partSize := int64(1024) 66 numParts, _ := getNumPartsAndPartSize(totalSize, partSize, maxPartNum) 67 68 collector := &uploadCollector{ 69 m: &sync.Mutex{}, 70 completedParts: make([]testUploadPart, 0), 71 } 72 73 f := func(ctx context.Context, objectName, uploadID string, partNumber int, contentLength int64, reader io.Reader) (objectstorage.CommitMultipartUploadPartDetails, error) { 74 etag := uuid.NewString() 75 b, err := io.ReadAll(reader) 76 if err != nil { 77 return objectstorage.CommitMultipartUploadPartDetails{}, err 78 } 79 cp := objectstorage.CommitMultipartUploadPartDetails{ 80 PartNum: &partNumber, 81 Etag: &etag, 82 } 83 part := testUploadPart{ 84 b: b, 85 cp: cp, 86 } 87 collector.Add(part) 88 return cp, nil 89 } 90 91 completedParts, err := uploadParts(context.Background(), "test-object", "test-upload-id", numParts, 3, totalSize, 55*1024, r, f) 92 assert.NoError(t, err) 93 assert.NotNil(t, completedParts) 94 assert.Equal(t, len(completedParts), numParts) 95 assert.Equal(t, len(completedParts), len(collector.Parts())) 96 97 actual := collector.Parts() 98 allData := make([]byte, 0) 99 for _, tp := range actual { 100 allData = append(allData, tp.b...) 101 } 102 103 assert.Equal(t, buf, allData) 104 }