summaryrefslogtreecommitdiff
path: root/vendor/github.com/minio/minio-go/v7/functional_tests.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/minio/minio-go/v7/functional_tests.go')
-rw-r--r--vendor/github.com/minio/minio-go/v7/functional_tests.go215
1 files changed, 192 insertions, 23 deletions
diff --git a/vendor/github.com/minio/minio-go/v7/functional_tests.go b/vendor/github.com/minio/minio-go/v7/functional_tests.go
index 97c6930fb..3ade9a6af 100644
--- a/vendor/github.com/minio/minio-go/v7/functional_tests.go
+++ b/vendor/github.com/minio/minio-go/v7/functional_tests.go
@@ -1970,7 +1970,7 @@ func testPutObjectWithChecksums() {
// initialize logging params
startTime := time.Now()
testName := getFuncName()
- function := "PutObject(bucketName, objectName, reader,size, opts)"
+ function := "PutObject(bucketName, objectName, reader, size, opts)"
args := map[string]interface{}{
"bucketName": "",
"objectName": "",
@@ -1982,7 +1982,7 @@ func testPutObjectWithChecksums() {
return
}
- c, err := NewClient(ClientConfig{})
+ c, err := NewClient(ClientConfig{TrailingHeaders: true})
if err != nil {
logError(testName, function, args, startTime, "", "MinIO client object creation failed", err)
return
@@ -2037,6 +2037,10 @@ func testPutObjectWithChecksums() {
h := test.cs.Hasher()
h.Reset()
+ if test.cs.IsSet() {
+ meta["x-amz-checksum-algorithm"] = test.cs.String()
+ }
+
// Test with a bad CRC - we haven't called h.Write(b), so this is a checksum of empty data
meta[test.cs.Key()] = base64.StdEncoding.EncodeToString(h.Sum(nil))
args["metadata"] = meta
@@ -2323,7 +2327,7 @@ func testPutObjectWithTrailingChecksums() {
}
// Test PutObject with custom checksums.
-func testPutMultipartObjectWithChecksums(trailing bool) {
+func testPutMultipartObjectWithChecksums() {
// initialize logging params
startTime := time.Now()
testName := getFuncName()
@@ -2331,7 +2335,7 @@ func testPutMultipartObjectWithChecksums(trailing bool) {
args := map[string]interface{}{
"bucketName": "",
"objectName": "",
- "opts": fmt.Sprintf("minio.PutObjectOptions{UserMetadata: metadata, Trailing: %v}", trailing),
+ "opts": "minio.PutObjectOptions{UserMetadata: metadata, Trailing: true}",
}
if !isFullMode() {
@@ -2339,7 +2343,7 @@ func testPutMultipartObjectWithChecksums(trailing bool) {
return
}
- c, err := NewClient(ClientConfig{TrailingHeaders: trailing})
+ c, err := NewClient(ClientConfig{TrailingHeaders: true})
if err != nil {
logError(testName, function, args, startTime, "", "MinIO client object creation failed", err)
return
@@ -2433,12 +2437,8 @@ func testPutMultipartObjectWithChecksums(trailing bool) {
h.Reset()
want := hashMultiPart(b, partSize, test.cs)
- var cs minio.ChecksumType
- rd := io.Reader(io.NopCloser(bytes.NewReader(b)))
- if trailing {
- cs = test.cs
- rd = bytes.NewReader(b)
- }
+ rd := bytes.NewReader(b)
+ cs := test.cs
// Set correct CRC.
args["section"] = "PutObject"
@@ -2447,7 +2447,6 @@ func testPutMultipartObjectWithChecksums(trailing bool) {
DisableMultipart: false,
UserMetadata: nil,
PartSize: partSize,
- AutoChecksum: test.cs,
Checksum: cs,
})
if err != nil {
@@ -2589,11 +2588,10 @@ func testTrailingChecksums() {
return
}
- hashMultiPart := func(b []byte, partSize int, hasher hash.Hash) string {
+ hashMultiPart := func(b []byte, partSize int, hasher hash.Hash) (oparts []minio.ObjectPart) {
r := bytes.NewReader(b)
tmp := make([]byte, partSize)
parts := 0
- var all []byte
for {
n, err := io.ReadFull(r, tmp)
if err != nil && err != io.ErrUnexpectedEOF {
@@ -2605,14 +2603,16 @@ func testTrailingChecksums() {
parts++
hasher.Reset()
hasher.Write(tmp[:n])
- all = append(all, hasher.Sum(nil)...)
+ oparts = append(oparts, minio.ObjectPart{
+ PartNumber: parts,
+ Size: int64(n),
+ ChecksumCRC32C: base64.StdEncoding.EncodeToString(hasher.Sum(nil)),
+ })
if err != nil {
break
}
}
- hasher.Reset()
- hasher.Write(all)
- return fmt.Sprintf("%s-%d", base64.StdEncoding.EncodeToString(hasher.Sum(nil)), parts)
+ return oparts
}
defer cleanupBucket(bucketName, c)
tests := []struct {
@@ -2636,6 +2636,7 @@ func testTrailingChecksums() {
DisableMultipart: false,
UserMetadata: nil,
PartSize: 5 << 20,
+ Checksum: minio.ChecksumFullObjectCRC32C,
},
},
{
@@ -2647,6 +2648,7 @@ func testTrailingChecksums() {
DisableMultipart: false,
UserMetadata: nil,
PartSize: 6_645_654, // Rather arbitrary size
+ Checksum: minio.ChecksumFullObjectCRC32C,
},
},
{
@@ -2658,6 +2660,7 @@ func testTrailingChecksums() {
DisableMultipart: false,
UserMetadata: nil,
PartSize: 5 << 20,
+ Checksum: minio.ChecksumFullObjectCRC32C,
},
},
{
@@ -2669,6 +2672,7 @@ func testTrailingChecksums() {
DisableMultipart: false,
UserMetadata: nil,
PartSize: 6_645_654, // Rather arbitrary size
+ Checksum: minio.ChecksumFullObjectCRC32C,
},
},
}
@@ -2696,7 +2700,14 @@ func testTrailingChecksums() {
reader.Close()
h := test.hasher
h.Reset()
- test.ChecksumCRC32C = hashMultiPart(b, int(test.PO.PartSize), test.hasher)
+
+ parts := hashMultiPart(b, int(test.PO.PartSize), test.hasher)
+ cksum, err := minio.ChecksumFullObjectCRC32C.FullObjectChecksum(parts)
+ if err != nil {
+ logError(testName, function, args, startTime, "", "checksum calculation failed", err)
+ return
+ }
+ test.ChecksumCRC32C = cksum.Encoded()
// Set correct CRC.
resp, err := c.PutObject(context.Background(), bucketName, objectName, bytes.NewReader(b), int64(bufSize), test.PO)
@@ -4172,7 +4183,7 @@ func testFPutObjectMultipart() {
"opts": "",
}
- c, err := NewClient(ClientConfig{})
+ c, err := NewClient(ClientConfig{TrailingHeaders: true})
if err != nil {
logError(testName, function, args, startTime, "", "MinIO client object creation failed", err)
return
@@ -5586,6 +5597,161 @@ func testPresignedPostPolicyWrongFile() {
logSuccess(testName, function, args, startTime)
}
+// testPresignedPostPolicyEmptyFileName tests that an empty file name in the presigned post policy
+func testPresignedPostPolicyEmptyFileName() {
+ // initialize logging params
+ startTime := time.Now()
+ testName := getFuncName()
+ function := "PresignedPostPolicy(policy)"
+ args := map[string]interface{}{
+ "policy": "",
+ }
+
+ c, err := NewClient(ClientConfig{})
+ if err != nil {
+ logError(testName, function, args, startTime, "", "MinIO client object creation failed", err)
+ return
+ }
+
+ // Generate a new random bucket name.
+ bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test-")
+
+ // Make a new bucket in 'us-east-1' (source bucket).
+ err = c.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{Region: "us-east-1"})
+ if err != nil {
+ logError(testName, function, args, startTime, "", "MakeBucket failed", err)
+ return
+ }
+
+ defer cleanupBucket(bucketName, c)
+
+ // Generate 33K of data.
+ reader := getDataReader("datafile-33-kB")
+ defer reader.Close()
+
+ objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "")
+ // Azure requires the key to not start with a number
+ metadataKey := randString(60, rand.NewSource(time.Now().UnixNano()), "user")
+ metadataValue := randString(60, rand.NewSource(time.Now().UnixNano()), "")
+
+ buf, err := io.ReadAll(reader)
+ if err != nil {
+ logError(testName, function, args, startTime, "", "ReadAll failed", err)
+ return
+ }
+
+ policy := minio.NewPostPolicy()
+ policy.SetBucket(bucketName)
+ policy.SetKey(objectName)
+ policy.SetExpires(time.Now().UTC().AddDate(0, 0, 10)) // expires in 10 days
+ policy.SetContentType("binary/octet-stream")
+ policy.SetContentLengthRange(10, 1024*1024)
+ policy.SetUserMetadata(metadataKey, metadataValue)
+ policy.SetContentEncoding("gzip")
+
+ // Add CRC32C
+ checksum := minio.ChecksumCRC32C.ChecksumBytes(buf)
+ err = policy.SetChecksum(checksum)
+ if err != nil {
+ logError(testName, function, args, startTime, "", "SetChecksum failed", err)
+ return
+ }
+
+ args["policy"] = policy.String()
+
+ presignedPostPolicyURL, formData, err := c.PresignedPostPolicy(context.Background(), policy)
+ if err != nil {
+ logError(testName, function, args, startTime, "", "PresignedPostPolicy failed", err)
+ return
+ }
+
+ var formBuf bytes.Buffer
+ writer := multipart.NewWriter(&formBuf)
+ for k, v := range formData {
+ writer.WriteField(k, v)
+ }
+
+ // Get a 33KB file to upload and test if set post policy works
+ filePath := getMintDataDirFilePath("datafile-33-kB")
+ if filePath == "" {
+ // Make a temp file with 33 KB data.
+ file, err := os.CreateTemp(os.TempDir(), "PresignedPostPolicyTest")
+ if err != nil {
+ logError(testName, function, args, startTime, "", "TempFile creation failed", err)
+ return
+ }
+ if _, err = io.Copy(file, getDataReader("datafile-33-kB")); err != nil {
+ logError(testName, function, args, startTime, "", "Copy failed", err)
+ return
+ }
+ if err = file.Close(); err != nil {
+ logError(testName, function, args, startTime, "", "File Close failed", err)
+ return
+ }
+ filePath = file.Name()
+ }
+
+ // add file to post request
+ f, err := os.Open(filePath)
+ defer f.Close()
+ if err != nil {
+ logError(testName, function, args, startTime, "", "File open failed", err)
+ return
+ }
+ w, err := writer.CreateFormFile("", filePath)
+ if err != nil {
+ logError(testName, function, args, startTime, "", "CreateFormFile failed", err)
+ return
+ }
+
+ _, err = io.Copy(w, f)
+ if err != nil {
+ logError(testName, function, args, startTime, "", "Copy failed", err)
+ return
+ }
+ writer.Close()
+
+ httpClient := &http.Client{
+ // Setting a sensible time out of 30secs to wait for response
+ // headers. Request is pro-actively canceled after 30secs
+ // with no response.
+ Timeout: 30 * time.Second,
+ Transport: createHTTPTransport(),
+ }
+ args["url"] = presignedPostPolicyURL.String()
+
+ req, err := http.NewRequest(http.MethodPost, presignedPostPolicyURL.String(), bytes.NewReader(formBuf.Bytes()))
+ if err != nil {
+ logError(testName, function, args, startTime, "", "Http request failed", err)
+ return
+ }
+
+ req.Header.Set("Content-Type", writer.FormDataContentType())
+
+ // make post request with correct form data
+ res, err := httpClient.Do(req)
+ if err != nil {
+ logError(testName, function, args, startTime, "", "Http request failed", err)
+ return
+ }
+ defer res.Body.Close()
+ if res.StatusCode != http.StatusBadRequest {
+ logError(testName, function, args, startTime, "", "Http request failed", errors.New(res.Status))
+ return
+ }
+
+ body, err := io.ReadAll(res.Body)
+ if err != nil {
+ logError(testName, function, args, startTime, "", "ReadAll failed", err)
+ return
+ }
+ if !strings.Contains(string(body), "MalformedPOSTRequest") {
+ logError(testName, function, args, startTime, "", "Invalid error from server", errors.New(string(body)))
+ }
+
+ logSuccess(testName, function, args, startTime)
+}
+
// Tests copy object
func testCopyObject() {
// initialize logging params
@@ -11560,8 +11726,11 @@ func testPutObjectMetadataNonUSASCIIV2() {
}
for k, v := range metadata {
+ if strings.HasPrefix(strings.ToLower(k), "x-amz-checksum-") {
+ continue
+ }
if st.Metadata.Get(http.CanonicalHeaderKey("X-Amz-Meta-"+k)) != v {
- logError(testName, function, args, startTime, "", "Expected upload object metadata "+k+": "+v+" but got "+st.Metadata.Get("X-Amz-Meta-"+k), err)
+ logError(testName, function, args, startTime, "", "Expected upload object metadata "+k+": "+v+" but got "+st.Metadata.Get(http.CanonicalHeaderKey("X-Amz-Meta-"+k)), err)
return
}
}
@@ -14069,8 +14238,7 @@ func main() {
testUserMetadataCopyingV2()
testPutObjectWithChecksums()
testPutObjectWithTrailingChecksums()
- testPutMultipartObjectWithChecksums(false)
- testPutMultipartObjectWithChecksums(true)
+ testPutMultipartObjectWithChecksums()
testPutObject0ByteV2()
testPutObjectMetadataNonUSASCIIV2()
testPutObjectNoLengthV2()
@@ -14098,6 +14266,7 @@ func main() {
testGetObjectReadAtWhenEOFWasReached()
testPresignedPostPolicy()
testPresignedPostPolicyWrongFile()
+ testPresignedPostPolicyEmptyFileName()
testCopyObject()
testComposeObjectErrorCases()
testCompose10KSources()