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  }