summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/minio/minio-go/core_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/minio/minio-go/core_test.go')
-rw-r--r--vendor/github.com/minio/minio-go/core_test.go334
1 files changed, 296 insertions, 38 deletions
diff --git a/vendor/github.com/minio/minio-go/core_test.go b/vendor/github.com/minio/minio-go/core_test.go
index 8cadc251b..8cf810465 100644
--- a/vendor/github.com/minio/minio-go/core_test.go
+++ b/vendor/github.com/minio/minio-go/core_test.go
@@ -1,5 +1,6 @@
/*
- * Minio Go Library for Amazon S3 Compatible Cloud Storage (C) 2017 Minio, Inc.
+ * Minio Go Library for Amazon S3 Compatible Cloud Storage
+ * Copyright 2017 Minio, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,7 +26,6 @@ import (
"testing"
"time"
- "crypto/md5"
"math/rand"
)
@@ -103,7 +103,9 @@ func TestGetObjectCore(t *testing.T) {
// Save the data
objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "")
- n, err := c.Client.PutObject(bucketName, objectName, bytes.NewReader(buf), "binary/octet-stream")
+ n, err := c.Client.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), PutObjectOptions{
+ ContentType: "binary/octet-stream",
+ })
if err != nil {
t.Fatal("Error:", err, bucketName, objectName)
}
@@ -112,8 +114,6 @@ func TestGetObjectCore(t *testing.T) {
t.Fatalf("Error: number of bytes does not match, want %v, got %v\n", len(buf), n)
}
- reqHeaders := NewGetReqHeaders()
-
offset := int64(2048)
// read directly
@@ -122,8 +122,9 @@ func TestGetObjectCore(t *testing.T) {
buf3 := make([]byte, n)
buf4 := make([]byte, 1)
- reqHeaders.SetRange(offset, offset+int64(len(buf1))-1)
- reader, objectInfo, err := c.GetObject(bucketName, objectName, reqHeaders)
+ opts := GetObjectOptions{}
+ opts.SetRange(offset, offset+int64(len(buf1))-1)
+ reader, objectInfo, err := c.GetObject(bucketName, objectName, opts)
if err != nil {
t.Fatal(err)
}
@@ -141,8 +142,8 @@ func TestGetObjectCore(t *testing.T) {
}
offset += 512
- reqHeaders.SetRange(offset, offset+int64(len(buf2))-1)
- reader, objectInfo, err = c.GetObject(bucketName, objectName, reqHeaders)
+ opts.SetRange(offset, offset+int64(len(buf2))-1)
+ reader, objectInfo, err = c.GetObject(bucketName, objectName, opts)
if err != nil {
t.Fatal(err)
}
@@ -160,8 +161,8 @@ func TestGetObjectCore(t *testing.T) {
t.Fatal("Error: Incorrect read between two GetObject from same offset.")
}
- reqHeaders.SetRange(0, int64(len(buf3)))
- reader, objectInfo, err = c.GetObject(bucketName, objectName, reqHeaders)
+ opts.SetRange(0, int64(len(buf3)))
+ reader, objectInfo, err = c.GetObject(bucketName, objectName, opts)
if err != nil {
t.Fatal(err)
}
@@ -180,9 +181,9 @@ func TestGetObjectCore(t *testing.T) {
t.Fatal("Error: Incorrect data read in GetObject, than what was previously upoaded.")
}
- reqHeaders = NewGetReqHeaders()
- reqHeaders.SetMatchETag("etag")
- _, _, err = c.GetObject(bucketName, objectName, reqHeaders)
+ opts = GetObjectOptions{}
+ opts.SetMatchETag("etag")
+ _, _, err = c.GetObject(bucketName, objectName, opts)
if err == nil {
t.Fatal("Unexpected GetObject should fail with mismatching etags")
}
@@ -190,9 +191,9 @@ func TestGetObjectCore(t *testing.T) {
t.Fatalf("Expected \"PreconditionFailed\" as code, got %s instead", errResp.Code)
}
- reqHeaders = NewGetReqHeaders()
- reqHeaders.SetMatchETagExcept("etag")
- reader, objectInfo, err = c.GetObject(bucketName, objectName, reqHeaders)
+ opts = GetObjectOptions{}
+ opts.SetMatchETagExcept("etag")
+ reader, objectInfo, err = c.GetObject(bucketName, objectName, opts)
if err != nil {
t.Fatal(err)
}
@@ -210,9 +211,9 @@ func TestGetObjectCore(t *testing.T) {
t.Fatal("Error: Incorrect data read in GetObject, than what was previously upoaded.")
}
- reqHeaders = NewGetReqHeaders()
- reqHeaders.SetRange(0, 0)
- reader, objectInfo, err = c.GetObject(bucketName, objectName, reqHeaders)
+ opts = GetObjectOptions{}
+ opts.SetRange(0, 0)
+ reader, objectInfo, err = c.GetObject(bucketName, objectName, opts)
if err != nil {
t.Fatal(err)
}
@@ -275,12 +276,12 @@ func TestGetObjectContentEncoding(t *testing.T) {
// Generate data more than 32K
buf := bytes.Repeat([]byte("3"), rand.Intn(1<<20)+32*1024)
- m := make(map[string][]string)
- m["Content-Encoding"] = []string{"gzip"}
// Save the data
objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "")
- n, err := c.Client.PutObjectWithMetadata(bucketName, objectName, bytes.NewReader(buf), m, nil)
+ n, err := c.Client.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), PutObjectOptions{
+ ContentEncoding: "gzip",
+ })
if err != nil {
t.Fatal("Error:", err, bucketName, objectName)
}
@@ -289,8 +290,7 @@ func TestGetObjectContentEncoding(t *testing.T) {
t.Fatalf("Error: number of bytes does not match, want %v, got %v\n", len(buf), n)
}
- reqHeaders := NewGetReqHeaders()
- rwc, objInfo, err := c.GetObject(bucketName, objectName, reqHeaders)
+ rwc, objInfo, err := c.GetObject(bucketName, objectName, GetObjectOptions{})
if err != nil {
t.Fatalf("Error: %v", err)
}
@@ -370,6 +370,265 @@ func TestGetBucketPolicy(t *testing.T) {
}
}
+// Tests Core CopyObject API implementation.
+func TestCoreCopyObject(t *testing.T) {
+ if testing.Short() {
+ t.Skip("skipping functional tests for short runs")
+ }
+
+ // Seed random based on current time.
+ rand.Seed(time.Now().Unix())
+
+ // Instantiate new minio client object.
+ c, err := NewCore(
+ os.Getenv(serverEndpoint),
+ os.Getenv(accessKey),
+ os.Getenv(secretKey),
+ mustParseBool(os.Getenv(enableSecurity)),
+ )
+ if err != nil {
+ t.Fatal("Error:", err)
+ }
+
+ // Enable tracing, write to stderr.
+ // c.TraceOn(os.Stderr)
+
+ // Set user agent.
+ c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0")
+
+ // Generate a new random bucket name.
+ bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test")
+
+ // Make a new bucket.
+ err = c.MakeBucket(bucketName, "us-east-1")
+ if err != nil {
+ t.Fatal("Error:", err, bucketName)
+ }
+
+ buf := bytes.Repeat([]byte("a"), 32*1024)
+
+ // Save the data
+ objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "")
+ objInfo, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), "", "", map[string]string{
+ "Content-Type": "binary/octet-stream",
+ })
+ if err != nil {
+ t.Fatal("Error:", err, bucketName, objectName)
+ }
+
+ if objInfo.Size != int64(len(buf)) {
+ t.Fatalf("Error: number of bytes does not match, want %v, got %v\n", len(buf), objInfo.Size)
+ }
+
+ destBucketName := bucketName
+ destObjectName := objectName + "-dest"
+
+ cobjInfo, err := c.CopyObject(bucketName, objectName, destBucketName, destObjectName, map[string]string{
+ "X-Amz-Metadata-Directive": "REPLACE",
+ "Content-Type": "application/javascript",
+ })
+ if err != nil {
+ t.Fatal("Error:", err, bucketName, objectName, destBucketName, destObjectName)
+ }
+ if cobjInfo.ETag != objInfo.ETag {
+ t.Fatalf("Error: expected etag to be same as source object %s, but found different etag :%s", objInfo.ETag, cobjInfo.ETag)
+ }
+
+ // Attempt to read from destBucketName and object name.
+ r, err := c.Client.GetObject(destBucketName, destObjectName, GetObjectOptions{})
+ if err != nil {
+ t.Fatal("Error:", err, bucketName, objectName)
+ }
+
+ st, err := r.Stat()
+ if err != nil {
+ t.Fatal("Error:", err, bucketName, objectName)
+ }
+
+ if st.Size != int64(len(buf)) {
+ t.Fatalf("Error: number of bytes in stat does not match, want %v, got %v\n",
+ len(buf), st.Size)
+ }
+
+ if st.ContentType != "application/javascript" {
+ t.Fatalf("Error: Content types don't match, expected: application/javascript, found: %+v\n", st.ContentType)
+ }
+
+ if st.ETag != objInfo.ETag {
+ t.Fatalf("Error: expected etag to be same as source object %s, but found different etag :%s", objInfo.ETag, st.ETag)
+ }
+
+ if err := r.Close(); err != nil {
+ t.Fatal("Error:", err)
+ }
+
+ if err := r.Close(); err == nil {
+ t.Fatal("Error: object is already closed, should return error")
+ }
+
+ err = c.RemoveObject(bucketName, objectName)
+ if err != nil {
+ t.Fatal("Error: ", err)
+ }
+
+ err = c.RemoveObject(destBucketName, destObjectName)
+ if err != nil {
+ t.Fatal("Error: ", err)
+ }
+
+ err = c.RemoveBucket(bucketName)
+ if err != nil {
+ t.Fatal("Error:", err)
+ }
+
+ // Do not need to remove destBucketName its same as bucketName.
+}
+
+// Test Core CopyObjectPart implementation
+func TestCoreCopyObjectPart(t *testing.T) {
+ if testing.Short() {
+ t.Skip("skipping functional tests for short runs")
+ }
+
+ // Seed random based on current time.
+ rand.Seed(time.Now().Unix())
+
+ // Instantiate new minio client object.
+ c, err := NewCore(
+ os.Getenv(serverEndpoint),
+ os.Getenv(accessKey),
+ os.Getenv(secretKey),
+ mustParseBool(os.Getenv(enableSecurity)),
+ )
+ if err != nil {
+ t.Fatal("Error:", err)
+ }
+
+ // Enable tracing, write to stderr.
+ // c.TraceOn(os.Stderr)
+
+ // Set user agent.
+ c.SetAppInfo("Minio-go-FunctionalTest", "0.1.0")
+
+ // Generate a new random bucket name.
+ bucketName := randString(60, rand.NewSource(time.Now().UnixNano()), "minio-go-test")
+
+ // Make a new bucket.
+ err = c.MakeBucket(bucketName, "us-east-1")
+ if err != nil {
+ t.Fatal("Error:", err, bucketName)
+ }
+
+ // Make a buffer with 5MB of data
+ buf := bytes.Repeat([]byte("abcde"), 1024*1024)
+
+ // Save the data
+ objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "")
+ objInfo, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), "", "", map[string]string{
+ "Content-Type": "binary/octet-stream",
+ })
+ if err != nil {
+ t.Fatal("Error:", err, bucketName, objectName)
+ }
+
+ if objInfo.Size != int64(len(buf)) {
+ t.Fatalf("Error: number of bytes does not match, want %v, got %v\n", len(buf), objInfo.Size)
+ }
+
+ destBucketName := bucketName
+ destObjectName := objectName + "-dest"
+
+ uploadID, err := c.NewMultipartUpload(destBucketName, destObjectName, PutObjectOptions{})
+ if err != nil {
+ t.Fatal("Error:", err, bucketName, objectName)
+ }
+
+ // Content of the destination object will be two copies of
+ // `objectName` concatenated, followed by first byte of
+ // `objectName`.
+
+ // First of three parts
+ fstPart, err := c.CopyObjectPart(bucketName, objectName, destBucketName, destObjectName, uploadID, 1, 0, -1, nil)
+ if err != nil {
+ t.Fatal("Error:", err, destBucketName, destObjectName)
+ }
+
+ // Second of three parts
+ sndPart, err := c.CopyObjectPart(bucketName, objectName, destBucketName, destObjectName, uploadID, 2, 0, -1, nil)
+ if err != nil {
+ t.Fatal("Error:", err, destBucketName, destObjectName)
+ }
+
+ // Last of three parts
+ lstPart, err := c.CopyObjectPart(bucketName, objectName, destBucketName, destObjectName, uploadID, 3, 0, 1, nil)
+ if err != nil {
+ t.Fatal("Error:", err, destBucketName, destObjectName)
+ }
+
+ // Complete the multipart upload
+ err = c.CompleteMultipartUpload(destBucketName, destObjectName, uploadID, []CompletePart{fstPart, sndPart, lstPart})
+ if err != nil {
+ t.Fatal("Error:", err, destBucketName, destObjectName)
+ }
+
+ // Stat the object and check its length matches
+ objInfo, err = c.StatObject(destBucketName, destObjectName, StatObjectOptions{})
+ if err != nil {
+ t.Fatal("Error:", err, destBucketName, destObjectName)
+ }
+
+ if objInfo.Size != (5*1024*1024)*2+1 {
+ t.Fatal("Destination object has incorrect size!")
+ }
+
+ // Now we read the data back
+ getOpts := GetObjectOptions{}
+ getOpts.SetRange(0, 5*1024*1024-1)
+ r, _, err := c.GetObject(destBucketName, destObjectName, getOpts)
+ if err != nil {
+ t.Fatal("Error:", err, destBucketName, destObjectName)
+ }
+ getBuf := make([]byte, 5*1024*1024)
+ _, err = io.ReadFull(r, getBuf)
+ if err != nil {
+ t.Fatal("Error:", err, destBucketName, destObjectName)
+ }
+ if !bytes.Equal(getBuf, buf) {
+ t.Fatal("Got unexpected data in first 5MB")
+ }
+
+ getOpts.SetRange(5*1024*1024, 0)
+ r, _, err = c.GetObject(destBucketName, destObjectName, getOpts)
+ if err != nil {
+ t.Fatal("Error:", err, destBucketName, destObjectName)
+ }
+ getBuf = make([]byte, 5*1024*1024+1)
+ _, err = io.ReadFull(r, getBuf)
+ if err != nil {
+ t.Fatal("Error:", err, destBucketName, destObjectName)
+ }
+ if !bytes.Equal(getBuf[:5*1024*1024], buf) {
+ t.Fatal("Got unexpected data in second 5MB")
+ }
+ if getBuf[5*1024*1024] != buf[0] {
+ t.Fatal("Got unexpected data in last byte of copied object!")
+ }
+
+ if err := c.RemoveObject(destBucketName, destObjectName); err != nil {
+ t.Fatal("Error: ", err)
+ }
+
+ if err := c.RemoveObject(bucketName, objectName); err != nil {
+ t.Fatal("Error: ", err)
+ }
+
+ if err := c.RemoveBucket(bucketName); err != nil {
+ t.Fatal("Error: ", err)
+ }
+
+ // Do not need to remove destBucketName its same as bucketName.
+}
+
// Test Core PutObject.
func TestCorePutObject(t *testing.T) {
if testing.Short() {
@@ -405,21 +664,21 @@ func TestCorePutObject(t *testing.T) {
t.Fatal("Error:", err, bucketName)
}
- buf := bytes.Repeat([]byte("a"), minPartSize)
+ buf := bytes.Repeat([]byte("a"), 32*1024)
// Save the data
objectName := randString(60, rand.NewSource(time.Now().UnixNano()), "")
// Object content type
objectContentType := "binary/octet-stream"
- metadata := make(map[string][]string)
- metadata["Content-Type"] = []string{objectContentType}
+ metadata := make(map[string]string)
+ metadata["Content-Type"] = objectContentType
- objInfo, err := c.PutObject(bucketName, objectName, int64(len(buf)), bytes.NewReader(buf), md5.New().Sum(nil), nil, metadata)
+ objInfo, err := c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), "1B2M2Y8AsgTpgAmY7PhCfg==", "", metadata)
if err == nil {
- t.Fatal("Error expected: nil, got: ", err)
+ t.Fatal("Error expected: error, got: nil(success)")
}
- objInfo, err = c.PutObject(bucketName, objectName, int64(len(buf)), bytes.NewReader(buf), nil, nil, metadata)
+ objInfo, err = c.PutObject(bucketName, objectName, bytes.NewReader(buf), int64(len(buf)), "", "", metadata)
if err != nil {
t.Fatal("Error:", err, bucketName, objectName)
}
@@ -429,7 +688,7 @@ func TestCorePutObject(t *testing.T) {
}
// Read the data back
- r, err := c.Client.GetObject(bucketName, objectName)
+ r, err := c.Client.GetObject(bucketName, objectName, GetObjectOptions{})
if err != nil {
t.Fatal("Error:", err, bucketName, objectName)
}
@@ -490,18 +749,17 @@ func TestCoreGetObjectMetadata(t *testing.T) {
t.Fatal("Error:", err, bucketName)
}
- metadata := map[string][]string{
- "X-Amz-Meta-Key-1": {"Val-1"},
+ metadata := map[string]string{
+ "X-Amz-Meta-Key-1": "Val-1",
}
- _, err = core.PutObject(bucketName, "my-objectname", 5,
- bytes.NewReader([]byte("hello")), nil, nil, metadata)
+ _, err = core.PutObject(bucketName, "my-objectname",
+ bytes.NewReader([]byte("hello")), 5, "", "", metadata)
if err != nil {
log.Fatalln(err)
}
- reader, objInfo, err := core.GetObject(bucketName, "my-objectname",
- RequestHeaders{})
+ reader, objInfo, err := core.GetObject(bucketName, "my-objectname", GetObjectOptions{})
if err != nil {
log.Fatalln(err)
}