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

     1  package oss
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/base64"
     6  	"encoding/json"
     7  	"fmt"
     8  	"io"
     9  	"net/http"
    10  	"os"
    11  	"time"
    12  
    13  	. "gopkg.in/check.v1"
    14  )
    15  
    16  type OssUploadSuite struct {
    17  	cloudBoxControlClient *Client
    18  	client                *Client
    19  	bucket                *Bucket
    20  }
    21  
    22  var _ = Suite(&OssUploadSuite{})
    23  
    24  // SetUpSuite runs once when the suite starts running
    25  func (s *OssUploadSuite) SetUpSuite(c *C) {
    26  	bucketName := bucketNamePrefix + RandLowStr(6)
    27  	if cloudboxControlEndpoint == "" {
    28  		client, err := New(endpoint, accessID, accessKey)
    29  		c.Assert(err, IsNil)
    30  		s.client = client
    31  
    32  		s.client.CreateBucket(bucketName)
    33  
    34  		bucket, err := s.client.Bucket(bucketName)
    35  		c.Assert(err, IsNil)
    36  		s.bucket = bucket
    37  	} else {
    38  		client, err := New(cloudboxEndpoint, accessID, accessKey)
    39  		c.Assert(err, IsNil)
    40  		s.client = client
    41  
    42  		controlClient, err := New(cloudboxControlEndpoint, accessID, accessKey)
    43  		c.Assert(err, IsNil)
    44  		s.cloudBoxControlClient = controlClient
    45  		controlClient.CreateBucket(bucketName)
    46  
    47  		bucket, err := s.client.Bucket(bucketName)
    48  		c.Assert(err, IsNil)
    49  		s.bucket = bucket
    50  	}
    51  
    52  	testLogger.Println("test upload started")
    53  }
    54  
    55  // TearDownSuite runs before each test or benchmark starts running
    56  func (s *OssUploadSuite) TearDownSuite(c *C) {
    57  	// Delete part
    58  	keyMarker := KeyMarker("")
    59  	uploadIDMarker := UploadIDMarker("")
    60  	for {
    61  		lmur, err := s.bucket.ListMultipartUploads(keyMarker, uploadIDMarker)
    62  		c.Assert(err, IsNil)
    63  		for _, upload := range lmur.Uploads {
    64  			var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName,
    65  				Key: upload.Key, UploadID: upload.UploadID}
    66  			err = s.bucket.AbortMultipartUpload(imur)
    67  			c.Assert(err, IsNil)
    68  		}
    69  		keyMarker = KeyMarker(lmur.NextKeyMarker)
    70  		uploadIDMarker = UploadIDMarker(lmur.NextUploadIDMarker)
    71  		if !lmur.IsTruncated {
    72  			break
    73  		}
    74  	}
    75  
    76  	// Delete objects
    77  	marker := Marker("")
    78  	for {
    79  		lor, err := s.bucket.ListObjects(marker)
    80  		c.Assert(err, IsNil)
    81  		for _, object := range lor.Objects {
    82  			err = s.bucket.DeleteObject(object.Key)
    83  			c.Assert(err, IsNil)
    84  		}
    85  		marker = Marker(lor.NextMarker)
    86  		if !lor.IsTruncated {
    87  			break
    88  		}
    89  	}
    90  
    91  	// Delete bucket
    92  	if s.cloudBoxControlClient != nil {
    93  		err := s.cloudBoxControlClient.DeleteBucket(s.bucket.BucketName)
    94  		c.Assert(err, IsNil)
    95  	} else {
    96  		err := s.client.DeleteBucket(s.bucket.BucketName)
    97  		c.Assert(err, IsNil)
    98  	}
    99  
   100  	testLogger.Println("test upload completed")
   101  }
   102  
   103  // SetUpTest runs after each test or benchmark runs
   104  func (s *OssUploadSuite) SetUpTest(c *C) {
   105  	err := removeTempFiles("../oss", ".jpg")
   106  	c.Assert(err, IsNil)
   107  }
   108  
   109  // TearDownTest runs once after all tests or benchmarks have finished running
   110  func (s *OssUploadSuite) TearDownTest(c *C) {
   111  	err := removeTempFiles("../oss", ".jpg")
   112  	c.Assert(err, IsNil)
   113  }
   114  
   115  // TestUploadRoutineWithoutRecovery tests multiroutineed upload without checkpoint
   116  func (s *OssUploadSuite) TestUploadRoutineWithoutRecovery(c *C) {
   117  	objectName := objectNamePrefix + RandStr(8)
   118  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   119  	newFile := RandStr(8) + ".jpg"
   120  
   121  	// Routines is not specified, by default single routine
   122  	err := s.bucket.UploadFile(objectName, fileName, 100*1024)
   123  	c.Assert(err, IsNil)
   124  
   125  	os.Remove(newFile)
   126  	err = s.bucket.GetObjectToFile(objectName, newFile)
   127  	c.Assert(err, IsNil)
   128  
   129  	eq, err := compareFiles(fileName, newFile)
   130  	c.Assert(err, IsNil)
   131  	c.Assert(eq, Equals, true)
   132  
   133  	err = s.bucket.DeleteObject(objectName)
   134  	c.Assert(err, IsNil)
   135  
   136  	// Specify routine count as 1
   137  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(1))
   138  	c.Assert(err, IsNil)
   139  
   140  	os.Remove(newFile)
   141  	err = s.bucket.GetObjectToFile(objectName, newFile)
   142  	c.Assert(err, IsNil)
   143  
   144  	eq, err = compareFiles(fileName, newFile)
   145  	c.Assert(err, IsNil)
   146  	c.Assert(eq, Equals, true)
   147  
   148  	err = s.bucket.DeleteObject(objectName)
   149  	c.Assert(err, IsNil)
   150  
   151  	// Specify routine count as 3, which is smaller than parts count 5
   152  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
   153  	c.Assert(err, IsNil)
   154  
   155  	os.Remove(newFile)
   156  	err = s.bucket.GetObjectToFile(objectName, newFile)
   157  	c.Assert(err, IsNil)
   158  
   159  	eq, err = compareFiles(fileName, newFile)
   160  	c.Assert(err, IsNil)
   161  	c.Assert(eq, Equals, true)
   162  
   163  	err = s.bucket.DeleteObject(objectName)
   164  	c.Assert(err, IsNil)
   165  
   166  	// Specify routine count as 5, which is same as the part count 5
   167  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(5))
   168  	c.Assert(err, IsNil)
   169  
   170  	os.Remove(newFile)
   171  	err = s.bucket.GetObjectToFile(objectName, newFile)
   172  	c.Assert(err, IsNil)
   173  
   174  	eq, err = compareFiles(fileName, newFile)
   175  	c.Assert(err, IsNil)
   176  	c.Assert(eq, Equals, true)
   177  
   178  	err = s.bucket.DeleteObject(objectName)
   179  	c.Assert(err, IsNil)
   180  
   181  	// Specify routine count as 10, which is bigger than the part count 5.
   182  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(10))
   183  	c.Assert(err, IsNil)
   184  
   185  	os.Remove(newFile)
   186  	err = s.bucket.GetObjectToFile(objectName, newFile)
   187  	c.Assert(err, IsNil)
   188  
   189  	eq, err = compareFiles(fileName, newFile)
   190  	c.Assert(err, IsNil)
   191  	c.Assert(eq, Equals, true)
   192  
   193  	err = s.bucket.DeleteObject(objectName)
   194  	c.Assert(err, IsNil)
   195  
   196  	// Invalid routine count, it will use 1 automatically.
   197  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(0))
   198  	os.Remove(newFile)
   199  	err = s.bucket.GetObjectToFile(objectName, newFile)
   200  	c.Assert(err, IsNil)
   201  
   202  	eq, err = compareFiles(fileName, newFile)
   203  	c.Assert(err, IsNil)
   204  	c.Assert(eq, Equals, true)
   205  
   206  	err = s.bucket.DeleteObject(objectName)
   207  	c.Assert(err, IsNil)
   208  
   209  	// Invalid routine count, it will use 1 automatically
   210  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(-1))
   211  	os.Remove(newFile)
   212  	err = s.bucket.GetObjectToFile(objectName, newFile)
   213  	c.Assert(err, IsNil)
   214  
   215  	eq, err = compareFiles(fileName, newFile)
   216  	c.Assert(err, IsNil)
   217  	c.Assert(eq, Equals, true)
   218  
   219  	err = s.bucket.DeleteObject(objectName)
   220  	c.Assert(err, IsNil)
   221  
   222  	// Option
   223  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), Meta("myprop", "mypropval"))
   224  
   225  	meta, err := s.bucket.GetObjectDetailedMeta(objectName)
   226  	c.Assert(err, IsNil)
   227  	c.Assert(meta.Get("X-Oss-Meta-Myprop"), Equals, "mypropval")
   228  
   229  	os.Remove(newFile)
   230  	err = s.bucket.GetObjectToFile(objectName, newFile)
   231  	c.Assert(err, IsNil)
   232  
   233  	eq, err = compareFiles(fileName, newFile)
   234  	c.Assert(err, IsNil)
   235  	c.Assert(eq, Equals, true)
   236  
   237  	err = s.bucket.DeleteObject(objectName)
   238  	c.Assert(err, IsNil)
   239  }
   240  
   241  // ErrorHooker is a UploadPart hook---it will fail the 5th part's upload.
   242  func ErrorHooker(id int, chunk FileChunk) error {
   243  	if chunk.Number == 5 {
   244  		time.Sleep(time.Second)
   245  		return fmt.Errorf("ErrorHooker")
   246  	}
   247  	return nil
   248  }
   249  
   250  // TestUploadRoutineWithoutRecoveryNegative is multiroutineed upload without checkpoint
   251  func (s *OssUploadSuite) TestUploadRoutineWithoutRecoveryNegative(c *C) {
   252  	objectName := objectNamePrefix + RandStr(8)
   253  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   254  
   255  	uploadPartHooker = ErrorHooker
   256  	// Worker routine error
   257  	err := s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(2))
   258  	c.Assert(err, NotNil)
   259  	c.Assert(err.Error(), Equals, "ErrorHooker")
   260  	uploadPartHooker = defaultUploadPart
   261  
   262  	// Local file does not exist
   263  	err = s.bucket.UploadFile(objectName, "NotExist", 100*1024, Routines(2))
   264  	c.Assert(err, NotNil)
   265  
   266  	// The part size is invalid
   267  	err = s.bucket.UploadFile(objectName, fileName, 1024, Routines(2))
   268  	c.Assert(err, NotNil)
   269  
   270  	err = s.bucket.UploadFile(objectName, fileName, 1024*1024*1024*100, Routines(2))
   271  	c.Assert(err, NotNil)
   272  }
   273  
   274  // TestUploadRoutineWithRecovery is multi-routine upload with resumable recovery
   275  func (s *OssUploadSuite) TestUploadRoutineWithRecovery(c *C) {
   276  	objectName := objectNamePrefix + RandStr(8)
   277  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   278  	newFile := "upload-new-file-2.jpg"
   279  
   280  	// Use default routines and default CP file path (fileName+.cp)
   281  	// First upload for 4 parts
   282  	uploadPartHooker = ErrorHooker
   283  	err := s.bucket.UploadFile(objectName, fileName, 100*1024, Checkpoint(true, fileName+".cp"))
   284  	c.Assert(err, NotNil)
   285  	c.Assert(err.Error(), Equals, "ErrorHooker")
   286  	uploadPartHooker = defaultUploadPart
   287  
   288  	// Check CP
   289  	ucp := uploadCheckpoint{}
   290  	err = ucp.load(fileName + ".cp")
   291  	c.Assert(err, IsNil)
   292  	c.Assert(ucp.Magic, Equals, uploadCpMagic)
   293  	c.Assert(len(ucp.MD5), Equals, len("LC34jZU5xK4hlxi3Qn3XGQ=="))
   294  	c.Assert(ucp.FilePath, Equals, fileName)
   295  	c.Assert(ucp.FileStat.Size, Equals, int64(482048))
   296  	c.Assert(len(ucp.FileStat.LastModified.String()) > 0, Equals, true)
   297  	c.Assert(ucp.FileStat.MD5, Equals, "")
   298  	c.Assert(ucp.ObjectKey, Equals, objectName)
   299  	c.Assert(len(ucp.UploadID), Equals, len("3F79722737D1469980DACEDCA325BB52"))
   300  	c.Assert(len(ucp.Parts), Equals, 5)
   301  	c.Assert(len(ucp.todoParts()), Equals, 1)
   302  	c.Assert(len(ucp.allParts()), Equals, 5)
   303  
   304  	// Second upload, finish the remaining part
   305  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Checkpoint(true, fileName+".cp"))
   306  	c.Assert(err, IsNil)
   307  
   308  	os.Remove(newFile)
   309  	err = s.bucket.GetObjectToFile(objectName, newFile)
   310  	c.Assert(err, IsNil)
   311  
   312  	eq, err := compareFiles(fileName, newFile)
   313  	c.Assert(err, IsNil)
   314  	c.Assert(eq, Equals, true)
   315  
   316  	err = s.bucket.DeleteObject(objectName)
   317  	c.Assert(err, IsNil)
   318  
   319  	err = ucp.load(fileName + ".cp")
   320  	c.Assert(err, NotNil)
   321  
   322  	// Resumable upload with empty checkpoint path
   323  	uploadPartHooker = ErrorHooker
   324  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), CheckpointDir(true, ""))
   325  	c.Assert(err, NotNil)
   326  	c.Assert(err.Error(), Equals, "ErrorHooker")
   327  	uploadPartHooker = defaultUploadPart
   328  	ucp = uploadCheckpoint{}
   329  	err = ucp.load(fileName + ".cp")
   330  	c.Assert(err, NotNil)
   331  
   332  	// Resumable upload with checkpoint dir
   333  	uploadPartHooker = ErrorHooker
   334  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), CheckpointDir(true, "./"))
   335  	c.Assert(err, NotNil)
   336  	c.Assert(err.Error(), Equals, "ErrorHooker")
   337  	uploadPartHooker = defaultUploadPart
   338  
   339  	// Check CP
   340  	ucp = uploadCheckpoint{}
   341  	cpConf := cpConfig{IsEnable: true, DirPath: "./"}
   342  	cpFilePath := getUploadCpFilePath(&cpConf, fileName, s.bucket.BucketName, objectName)
   343  	err = ucp.load(cpFilePath)
   344  	c.Assert(err, IsNil)
   345  	c.Assert(ucp.Magic, Equals, uploadCpMagic)
   346  	c.Assert(len(ucp.MD5), Equals, len("LC34jZU5xK4hlxi3Qn3XGQ=="))
   347  	c.Assert(ucp.FilePath, Equals, fileName)
   348  	c.Assert(ucp.FileStat.Size, Equals, int64(482048))
   349  	c.Assert(len(ucp.FileStat.LastModified.String()) > 0, Equals, true)
   350  	c.Assert(ucp.FileStat.MD5, Equals, "")
   351  	c.Assert(ucp.ObjectKey, Equals, objectName)
   352  	c.Assert(len(ucp.UploadID), Equals, len("3F79722737D1469980DACEDCA325BB52"))
   353  	c.Assert(len(ucp.Parts), Equals, 5)
   354  	c.Assert(len(ucp.todoParts()), Equals, 1)
   355  	c.Assert(len(ucp.allParts()), Equals, 5)
   356  
   357  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), CheckpointDir(true, "./"))
   358  	c.Assert(err, IsNil)
   359  
   360  	os.Remove(newFile)
   361  	err = s.bucket.GetObjectToFile(objectName, newFile)
   362  	c.Assert(err, IsNil)
   363  
   364  	eq, err = compareFiles(fileName, newFile)
   365  	c.Assert(err, IsNil)
   366  	c.Assert(eq, Equals, true)
   367  
   368  	err = s.bucket.DeleteObject(objectName)
   369  	c.Assert(err, IsNil)
   370  
   371  	err = ucp.load(cpFilePath)
   372  	c.Assert(err, NotNil)
   373  
   374  	// Upload all 5 parts without error
   375  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), Checkpoint(true, objectName+".cp"))
   376  	c.Assert(err, IsNil)
   377  
   378  	os.Remove(newFile)
   379  	err = s.bucket.GetObjectToFile(objectName, newFile)
   380  	c.Assert(err, IsNil)
   381  
   382  	eq, err = compareFiles(fileName, newFile)
   383  	c.Assert(err, IsNil)
   384  	c.Assert(eq, Equals, true)
   385  
   386  	err = s.bucket.DeleteObject(objectName)
   387  	c.Assert(err, IsNil)
   388  
   389  	// Upload all 5 parts with 10 routines without error
   390  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(10), Checkpoint(true, objectName+".cp"))
   391  	c.Assert(err, IsNil)
   392  
   393  	os.Remove(newFile)
   394  	err = s.bucket.GetObjectToFile(objectName, newFile)
   395  	c.Assert(err, IsNil)
   396  
   397  	eq, err = compareFiles(fileName, newFile)
   398  	c.Assert(err, IsNil)
   399  	c.Assert(eq, Equals, true)
   400  
   401  	err = s.bucket.DeleteObject(objectName)
   402  	c.Assert(err, IsNil)
   403  
   404  	// Option
   405  	err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), Checkpoint(true, objectName+".cp"), Meta("myprop", "mypropval"))
   406  
   407  	meta, err := s.bucket.GetObjectDetailedMeta(objectName)
   408  	c.Assert(err, IsNil)
   409  	c.Assert(meta.Get("X-Oss-Meta-Myprop"), Equals, "mypropval")
   410  
   411  	os.Remove(newFile)
   412  	err = s.bucket.GetObjectToFile(objectName, newFile)
   413  	c.Assert(err, IsNil)
   414  
   415  	eq, err = compareFiles(fileName, newFile)
   416  	c.Assert(err, IsNil)
   417  	c.Assert(eq, Equals, true)
   418  
   419  	err = s.bucket.DeleteObject(objectName)
   420  	c.Assert(err, IsNil)
   421  }
   422  
   423  // TestUploadRoutineWithRecoveryNegative is multiroutineed upload without checkpoint
   424  func (s *OssUploadSuite) TestUploadRoutineWithRecoveryNegative(c *C) {
   425  	objectName := objectNamePrefix + RandStr(8)
   426  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   427  
   428  	// The local file does not exist
   429  	err := s.bucket.UploadFile(objectName, "NotExist", 100*1024, Checkpoint(true, "NotExist.cp"))
   430  	c.Assert(err, NotNil)
   431  
   432  	err = s.bucket.UploadFile(objectName, "NotExist", 100*1024, Routines(2), Checkpoint(true, "NotExist.cp"))
   433  	c.Assert(err, NotNil)
   434  
   435  	// Specified part size is invalid
   436  	err = s.bucket.UploadFile(objectName, fileName, 1024, Checkpoint(true, fileName+".cp"))
   437  	c.Assert(err, NotNil)
   438  
   439  	err = s.bucket.UploadFile(objectName, fileName, 1024, Routines(2), Checkpoint(true, fileName+".cp"))
   440  	c.Assert(err, NotNil)
   441  
   442  	err = s.bucket.UploadFile(objectName, fileName, 1024*1024*1024*100, Checkpoint(true, fileName+".cp"))
   443  	c.Assert(err, NotNil)
   444  
   445  	err = s.bucket.UploadFile(objectName, fileName, 1024*1024*1024*100, Routines(2), Checkpoint(true, fileName+".cp"))
   446  	c.Assert(err, NotNil)
   447  }
   448  
   449  // TestUploadLocalFileChange tests the file is updated while being uploaded
   450  func (s *OssUploadSuite) TestUploadLocalFileChange(c *C) {
   451  	objectName := objectNamePrefix + RandStr(8)
   452  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   453  	localFile := RandStr(8) + ".jpg"
   454  	newFile := RandStr(8) + ".jpg"
   455  
   456  	os.Remove(localFile)
   457  	err := copyFile(fileName, localFile)
   458  	c.Assert(err, IsNil)
   459  
   460  	// First upload for 4 parts
   461  	uploadPartHooker = ErrorHooker
   462  	err = s.bucket.UploadFile(objectName, localFile, 100*1024, Checkpoint(true, localFile+".cp"))
   463  	c.Assert(err, NotNil)
   464  	c.Assert(err.Error(), Equals, "ErrorHooker")
   465  	uploadPartHooker = defaultUploadPart
   466  
   467  	os.Remove(localFile)
   468  	err = copyFile(fileName, localFile)
   469  	c.Assert(err, IsNil)
   470  
   471  	// Updating the file. The second upload will re-upload all 5 parts.
   472  	err = s.bucket.UploadFile(objectName, localFile, 100*1024, Checkpoint(true, localFile+".cp"))
   473  	c.Assert(err, IsNil)
   474  
   475  	os.Remove(newFile)
   476  	err = s.bucket.GetObjectToFile(objectName, newFile)
   477  	c.Assert(err, IsNil)
   478  
   479  	eq, err := compareFiles(fileName, newFile)
   480  	c.Assert(err, IsNil)
   481  	c.Assert(eq, Equals, true)
   482  
   483  	err = s.bucket.DeleteObject(objectName)
   484  	c.Assert(err, IsNil)
   485  }
   486  
   487  // TestUploadPartArchiveObject
   488  func (s *OssUploadSuite) TestUploadPartArchiveObject(c *C) {
   489  	// create archive bucket
   490  	client, err := New(endpoint, accessID, accessKey)
   491  	c.Assert(err, IsNil)
   492  
   493  	bucketName := bucketNamePrefix + RandLowStr(6)
   494  	err = client.CreateBucket(bucketName, StorageClass(StorageArchive))
   495  	c.Assert(err, IsNil)
   496  	bucket, err := client.Bucket(bucketName)
   497  	objectName := objectNamePrefix + RandStr(8)
   498  
   499  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   500  	fileInfo, err := os.Stat(fileName)
   501  	c.Assert(err, IsNil)
   502  
   503  	// Updating the file,archive object
   504  	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, ObjectStorageClass(StorageArchive))
   505  	c.Assert(err, IsNil)
   506  
   507  	// Updating the file,archive object,checkpoint
   508  	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, ObjectStorageClass(StorageArchive), Checkpoint(true, fileName+".cp"))
   509  	c.Assert(err, IsNil)
   510  	ForceDeleteBucket(client, bucketName, c)
   511  }
   512  
   513  func copyFile(src, dst string) error {
   514  	srcFile, err := os.Open(src)
   515  	if err != nil {
   516  		return err
   517  	}
   518  	defer srcFile.Close()
   519  
   520  	dstFile, err := os.Create(dst)
   521  	if err != nil {
   522  		return err
   523  	}
   524  	defer dstFile.Close()
   525  
   526  	_, err = io.Copy(dstFile, srcFile)
   527  	return err
   528  }
   529  
   530  func (s *OssUploadSuite) TestVersioningUploadRoutineWithRecovery(c *C) {
   531  	// create a bucket with default proprety
   532  	client, err := New(endpoint, accessID, accessKey)
   533  	c.Assert(err, IsNil)
   534  
   535  	bucketName := bucketNamePrefix + RandLowStr(6)
   536  	err = client.CreateBucket(bucketName)
   537  	c.Assert(err, IsNil)
   538  
   539  	bucket, err := client.Bucket(bucketName)
   540  
   541  	// put bucket version:enabled
   542  	var versioningConfig VersioningConfig
   543  	versioningConfig.Status = string(VersionEnabled)
   544  	err = client.SetBucketVersioning(bucketName, versioningConfig)
   545  	c.Assert(err, IsNil)
   546  
   547  	// begin test
   548  	objectName := objectNamePrefix + RandStr(8)
   549  	fileName := "test-file-" + RandStr(8)
   550  	fileData := RandStr(500 * 1024)
   551  	CreateFile(fileName, fileData, c)
   552  	newFile := "test-file-" + RandStr(8)
   553  
   554  	// Use default routines and default CP file path (fileName+.cp)Header
   555  	// First upload for 4 parts
   556  	var respHeader http.Header
   557  	uploadPartHooker = ErrorHooker
   558  	options := []Option{Checkpoint(true, fileName+".cp"), GetResponseHeader(&respHeader)}
   559  	err = bucket.UploadFile(objectName, fileName, 100*1024, options...)
   560  	c.Assert(err, NotNil)
   561  	c.Assert(err.Error(), Equals, "ErrorHooker")
   562  	c.Assert(GetVersionId(respHeader), Equals, "")
   563  
   564  	uploadPartHooker = defaultUploadPart
   565  
   566  	// Second upload, finish the remaining part
   567  	options = []Option{Checkpoint(true, fileName+".cp"), GetResponseHeader(&respHeader)}
   568  	err = bucket.UploadFile(objectName, fileName, 100*1024, options...)
   569  	c.Assert(err, IsNil)
   570  	versionIdUp := GetVersionId(respHeader)
   571  	c.Assert(len(versionIdUp) > 0, Equals, true)
   572  
   573  	os.Remove(newFile)
   574  	var respHeaderDown http.Header
   575  	err = bucket.GetObjectToFile(objectName, newFile, GetResponseHeader(&respHeaderDown))
   576  	versionIdDown := GetVersionId(respHeaderDown)
   577  	c.Assert(err, IsNil)
   578  	c.Assert(versionIdUp, Equals, versionIdDown)
   579  
   580  	eq, err := compareFiles(fileName, newFile)
   581  	c.Assert(err, IsNil)
   582  	c.Assert(eq, Equals, true)
   583  
   584  	os.Remove(fileName)
   585  	os.Remove(newFile)
   586  	bucket.DeleteObject(objectName)
   587  	ForceDeleteBucket(client, bucketName, c)
   588  }
   589  
   590  // TestUploadFileChoiceOptions
   591  func (s *OssUploadSuite) TestUploadFileChoiceOptions(c *C) {
   592  	// create a bucket with default proprety
   593  	client, err := New(endpoint, accessID, accessKey)
   594  	c.Assert(err, IsNil)
   595  
   596  	bucketName := bucketNamePrefix + RandLowStr(6)
   597  	err = client.CreateBucket(bucketName)
   598  	c.Assert(err, IsNil)
   599  	bucket, err := client.Bucket(bucketName)
   600  
   601  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   602  	fileInfo, err := os.Stat(fileName)
   603  	c.Assert(err, IsNil)
   604  
   605  	objectName := objectNamePrefix + RandStr(8)
   606  
   607  	// UploadFile with properties
   608  	options := []Option{
   609  		ObjectACL(ACLPublicRead),
   610  		RequestPayer(Requester),
   611  		TrafficLimitHeader(1024 * 1024 * 8),
   612  		ServerSideEncryption("AES256"),
   613  		ObjectStorageClass(StorageArchive),
   614  	}
   615  
   616  	// Updating the file
   617  	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
   618  	c.Assert(err, IsNil)
   619  
   620  	// GetMetaDetail
   621  	headerResp, err := bucket.GetObjectDetailedMeta(objectName)
   622  	c.Assert(err, IsNil)
   623  
   624  	c.Assert(headerResp.Get("X-Oss-Server-Side-Encryption"), Equals, "AES256")
   625  	aclResult, err := bucket.GetObjectACL(objectName)
   626  	c.Assert(aclResult.ACL, Equals, "public-read")
   627  	c.Assert(err, IsNil)
   628  	ForceDeleteBucket(client, bucketName, c)
   629  }
   630  
   631  // TestUploadFileWithCpChoiceOptions
   632  func (s *OssUploadSuite) TestUploadFileWithCpChoiceOptions(c *C) {
   633  	// create a bucket with default proprety
   634  	client, err := New(endpoint, accessID, accessKey)
   635  	c.Assert(err, IsNil)
   636  
   637  	bucketName := bucketNamePrefix + RandLowStr(6)
   638  	err = client.CreateBucket(bucketName)
   639  	c.Assert(err, IsNil)
   640  	bucket, err := client.Bucket(bucketName)
   641  
   642  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   643  	fileInfo, err := os.Stat(fileName)
   644  	c.Assert(err, IsNil)
   645  
   646  	objectName := objectNamePrefix + RandStr(8)
   647  
   648  	// UploadFile with properties
   649  	options := []Option{
   650  		ObjectACL(ACLPublicRead),
   651  		RequestPayer(Requester),
   652  		TrafficLimitHeader(1024 * 1024 * 8),
   653  		ServerSideEncryption("AES256"),
   654  		ObjectStorageClass(StorageArchive),
   655  		Checkpoint(true, fileName+".cp"), // with checkpoint
   656  	}
   657  
   658  	// Updating the file
   659  	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
   660  	c.Assert(err, IsNil)
   661  
   662  	// GetMetaDetail
   663  	headerResp, err := bucket.GetObjectDetailedMeta(objectName)
   664  	c.Assert(err, IsNil)
   665  
   666  	c.Assert(headerResp.Get("X-Oss-Server-Side-Encryption"), Equals, "AES256")
   667  	c.Assert(headerResp.Get("X-Oss-Storage-Class"), Equals, "Archive")
   668  
   669  	aclResult, err := bucket.GetObjectACL(objectName)
   670  	c.Assert(aclResult.ACL, Equals, "public-read")
   671  	c.Assert(err, IsNil)
   672  
   673  	ForceDeleteBucket(client, bucketName, c)
   674  }
   675  
   676  // TestUploadFileWithForbidOverWrite
   677  func (s *OssUploadSuite) TestUploadFileWithForbidOverWrite(c *C) {
   678  	// create a bucket with default proprety
   679  	client, err := New(endpoint, accessID, accessKey)
   680  	c.Assert(err, IsNil)
   681  
   682  	bucketName := bucketNamePrefix + RandLowStr(6)
   683  	err = client.CreateBucket(bucketName)
   684  	c.Assert(err, IsNil)
   685  	bucket, err := client.Bucket(bucketName)
   686  
   687  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   688  	fileInfo, err := os.Stat(fileName)
   689  	c.Assert(err, IsNil)
   690  
   691  	objectName := objectNamePrefix + RandStr(8)
   692  
   693  	// UploadFile with properties
   694  	options := []Option{
   695  		ObjectACL(ACLPublicRead),
   696  		RequestPayer(Requester),
   697  		TrafficLimitHeader(1024 * 1024 * 8),
   698  		ServerSideEncryption("AES256"),
   699  		ObjectStorageClass(StorageArchive),
   700  		ForbidOverWrite(true),
   701  		Checkpoint(true, fileName+".cp"),
   702  	}
   703  
   704  	// Updating the file
   705  	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
   706  	c.Assert(err, IsNil)
   707  
   708  	// Updating the file with ForbidOverWrite(true)
   709  	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
   710  	c.Assert(err, NotNil)
   711  
   712  	// without Checkpoint
   713  	options = []Option{
   714  		ObjectACL(ACLPublicRead),
   715  		RequestPayer(Requester),
   716  		TrafficLimitHeader(1024 * 1024 * 8),
   717  		ServerSideEncryption("AES256"),
   718  		ObjectStorageClass(StorageArchive),
   719  		ForbidOverWrite(true),
   720  	}
   721  
   722  	// Updating the file with ForbidOverWrite(true)
   723  	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
   724  	c.Assert(err, NotNil)
   725  
   726  	ForceDeleteBucket(client, bucketName, c)
   727  }
   728  
   729  // TestUploadFileWithSequential
   730  func (s *OssUploadSuite) TestUploadFileWithSequential(c *C) {
   731  	// create a bucket with default proprety
   732  	client, err := New(endpoint, accessID, accessKey)
   733  	c.Assert(err, IsNil)
   734  
   735  	bucketName := bucketNamePrefix + RandLowStr(6)
   736  	err = client.CreateBucket(bucketName)
   737  	c.Assert(err, IsNil)
   738  	bucket, err := client.Bucket(bucketName)
   739  
   740  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   741  	fileInfo, err := os.Stat(fileName)
   742  	c.Assert(err, IsNil)
   743  
   744  	objectName := objectNamePrefix + RandStr(8)
   745  
   746  	var respHeader http.Header
   747  
   748  	// UploadFile with properties
   749  	options := []Option{
   750  		Sequential(),
   751  		GetResponseHeader(&respHeader),
   752  		Checkpoint(true, fileName+".cp"),
   753  	}
   754  
   755  	// Updating the file
   756  	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
   757  	c.Assert(err, IsNil)
   758  
   759  	respHeader, err = bucket.GetObjectDetailedMeta(objectName)
   760  	c.Assert(err, IsNil)
   761  
   762  	strMD5 := respHeader.Get("Content-MD5")
   763  	c.Assert(len(strMD5) > 0, Equals, true)
   764  
   765  	ForceDeleteBucket(client, bucketName, c)
   766  }
   767  
   768  // TestUploadFileWithSequential
   769  func (s *OssUploadSuite) TestUploadFileWithCallbackResult(c *C) {
   770  	// create a bucket with default proprety
   771  	client, err := New(endpoint, accessID, accessKey)
   772  	c.Assert(err, IsNil)
   773  
   774  	bucketName := bucketNamePrefix + RandLowStr(6)
   775  	err = client.CreateBucket(bucketName)
   776  	c.Assert(err, IsNil)
   777  	bucket, err := client.Bucket(bucketName)
   778  
   779  	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
   780  	fileInfo, err := os.Stat(fileName)
   781  	c.Assert(err, IsNil)
   782  
   783  	objectName := objectNamePrefix + RandStr(8)
   784  
   785  	var respHeader http.Header
   786  	callbackMap := map[string]string{}
   787  	callbackMap["callbackUrl"] = "www.aliyuncs.com"
   788  	callbackMap["callbackBody"] = "filename=${object}&size=${size}&mimeType=${mimeType}"
   789  	callbackMap["callbackBodyType"] = "application/x-www-form-urlencoded"
   790  	callbackBuffer := bytes.NewBuffer([]byte{})
   791  	callbackEncoder := json.NewEncoder(callbackBuffer)
   792  	callbackEncoder.SetEscapeHTML(false)
   793  	err = callbackEncoder.Encode(callbackMap)
   794  	c.Assert(err, IsNil)
   795  
   796  	callbackVal := base64.StdEncoding.EncodeToString(callbackBuffer.Bytes())
   797  	var pBody []byte
   798  
   799  	// UploadFile with properties
   800  	options := []Option{
   801  		Sequential(),
   802  		GetResponseHeader(&respHeader),
   803  		Checkpoint(true, fileName+".cp"),
   804  		Callback(callbackVal),
   805  		CallbackResult(&pBody),
   806  	}
   807  
   808  	// Updating the file
   809  	err = bucket.UploadFile(objectName, fileName, fileInfo.Size()/2, options...)
   810  	c.Assert(err, NotNil)
   811  
   812  	e, ok := err.(ServiceError)
   813  	c.Assert(ok, Equals, true)
   814  	c.Assert(e.StatusCode, Equals, 203)
   815  	c.Assert(pBody, IsNil)
   816  
   817  	respHeader, err = bucket.GetObjectDetailedMeta(objectName)
   818  	c.Assert(err, IsNil)
   819  
   820  	strMD5 := respHeader.Get("Content-MD5")
   821  	c.Assert(len(strMD5) > 0, Equals, true)
   822  
   823  	ForceDeleteBucket(client, bucketName, c)
   824  }