16 type OssProgressSuite struct {
21 var _ = Suite(&OssProgressSuite{})
23 // SetUpSuite runs once when the suite starts running
24 func (s *OssProgressSuite) SetUpSuite(c *C) {
25 client, err := New(endpoint, accessID, accessKey)
29 s.client.CreateBucket(bucketName)
31 bucket, err := s.client.Bucket(bucketName)
35 testLogger.Println("test progress started")
38 // TearDownSuite runs before each test or benchmark starts running
39 func (s *OssProgressSuite) TearDownSuite(c *C) {
40 // Abort multipart uploads
41 keyMarker := KeyMarker("")
42 uploadIDMarker := UploadIDMarker("")
44 lmu, err := s.bucket.ListMultipartUploads(keyMarker, uploadIDMarker)
46 for _, upload := range lmu.Uploads {
47 imur := InitiateMultipartUploadResult{Bucket: bucketName, Key: upload.Key, UploadID: upload.UploadID}
48 err = s.bucket.AbortMultipartUpload(imur)
51 keyMarker = KeyMarker(lmu.NextKeyMarker)
52 uploadIDMarker = UploadIDMarker(lmu.NextUploadIDMarker)
61 lor, err := s.bucket.ListObjects(marker)
63 for _, object := range lor.Objects {
64 err = s.bucket.DeleteObject(object.Key)
67 marker = Marker(lor.NextMarker)
74 err := s.client.DeleteBucket(s.bucket.BucketName)
77 testLogger.Println("test progress completed")
80 // SetUpTest runs after each test or benchmark runs
81 func (s *OssProgressSuite) SetUpTest(c *C) {
82 err := removeTempFiles("../oss", ".jpg")
85 err = removeTempFiles("../oss", ".txt")
88 err = removeTempFiles("../oss", ".html")
92 // TearDownTest runs once after all tests or benchmarks have finished running
93 func (s *OssProgressSuite) TearDownTest(c *C) {
94 err := removeTempFiles("../oss", ".jpg")
97 err = removeTempFiles("../oss", ".txt")
100 err = removeTempFiles("../oss", ".html")
104 // OssProgressListener is the progress listener
105 type OssProgressListener struct {
109 // ProgressChanged handles progress event
110 func (listener *OssProgressListener) ProgressChanged(event *ProgressEvent) {
111 switch event.EventType {
112 case TransferStartedEvent:
113 testLogger.Printf("Transfer Started, ConsumedBytes: %d, TotalBytes %d.\n",
114 event.ConsumedBytes, event.TotalBytes)
115 case TransferDataEvent:
116 atomic.AddInt64(&listener.TotalRwBytes, event.RwBytes)
117 testLogger.Printf("Transfer Data, ConsumedBytes: %d, TotalBytes %d, %d%%.\n",
118 event.ConsumedBytes, event.TotalBytes, event.ConsumedBytes*100/event.TotalBytes)
119 case TransferCompletedEvent:
120 testLogger.Printf("Transfer Completed, ConsumedBytes: %d, TotalBytes %d.\n",
121 event.ConsumedBytes, event.TotalBytes)
122 case TransferFailedEvent:
123 testLogger.Printf("Transfer Failed, ConsumedBytes: %d, TotalBytes %d.\n",
124 event.ConsumedBytes, event.TotalBytes)
130 func (s *OssProgressSuite) TestPutObject(c *C) {
131 objectName := RandStr(8) + ".jpg"
132 localFile := "../sample/The Go Programming Language.html"
134 fileInfo, err := os.Stat(localFile)
138 fd, err := os.Open(localFile)
142 progressListener := OssProgressListener{}
143 err = s.bucket.PutObject(objectName, fd, Progress(&progressListener))
145 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
148 progressListener.TotalRwBytes = 0
149 err = s.bucket.PutObjectFromFile(objectName, localFile, Progress(&progressListener))
151 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
154 fd, err = os.Open(localFile)
158 request := &PutObjectRequest{
159 ObjectKey: objectName,
163 progressListener.TotalRwBytes = 0
164 options := []Option{Progress(&progressListener)}
165 _, err = s.bucket.DoPutObject(request, options)
167 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
169 // PutObject size is 0
170 progressListener.TotalRwBytes = 0
171 err = s.bucket.PutObject(objectName, strings.NewReader(""), Progress(&progressListener))
173 c.Assert(progressListener.TotalRwBytes, Equals, int64(0))
175 testLogger.Println("OssProgressSuite.TestPutObject")
179 func (s *OssProgressSuite) SignURLTestFunc(c *C, authVersion AuthVersionType, extraHeaders []string) {
180 objectName := objectNamePrefix + RandStr(8)
181 filePath := RandLowStr(10)
182 content := RandStr(20)
183 CreateFile(filePath, content, c)
185 oldType := s.bucket.Client.Config.AuthVersion
186 oldHeaders := s.bucket.Client.Config.AdditionalHeaders
187 s.bucket.Client.Config.AuthVersion = authVersion
188 s.bucket.Client.Config.AdditionalHeaders = extraHeaders
191 progressListener := OssProgressListener{}
192 str, err := s.bucket.SignURL(objectName, HTTPPut, 60, Progress(&progressListener))
194 if s.bucket.Client.Config.AuthVersion == AuthV1 {
195 c.Assert(strings.Contains(str, HTTPParamExpires+"="), Equals, true)
196 c.Assert(strings.Contains(str, HTTPParamAccessKeyID+"="), Equals, true)
197 c.Assert(strings.Contains(str, HTTPParamSignature+"="), Equals, true)
199 c.Assert(strings.Contains(str, HTTPParamSignatureVersion+"=OSS2"), Equals, true)
200 c.Assert(strings.Contains(str, HTTPParamExpiresV2+"="), Equals, true)
201 c.Assert(strings.Contains(str, HTTPParamAccessKeyIDV2+"="), Equals, true)
202 c.Assert(strings.Contains(str, HTTPParamSignatureV2+"="), Equals, true)
205 // Put object with URL
206 fd, err := os.Open(filePath)
210 err = s.bucket.PutObjectWithURL(str, fd, Progress(&progressListener))
212 c.Assert(progressListener.TotalRwBytes, Equals, int64(len(content)))
214 // Put object from file with URL
215 progressListener.TotalRwBytes = 0
216 err = s.bucket.PutObjectFromFileWithURL(str, filePath, Progress(&progressListener))
218 c.Assert(progressListener.TotalRwBytes, Equals, int64(len(content)))
221 fd, err = os.Open(filePath)
225 progressListener.TotalRwBytes = 0
226 options := []Option{Progress(&progressListener)}
227 _, err = s.bucket.DoPutObjectWithURL(str, fd, options)
229 c.Assert(progressListener.TotalRwBytes, Equals, int64(len(content)))
232 str, err = s.bucket.SignURL(objectName, HTTPGet, 60, Progress(&progressListener))
234 if s.bucket.Client.Config.AuthVersion == AuthV1 {
235 c.Assert(strings.Contains(str, HTTPParamExpires+"="), Equals, true)
236 c.Assert(strings.Contains(str, HTTPParamAccessKeyID+"="), Equals, true)
237 c.Assert(strings.Contains(str, HTTPParamSignature+"="), Equals, true)
239 c.Assert(strings.Contains(str, HTTPParamSignatureVersion+"=OSS2"), Equals, true)
240 c.Assert(strings.Contains(str, HTTPParamExpiresV2+"="), Equals, true)
241 c.Assert(strings.Contains(str, HTTPParamAccessKeyIDV2+"="), Equals, true)
242 c.Assert(strings.Contains(str, HTTPParamSignatureV2+"="), Equals, true)
245 // Get object with URL
246 progressListener.TotalRwBytes = 0
247 body, err := s.bucket.GetObjectWithURL(str, Progress(&progressListener))
249 str, err = readBody(body)
251 c.Assert(str, Equals, content)
252 c.Assert(progressListener.TotalRwBytes, Equals, int64(len(content)))
254 // Get object to file with URL
255 progressListener.TotalRwBytes = 0
256 str, err = s.bucket.SignURL(objectName, HTTPGet, 10, Progress(&progressListener))
259 newFile := RandStr(10)
260 progressListener.TotalRwBytes = 0
261 err = s.bucket.GetObjectToFileWithURL(str, newFile, Progress(&progressListener))
262 c.Assert(progressListener.TotalRwBytes, Equals, int64(len(content)))
264 eq, err := compareFiles(filePath, newFile)
266 c.Assert(eq, Equals, true)
271 err = s.bucket.DeleteObject(objectName)
274 testLogger.Println("OssProgressSuite.TestSignURL")
276 s.bucket.Client.Config.AuthVersion = oldType
277 s.bucket.Client.Config.AdditionalHeaders = oldHeaders
280 func (s *OssProgressSuite) TestSignURL(c *C) {
281 s.SignURLTestFunc(c, AuthV1, []string{})
282 s.SignURLTestFunc(c, AuthV2, []string{})
283 s.SignURLTestFunc(c, AuthV2, []string{"host", "range", "user-agent"})
286 func (s *OssProgressSuite) TestPutObjectNegative(c *C) {
287 objectName := objectNamePrefix + RandStr(8)
288 localFile := "../sample/The Go Programming Language.html"
291 client, err := New("http://oss-cn-taikang.aliyuncs.com", accessID, accessKey)
294 bucket, err := client.Bucket(bucketName)
297 err = bucket.PutObjectFromFile(objectName, localFile, Progress(&OssProgressListener{}))
298 testLogger.Println(err)
299 c.Assert(err, NotNil)
301 testLogger.Println("OssProgressSuite.TestPutObjectNegative")
305 func (s *OssProgressSuite) TestAppendObject(c *C) {
306 objectName := objectNamePrefix + RandStr(8)
307 objectValue := RandStr(100)
308 var val = []byte(objectValue)
310 var midPos = 1 + rand.Intn(len(val)-1)
313 progressListener := OssProgressListener{}
314 nextPos, err := s.bucket.AppendObject(objectName, bytes.NewReader(val[0:midPos]), nextPos, Progress(&progressListener))
316 c.Assert(progressListener.TotalRwBytes, Equals, nextPos)
319 request := &AppendObjectRequest{
320 ObjectKey: objectName,
321 Reader: bytes.NewReader(val[midPos:]),
324 options := []Option{Progress(&OssProgressListener{})}
325 _, err = s.bucket.DoAppendObject(request, options)
328 testLogger.Println("OssProgressSuite.TestAppendObject")
331 // TestMultipartUpload
332 func (s *OssProgressSuite) TestMultipartUpload(c *C) {
333 objectName := objectNamePrefix + RandStr(8)
334 var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
336 fileInfo, err := os.Stat(fileName)
339 chunks, err := SplitFileByPartNum(fileName, 3)
341 testLogger.Println("chunks:", chunks)
343 fd, err := os.Open(fileName)
348 progressListener := OssProgressListener{}
349 imur, err := s.bucket.InitiateMultipartUpload(objectName)
353 var parts []UploadPart
354 for _, chunk := range chunks {
355 fd.Seek(chunk.Offset, os.SEEK_SET)
356 part, err := s.bucket.UploadPart(imur, fd, chunk.Size, chunk.Number, Progress(&progressListener))
358 parts = append(parts, part)
362 _, err = s.bucket.CompleteMultipartUpload(imur, parts)
364 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
366 err = s.bucket.DeleteObject(objectName)
369 testLogger.Println("OssProgressSuite.TestMultipartUpload")
372 // TestMultipartUploadFromFile
373 func (s *OssProgressSuite) TestMultipartUploadFromFile(c *C) {
374 objectName := objectNamePrefix + RandStr(8)
375 var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
376 fileInfo, err := os.Stat(fileName)
379 chunks, err := SplitFileByPartNum(fileName, 3)
383 imur, err := s.bucket.InitiateMultipartUpload(objectName)
387 progressListener := OssProgressListener{}
388 var parts []UploadPart
389 for _, chunk := range chunks {
390 part, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, chunk.Number, Progress(&progressListener))
392 parts = append(parts, part)
396 _, err = s.bucket.CompleteMultipartUpload(imur, parts)
398 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
400 err = s.bucket.DeleteObject(objectName)
403 testLogger.Println("OssProgressSuite.TestMultipartUploadFromFile")
407 func (s *OssProgressSuite) TestGetObject(c *C) {
408 objectName := objectNamePrefix + RandStr(8)
409 localFile := "../sample/BingWallpaper-2015-11-07.jpg"
410 newFile := "newpic-progress-1.jpg"
412 fileInfo, err := os.Stat(localFile)
415 progressListener := OssProgressListener{}
417 err = s.bucket.PutObjectFromFile(objectName, localFile, Progress(&progressListener))
419 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
422 progressListener.TotalRwBytes = 0
423 body, err := s.bucket.GetObject(objectName, Progress(&progressListener))
425 _, err = ioutil.ReadAll(body)
428 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
431 progressListener.TotalRwBytes = 0
432 err = s.bucket.GetObjectToFile(objectName, newFile, Progress(&progressListener))
434 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
437 progressListener.TotalRwBytes = 0
438 request := &GetObjectRequest{objectName}
439 options := []Option{Progress(&progressListener)}
440 result, err := s.bucket.DoGetObject(request, options)
442 _, err = ioutil.ReadAll(result.Response.Body)
444 result.Response.Body.Close()
445 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
447 // GetObject with range
448 progressListener.TotalRwBytes = 0
449 body, err = s.bucket.GetObject(objectName, Range(1024, 4*1024), Progress(&progressListener))
451 text, err := ioutil.ReadAll(body)
454 c.Assert(progressListener.TotalRwBytes, Equals, int64(len(text)))
456 // PutObject size is 0
457 progressListener.TotalRwBytes = 0
458 err = s.bucket.PutObject(objectName, strings.NewReader(""), Progress(&progressListener))
460 c.Assert(progressListener.TotalRwBytes, Equals, int64(0))
462 // GetObject size is 0
463 progressListener.TotalRwBytes = 0
464 body, err = s.bucket.GetObject(objectName, Progress(&progressListener))
466 _, err = ioutil.ReadAll(body)
469 c.Assert(progressListener.TotalRwBytes, Equals, int64(0))
471 testLogger.Println("OssProgressSuite.TestGetObject")
474 // TestGetObjectNegative
475 func (s *OssProgressSuite) TestGetObjectNegative(c *C) {
476 objectName := objectNamePrefix + RandStr(8)
477 localFile := "../sample/BingWallpaper-2015-11-07.jpg"
480 err := s.bucket.PutObjectFromFile(objectName, localFile)
484 body, err := s.bucket.GetObject(objectName, Progress(&OssProgressListener{}))
487 buf := make([]byte, 4*1024)
488 n, err := body.Read(buf)
491 //time.Sleep(70 * time.Second) TODO
495 n, err = body.Read(buf)
498 c.Assert(err, NotNil)
501 testLogger.Println("OssProgressSuite.TestGetObjectNegative")
505 func (s *OssProgressSuite) TestUploadFile(c *C) {
506 objectName := objectNamePrefix + RandStr(8)
507 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
509 fileInfo, err := os.Stat(fileName)
512 progressListener := OssProgressListener{}
513 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(5), Progress(&progressListener))
515 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
517 progressListener.TotalRwBytes = 0
518 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3), Checkpoint(true, objectName+".cp"), Progress(&progressListener))
520 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
522 testLogger.Println("OssProgressSuite.TestUploadFile")
526 func (s *OssProgressSuite) TestDownloadFile(c *C) {
527 objectName := objectNamePrefix + RandStr(8)
528 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
529 newFile := "down-new-file-progress-2.jpg"
531 fileInfo, err := os.Stat(fileName)
535 err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
538 progressListener := OssProgressListener{}
539 err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(5), Progress(&progressListener))
541 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
543 progressListener.TotalRwBytes = 0
544 err = s.bucket.DownloadFile(objectName, newFile, 1024*1024, Routines(3), Progress(&progressListener))
546 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
548 progressListener.TotalRwBytes = 0
549 err = s.bucket.DownloadFile(objectName, newFile, 50*1024, Routines(3), Checkpoint(true, ""), Progress(&progressListener))
551 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
553 testLogger.Println("OssProgressSuite.TestDownloadFile")
557 func (s *OssProgressSuite) TestCopyFile(c *C) {
558 srcObjectName := objectNamePrefix + RandStr(8)
559 destObjectName := srcObjectName + "-copy"
560 fileName := "../sample/BingWallpaper-2015-11-07.jpg"
562 fileInfo, err := os.Stat(fileName)
566 progressListener := OssProgressListener{}
567 err = s.bucket.UploadFile(srcObjectName, fileName, 100*1024, Routines(3), Progress(&progressListener))
569 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
571 progressListener.TotalRwBytes = 0
572 err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(5), Progress(&progressListener))
574 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
576 progressListener.TotalRwBytes = 0
577 err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(3), Checkpoint(true, ""), Progress(&progressListener))
579 c.Assert(progressListener.TotalRwBytes, Equals, fileInfo.Size())
581 testLogger.Println("OssProgressSuite.TestCopyFile")