github.com/aliyun/aliyun-oss-go-sdk@v3.0.2+incompatible/oss/multipart_test.go (about)

     1  // multipart test
     2  
     3  package oss
     4  
     5  import (
     6  	"bytes"
     7  	"encoding/base64"
     8  	"encoding/json"
     9  	"math/rand"
    10  	"net/http"
    11  	"os"
    12  	"strconv"
    13  	"strings"
    14  
    15  	. "gopkg.in/check.v1"
    16  )
    17  
    18  type OssBucketMultipartSuite struct {
    19  	cloudBoxControlClient *Client
    20  	client                *Client
    21  	bucket                *Bucket
    22  }
    23  
    24  var _ = Suite(&OssBucketMultipartSuite{})
    25  
    26  // SetUpSuite runs once when the suite starts running
    27  func (s *OssBucketMultipartSuite) SetUpSuite(c *C) {
    28  	bucketName := bucketNamePrefix + RandLowStr(6)
    29  	if cloudboxControlEndpoint == "" {
    30  		client, err := New(endpoint, accessID, accessKey)
    31  		c.Assert(err, IsNil)
    32  		s.client = client
    33  
    34  		s.client.CreateBucket(bucketName)
    35  
    36  		bucket, err := s.client.Bucket(bucketName)
    37  		c.Assert(err, IsNil)
    38  		s.bucket = bucket
    39  	} else {
    40  		client, err := New(cloudboxEndpoint, accessID, accessKey)
    41  		c.Assert(err, IsNil)
    42  		s.client = client
    43  
    44  		controlClient, err := New(cloudboxControlEndpoint, accessID, accessKey)
    45  		c.Assert(err, IsNil)
    46  		s.cloudBoxControlClient = controlClient
    47  		controlClient.CreateBucket(bucketName)
    48  
    49  		bucket, err := s.client.Bucket(bucketName)
    50  		c.Assert(err, IsNil)
    51  		s.bucket = bucket
    52  	}
    53  
    54  	// Delete part
    55  	keyMarker := KeyMarker("")
    56  	uploadIDMarker := UploadIDMarker("")
    57  	for {
    58  		lmur, err := s.bucket.ListMultipartUploads(keyMarker, uploadIDMarker)
    59  		c.Assert(err, IsNil)
    60  		for _, upload := range lmur.Uploads {
    61  			var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName,
    62  				Key: upload.Key, UploadID: upload.UploadID}
    63  			err = s.bucket.AbortMultipartUpload(imur)
    64  			c.Assert(err, IsNil)
    65  		}
    66  		keyMarker = KeyMarker(lmur.NextKeyMarker)
    67  		uploadIDMarker = UploadIDMarker(lmur.NextUploadIDMarker)
    68  		if !lmur.IsTruncated {
    69  			break
    70  		}
    71  	}
    72  
    73  	// Delete objects
    74  	marker := Marker("")
    75  	for {
    76  		lor, err := s.bucket.ListObjects(marker)
    77  		c.Assert(err, IsNil)
    78  		for _, object := range lor.Objects {
    79  			err = s.bucket.DeleteObject(object.Key)
    80  			c.Assert(err, IsNil)
    81  		}
    82  		marker = Marker(lor.NextMarker)
    83  		if !lor.IsTruncated {
    84  			break
    85  		}
    86  	}
    87  
    88  	testLogger.Println("test multipart started")
    89  }
    90  
    91  // TearDownSuite runs before each test or benchmark starts running
    92  func (s *OssBucketMultipartSuite) TearDownSuite(c *C) {
    93  	// Delete part
    94  	keyMarker := KeyMarker("")
    95  	uploadIDMarker := UploadIDMarker("")
    96  	for {
    97  		lmur, err := s.bucket.ListMultipartUploads(keyMarker, uploadIDMarker)
    98  		c.Assert(err, IsNil)
    99  		for _, upload := range lmur.Uploads {
   100  			var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName,
   101  				Key: upload.Key, UploadID: upload.UploadID}
   102  			err = s.bucket.AbortMultipartUpload(imur)
   103  			c.Assert(err, IsNil)
   104  		}
   105  		keyMarker = KeyMarker(lmur.NextKeyMarker)
   106  		uploadIDMarker = UploadIDMarker(lmur.NextUploadIDMarker)
   107  		if !lmur.IsTruncated {
   108  			break
   109  		}
   110  	}
   111  
   112  	// Delete objects
   113  	marker := Marker("")
   114  	for {
   115  		lor, err := s.bucket.ListObjects(marker)
   116  		c.Assert(err, IsNil)
   117  		for _, object := range lor.Objects {
   118  			err = s.bucket.DeleteObject(object.Key)
   119  			c.Assert(err, IsNil)
   120  		}
   121  		marker = Marker(lor.NextMarker)
   122  		if !lor.IsTruncated {
   123  			break
   124  		}
   125  	}
   126  
   127  	// Delete bucket
   128  	if s.cloudBoxControlClient != nil {
   129  		err := s.cloudBoxControlClient.DeleteBucket(s.bucket.BucketName)
   130  		c.Assert(err, IsNil)
   131  	} else {
   132  		err := s.client.DeleteBucket(s.bucket.BucketName)
   133  		c.Assert(err, IsNil)
   134  	}
   135  
   136  	testLogger.Println("test multipart completed")
   137  }
   138  
   139  // SetUpTest runs after each test or benchmark runs
   140  func (s *OssBucketMultipartSuite) SetUpTest(c *C) {
   141  	err := removeTempFiles("../oss", ".jpg")
   142  	c.Assert(err, IsNil)
   143  }
   144  
   145  // TearDownTest runs once after all tests or benchmarks have finished running
   146  func (s *OssBucketMultipartSuite) TearDownTest(c *C) {
   147  	err := removeTempFiles("../oss", ".jpg")
   148  	c.Assert(err, IsNil)
   149  
   150  	err = removeTempFiles("../oss", ".temp")
   151  	c.Assert(err, IsNil)
   152  
   153  	err = removeTempFiles("../oss", ".txt1")
   154  	c.Assert(err, IsNil)
   155  
   156  	err = removeTempFiles("../oss", ".txt2")
   157  	c.Assert(err, IsNil)
   158  }
   159  
   160  // TestMultipartUpload
   161  func (s *OssBucketMultipartSuite) TestMultipartUpload(c *C) {
   162  	objectName := objectNamePrefix + RandStr(8)
   163  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   164  
   165  	chunks, err := SplitFileByPartNum(fileName, 3)
   166  	c.Assert(err, IsNil)
   167  	testLogger.Println("chunks:", chunks)
   168  
   169  	options := []Option{
   170  		Expires(futureDate), Meta("my", "myprop"),
   171  	}
   172  
   173  	fd, err := os.Open(fileName)
   174  	c.Assert(err, IsNil)
   175  	defer fd.Close()
   176  
   177  	imur, err := s.bucket.InitiateMultipartUpload(objectName, options...)
   178  	c.Assert(err, IsNil)
   179  	var parts []UploadPart
   180  	for _, chunk := range chunks {
   181  		fd.Seek(chunk.Offset, os.SEEK_SET)
   182  		part, err := s.bucket.UploadPart(imur, fd, chunk.Size, chunk.Number)
   183  		c.Assert(err, IsNil)
   184  		parts = append(parts, part)
   185  	}
   186  
   187  	cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
   188  	c.Assert(err, IsNil)
   189  	testLogger.Println("cmur:", cmur)
   190  
   191  	meta, err := s.bucket.GetObjectDetailedMeta(objectName)
   192  	c.Assert(err, IsNil)
   193  	testLogger.Println("GetObjectDetailedMeta:", meta)
   194  	c.Assert(meta.Get("X-Oss-Meta-My"), Equals, "myprop")
   195  	c.Assert(meta.Get("Expires"), Equals, futureDate.Format(http.TimeFormat))
   196  	c.Assert(meta.Get("X-Oss-Object-Type"), Equals, "Multipart")
   197  
   198  	err = s.bucket.GetObjectToFile(objectName, "newpic1.jpg")
   199  	c.Assert(err, IsNil)
   200  
   201  	err = s.bucket.DeleteObject(objectName)
   202  	c.Assert(err, IsNil)
   203  }
   204  
   205  // TestMultipartUploadFromFile
   206  func (s *OssBucketMultipartSuite) TestMultipartUploadFromFile(c *C) {
   207  	objectName := objectNamePrefix + RandStr(8)
   208  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   209  
   210  	chunks, err := SplitFileByPartNum(fileName, 3)
   211  	c.Assert(err, IsNil)
   212  	testLogger.Println("chunks:", chunks)
   213  
   214  	options := []Option{
   215  		Expires(futureDate), Meta("my", "myprop"),
   216  	}
   217  	imur, err := s.bucket.InitiateMultipartUpload(objectName, options...)
   218  	c.Assert(err, IsNil)
   219  	var parts []UploadPart
   220  	for _, chunk := range chunks {
   221  		part, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, chunk.Number)
   222  		c.Assert(err, IsNil)
   223  		parts = append(parts, part)
   224  	}
   225  
   226  	cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
   227  	c.Assert(err, IsNil)
   228  	testLogger.Println("cmur:", cmur)
   229  
   230  	meta, err := s.bucket.GetObjectDetailedMeta(objectName)
   231  	c.Assert(err, IsNil)
   232  	testLogger.Println("GetObjectDetailedMeta:", meta)
   233  	c.Assert(meta.Get("X-Oss-Meta-My"), Equals, "myprop")
   234  	c.Assert(meta.Get("Expires"), Equals, futureDate.Format(http.TimeFormat))
   235  	c.Assert(meta.Get("X-Oss-Object-Type"), Equals, "Multipart")
   236  
   237  	err = s.bucket.GetObjectToFile(objectName, "newpic1.jpg")
   238  	c.Assert(err, IsNil)
   239  
   240  	err = s.bucket.DeleteObject(objectName)
   241  	c.Assert(err, IsNil)
   242  }
   243  
   244  // TestUploadPartCopy
   245  func (s *OssBucketMultipartSuite) TestUploadPartCopy(c *C) {
   246  	objectSrc := objectNamePrefix + RandStr(8) + "-src"
   247  	objectDest := objectNamePrefix + RandStr(8) + "-dest"
   248  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   249  
   250  	chunks, err := SplitFileByPartNum(fileName, 3)
   251  	c.Assert(err, IsNil)
   252  	testLogger.Println("chunks:", chunks)
   253  
   254  	err = s.bucket.PutObjectFromFile(objectSrc, fileName)
   255  	c.Assert(err, IsNil)
   256  
   257  	options := []Option{
   258  		Expires(futureDate), Meta("my", "myprop"),
   259  	}
   260  	imur, err := s.bucket.InitiateMultipartUpload(objectDest, options...)
   261  	c.Assert(err, IsNil)
   262  	var parts []UploadPart
   263  	for _, chunk := range chunks {
   264  		part, err := s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number))
   265  		c.Assert(err, IsNil)
   266  		parts = append(parts, part)
   267  	}
   268  
   269  	cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
   270  	c.Assert(err, IsNil)
   271  	testLogger.Println("cmur:", cmur)
   272  
   273  	meta, err := s.bucket.GetObjectDetailedMeta(objectDest)
   274  	c.Assert(err, IsNil)
   275  	testLogger.Println("GetObjectDetailedMeta:", meta)
   276  	c.Assert(meta.Get("X-Oss-Meta-My"), Equals, "myprop")
   277  	c.Assert(meta.Get("Expires"), Equals, futureDate.Format(http.TimeFormat))
   278  	c.Assert(meta.Get("X-Oss-Object-Type"), Equals, "Multipart")
   279  
   280  	err = s.bucket.GetObjectToFile(objectDest, "newpic2.jpg")
   281  	c.Assert(err, IsNil)
   282  
   283  	err = s.bucket.DeleteObject(objectSrc)
   284  	c.Assert(err, IsNil)
   285  	err = s.bucket.DeleteObject(objectDest)
   286  	c.Assert(err, IsNil)
   287  }
   288  
   289  func (s *OssBucketMultipartSuite) TestListUploadedParts(c *C) {
   290  	objectName := objectNamePrefix + RandStr(8)
   291  	objectSrc := objectName + "-src"
   292  	objectDest := objectName + "-dest"
   293  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   294  
   295  	chunks, err := SplitFileByPartSize(fileName, 100*1024)
   296  	c.Assert(err, IsNil)
   297  	testLogger.Println("chunks:", chunks)
   298  
   299  	err = s.bucket.PutObjectFromFile(objectSrc, fileName)
   300  	c.Assert(err, IsNil)
   301  
   302  	// Upload
   303  	imurUpload, err := s.bucket.InitiateMultipartUpload(objectName)
   304  	var partsUpload []UploadPart
   305  	for _, chunk := range chunks {
   306  		part, err := s.bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
   307  		c.Assert(err, IsNil)
   308  		partsUpload = append(partsUpload, part)
   309  	}
   310  
   311  	// Copy
   312  	imurCopy, err := s.bucket.InitiateMultipartUpload(objectDest)
   313  	var partsCopy []UploadPart
   314  	for _, chunk := range chunks {
   315  		part, err := s.bucket.UploadPartCopy(imurCopy, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number))
   316  		c.Assert(err, IsNil)
   317  		partsCopy = append(partsCopy, part)
   318  	}
   319  
   320  	// List
   321  	lupr, err := s.bucket.ListUploadedParts(imurUpload)
   322  	c.Assert(err, IsNil)
   323  	testLogger.Println("lupr:", lupr)
   324  	c.Assert(len(lupr.UploadedParts), Equals, len(chunks))
   325  
   326  	lupr, err = s.bucket.ListUploadedParts(imurCopy)
   327  	c.Assert(err, IsNil)
   328  	testLogger.Println("lupr:", lupr)
   329  	c.Assert(len(lupr.UploadedParts), Equals, len(chunks))
   330  
   331  	lmur, err := s.bucket.ListMultipartUploads()
   332  	c.Assert(err, IsNil)
   333  	testLogger.Println("lmur:", lmur)
   334  
   335  	// Complete
   336  	_, err = s.bucket.CompleteMultipartUpload(imurUpload, partsUpload)
   337  	c.Assert(err, IsNil)
   338  	_, err = s.bucket.CompleteMultipartUpload(imurCopy, partsCopy)
   339  	c.Assert(err, IsNil)
   340  
   341  	// Download
   342  	err = s.bucket.GetObjectToFile(objectDest, "newpic3.jpg")
   343  	c.Assert(err, IsNil)
   344  	err = s.bucket.GetObjectToFile(objectName, "newpic4.jpg")
   345  	c.Assert(err, IsNil)
   346  
   347  	err = s.bucket.DeleteObject(objectName)
   348  	c.Assert(err, IsNil)
   349  	err = s.bucket.DeleteObject(objectDest)
   350  	c.Assert(err, IsNil)
   351  	err = s.bucket.DeleteObject(objectSrc)
   352  	c.Assert(err, IsNil)
   353  }
   354  
   355  func (s *OssBucketMultipartSuite) TestAbortMultipartUpload(c *C) {
   356  	objectName := objectNamePrefix + RandStr(8)
   357  	objectSrc := objectName + "-src"
   358  	objectDest := objectName + "-dest"
   359  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   360  
   361  	chunks, err := SplitFileByPartSize(fileName, 100*1024)
   362  	c.Assert(err, IsNil)
   363  	testLogger.Println("chunks:", chunks)
   364  
   365  	err = s.bucket.PutObjectFromFile(objectSrc, fileName)
   366  	c.Assert(err, IsNil)
   367  
   368  	// Upload
   369  	imurUpload, err := s.bucket.InitiateMultipartUpload(objectName)
   370  	var partsUpload []UploadPart
   371  	for _, chunk := range chunks {
   372  		part, err := s.bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
   373  		c.Assert(err, IsNil)
   374  		partsUpload = append(partsUpload, part)
   375  	}
   376  
   377  	// Copy
   378  	imurCopy, err := s.bucket.InitiateMultipartUpload(objectDest)
   379  	var partsCopy []UploadPart
   380  	for _, chunk := range chunks {
   381  		part, err := s.bucket.UploadPartCopy(imurCopy, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number))
   382  		c.Assert(err, IsNil)
   383  		partsCopy = append(partsCopy, part)
   384  	}
   385  
   386  	// List
   387  	lupr, err := s.bucket.ListUploadedParts(imurUpload)
   388  	c.Assert(err, IsNil)
   389  	testLogger.Println("lupr:", lupr)
   390  	c.Assert(len(lupr.UploadedParts), Equals, len(chunks))
   391  
   392  	lupr, err = s.bucket.ListUploadedParts(imurCopy)
   393  	c.Assert(err, IsNil)
   394  	testLogger.Println("lupr:", lupr)
   395  	c.Assert(len(lupr.UploadedParts), Equals, len(chunks))
   396  
   397  	lmur, err := s.bucket.ListMultipartUploads()
   398  	c.Assert(err, IsNil)
   399  	testLogger.Println("lmur:", lmur)
   400  	c.Assert(len(lmur.Uploads), Equals, 2)
   401  
   402  	// Abort
   403  	err = s.bucket.AbortMultipartUpload(imurUpload)
   404  	c.Assert(err, IsNil)
   405  	err = s.bucket.AbortMultipartUpload(imurCopy)
   406  	c.Assert(err, IsNil)
   407  
   408  	lmur, err = s.bucket.ListMultipartUploads()
   409  	c.Assert(err, IsNil)
   410  	testLogger.Println("lmur:", lmur)
   411  	c.Assert(len(lmur.Uploads), Equals, 0)
   412  
   413  	// Download
   414  	err = s.bucket.GetObjectToFile(objectDest, "newpic3.jpg")
   415  	c.Assert(err, NotNil)
   416  	err = s.bucket.GetObjectToFile(objectName, "newpic4.jpg")
   417  	c.Assert(err, NotNil)
   418  }
   419  
   420  // TestUploadPartCopyWithConstraints
   421  func (s *OssBucketMultipartSuite) TestUploadPartCopyWithConstraints(c *C) {
   422  	objectSrc := objectNamePrefix + RandStr(8) + "-src"
   423  	objectDest := objectNamePrefix + RandStr(8) + "-dest"
   424  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   425  
   426  	chunks, err := SplitFileByPartNum(fileName, 3)
   427  	c.Assert(err, IsNil)
   428  	testLogger.Println("chunks:", chunks)
   429  
   430  	err = s.bucket.PutObjectFromFile(objectSrc, fileName)
   431  	c.Assert(err, IsNil)
   432  
   433  	imur, err := s.bucket.InitiateMultipartUpload(objectDest)
   434  	var parts []UploadPart
   435  	for _, chunk := range chunks {
   436  		_, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number),
   437  			CopySourceIfModifiedSince(futureDate))
   438  		c.Assert(err, NotNil)
   439  	}
   440  
   441  	for _, chunk := range chunks {
   442  		_, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number),
   443  			CopySourceIfUnmodifiedSince(futureDate))
   444  		c.Assert(err, IsNil)
   445  	}
   446  
   447  	meta, err := s.bucket.GetObjectDetailedMeta(objectSrc)
   448  	c.Assert(err, IsNil)
   449  	testLogger.Println("GetObjectDetailedMeta:", meta)
   450  
   451  	for _, chunk := range chunks {
   452  		_, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number),
   453  			CopySourceIfNoneMatch(meta.Get("Etag")))
   454  		c.Assert(err, NotNil)
   455  	}
   456  
   457  	for _, chunk := range chunks {
   458  		part, err := s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number),
   459  			CopySourceIfMatch(meta.Get("Etag")))
   460  		c.Assert(err, IsNil)
   461  		parts = append(parts, part)
   462  	}
   463  
   464  	cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
   465  	c.Assert(err, IsNil)
   466  	testLogger.Println("cmur:", cmur)
   467  
   468  	err = s.bucket.GetObjectToFile(objectDest, "newpic5.jpg")
   469  	c.Assert(err, IsNil)
   470  
   471  	err = s.bucket.DeleteObject(objectSrc)
   472  	c.Assert(err, IsNil)
   473  	err = s.bucket.DeleteObject(objectDest)
   474  	c.Assert(err, IsNil)
   475  }
   476  
   477  // TestMultipartUploadFromFileOutofOrder
   478  func (s *OssBucketMultipartSuite) TestMultipartUploadFromFileOutofOrder(c *C) {
   479  	objectName := objectNamePrefix + RandStr(8)
   480  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   481  
   482  	chunks, err := SplitFileByPartSize(fileName, 1024*100)
   483  	shuffleArray(chunks)
   484  	c.Assert(err, IsNil)
   485  	testLogger.Println("chunks:", chunks)
   486  
   487  	imur, err := s.bucket.InitiateMultipartUpload(objectName)
   488  	var parts []UploadPart
   489  	for _, chunk := range chunks {
   490  		_, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
   491  		c.Assert(err, IsNil)
   492  	}
   493  	// Double upload
   494  	for _, chunk := range chunks {
   495  		part, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
   496  		c.Assert(err, IsNil)
   497  		parts = append(parts, part)
   498  	}
   499  
   500  	cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
   501  	c.Assert(err, IsNil)
   502  	testLogger.Println("cmur:", cmur)
   503  
   504  	err = s.bucket.GetObjectToFile(objectName, "newpic6.jpg")
   505  	c.Assert(err, IsNil)
   506  
   507  	err = s.bucket.DeleteObject(objectName)
   508  	c.Assert(err, IsNil)
   509  }
   510  
   511  // TestUploadPartCopyOutofOrder
   512  func (s *OssBucketMultipartSuite) TestUploadPartCopyOutofOrder(c *C) {
   513  	objectSrc := objectNamePrefix + RandStr(8) + "-src"
   514  	objectDest := objectNamePrefix + RandStr(8) + "-dest"
   515  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   516  
   517  	chunks, err := SplitFileByPartSize(fileName, 1024*100)
   518  	shuffleArray(chunks)
   519  	c.Assert(err, IsNil)
   520  	testLogger.Println("chunks:", chunks)
   521  
   522  	err = s.bucket.PutObjectFromFile(objectSrc, fileName)
   523  	c.Assert(err, IsNil)
   524  
   525  	imur, err := s.bucket.InitiateMultipartUpload(objectDest)
   526  	var parts []UploadPart
   527  	for _, chunk := range chunks {
   528  		_, err := s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number))
   529  		c.Assert(err, IsNil)
   530  	}
   531  	// Double copy
   532  	for _, chunk := range chunks {
   533  		part, err := s.bucket.UploadPartCopy(imur, s.bucket.BucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number))
   534  		c.Assert(err, IsNil)
   535  		parts = append(parts, part)
   536  	}
   537  
   538  	cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
   539  	c.Assert(err, IsNil)
   540  	testLogger.Println("cmur:", cmur)
   541  
   542  	err = s.bucket.GetObjectToFile(objectDest, "newpic7.jpg")
   543  	c.Assert(err, IsNil)
   544  
   545  	err = s.bucket.DeleteObject(objectSrc)
   546  	c.Assert(err, IsNil)
   547  	err = s.bucket.DeleteObject(objectDest)
   548  	c.Assert(err, IsNil)
   549  }
   550  
   551  // TestMultipartUploadFromFileType
   552  func (s *OssBucketMultipartSuite) TestMultipartUploadFromFileType(c *C) {
   553  	objectName := objectNamePrefix + RandStr(8) + ".jpg"
   554  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   555  
   556  	chunks, err := SplitFileByPartNum(fileName, 4)
   557  	c.Assert(err, IsNil)
   558  	testLogger.Println("chunks:", chunks)
   559  
   560  	imur, err := s.bucket.InitiateMultipartUpload(objectName)
   561  	var parts []UploadPart
   562  	for _, chunk := range chunks {
   563  		part, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, chunk.Number)
   564  		c.Assert(err, IsNil)
   565  		parts = append(parts, part)
   566  	}
   567  
   568  	testLogger.Println("parts:", parts)
   569  	cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
   570  	c.Assert(err, IsNil)
   571  	testLogger.Println("cmur:", cmur)
   572  
   573  	err = s.bucket.GetObjectToFile(objectName, "newpic8.jpg")
   574  	c.Assert(err, IsNil)
   575  
   576  	meta, err := s.bucket.GetObjectDetailedMeta(objectName)
   577  	c.Assert(err, IsNil)
   578  	c.Assert(meta.Get("Content-Type"), Equals, "image/jpeg")
   579  
   580  	err = s.bucket.DeleteObject(objectName)
   581  	c.Assert(err, IsNil)
   582  }
   583  
   584  func (s *OssBucketMultipartSuite) TestListMultipartUploads(c *C) {
   585  	objectName := objectNamePrefix + RandStr(8)
   586  
   587  	imurs := []InitiateMultipartUploadResult{}
   588  	for i := 0; i < 20; i++ {
   589  		imur, err := s.bucket.InitiateMultipartUpload(objectName + strconv.Itoa(i))
   590  		c.Assert(err, IsNil)
   591  		imurs = append(imurs, imur)
   592  	}
   593  
   594  	lmpu, err := s.bucket.ListMultipartUploads()
   595  	c.Assert(err, IsNil)
   596  	c.Assert(len(lmpu.Uploads), Equals, 20)
   597  
   598  	lmpu, err = s.bucket.ListMultipartUploads(MaxUploads(3))
   599  	c.Assert(err, IsNil)
   600  	c.Assert(len(lmpu.Uploads), Equals, 3)
   601  
   602  	lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName))
   603  	c.Assert(err, IsNil)
   604  	c.Assert(len(lmpu.Uploads), Equals, 20)
   605  
   606  	lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName + "1"))
   607  	c.Assert(err, IsNil)
   608  	c.Assert(len(lmpu.Uploads), Equals, 11)
   609  
   610  	lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName + "22"))
   611  	c.Assert(err, IsNil)
   612  	c.Assert(len(lmpu.Uploads), Equals, 0)
   613  
   614  	lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(objectName + "10"))
   615  	c.Assert(err, IsNil)
   616  	c.Assert(len(lmpu.Uploads), Equals, 17)
   617  
   618  	lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(objectName+"10"), MaxUploads(3))
   619  	c.Assert(err, IsNil)
   620  	c.Assert(len(lmpu.Uploads), Equals, 3)
   621  
   622  	lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName), Delimiter("4"))
   623  	c.Assert(err, IsNil)
   624  	c.Assert(len(lmpu.Uploads), Equals, 18)
   625  	c.Assert(len(lmpu.CommonPrefixes), Equals, 2)
   626  
   627  	upLoadIDStr := RandStr(3)
   628  	lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(objectName+"12"), UploadIDMarker(upLoadIDStr))
   629  	c.Assert(err, IsNil)
   630  	checkNum := 15
   631  	for _, im := range imurs {
   632  		if im.Key == objectName+"12" && im.UploadID > upLoadIDStr {
   633  			checkNum = 16
   634  			break
   635  		}
   636  	}
   637  	c.Assert(len(lmpu.Uploads), Equals, checkNum)
   638  	//testLogger.Println("UploadIDMarker", lmpu.Uploads)
   639  
   640  	for _, imur := range imurs {
   641  		err = s.bucket.AbortMultipartUpload(imur)
   642  		c.Assert(err, IsNil)
   643  	}
   644  }
   645  
   646  func (s *OssBucketMultipartSuite) TestListMultipartUploadsEncodingKey(c *C) {
   647  	prefix := objectNamePrefix + "让你任性让你狂" + RandStr(8)
   648  
   649  	imurs := []InitiateMultipartUploadResult{}
   650  	for i := 0; i < 3; i++ {
   651  		imur, err := s.bucket.InitiateMultipartUpload(prefix + strconv.Itoa(i))
   652  		c.Assert(err, IsNil)
   653  		imurs = append(imurs, imur)
   654  	}
   655  
   656  	lmpu, err := s.bucket.ListMultipartUploads()
   657  	c.Assert(err, IsNil)
   658  	c.Assert(len(lmpu.Uploads), Equals, 3)
   659  
   660  	lmpu, err = s.bucket.ListMultipartUploads(Prefix(prefix + "1"))
   661  	c.Assert(err, IsNil)
   662  	c.Assert(len(lmpu.Uploads), Equals, 1)
   663  
   664  	lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(prefix + "1"))
   665  	c.Assert(err, IsNil)
   666  	c.Assert(len(lmpu.Uploads), Equals, 1)
   667  
   668  	lmpu, err = s.bucket.ListMultipartUploads(EncodingType("url"))
   669  	c.Assert(err, IsNil)
   670  	for i, upload := range lmpu.Uploads {
   671  		c.Assert(upload.Key, Equals, prefix+strconv.Itoa(i))
   672  	}
   673  
   674  	for _, imur := range imurs {
   675  		err = s.bucket.AbortMultipartUpload(imur)
   676  		c.Assert(err, IsNil)
   677  	}
   678  }
   679  
   680  func (s *OssBucketMultipartSuite) TestMultipartNegative(c *C) {
   681  	objectName := objectNamePrefix + RandStr(8)
   682  
   683  	// Key tool long
   684  	data := make([]byte, 100*1024)
   685  	imur, err := s.bucket.InitiateMultipartUpload(string(data))
   686  	c.Assert(err, NotNil)
   687  
   688  	// Invalid imur
   689  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   690  	fd, err := os.Open(fileName)
   691  	c.Assert(err, IsNil)
   692  	defer fd.Close()
   693  
   694  	_, err = s.bucket.UploadPart(imur, fd, 1024, 1)
   695  	c.Assert(err, NotNil)
   696  
   697  	_, err = s.bucket.UploadPartFromFile(imur, fileName, 0, 1024, 1)
   698  	c.Assert(err, NotNil)
   699  
   700  	_, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, fileName, 0, 1024, 1)
   701  	c.Assert(err, NotNil)
   702  
   703  	err = s.bucket.AbortMultipartUpload(imur)
   704  	c.Assert(err, NotNil)
   705  
   706  	_, err = s.bucket.ListUploadedParts(imur)
   707  	c.Assert(err, NotNil)
   708  
   709  	// Invalid exist
   710  	imur, err = s.bucket.InitiateMultipartUpload(objectName)
   711  	c.Assert(err, IsNil)
   712  
   713  	_, err = s.bucket.UploadPart(imur, fd, 1024, 1)
   714  	c.Assert(err, IsNil)
   715  
   716  	_, err = s.bucket.UploadPart(imur, fd, 102400, 10001)
   717  	c.Assert(err, NotNil)
   718  
   719  	//    _, err = s.bucket.UploadPartFromFile(imur, fileName, 0, 1024, 1)
   720  	//    c.Assert(err, IsNil)
   721  
   722  	_, err = s.bucket.UploadPartFromFile(imur, fileName, 0, 102400, 10001)
   723  	c.Assert(err, NotNil)
   724  
   725  	_, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, fileName, 0, 1024, 1)
   726  	c.Assert(err, NotNil)
   727  
   728  	_, err = s.bucket.UploadPartCopy(imur, s.bucket.BucketName, fileName, 0, 1024, 1000)
   729  	c.Assert(err, NotNil)
   730  
   731  	err = s.bucket.AbortMultipartUpload(imur)
   732  	c.Assert(err, IsNil)
   733  
   734  	// Invalid option
   735  	_, err = s.bucket.InitiateMultipartUpload(objectName, IfModifiedSince(futureDate))
   736  	c.Assert(err, IsNil)
   737  }
   738  
   739  func (s *OssBucketMultipartSuite) TestMultipartUploadFromFileBigFile(c *C) {
   740  	objectName := objectNamePrefix + RandStr(8)
   741  	bigFile := "D:\\tmp\\bigfile.zip"
   742  	newFile := "D:\\tmp\\newbigfile.zip"
   743  
   744  	exist, err := isFileExist(bigFile)
   745  	c.Assert(err, IsNil)
   746  	if !exist {
   747  		return
   748  	}
   749  
   750  	chunks, err := SplitFileByPartNum(bigFile, 64)
   751  	c.Assert(err, IsNil)
   752  	testLogger.Println("chunks:", chunks)
   753  
   754  	imur, err := s.bucket.InitiateMultipartUpload(objectName)
   755  	var parts []UploadPart
   756  	start := GetNowSec()
   757  	for _, chunk := range chunks {
   758  		part, err := s.bucket.UploadPartFromFile(imur, bigFile, chunk.Offset, chunk.Size, (int)(chunk.Number))
   759  		c.Assert(err, IsNil)
   760  		parts = append(parts, part)
   761  	}
   762  	end := GetNowSec()
   763  	testLogger.Println("Uplaod big file:", bigFile, "use sec:", end-start)
   764  
   765  	testLogger.Println("parts:", parts)
   766  	_, err = s.bucket.CompleteMultipartUpload(imur, parts)
   767  	c.Assert(err, IsNil)
   768  
   769  	start = GetNowSec()
   770  	err = s.bucket.GetObjectToFile(objectName, newFile)
   771  	c.Assert(err, IsNil)
   772  	end = GetNowSec()
   773  	testLogger.Println("Download big file:", bigFile, "use sec:", end-start)
   774  
   775  	start = GetNowSec()
   776  	eq, err := compareFiles(bigFile, newFile)
   777  	c.Assert(err, IsNil)
   778  	c.Assert(eq, Equals, true)
   779  	end = GetNowSec()
   780  	testLogger.Println("Compare big file:", bigFile, "use sec:", end-start)
   781  
   782  	err = s.bucket.DeleteObject(objectName)
   783  	c.Assert(err, IsNil)
   784  }
   785  
   786  // TestUploadFile
   787  func (s *OssBucketMultipartSuite) TestUploadFile(c *C) {
   788  	objectName := objectNamePrefix + RandStr(8)
   789  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   790  	newFile := RandStr(8) + ".jpg"
   791  
   792  	// Upload with 100K part size
   793  	err := s.bucket.UploadFile(objectName, fileName, 100*1024)
   794  	c.Assert(err, IsNil)
   795  
   796  	os.Remove(newFile)
   797  	err = s.bucket.GetObjectToFile(objectName, newFile)
   798  	c.Assert(err, IsNil)
   799  
   800  	eq, err := compareFiles(fileName, newFile)
   801  	c.Assert(err, IsNil)
   802  	c.Assert(eq, Equals, true)
   803  
   804  	err = s.bucket.DeleteObject(objectName)
   805  	c.Assert(err, IsNil)
   806  
   807  	// Upload with part size equals to 1/4 of the file size
   808  	err = s.bucket.UploadFile(objectName, fileName, 482048/4)
   809  	c.Assert(err, IsNil)
   810  
   811  	os.Remove(newFile)
   812  	err = s.bucket.GetObjectToFile(objectName, newFile)
   813  	c.Assert(err, IsNil)
   814  
   815  	eq, err = compareFiles(fileName, newFile)
   816  	c.Assert(err, IsNil)
   817  	c.Assert(eq, Equals, true)
   818  
   819  	err = s.bucket.DeleteObject(objectName)
   820  	c.Assert(err, IsNil)
   821  
   822  	// Upload with part size equals to the file size
   823  	err = s.bucket.UploadFile(objectName, fileName, 482048)
   824  	c.Assert(err, IsNil)
   825  
   826  	os.Remove(newFile)
   827  	err = s.bucket.GetObjectToFile(objectName, newFile)
   828  	c.Assert(err, IsNil)
   829  
   830  	eq, err = compareFiles(fileName, newFile)
   831  	c.Assert(err, IsNil)
   832  	c.Assert(eq, Equals, true)
   833  
   834  	err = s.bucket.DeleteObject(objectName)
   835  	c.Assert(err, IsNil)
   836  
   837  	// Upload with part size is bigger than the file size
   838  	err = s.bucket.UploadFile(objectName, fileName, 482049)
   839  	c.Assert(err, IsNil)
   840  
   841  	os.Remove(newFile)
   842  	err = s.bucket.GetObjectToFile(objectName, newFile)
   843  	c.Assert(err, IsNil)
   844  
   845  	eq, err = compareFiles(fileName, newFile)
   846  	c.Assert(err, IsNil)
   847  	c.Assert(eq, Equals, true)
   848  
   849  	err = s.bucket.DeleteObject(objectName)
   850  	c.Assert(err, IsNil)
   851  
   852  	// Option
   853  	options := []Option{
   854  		Expires(futureDate),
   855  		ObjectACL(ACLPublicRead),
   856  		Meta("myprop", "mypropval")}
   857  	err = s.bucket.UploadFile(objectName, fileName, 482049, options...)
   858  	c.Assert(err, IsNil)
   859  
   860  	// Check
   861  	os.Remove(newFile)
   862  	err = s.bucket.GetObjectToFile(objectName, newFile)
   863  	c.Assert(err, IsNil)
   864  
   865  	eq, err = compareFiles(fileName, newFile)
   866  	c.Assert(err, IsNil)
   867  	c.Assert(eq, Equals, true)
   868  
   869  	acl, err := s.bucket.GetObjectACL(objectName)
   870  	c.Assert(err, IsNil)
   871  	testLogger.Println("GetObjectAcl:", acl)
   872  	c.Assert(acl.ACL, Equals, "public-read")
   873  
   874  	meta, err := s.bucket.GetObjectDetailedMeta(objectName)
   875  	c.Assert(err, IsNil)
   876  	testLogger.Println("GetObjectDetailedMeta:", meta)
   877  	c.Assert(meta.Get("X-Oss-Meta-Myprop"), Equals, "mypropval")
   878  }
   879  
   880  func (s *OssBucketMultipartSuite) TestUploadFileNegative(c *C) {
   881  	objectName := objectNamePrefix + RandStr(8)
   882  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   883  
   884  	// Smaller than the required minimal part size (100KB)
   885  	err := s.bucket.UploadFile(objectName, fileName, 100*1024-1)
   886  	c.Assert(err, NotNil)
   887  
   888  	// Bigger than the max part size (5G)
   889  	err = s.bucket.UploadFile(objectName, fileName, 1024*1024*1024*5+1)
   890  	c.Assert(err, NotNil)
   891  
   892  	// File does not exist
   893  	err = s.bucket.UploadFile(objectName, "/root1/123abc9874", 1024*1024*1024)
   894  	c.Assert(err, NotNil)
   895  
   896  	// Invalid key , key is empty.
   897  	err = s.bucket.UploadFile("", fileName, 100*1024)
   898  	c.Assert(err, NotNil)
   899  }
   900  
   901  // TestDownloadFile
   902  func (s *OssBucketMultipartSuite) TestDownloadFile(c *C) {
   903  	objectName := objectNamePrefix + RandStr(8)
   904  	var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
   905  	newFile := RandStr(8) + ".jpg"
   906  
   907  	err := s.bucket.UploadFile(objectName, fileName, 100*1024)
   908  	c.Assert(err, IsNil)
   909  
   910  	// Download file with part size of 100K
   911  	err = s.bucket.DownloadFile(objectName, newFile, 100*1024)
   912  	c.Assert(err, IsNil)
   913  
   914  	os.Remove(newFile)
   915  	err = s.bucket.GetObjectToFile(objectName, newFile)
   916  	c.Assert(err, IsNil)
   917  
   918  	eq, err := compareFiles(fileName, newFile)
   919  	c.Assert(err, IsNil)
   920  	c.Assert(eq, Equals, true)
   921  
   922  	// Download the file with part size equals to 1/4 of the file size
   923  	err = s.bucket.DownloadFile(objectName, newFile, 482048/4)
   924  	c.Assert(err, IsNil)
   925  
   926  	os.Remove(newFile)
   927  	err = s.bucket.GetObjectToFile(objectName, newFile)
   928  	c.Assert(err, IsNil)
   929  
   930  	eq, err = compareFiles(fileName, newFile)
   931  	c.Assert(err, IsNil)
   932  	c.Assert(eq, Equals, true)
   933  
   934  	// Download the file with part size same as the file size
   935  	err = s.bucket.DownloadFile(objectName, newFile, 482048)
   936  	c.Assert(err, IsNil)
   937  
   938  	os.Remove(newFile)
   939  	err = s.bucket.GetObjectToFile(objectName, newFile)
   940  	c.Assert(err, IsNil)
   941  
   942  	eq, err = compareFiles(fileName, newFile)
   943  	c.Assert(err, IsNil)
   944  	c.Assert(eq, Equals, true)
   945  
   946  	// Download the file with part size bigger than the file size
   947  	err = s.bucket.DownloadFile(objectName, newFile, 482049)
   948  	c.Assert(err, IsNil)
   949  
   950  	os.Remove(newFile)
   951  	err = s.bucket.GetObjectToFile(objectName, newFile)
   952  	c.Assert(err, IsNil)
   953  
   954  	eq, err = compareFiles(fileName, newFile)
   955  	c.Assert(err, IsNil)
   956  	c.Assert(eq, Equals, true)
   957  
   958  	// Option
   959  	meta, err := s.bucket.GetObjectDetailedMeta(objectName)
   960  	c.Assert(err, IsNil)
   961  	testLogger.Println("GetObjectDetailedMeta:", meta)
   962  
   963  	// If-Match
   964  	err = s.bucket.DownloadFile(objectName, newFile, 482048/4, IfMatch(meta.Get("Etag")))
   965  	c.Assert(err, IsNil)
   966  
   967  	os.Remove(newFile)
   968  	err = s.bucket.GetObjectToFile(objectName, newFile)
   969  	c.Assert(err, IsNil)
   970  
   971  	eq, err = compareFiles(fileName, newFile)
   972  	c.Assert(err, IsNil)
   973  	c.Assert(eq, Equals, true)
   974  
   975  	// If-None-Match
   976  	err = s.bucket.DownloadFile(objectName, newFile, 482048, IfNoneMatch(meta.Get("Etag")))
   977  	c.Assert(err, NotNil)
   978  
   979  	os.Remove(newFile)
   980  	err = s.bucket.DeleteObject(objectName)
   981  	c.Assert(err, IsNil)
   982  }
   983  
   984  func (s *OssBucketMultipartSuite) TestDownloadFileNegative(c *C) {
   985  	objectName := objectNamePrefix + RandStr(8)
   986  	newFile := RandStr(8) + ".jpg"
   987  
   988  	// Smaller than the required minimal part size (100KB)
   989  	err := s.bucket.DownloadFile(objectName, newFile, 100*1024-1)
   990  	c.Assert(err, NotNil)
   991  
   992  	// Bigger than the required max part size (5G)
   993  	err = s.bucket.DownloadFile(objectName, newFile, 1024*1024*1024+1)
   994  	c.Assert(err, NotNil)
   995  
   996  	// File does not exist
   997  	err = s.bucket.DownloadFile(objectName, "/OSS/TEMP/ZIBI/QUQU/BALA", 1024*1024*1024+1)
   998  	c.Assert(err, NotNil)
   999  
  1000  	// Key does not exist
  1001  	err = s.bucket.DownloadFile(objectName, newFile, 100*1024)
  1002  	c.Assert(err, NotNil)
  1003  }
  1004  
  1005  // Private
  1006  func shuffleArray(chunks []FileChunk) []FileChunk {
  1007  	for i := range chunks {
  1008  		j := rand.Intn(i + 1)
  1009  		chunks[i], chunks[j] = chunks[j], chunks[i]
  1010  	}
  1011  	return chunks
  1012  }
  1013  
  1014  func (s *OssBucketMultipartSuite) TestMultipartUploadWithCallbackResult(c *C) {
  1015  	objectName := objectNamePrefix + RandStr(8)
  1016  	content := "大江东去,浪淘尽,千古风流人物。 故垒西边,人道是、三国周郎赤壁。 乱石穿空,惊涛拍岸,卷起千堆雪。 江山如画,一时多少豪杰。" +
  1017  		"遥想公谨当年,小乔初嫁了,雄姿英发。 羽扇纶巾,谈笑间、樯橹灰飞烟灭。故国神游,多情应笑我,早生华发,人生如梦,一尊还酹江月。"
  1018  
  1019  	imur, err := s.bucket.InitiateMultipartUpload(objectName)
  1020  	var parts []UploadPart
  1021  	part, err := s.bucket.UploadPart(imur, strings.NewReader(content), int64(len(content)), 1)
  1022  	c.Assert(err, IsNil)
  1023  	parts = append(parts, part)
  1024  	testLogger.Println("parts:", parts)
  1025  
  1026  	callbackMap := map[string]string{}
  1027  	callbackMap["callbackUrl"] = "www.aliyuncs.com"
  1028  	callbackMap["callbackBody"] = "filename=${object}&size=${size}&mimeType=${mimeType}"
  1029  	callbackMap["callbackBodyType"] = "application/x-www-form-urlencoded"
  1030  
  1031  	callbackBuffer := bytes.NewBuffer([]byte{})
  1032  	callbackEncoder := json.NewEncoder(callbackBuffer)
  1033  	callbackEncoder.SetEscapeHTML(false)
  1034  	err = callbackEncoder.Encode(callbackMap)
  1035  	c.Assert(err, IsNil)
  1036  	callbackVal := base64.StdEncoding.EncodeToString(callbackBuffer.Bytes())
  1037  	var body []byte
  1038  	_, err = s.bucket.CompleteMultipartUpload(imur, parts, Callback(callbackVal), CallbackResult(&body))
  1039  	e, ok := err.(ServiceError)
  1040  	c.Assert(ok, Equals, true)
  1041  	c.Assert(e.StatusCode, Equals, 203)
  1042  	c.Assert(e.Code, Equals, "CallbackFailed")
  1043  	c.Assert(body, IsNil)
  1044  
  1045  	pbody, err := s.bucket.GetObject(objectName)
  1046  	c.Assert(err, IsNil)
  1047  	str, err := readBody(pbody)
  1048  	c.Assert(err, IsNil)
  1049  	c.Assert(str, Equals, content)
  1050  
  1051  	err = s.bucket.DeleteObject(objectName)
  1052  	c.Assert(err, IsNil)
  1053  }
  1054  
  1055  func (s *OssBucketMultipartSuite) TestMultipartUploadNormal(c *C) {
  1056  	objectName := objectNamePrefix + RandStr(8)
  1057  	content := "大江东去,浪淘尽,千古风流人物。 故垒西边,人道是、三国周郎赤壁。 乱石穿空,惊涛拍岸,卷起千堆雪。 江山如画,一时多少豪杰。" +
  1058  		"遥想公谨当年,小乔初嫁了,雄姿英发。 羽扇纶巾,谈笑间、樯橹灰飞烟灭。故国神游,多情应笑我,早生华发,人生如梦,一尊还酹江月。"
  1059  
  1060  	imur, err := s.bucket.InitiateMultipartUpload(objectName)
  1061  	var parts []UploadPart
  1062  	part, err := s.bucket.UploadPart(imur, strings.NewReader(content), int64(len(content)), 1)
  1063  	c.Assert(err, IsNil)
  1064  	parts = append(parts, part)
  1065  	testLogger.Println("parts:", parts)
  1066  	_, err = s.bucket.CompleteMultipartUpload(imur, parts)
  1067  	c.Assert(err, IsNil)
  1068  
  1069  	body, err := s.bucket.GetObject(objectName)
  1070  	c.Assert(err, IsNil)
  1071  	str, err := readBody(body)
  1072  	c.Assert(err, IsNil)
  1073  	c.Assert(str, Equals, content)
  1074  
  1075  	err = s.bucket.DeleteObject(objectName)
  1076  	c.Assert(err, IsNil)
  1077  
  1078  }