13 type OssUploadSuite struct {
18 var _ = Suite(&OssUploadSuite{})
20 // SetUpSuite runs once when the suite starts running
21 func (s *OssUploadSuite) SetUpSuite(c *C) {
22 client, err := New(endpoint, accessID, accessKey)
26 s.client.CreateBucket(bucketName)
28 bucket, err := s.client.Bucket(bucketName)
32 testLogger.Println("test upload started")
35 // TearDownSuite runs before each test or benchmark starts running
36 func (s *OssUploadSuite) TearDownSuite(c *C) {
38 keyMarker := KeyMarker("")
39 uploadIDMarker := UploadIDMarker("")
41 lmur, err := s.bucket.ListMultipartUploads(keyMarker, uploadIDMarker)
43 for _, upload := range lmur.Uploads {
44 var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName,
45 Key: upload.Key, UploadID: upload.UploadID}
46 err = s.bucket.AbortMultipartUpload(imur)
49 keyMarker = KeyMarker(lmur.NextKeyMarker)
50 uploadIDMarker = UploadIDMarker(lmur.NextUploadIDMarker)
51 if !lmur.IsTruncated {
59 lor, err := s.bucket.ListObjects(marker)
61 for _, object := range lor.Objects {
62 err = s.bucket.DeleteObject(object.Key)
65 marker = Marker(lor.NextMarker)
72 err := s.client.DeleteBucket(s.bucket.BucketName)
75 testLogger.Println("test upload completed")
78 // SetUpTest runs after each test or benchmark runs
79 func (s *OssUploadSuite) SetUpTest(c *C) {
80 err := removeTempFiles("../oss", ".jpg")
84 // TearDownTest runs once after all tests or benchmarks have finished running
85 func (s *OssUploadSuite) TearDownTest(c *C) {
86 err := removeTempFiles("../oss", ".jpg")
90 // TestUploadRoutineWithoutRecovery tests multiroutineed upload without checkpoint
91 func (s *OssUploadSuite) TestUploadRoutineWithoutRecovery(c *C) {
92 objectName := objectNamePrefix + RandStr(8)
93 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
94 newFile := RandStr(8) + ".jpg"
96 // Routines is not specified, by default single routine
97 err := s.bucket.UploadFile(objectName, fileName, 100*1024)
101 err = s.bucket.GetObjectToFile(objectName, newFile)
104 eq, err := compareFiles(fileName, newFile)
106 c.Assert(eq, Equals, true)
108 err = s.bucket.DeleteObject(objectName)
111 // Specify routine count as 1
112 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(1))
116 err = s.bucket.GetObjectToFile(objectName, newFile)
119 eq, err = compareFiles(fileName, newFile)
121 c.Assert(eq, Equals, true)
123 err = s.bucket.DeleteObject(objectName)
126 // Specify routine count as 3, which is smaller than parts count 5
127 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
131 err = s.bucket.GetObjectToFile(objectName, newFile)
134 eq, err = compareFiles(fileName, newFile)
136 c.Assert(eq, Equals, true)
138 err = s.bucket.DeleteObject(objectName)
141 // Specify routine count as 5, which is same as the part count 5
142 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(5))
146 err = s.bucket.GetObjectToFile(objectName, newFile)
149 eq, err = compareFiles(fileName, newFile)
151 c.Assert(eq, Equals, true)
153 err = s.bucket.DeleteObject(objectName)
156 // Specify routine count as 10, which is bigger than the part count 5.
157 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(10))
161 err = s.bucket.GetObjectToFile(objectName, newFile)
164 eq, err = compareFiles(fileName, newFile)
166 c.Assert(eq, Equals, true)
168 err = s.bucket.DeleteObject(objectName)
171 // Invalid routine count, it will use 1 automatically.
172 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(0))
174 err = s.bucket.GetObjectToFile(objectName, newFile)
177 eq, err = compareFiles(fileName, newFile)
179 c.Assert(eq, Equals, true)
181 err = s.bucket.DeleteObject(objectName)
184 // Invalid routine count, it will use 1 automatically
185 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(-1))
187 err = s.bucket.GetObjectToFile(objectName, newFile)
190 eq, err = compareFiles(fileName, newFile)
192 c.Assert(eq, Equals, true)
194 err = s.bucket.DeleteObject(objectName)
198 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), Meta("myprop", "mypropval"))
200 meta, err := s.bucket.GetObjectDetailedMeta(objectName)
202 c.Assert(meta.Get("X-Oss-Meta-Myprop"), Equals, "mypropval")
205 err = s.bucket.GetObjectToFile(objectName, newFile)
208 eq, err = compareFiles(fileName, newFile)
210 c.Assert(eq, Equals, true)
212 err = s.bucket.DeleteObject(objectName)
216 // ErrorHooker is a UploadPart hook---it will fail the 5th part's upload.
217 func ErrorHooker(id int, chunk FileChunk) error {
218 if chunk.Number == 5 {
219 time.Sleep(time.Second)
220 return fmt.Errorf("ErrorHooker")
225 // TestUploadRoutineWithoutRecoveryNegative is multiroutineed upload without checkpoint
226 func (s *OssUploadSuite) TestUploadRoutineWithoutRecoveryNegative(c *C) {
227 objectName := objectNamePrefix + RandStr(8)
228 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
230 uploadPartHooker = ErrorHooker
231 // Worker routine error
232 err := s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(2))
233 c.Assert(err, NotNil)
234 c.Assert(err.Error(), Equals, "ErrorHooker")
235 uploadPartHooker = defaultUploadPart
237 // Local file does not exist
238 err = s.bucket.UploadFile(objectName, "NotExist", 100*1024, Routines(2))
239 c.Assert(err, NotNil)
241 // The part size is invalid
242 err = s.bucket.UploadFile(objectName, fileName, 1024, Routines(2))
243 c.Assert(err, NotNil)
245 err = s.bucket.UploadFile(objectName, fileName, 1024*1024*1024*100, Routines(2))
246 c.Assert(err, NotNil)
249 // TestUploadRoutineWithRecovery is multi-routine upload with resumable recovery
250 func (s *OssUploadSuite) TestUploadRoutineWithRecovery(c *C) {
251 objectName := objectNamePrefix + RandStr(8)
252 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
253 newFile := "upload-new-file-2.jpg"
255 // Use default routines and default CP file path (fileName+.cp)
256 // First upload for 4 parts
257 uploadPartHooker = ErrorHooker
258 err := s.bucket.UploadFile(objectName, fileName, 100*1024, Checkpoint(true, fileName+".cp"))
259 c.Assert(err, NotNil)
260 c.Assert(err.Error(), Equals, "ErrorHooker")
261 uploadPartHooker = defaultUploadPart
264 ucp := uploadCheckpoint{}
265 err = ucp.load(fileName + ".cp")
267 c.Assert(ucp.Magic, Equals, uploadCpMagic)
268 c.Assert(len(ucp.MD5), Equals, len("LC34jZU5xK4hlxi3Qn3XGQ=="))
269 c.Assert(ucp.FilePath, Equals, fileName)
270 c.Assert(ucp.FileStat.Size, Equals, int64(482048))
271 c.Assert(len(ucp.FileStat.LastModified.String()) > 0, Equals, true)
272 c.Assert(ucp.FileStat.MD5, Equals, "")
273 c.Assert(ucp.ObjectKey, Equals, objectName)
274 c.Assert(len(ucp.UploadID), Equals, len("3F79722737D1469980DACEDCA325BB52"))
275 c.Assert(len(ucp.Parts), Equals, 5)
276 c.Assert(len(ucp.todoParts()), Equals, 1)
277 c.Assert(len(ucp.allParts()), Equals, 5)
279 // Second upload, finish the remaining part
280 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Checkpoint(true, fileName+".cp"))
284 err = s.bucket.GetObjectToFile(objectName, newFile)
287 eq, err := compareFiles(fileName, newFile)
289 c.Assert(eq, Equals, true)
291 err = s.bucket.DeleteObject(objectName)
294 err = ucp.load(fileName + ".cp")
295 c.Assert(err, NotNil)
297 // Resumable upload with empty checkpoint path
298 uploadPartHooker = ErrorHooker
299 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), CheckpointDir(true, ""))
300 c.Assert(err, NotNil)
301 c.Assert(err.Error(), Equals, "ErrorHooker")
302 uploadPartHooker = defaultUploadPart
303 ucp = uploadCheckpoint{}
304 err = ucp.load(fileName + ".cp")
305 c.Assert(err, NotNil)
307 // Resumable upload with checkpoint dir
308 uploadPartHooker = ErrorHooker
309 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), CheckpointDir(true, "./"))
310 c.Assert(err, NotNil)
311 c.Assert(err.Error(), Equals, "ErrorHooker")
312 uploadPartHooker = defaultUploadPart
315 ucp = uploadCheckpoint{}
316 cpConf := cpConfig{IsEnable: true, DirPath: "./"}
317 cpFilePath := getUploadCpFilePath(&cpConf, fileName, s.bucket.BucketName, objectName)
318 err = ucp.load(cpFilePath)
320 c.Assert(ucp.Magic, Equals, uploadCpMagic)
321 c.Assert(len(ucp.MD5), Equals, len("LC34jZU5xK4hlxi3Qn3XGQ=="))
322 c.Assert(ucp.FilePath, Equals, fileName)
323 c.Assert(ucp.FileStat.Size, Equals, int64(482048))
324 c.Assert(len(ucp.FileStat.LastModified.String()) > 0, Equals, true)
325 c.Assert(ucp.FileStat.MD5, Equals, "")
326 c.Assert(ucp.ObjectKey, Equals, objectName)
327 c.Assert(len(ucp.UploadID), Equals, len("3F79722737D1469980DACEDCA325BB52"))
328 c.Assert(len(ucp.Parts), Equals, 5)
329 c.Assert(len(ucp.todoParts()), Equals, 1)
330 c.Assert(len(ucp.allParts()), Equals, 5)
332 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), CheckpointDir(true, "./"))
336 err = s.bucket.GetObjectToFile(objectName, newFile)
339 eq, err = compareFiles(fileName, newFile)
341 c.Assert(eq, Equals, true)
343 err = s.bucket.DeleteObject(objectName)
346 err = ucp.load(cpFilePath)
347 c.Assert(err, NotNil)
349 // Upload all 5 parts without error
350 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), Checkpoint(true, objectName+".cp"))
354 err = s.bucket.GetObjectToFile(objectName, newFile)
357 eq, err = compareFiles(fileName, newFile)
359 c.Assert(eq, Equals, true)
361 err = s.bucket.DeleteObject(objectName)
364 // Upload all 5 parts with 10 routines without error
365 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(10), Checkpoint(true, objectName+".cp"))
369 err = s.bucket.GetObjectToFile(objectName, newFile)
372 eq, err = compareFiles(fileName, newFile)
374 c.Assert(eq, Equals, true)
376 err = s.bucket.DeleteObject(objectName)
380 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), Checkpoint(true, objectName+".cp"), Meta("myprop", "mypropval"))
382 meta, err := s.bucket.GetObjectDetailedMeta(objectName)
384 c.Assert(meta.Get("X-Oss-Meta-Myprop"), Equals, "mypropval")
387 err = s.bucket.GetObjectToFile(objectName, newFile)
390 eq, err = compareFiles(fileName, newFile)
392 c.Assert(eq, Equals, true)
394 err = s.bucket.DeleteObject(objectName)
398 // TestUploadRoutineWithRecoveryNegative is multiroutineed upload without checkpoint
399 func (s *OssUploadSuite) TestUploadRoutineWithRecoveryNegative(c *C) {
400 objectName := objectNamePrefix + RandStr(8)
401 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
403 // The local file does not exist
404 err := s.bucket.UploadFile(objectName, "NotExist", 100*1024, Checkpoint(true, "NotExist.cp"))
405 c.Assert(err, NotNil)
407 err = s.bucket.UploadFile(objectName, "NotExist", 100*1024, Routines(2), Checkpoint(true, "NotExist.cp"))
408 c.Assert(err, NotNil)
410 // Specified part size is invalid
411 err = s.bucket.UploadFile(objectName, fileName, 1024, Checkpoint(true, fileName+".cp"))
412 c.Assert(err, NotNil)
414 err = s.bucket.UploadFile(objectName, fileName, 1024, Routines(2), Checkpoint(true, fileName+".cp"))
415 c.Assert(err, NotNil)
417 err = s.bucket.UploadFile(objectName, fileName, 1024*1024*1024*100, Checkpoint(true, fileName+".cp"))
418 c.Assert(err, NotNil)
420 err = s.bucket.UploadFile(objectName, fileName, 1024*1024*1024*100, Routines(2), Checkpoint(true, fileName+".cp"))
421 c.Assert(err, NotNil)
424 // TestUploadLocalFileChange tests the file is updated while being uploaded
425 func (s *OssUploadSuite) TestUploadLocalFileChange(c *C) {
426 objectName := objectNamePrefix + RandStr(8)
427 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
428 localFile := RandStr(8) + ".jpg"
429 newFile := RandStr(8) + ".jpg"
432 err := copyFile(fileName, localFile)
435 // First upload for 4 parts
436 uploadPartHooker = ErrorHooker
437 err = s.bucket.UploadFile(objectName, localFile, 100*1024, Checkpoint(true, localFile+".cp"))
438 c.Assert(err, NotNil)
439 c.Assert(err.Error(), Equals, "ErrorHooker")
440 uploadPartHooker = defaultUploadPart
443 err = copyFile(fileName, localFile)
446 // Updating the file. The second upload will re-upload all 5 parts.
447 err = s.bucket.UploadFile(objectName, localFile, 100*1024, Checkpoint(true, localFile+".cp"))
451 err = s.bucket.GetObjectToFile(objectName, newFile)
454 eq, err := compareFiles(fileName, newFile)
456 c.Assert(eq, Equals, true)
458 err = s.bucket.DeleteObject(objectName)
462 // TestUploadPartArchiveObject
463 func (s *OssUploadSuite) TestUploadPartArchiveObject(c *C) {
464 // create archive bucket
465 client, err := New(endpoint, accessID, accessKey)
468 bucketName := bucketNamePrefix + RandLowStr(6)
469 err = client.CreateBucket(bucketName, StorageClass(StorageArchive))
471 bucket, err := client.Bucket(bucketName)
472 objectName := objectNamePrefix + RandStr(8)
474 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
475 fileInfo, err := os.Stat(fileName)
478 // Updating the file,archive object
479 err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, ObjectStorageClass(StorageArchive))
482 // Updating the file,archive object,checkpoint
483 err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, ObjectStorageClass(StorageArchive), Checkpoint(true, fileName+".cp"))
485 ForceDeleteBucket(client, bucketName, c)
488 func copyFile(src, dst string) error {
489 srcFile, err := os.Open(src)
493 defer srcFile.Close()
495 dstFile, err := os.Create(dst)
499 defer dstFile.Close()
501 _, err = io.Copy(dstFile, srcFile)
505 func (s *OssUploadSuite) TestVersioningUploadRoutineWithRecovery(c *C) {
506 // create a bucket with default proprety
507 client, err := New(endpoint, accessID, accessKey)
510 bucketName := bucketNamePrefix + RandLowStr(6)
511 err = client.CreateBucket(bucketName)
514 bucket, err := client.Bucket(bucketName)
516 // put bucket version:enabled
517 var versioningConfig VersioningConfig
518 versioningConfig.Status = string(VersionEnabled)
519 err = client.SetBucketVersioning(bucketName, versioningConfig)
523 objectName := objectNamePrefix + RandStr(8)
524 fileName := "test-file-" + RandStr(8)
525 fileData := RandStr(500 * 1024)
526 CreateFile(fileName, fileData, c)
527 newFile := "test-file-" + RandStr(8)
529 // Use default routines and default CP file path (fileName+.cp)Header
530 // First upload for 4 parts
531 var respHeader http.Header
532 uploadPartHooker = ErrorHooker
533 options := []Option{Checkpoint(true, fileName+".cp"), GetResponseHeader(&respHeader)}
534 err = bucket.UploadFile(objectName, fileName, 100*1024, options...)
535 c.Assert(err, NotNil)
536 c.Assert(err.Error(), Equals, "ErrorHooker")
537 c.Assert(GetVersionId(respHeader), Equals, "")
539 uploadPartHooker = defaultUploadPart
541 // Second upload, finish the remaining part
542 options = []Option{Checkpoint(true, fileName+".cp"), GetResponseHeader(&respHeader)}
543 err = bucket.UploadFile(objectName, fileName, 100*1024, options...)
545 versionIdUp := GetVersionId(respHeader)
546 c.Assert(len(versionIdUp) > 0, Equals, true)
549 var respHeaderDown http.Header
550 err = bucket.GetObjectToFile(objectName, newFile, GetResponseHeader(&respHeaderDown))
551 versionIdDown := GetVersionId(respHeaderDown)
553 c.Assert(versionIdUp, Equals, versionIdDown)
555 eq, err := compareFiles(fileName, newFile)
557 c.Assert(eq, Equals, true)
561 bucket.DeleteObject(objectName)
562 ForceDeleteBucket(client, bucketName, c)
565 // TestUploadFileChoiceOptions
566 func (s *OssUploadSuite) TestUploadFileChoiceOptions(c *C) {
567 // create a bucket with default proprety
568 client, err := New(endpoint, accessID, accessKey)
571 bucketName := bucketNamePrefix + RandLowStr(6)
572 err = client.CreateBucket(bucketName)
574 bucket, err := client.Bucket(bucketName)
576 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
577 fileInfo, err := os.Stat(fileName)
580 objectName := objectNamePrefix + RandStr(8)
582 // UploadFile with properties
584 ObjectACL(ACLPublicRead),
585 RequestPayer(Requester),
586 TrafficLimitHeader(1024 * 1024 * 8),
587 ServerSideEncryption("AES256"),
588 ObjectStorageClass(StorageArchive),
592 err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
596 headerResp, err := bucket.GetObjectDetailedMeta(objectName)
599 c.Assert(headerResp.Get("X-Oss-Server-Side-Encryption"), Equals, "AES256")
600 aclResult, err := bucket.GetObjectACL(objectName)
601 c.Assert(aclResult.ACL, Equals, "public-read")
603 ForceDeleteBucket(client, bucketName, c)
606 // TestUploadFileWithCpChoiceOptions
607 func (s *OssUploadSuite) TestUploadFileWithCpChoiceOptions(c *C) {
608 // create a bucket with default proprety
609 client, err := New(endpoint, accessID, accessKey)
612 bucketName := bucketNamePrefix + RandLowStr(6)
613 err = client.CreateBucket(bucketName)
615 bucket, err := client.Bucket(bucketName)
617 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
618 fileInfo, err := os.Stat(fileName)
621 objectName := objectNamePrefix + RandStr(8)
623 // UploadFile with properties
625 ObjectACL(ACLPublicRead),
626 RequestPayer(Requester),
627 TrafficLimitHeader(1024 * 1024 * 8),
628 ServerSideEncryption("AES256"),
629 ObjectStorageClass(StorageArchive),
630 Checkpoint(true, fileName+".cp"), // with checkpoint
634 err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
638 headerResp, err := bucket.GetObjectDetailedMeta(objectName)
641 c.Assert(headerResp.Get("X-Oss-Server-Side-Encryption"), Equals, "AES256")
642 c.Assert(headerResp.Get("X-Oss-Storage-Class"), Equals, "Archive")
644 aclResult, err := bucket.GetObjectACL(objectName)
645 c.Assert(aclResult.ACL, Equals, "public-read")
648 ForceDeleteBucket(client, bucketName, c)
651 // TestUploadFileWithForbidOverWrite
652 func (s *OssUploadSuite) TestUploadFileWithForbidOverWrite(c *C) {
653 // create a bucket with default proprety
654 client, err := New(endpoint, accessID, accessKey)
657 bucketName := bucketNamePrefix + RandLowStr(6)
658 err = client.CreateBucket(bucketName)
660 bucket, err := client.Bucket(bucketName)
662 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
663 fileInfo, err := os.Stat(fileName)
666 objectName := objectNamePrefix + RandStr(8)
668 // UploadFile with properties
670 ObjectACL(ACLPublicRead),
671 RequestPayer(Requester),
672 TrafficLimitHeader(1024 * 1024 * 8),
673 ServerSideEncryption("AES256"),
674 ObjectStorageClass(StorageArchive),
675 ForbidOverWrite(true),
676 Checkpoint(true, fileName+".cp"),
680 err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
683 // Updating the file with ForbidOverWrite(true)
684 err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
685 c.Assert(err, NotNil)
687 // without Checkpoint
689 ObjectACL(ACLPublicRead),
690 RequestPayer(Requester),
691 TrafficLimitHeader(1024 * 1024 * 8),
692 ServerSideEncryption("AES256"),
693 ObjectStorageClass(StorageArchive),
694 ForbidOverWrite(true),
697 // Updating the file with ForbidOverWrite(true)
698 err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
699 c.Assert(err, NotNil)
701 ForceDeleteBucket(client, bucketName, c)
704 // TestUploadFileWithSequential
705 func (s *OssUploadSuite) TestUploadFileWithSequential(c *C) {
706 // create a bucket with default proprety
707 client, err := New(endpoint, accessID, accessKey)
710 bucketName := bucketNamePrefix + RandLowStr(6)
711 err = client.CreateBucket(bucketName)
713 bucket, err := client.Bucket(bucketName)
715 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
716 fileInfo, err := os.Stat(fileName)
719 objectName := objectNamePrefix + RandStr(8)
721 var respHeader http.Header
723 // UploadFile with properties
726 GetResponseHeader(&respHeader),
727 Checkpoint(true, fileName+".cp"),
731 err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
734 respHeader, err = bucket.GetObjectDetailedMeta(objectName)
737 strMD5 := respHeader.Get("Content-MD5")
738 c.Assert(len(strMD5) > 0, Equals, true)
740 ForceDeleteBucket(client, bucketName, c)