toranger
6 years ago
12 changed files with 562 additions and 22 deletions
-
22.travis.yml
-
4Makefile
-
1cos.go
-
449costesting/ci_test.go
-
25example/object/get.go
-
9example/object/put.go
-
2example/test.sh
-
35object.go
-
16object_part.go
-
1vendor/github.com/google/go-querystring
-
1vendor/github.com/mozillazg/go-httpheader
-
1vendor/github.com/stretchr/testify
@ -1,27 +1,29 @@ |
|||||
language: go |
language: go |
||||
go: |
go: |
||||
- 1.6 |
|
||||
- 1.7 |
|
||||
- 1.8 |
|
||||
- 1.9 |
|
||||
|
- '1.6' |
||||
|
- '1.7' |
||||
|
- '1.8' |
||||
|
- '1.9' |
||||
|
- 1.10.x |
||||
- master |
- master |
||||
|
|
||||
sudo: false |
sudo: false |
||||
|
|
||||
before_install: |
before_install: |
||||
- go get github.com/mattn/goveralls |
- go get github.com/mattn/goveralls |
||||
|
|
||||
install: |
install: |
||||
- go get |
- go get |
||||
- go build |
- go build |
||||
|
|
||||
script: |
script: |
||||
- make test |
- make test |
||||
|
- make ci-test |
||||
- go test -coverprofile=cover.out github.com/tencentyun/cos-go-sdk-v5 |
- go test -coverprofile=cover.out github.com/tencentyun/cos-go-sdk-v5 |
||||
- $HOME/gopath/bin/goveralls -service=travis-ci -coverprofile=cover.out |
|
||||
|
|
||||
|
- "$HOME/gopath/bin/goveralls -service=travis-ci -coverprofile=cover.out" |
||||
matrix: |
matrix: |
||||
allow_failures: |
allow_failures: |
||||
- go: 1.6 |
- go: 1.6 |
||||
- go: 1.7 |
- go: 1.7 |
||||
- go: master |
- go: master |
||||
|
env: |
||||
|
global: |
||||
|
- secure: XXB/cFVnJcAzhOZ2/zplwjhhhireQQGGRbNscPgQ0kpUQCyPZ6oIHvJMafuP4TVTJHEdMiaDxm0HNvgARuopXVaQNmK2UZj6xw40Ud7OT7ZUnw88xkQkXOI5GwG8oz9LqxIXUSItHegKXRLW0e1PoBdjZNv6lxGFAtuOcl9ekAg/q2lGIIQFefz6NK7gCmGYULKe+4J15VFldoYNM0JesxxxArTvtv8+k+U53oUwy9dex6z5oIA1zGIeKLcOD2xXgbjid/Ett3t0B2w3GfJWoM9rGV0eHgveOAUGe5tQkMKvl5LK1hj+93ZmU0MAG7x7t9jYKrFPqU/eDNJRMb4Ro6L7lIXVEKaBUkLx28PnwFQ5D043GBVtQGqYNcldZXIfbyYEHQZlD/BWFOt5YqTpGg+7Wm4NC3Yffqsurzk54juT7FftzVy0A8MFkqO+c5RHrOSUlm01pWXkGLHgZhUP5gEZEuUaoluSQTZksmAUJZ7F8DxwpE4SYBqfN27PZ87rWDNyOqNv1w1trzwx2IfdHHA+vfCZ7UM5e85gxFWUO2tJCUai2q21v3gBrcAgBOb6BwVzbWAorM2zY20f0l21XxOWMakA+r4JJA3s3EmcczcQeeL6pkFIAh+qKdFEPuyQTjH1mGpPzYFNbWtvPXijQo5PqyGrKL8W1t3ovwXMXoE= |
||||
|
- secure: bep0PPD/oYW5zY0QpeeC+WgFIya5DNRVmR92MO+e5BdFlSJPhstoG8bRh91EeftzC/Hyd3PUEIglPqTgZPxwysqW/81plsU95wV3qJi9gPi7+ZtYXH4xZTnaqgZsTr7jsKSVoKHSu7XqCtbSytW8YMN9wRWzG19/9hX2Z79Q6yNy5l9856Oyj1E2IXDjdZLPsWDhnZ8Vvk1wAVy2fc2esqKzHAZwm8n9vee2yR8vz7GXUszzpKvn4R43eNzdlFEHCmN0ANmxLJZmnYDpZHHfNf4slts+0S6I7awFXppuXUDaJPBRCia4XoFeSw+01IW1Vi0kAwvGLhxjJCWc4M/4ZU0byXDT11tDFvWa19NmnbYiizWiXNVecn1oNWYJqIKe7TTAMAtHSXAPmLX0rXuXKzwM09W6yrLFufCxyix9IOnenEbe9WwSdBbhmeLF3Wu/uVGkDog/FsXJM75sk956vV9UKh9zF4B9/NR8szJMF7shEs0Fbru5UUWheqg4AadPl3dhAWuj2+6NANa1LpH3JVD3II9dlXeMmMvsSwDvrYUaX/S8tf6JwZG0zCJK0TYp05rjxH+NIzWaMUTY7+HwYqqK3pOW3San0SlZiMq8N7GSnKUZ7WRQXYSB4gXHrg+mWyeVC7XnqiRtCwVi+LtPMu+YUbg7dwVi0vtKjYZYIUY= |
||||
|
- secure: Ob28vrOuHMKNKEtChkWbsaVv2SwLhcxXMnvGe4XN+y3mFvdhYnwpt6NdgThF8OCZ0761tvTRmvALfiZnO0uORjTtoHKkVPrnVIxlCcode0NVJZNHGn2fqjemdLKCnSeX7hm+9zeLpCnIvC+Sp3iZ3t2AH4AzgFx6nirWO3HwT5l9rNL9Q1CfwlOpNJJ36r9JTHwQnXmOfOmszUNoZ3rtiFXJ8dCi+BgY0lsiIRSiDkAH7KAPf86REM+ww81AaXG4/RuYx1Vj5zQCtZN7XEOViSXEbqqb8SrIFOccDu5FV12djg+4QS7FSjLVGrdIUcn4oI6pS24Et3oXf8xFx6JLYyGGhgZ2BsyJEx5vLQvkTWnMTrwZVRtCQ+g6lMUQpJhL2rBrmVBUqBFb5IH69O7corQm53n5qLM8IiosAQLfbOtML/1PyEpKCG2aOx1377Fx2yzxXW3ucP1PBqCzli0oCM2T52LfiNvZTzkIU6XJebBnzkZXepzOIFSur86kxgvQFElw9ro2X6XXPKU5S25xVaUSvaN1kmqLSkToJ9S1rmDYXnJR4aH0R2GcLw+EkMHFJJoAjnRHxrB4/1vOJbzmfS+qy6ShRhUMSD8gk4YJ6Y7o9h7oekuWOEn+XGhl29U9T5OApzHfoPEGZwLnpHxAiKJtQtv/TNhBIOFCjigsF7U= |
@ -0,0 +1,449 @@ |
|||||
|
package cos |
||||
|
|
||||
|
// Basic imports
|
||||
|
import ( |
||||
|
"context" |
||||
|
"fmt" |
||||
|
"github.com/stretchr/testify/assert" |
||||
|
"github.com/stretchr/testify/suite" |
||||
|
"github.com/tencentyun/cos-go-sdk-v5" |
||||
|
"github.com/tencentyun/cos-go-sdk-v5/debug" |
||||
|
"io/ioutil" |
||||
|
"math/rand" |
||||
|
"net/http" |
||||
|
"net/url" |
||||
|
"os" |
||||
|
"strings" |
||||
|
"testing" |
||||
|
"time" |
||||
|
) |
||||
|
|
||||
|
// Define the suite, and absorb the built-in basic suite
|
||||
|
// functionality from testify - including a T() method which
|
||||
|
// returns the current testing context
|
||||
|
type CosTestSuite struct { |
||||
|
suite.Suite |
||||
|
VariableThatShouldStartAtFive int |
||||
|
|
||||
|
// CI client
|
||||
|
Client *cos.Client |
||||
|
|
||||
|
// Copy source client
|
||||
|
CClient *cos.Client |
||||
|
|
||||
|
Region string |
||||
|
|
||||
|
Bucket string |
||||
|
|
||||
|
Appid string |
||||
|
|
||||
|
// test_object
|
||||
|
TestObject string |
||||
|
|
||||
|
// special_file_name
|
||||
|
SepFileName string |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) SetupSuite() { |
||||
|
fmt.Println("Set up test") |
||||
|
// init
|
||||
|
s.TestObject = "test.txt" |
||||
|
s.SepFileName = "中文" + "→↓←→↖↗↙↘! \"#$%&'()*+,-./0123456789:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" |
||||
|
|
||||
|
// CI client for test interface
|
||||
|
// URL like this http://test-1253846586.cos.ap-guangzhou.myqcloud.com
|
||||
|
u := os.Getenv("COS_BUCKET_URL") |
||||
|
|
||||
|
// Get the region
|
||||
|
iu, _ := url.Parse(u) |
||||
|
p := strings.Split(iu.Host, ".") |
||||
|
assert.Equal(s.T(), 5, len(p), "Bucket host is not right") |
||||
|
s.Region = p[2] |
||||
|
|
||||
|
// Bucket name
|
||||
|
pp := strings.Split(p[0], "-") |
||||
|
s.Bucket = pp[0] |
||||
|
s.Appid = pp[1] |
||||
|
|
||||
|
ib := &cos.BaseURL{BucketURL: iu} |
||||
|
s.Client = cos.NewClient(ib, &http.Client{ |
||||
|
Transport: &cos.AuthorizationTransport{ |
||||
|
SecretID: os.Getenv("COS_SECRETID"), |
||||
|
SecretKey: os.Getenv("COS_SECRETKEY"), |
||||
|
Transport: &debug.DebugRequestTransport{ |
||||
|
// RequestHeader: true,
|
||||
|
// RequestBody: true,
|
||||
|
// ResponseHeader: true,
|
||||
|
// ResponseBody: true,
|
||||
|
}, |
||||
|
}, |
||||
|
}) |
||||
|
|
||||
|
opt := &cos.BucketPutOptions{ |
||||
|
XCosACL: "public-read", |
||||
|
} |
||||
|
r, err := s.Client.Bucket.Put(context.Background(), opt) |
||||
|
if err != nil && r.StatusCode == 409 { |
||||
|
fmt.Println("BucketAlreadyOwnedByYou") |
||||
|
} else if err != nil { |
||||
|
assert.Nil(s.T(), err, "PutBucket Failed") |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Begin of api test
|
||||
|
|
||||
|
// Service API
|
||||
|
func (s *CosTestSuite) TestGetService() { |
||||
|
_, _, err := s.Client.Service.Get(context.Background()) |
||||
|
assert.Nil(s.T(), err, "GetService Failed") |
||||
|
} |
||||
|
|
||||
|
// Bucket API
|
||||
|
func (s *CosTestSuite) TestPutHeadDeleteBucket() { |
||||
|
u := "http://gosdkbuckettest-" + s.Appid + ".cos.ap-beijing-1.myqcloud.com" |
||||
|
iu, _ := url.Parse(u) |
||||
|
ib := &cos.BaseURL{BucketURL: iu} |
||||
|
client := cos.NewClient(ib, &http.Client{ |
||||
|
Transport: &cos.AuthorizationTransport{ |
||||
|
SecretID: os.Getenv("COS_SECRETID"), |
||||
|
SecretKey: os.Getenv("COS_SECRETKEY"), |
||||
|
}, |
||||
|
}) |
||||
|
r, err := client.Bucket.Put(context.Background(), nil) |
||||
|
if err != nil && r.StatusCode == 409 { |
||||
|
fmt.Println("BucketAlreadyOwnedByYou") |
||||
|
} else if err != nil { |
||||
|
assert.Nil(s.T(), err, "PutBucket Failed") |
||||
|
} |
||||
|
|
||||
|
time.Sleep(3 * time.Second) |
||||
|
_, err = client.Bucket.Head(context.Background()) |
||||
|
assert.Nil(s.T(), err, "HeadBucket Failed") |
||||
|
|
||||
|
_, err = client.Bucket.Delete(context.Background()) |
||||
|
assert.Nil(s.T(), err, "DeleteBucket Failed") |
||||
|
|
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestPutBucketACLIllegal() { |
||||
|
opt := &cos.BucketPutACLOptions{ |
||||
|
Header: &cos.ACLHeaderOptions{ |
||||
|
XCosACL: "public-read-writ", |
||||
|
}, |
||||
|
} |
||||
|
_, err := s.Client.Bucket.PutACL(context.Background(), opt) |
||||
|
assert.NotNil(s.T(), err, "PutBucketACL illegal Failed") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestPutGetBucketACLNormal() { |
||||
|
// with header
|
||||
|
opt := &cos.BucketPutACLOptions{ |
||||
|
Header: &cos.ACLHeaderOptions{ |
||||
|
XCosACL: "private", |
||||
|
}, |
||||
|
} |
||||
|
_, err := s.Client.Bucket.PutACL(context.Background(), opt) |
||||
|
assert.Nil(s.T(), err, "PutBucketACL normal Failed") |
||||
|
|
||||
|
v, _, err := s.Client.Bucket.GetACL(context.Background()) |
||||
|
assert.Nil(s.T(), err, "GetBucketACL normal Failed") |
||||
|
assert.Equal(s.T(), 1, len(v.AccessControlList), "GetBucketACL normal Failed, must be private") |
||||
|
|
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestGetBucket() { |
||||
|
opt := &cos.BucketGetOptions{ |
||||
|
Prefix: "中文", |
||||
|
MaxKeys: 3, |
||||
|
} |
||||
|
_, _, err := s.Client.Bucket.Get(context.Background(), opt) |
||||
|
assert.Nil(s.T(), err, "GetBucket Failed") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestGetBucketLocation() { |
||||
|
v, _, err := s.Client.Bucket.GetLocation(context.Background()) |
||||
|
assert.Nil(s.T(), err, "GetLocation Failed") |
||||
|
assert.Equal(s.T(), s.Region, v.Location, "GetLocation wrong region") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestPutGetDeleteCORS() { |
||||
|
opt := &cos.BucketPutCORSOptions{ |
||||
|
Rules: []cos.BucketCORSRule{ |
||||
|
{ |
||||
|
AllowedOrigins: []string{"http://www.qq.com"}, |
||||
|
AllowedMethods: []string{"PUT", "GET"}, |
||||
|
AllowedHeaders: []string{"x-cos-meta-test", "x-cos-xx"}, |
||||
|
MaxAgeSeconds: 500, |
||||
|
ExposeHeaders: []string{"x-cos-meta-test1"}, |
||||
|
}, |
||||
|
}, |
||||
|
} |
||||
|
_, err := s.Client.Bucket.PutCORS(context.Background(), opt) |
||||
|
assert.Nil(s.T(), err, "PutBucketCORS Failed") |
||||
|
|
||||
|
v, _, err := s.Client.Bucket.GetCORS(context.Background()) |
||||
|
assert.Nil(s.T(), err, "GetBucketCORS Failed") |
||||
|
assert.Equal(s.T(), 1, len(v.Rules), "GetBucketCORS wrong number rules") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestPutGetDeleteLifeCycle() { |
||||
|
lc := &cos.BucketPutLifecycleOptions{ |
||||
|
Rules: []cos.BucketLifecycleRule{ |
||||
|
{ |
||||
|
ID: "1234", |
||||
|
Filter: &cos.BucketLifecycleFilter{Prefix: "test"}, |
||||
|
Status: "Enabled", |
||||
|
Transition: &cos.BucketLifecycleTransition{ |
||||
|
Days: 10, |
||||
|
StorageClass: "Standard", |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
} |
||||
|
_, err := s.Client.Bucket.PutLifecycle(context.Background(), lc) |
||||
|
assert.Nil(s.T(), err, "PutBucketLifecycle Failed") |
||||
|
_, _, err = s.Client.Bucket.GetLifecycle(context.Background()) |
||||
|
assert.Nil(s.T(), err, "GetBucketLifecycle Failed") |
||||
|
_, err = s.Client.Bucket.DeleteLifecycle(context.Background()) |
||||
|
assert.Nil(s.T(), err, "DeleteBucketLifecycle Failed") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestListMultipartUploads() { |
||||
|
// Create new upload
|
||||
|
name := "test_multipart.txt" |
||||
|
v, _, err := s.Client.Object.InitiateMultipartUpload(context.Background(), name, nil) |
||||
|
assert.Nil(s.T(), err, "InitiateMultipartUpload Failed") |
||||
|
id := v.UploadID |
||||
|
|
||||
|
// List
|
||||
|
r, _, err := s.Client.Bucket.ListMultipartUploads(context.Background(), nil) |
||||
|
assert.Nil(s.T(), err, "ListMultipartUploads Failed") |
||||
|
assert.Equal(s.T(), 1, len(r.Uploads), "ListMultipartUploads wrong number uploads") |
||||
|
for _, p := range r.Uploads { |
||||
|
assert.Equal(s.T(), name, p.Key, "ListMultipartUploads wrong key") |
||||
|
assert.Equal(s.T(), id, p.UploadID, "ListMultipartUploads wrong uploadid") |
||||
|
} |
||||
|
|
||||
|
// Abort
|
||||
|
_, err = s.Client.Object.AbortMultipartUpload(context.Background(), name, id) |
||||
|
assert.Nil(s.T(), err, "AbortMultipartUpload Failed") |
||||
|
} |
||||
|
|
||||
|
// Object API
|
||||
|
func (s *CosTestSuite) TestPutHeadGetDeleteObject_10MB() { |
||||
|
name := "test/objectPut.go" |
||||
|
b := make([]byte, 1024*1024*10) |
||||
|
_, err := rand.Read(b) |
||||
|
content := fmt.Sprintf("%X", b) |
||||
|
f := strings.NewReader(content) |
||||
|
|
||||
|
_, err = s.Client.Object.Put(context.Background(), name, f, nil) |
||||
|
assert.Nil(s.T(), err, "PutObject Failed") |
||||
|
|
||||
|
_, err = s.Client.Object.Head(context.Background(), name, nil) |
||||
|
assert.Nil(s.T(), err, "HeadObject Failed") |
||||
|
|
||||
|
_, err = s.Client.Object.Delete(context.Background(), name) |
||||
|
assert.Nil(s.T(), err, "DeleteObject Failed") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestPutGetDeleteObjectByFile_10MB() { |
||||
|
// Create tmp file
|
||||
|
filePath := "tmpfile" |
||||
|
newfile, err := os.Create(filePath) |
||||
|
assert.Nil(s.T(), err, "create tmp file Failed") |
||||
|
defer newfile.Close() |
||||
|
|
||||
|
name := "test/objectPutByFile.go" |
||||
|
b := make([]byte, 1024*1024*10) |
||||
|
_, err = rand.Read(b) |
||||
|
|
||||
|
newfile.Write(b) |
||||
|
_, err = s.Client.Object.PutFromFile(context.Background(), name, filePath, nil) |
||||
|
assert.Nil(s.T(), err, "PutObject Failed") |
||||
|
|
||||
|
// Over write tmp file
|
||||
|
_, err = s.Client.Object.GetToFile(context.Background(), name, filePath, nil) |
||||
|
assert.Nil(s.T(), err, "HeadObject Failed") |
||||
|
|
||||
|
_, err = s.Client.Object.Delete(context.Background(), name) |
||||
|
assert.Nil(s.T(), err, "DeleteObject Failed") |
||||
|
|
||||
|
// remove the local tmp file
|
||||
|
err = os.Remove(filePath) |
||||
|
assert.Nil(s.T(), err, "remove local file Failed") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestPutGetDeleteObjectSpecialName() { |
||||
|
f := strings.NewReader("test") |
||||
|
_, err := s.Client.Object.Put(context.Background(), s.SepFileName, f, nil) |
||||
|
assert.Nil(s.T(), err, "PutObject Failed") |
||||
|
|
||||
|
resp, err := s.Client.Object.Get(context.Background(), s.SepFileName, nil) |
||||
|
assert.Nil(s.T(), err, "GetObject Failed") |
||||
|
defer resp.Body.Close() |
||||
|
bs, _ := ioutil.ReadAll(resp.Body) |
||||
|
assert.Equal(s.T(), "test", string(bs), "GetObject failed content wrong") |
||||
|
|
||||
|
_, err = s.Client.Object.Delete(context.Background(), s.SepFileName) |
||||
|
assert.Nil(s.T(), err, "DeleteObject Failed") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestPutObjectToNonExistBucket() { |
||||
|
u := "http://gosdknonexistbucket-" + s.Appid + ".cos." + s.Region + ".myqcloud.com" |
||||
|
iu, _ := url.Parse(u) |
||||
|
ib := &cos.BaseURL{BucketURL: iu} |
||||
|
client := cos.NewClient(ib, &http.Client{ |
||||
|
Transport: &cos.AuthorizationTransport{ |
||||
|
SecretID: os.Getenv("COS_SECRETID"), |
||||
|
SecretKey: os.Getenv("COS_SECRETKEY"), |
||||
|
}, |
||||
|
}) |
||||
|
name := "test/objectPut.go" |
||||
|
f := strings.NewReader("test") |
||||
|
r, err := client.Object.Put(context.Background(), name, f, nil) |
||||
|
assert.NotNil(s.T(), err, "PutObject ToNonExistBucket Failed") |
||||
|
assert.Equal(s.T(), 404, r.StatusCode, "PutObject ToNonExistBucket, not 404") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestPutGetObjectACL() { |
||||
|
name := "test/objectACL.go" |
||||
|
f := strings.NewReader("test") |
||||
|
_, err := s.Client.Object.Put(context.Background(), name, f, nil) |
||||
|
assert.Nil(s.T(), err, "PutObject Failed") |
||||
|
|
||||
|
// Put acl
|
||||
|
opt := &cos.ObjectPutACLOptions{ |
||||
|
Header: &cos.ACLHeaderOptions{ |
||||
|
XCosACL: "public-read", |
||||
|
}, |
||||
|
} |
||||
|
_, err = s.Client.Object.PutACL(context.Background(), name, opt) |
||||
|
assert.Nil(s.T(), err, "PutObjectACL Failed") |
||||
|
v, _, err := s.Client.Object.GetACL(context.Background(), name) |
||||
|
assert.Nil(s.T(), err, "GetObjectACL Failed") |
||||
|
assert.Equal(s.T(), 2, len(v.AccessControlList), "GetLifecycle wrong number rules") |
||||
|
|
||||
|
_, err = s.Client.Object.Delete(context.Background(), name) |
||||
|
assert.Nil(s.T(), err, "DeleteObject Failed") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestCopyObject() { |
||||
|
u := "http://gosdkcopytest-" + s.Appid + ".cos.ap-beijing-1.myqcloud.com" |
||||
|
iu, _ := url.Parse(u) |
||||
|
ib := &cos.BaseURL{BucketURL: iu} |
||||
|
c := cos.NewClient(ib, &http.Client{ |
||||
|
Transport: &cos.AuthorizationTransport{ |
||||
|
SecretID: os.Getenv("COS_SECRETID"), |
||||
|
SecretKey: os.Getenv("COS_SECRETKEY"), |
||||
|
}, |
||||
|
}) |
||||
|
|
||||
|
opt := &cos.BucketPutOptions{ |
||||
|
XCosACL: "public-read", |
||||
|
} |
||||
|
|
||||
|
// Notice in intranet the bucket host sometimes has i/o timeout problem
|
||||
|
r, err := c.Bucket.Put(context.Background(), opt) |
||||
|
if err != nil && r.StatusCode == 409 { |
||||
|
fmt.Println("BucketAlreadyOwnedByYou") |
||||
|
} else if err != nil { |
||||
|
assert.Nil(s.T(), err, "PutBucket Failed") |
||||
|
} |
||||
|
|
||||
|
source := "test/objectMove1.go" |
||||
|
expected := "test" |
||||
|
f := strings.NewReader(expected) |
||||
|
|
||||
|
_, err = c.Object.Put(context.Background(), source, f, nil) |
||||
|
assert.Nil(s.T(), err, "PutObject Failed") |
||||
|
|
||||
|
time.Sleep(3 * time.Second) |
||||
|
// Copy file
|
||||
|
soruceURL := fmt.Sprintf("%s/%s", iu.Host, source) |
||||
|
dest := source |
||||
|
//opt := &cos.ObjectCopyOptions{}
|
||||
|
_, _, err = s.Client.Object.Copy(context.Background(), dest, soruceURL, nil) |
||||
|
assert.Nil(s.T(), err, "PutObjectCopy Failed") |
||||
|
|
||||
|
// Check content
|
||||
|
resp, err := s.Client.Object.Get(context.Background(), dest, nil) |
||||
|
assert.Nil(s.T(), err, "GetObject Failed") |
||||
|
bs, _ := ioutil.ReadAll(resp.Body) |
||||
|
resp.Body.Close() |
||||
|
result := string(bs) |
||||
|
assert.Equal(s.T(), expected, result, "PutObjectCopy Failed, wrong content") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestCreateAbortMultipartUpload() { |
||||
|
name := "test_multipart.txt" |
||||
|
v, _, err := s.Client.Object.InitiateMultipartUpload(context.Background(), name, nil) |
||||
|
assert.Nil(s.T(), err, "InitiateMultipartUpload Failed") |
||||
|
|
||||
|
_, err = s.Client.Object.AbortMultipartUpload(context.Background(), name, v.UploadID) |
||||
|
assert.Nil(s.T(), err, "AbortMultipartUpload Failed") |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TestCreateCompleteMultipartUpload() { |
||||
|
name := "test/test_complete_upload.go" |
||||
|
v, _, err := s.Client.Object.InitiateMultipartUpload(context.Background(), name, nil) |
||||
|
uploadID := v.UploadID |
||||
|
blockSize := 1024 * 1024 * 3 |
||||
|
|
||||
|
opt := &cos.CompleteMultipartUploadOptions{} |
||||
|
for i := 1; i < 5; i++ { |
||||
|
b := make([]byte, blockSize) |
||||
|
_, err := rand.Read(b) |
||||
|
content := fmt.Sprintf("%X", b) |
||||
|
f := strings.NewReader(content) |
||||
|
|
||||
|
resp, err := s.Client.Object.UploadPart( |
||||
|
context.Background(), name, uploadID, i, f, nil, |
||||
|
) |
||||
|
assert.Nil(s.T(), err, "UploadPart Failed") |
||||
|
etag := resp.Header.Get("Etag") |
||||
|
opt.Parts = append(opt.Parts, cos.Object{ |
||||
|
PartNumber: i, ETag: etag}, |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
_, _, err = s.Client.Object.CompleteMultipartUpload( |
||||
|
context.Background(), name, uploadID, opt, |
||||
|
) |
||||
|
assert.Nil(s.T(), err, "CompleteMultipartUpload Failed") |
||||
|
} |
||||
|
|
||||
|
// End of api test
|
||||
|
|
||||
|
// All methods that begin with "Test" are run as tests within a
|
||||
|
// suite.
|
||||
|
// In order for 'go test' to run this suite, we need to create
|
||||
|
// a normal test function and pass our suite to suite.Run
|
||||
|
func TestCosTestSuite(t *testing.T) { |
||||
|
suite.Run(t, new(CosTestSuite)) |
||||
|
} |
||||
|
|
||||
|
func (s *CosTestSuite) TearDownSuite() { |
||||
|
// Clean the file in bucket
|
||||
|
r, _, err := s.Client.Bucket.ListMultipartUploads(context.Background(), nil) |
||||
|
assert.Nil(s.T(), err, "ListMultipartUploads Failed") |
||||
|
for _, p := range r.Uploads { |
||||
|
// Abort
|
||||
|
_, err = s.Client.Object.AbortMultipartUpload(context.Background(), p.Key, p.UploadID) |
||||
|
assert.Nil(s.T(), err, "AbortMultipartUpload Failed") |
||||
|
} |
||||
|
|
||||
|
// Delete objects
|
||||
|
opt := &cos.BucketGetOptions{ |
||||
|
MaxKeys: 500, |
||||
|
} |
||||
|
v, _, err := s.Client.Bucket.Get(context.Background(), opt) |
||||
|
assert.Nil(s.T(), err, "GetBucket Failed") |
||||
|
for _, c := range v.Contents { |
||||
|
_, err := s.Client.Object.Delete(context.Background(), c.Key) |
||||
|
assert.Nil(s.T(), err, "DeleteObject Failed") |
||||
|
} |
||||
|
|
||||
|
fmt.Println("tear down~") |
||||
|
|
||||
|
} |
@ -0,0 +1 @@ |
|||||
|
Subproject commit 44c6ddd0a2342c386950e880b658017258da92fc |
@ -0,0 +1 @@ |
|||||
|
Subproject commit 61f2392c3317b60616c9dcb10d0a4cfef131fe62 |
@ -0,0 +1 @@ |
|||||
|
Subproject commit 363ebb24d041ccea8068222281c2e963e997b9dc |
Write
Preview
Loading…
Cancel
Save
Reference in new issue