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 }