From 71947dbb4ca4a35c1d679b1818f0d3286df3ea68 Mon Sep 17 00:00:00 2001 From: "zhang.ka" Date: Wed, 27 Apr 2022 11:00:23 +0800 Subject: [PATCH] Add TestMultipartUpload --- core_test.go | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/core_test.go b/core_test.go index ff0256293..e58ad3f8b 100644 --- a/core_test.go +++ b/core_test.go @@ -20,6 +20,7 @@ package minio import ( "bytes" "context" + "io" "math/rand" "net/http" "os" @@ -28,6 +29,7 @@ import ( "time" "github.com/minio/minio-go/v7/pkg/credentials" + "github.com/minio/minio-go/v7/pkg/encrypt" ) const ( @@ -797,3 +799,85 @@ func TestCoreGetObjectMetadata(t *testing.T) { t.Fatal("Error:", err) } } + +func TestCoreMultipartUpload(t *testing.T) { + if testing.Short() { + t.Skip("skipping functional tests for the short runs") + } + + // Instantiate new minio client object. + core, err := NewCore( + os.Getenv(serverEndpoint), + &Options{ + Creds: credentials.NewStaticV4(os.Getenv(accessKey), os.Getenv(secretKey), ""), + Secure: mustParseBool(os.Getenv(enableSecurity)), + }) + if err != nil { + t.Fatal("Error:", err) + } + + bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test") + // Make a new bucket. + err = core.MakeBucket(context.Background(), bucketName, MakeBucketOptions{Region: "us-east-1"}) + if err != nil { + t.Fatal("Error:", err, bucketName) + } + objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "") + + objectContentType := "binary/octet-stream" + metadata := make(map[string]string) + metadata["Content-Type"] = objectContentType + putopts := PutObjectOptions{ + UserMetadata: metadata, + } + uploadID, err := core.NewMultipartUpload(context.Background(), bucketName, objectName, putopts) + if err != nil { + t.Fatal("Error:", err, bucketName, objectName) + } + buf := bytes.Repeat([]byte("a"), 32*1024*1024) + r := bytes.NewReader(buf) + partBuf := make([]byte, 100*1024*1024) + parts := make([]CompletePart, 0, 5) + partID := 0 + for { + n, err := r.Read(partBuf) + if err != nil && err != io.EOF { + t.Fatal("Error:", err) + } + if err == io.EOF { + break + } + if n > 0 { + partID++ + data := bytes.NewReader(partBuf[:n]) + dataLen := int64(len(partBuf[:n])) + objectPart, err := core.PutObjectPart(context.Background(), bucketName, objectName, uploadID, partID, data, dataLen, "", "", encrypt.NewSSE()) + if err != nil { + t.Fatal("Error:", err, bucketName, objectName) + } + parts = append(parts, CompletePart{ + PartNumber: partID, + ETag: objectPart.ETag, + }) + } + } + objectParts, err := core.listObjectParts(context.Background(), bucketName, objectName, uploadID) + if err != nil { + t.Fatal("Error:", err) + } + if len(objectParts) != len(parts) { + t.Fatal("Error", len(objectParts), len(parts)) + } + _, err = core.CompleteMultipartUpload(context.Background(), bucketName, objectName, uploadID, parts, putopts) + if err != nil { + t.Fatal("Error:", err) + } + + if err := core.RemoveObject(context.Background(), bucketName, objectName, RemoveObjectOptions{}); err != nil { + t.Fatal("Error: ", err) + } + + if err := core.RemoveBucket(context.Background(), bucketName); err != nil { + t.Fatal("Error: ", err) + } +}