github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/gateway/operations/putobject_test.go (about) 1 package operations_test 2 3 import ( 4 "bytes" 5 "context" 6 "crypto/md5" //nolint:gosec 7 "crypto/rand" 8 "fmt" 9 "testing" 10 11 "github.com/treeverse/lakefs/pkg/api/apiutil" 12 "github.com/treeverse/lakefs/pkg/block" 13 "github.com/treeverse/lakefs/pkg/upload" 14 ) 15 16 const ( 17 bucketName = "test" 18 ObjectBlockSize = 1024 * 3 19 20 expensiveString = "EXPENSIVE" 21 cheapString = "CHEAP" 22 ) 23 24 func TestWriteBlob(t *testing.T) { 25 tt := []struct { 26 name string 27 size int64 28 storageClass *string 29 }{ 30 {"no data", 0, nil}, 31 {"100 bytes", 100, nil}, 32 {"1 block", ObjectBlockSize, apiutil.Ptr(expensiveString)}, 33 {"1 block and 100 bytes", ObjectBlockSize + 100, apiutil.Ptr(cheapString)}, 34 {"2 blocks and 1 bytes", ObjectBlockSize*2 + 1, nil}, 35 {"1000 blocks", ObjectBlockSize * 1000, nil}, 36 } 37 for _, tc := range tt { 38 t.Run(tc.name, func(t *testing.T) { 39 data := make([]byte, tc.size) 40 41 _, err := rand.Read(data) 42 if err != nil { 43 t.Fatal(err) 44 } 45 reader := bytes.NewReader(data) 46 adapter := newMockAdapter() 47 opts := block.PutOpts{StorageClass: tc.storageClass} 48 address := upload.DefaultPathProvider.NewPath() 49 blob, err := upload.WriteBlob(context.Background(), adapter, bucketName, address, reader, tc.size, opts) 50 if err != nil { 51 t.Fatal(err) 52 } 53 54 // test bucketName 55 if adapter.lastBucket != bucketName && tc.size != 0 { 56 t.Fatalf("write to wrong bucket: expected:%s got:%s", bucketName, adapter.lastBucket) 57 } 58 // test data size 59 expectedSize := int64(len(data)) 60 if expectedSize != blob.Size { 61 t.Fatalf("expected sent size to be equal to adapter read size, got: sent:%d , adapter:%d", expectedSize, adapter.totalSize) 62 } 63 if adapter.totalSize != blob.Size { 64 t.Fatalf("expected blob size to be equal to adapter read size, got: blob:%d , adapter:%d", blob.Size, adapter.totalSize) 65 } 66 // test storage class 67 if adapter.lastStorageClass != tc.storageClass { 68 t.Errorf("expected sent storage class to be equal to requested storage class, got: %v , requested: %v", 69 adapter.lastStorageClass, 70 tc.storageClass) 71 } 72 73 // test checksum 74 expectedMD5 := fmt.Sprintf("%x", md5.Sum(data)) 75 if blob.Checksum != expectedMD5 { 76 t.Fatalf("expected blob checksum to be equal to data checksum, got: blob:%s , data:%s", blob.Checksum, expectedMD5) 77 } 78 }) 79 } 80 }