OSDN Git Service

Create ossClient.go (#574)
[bytom/vapor.git] / vendor / github.com / aliyun / aliyun-oss-go-sdk / oss / multicopy_test.go
1 package oss
2
3 import (
4         "fmt"
5         "net/http"
6         "os"
7         "strings"
8         "time"
9
10         . "gopkg.in/check.v1"
11 )
12
13 type OssCopySuite struct {
14         client *Client
15         bucket *Bucket
16 }
17
18 var _ = Suite(&OssCopySuite{})
19
20 // SetUpSuite runs once when the suite starts running
21 func (s *OssCopySuite) SetUpSuite(c *C) {
22         client, err := New(endpoint, accessID, accessKey)
23         c.Assert(err, IsNil)
24         s.client = client
25
26         s.client.CreateBucket(bucketName)
27
28         bucket, err := s.client.Bucket(bucketName)
29         c.Assert(err, IsNil)
30         s.bucket = bucket
31
32         testLogger.Println("test copy started")
33 }
34
35 // TearDownSuite runs before each test or benchmark starts running
36 func (s *OssCopySuite) TearDownSuite(c *C) {
37         // Delete Part
38         keyMarker := KeyMarker("")
39         uploadIDMarker := UploadIDMarker("")
40         for {
41                 lmur, err := s.bucket.ListMultipartUploads(keyMarker, uploadIDMarker)
42                 c.Assert(err, IsNil)
43                 for _, upload := range lmur.Uploads {
44                         var imur = InitiateMultipartUploadResult{Bucket: bucketName,
45                                 Key: upload.Key, UploadID: upload.UploadID}
46                         err = s.bucket.AbortMultipartUpload(imur)
47                         c.Assert(err, IsNil)
48                 }
49                 keyMarker = KeyMarker(lmur.NextKeyMarker)
50                 uploadIDMarker = UploadIDMarker(lmur.NextUploadIDMarker)
51                 if !lmur.IsTruncated {
52                         break
53                 }
54         }
55
56         // Delete objects
57         marker := Marker("")
58         for {
59                 lor, err := s.bucket.ListObjects(marker)
60                 c.Assert(err, IsNil)
61                 for _, object := range lor.Objects {
62                         err = s.bucket.DeleteObject(object.Key)
63                         c.Assert(err, IsNil)
64                 }
65                 marker = Marker(lor.NextMarker)
66                 if !lor.IsTruncated {
67                         break
68                 }
69         }
70
71         // Delete bucket
72         err := s.client.DeleteBucket(s.bucket.BucketName)
73         c.Assert(err, IsNil)
74
75         testLogger.Println("test copy completed")
76 }
77
78 // SetUpTest runs after each test or benchmark runs
79 func (s *OssCopySuite) SetUpTest(c *C) {
80         err := removeTempFiles("../oss", ".jpg")
81         c.Assert(err, IsNil)
82 }
83
84 // TearDownTest runs once after all tests or benchmarks have finished running
85 func (s *OssCopySuite) TearDownTest(c *C) {
86         err := removeTempFiles("../oss", ".jpg")
87         c.Assert(err, IsNil)
88 }
89
90 // TestCopyRoutineWithoutRecovery is multi-routine copy without resumable recovery
91 func (s *OssCopySuite) TestCopyRoutineWithoutRecovery(c *C) {
92         srcObjectName := objectNamePrefix + RandStr(8)
93         destObjectName := srcObjectName + "-dest"
94         fileName := "../sample/BingWallpaper-2015-11-07.jpg"
95         newFile := "copy-new-file.jpg"
96
97         // Upload source file
98         err := s.bucket.UploadFile(srcObjectName, fileName, 100*1024, Routines(3))
99         c.Assert(err, IsNil)
100         os.Remove(newFile)
101
102         // Does not specify parameter 'routines', by default it's single routine
103         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024)
104         c.Assert(err, IsNil)
105
106         err = s.bucket.GetObjectToFile(destObjectName, newFile)
107         c.Assert(err, IsNil)
108
109         eq, err := compareFiles(fileName, newFile)
110         c.Assert(err, IsNil)
111         c.Assert(eq, Equals, true)
112
113         err = s.bucket.DeleteObject(destObjectName)
114         c.Assert(err, IsNil)
115         os.Remove(newFile)
116
117         // Specify one routine.
118         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(1))
119         c.Assert(err, IsNil)
120
121         err = s.bucket.GetObjectToFile(destObjectName, newFile)
122         c.Assert(err, IsNil)
123
124         eq, err = compareFiles(fileName, newFile)
125         c.Assert(err, IsNil)
126         c.Assert(eq, Equals, true)
127
128         err = s.bucket.DeleteObject(destObjectName)
129         c.Assert(err, IsNil)
130         os.Remove(newFile)
131
132         // Specify three routines, which is less than parts count 5
133         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(3))
134         c.Assert(err, IsNil)
135
136         err = s.bucket.GetObjectToFile(destObjectName, newFile)
137         c.Assert(err, IsNil)
138
139         eq, err = compareFiles(fileName, newFile)
140         c.Assert(err, IsNil)
141         c.Assert(eq, Equals, true)
142
143         err = s.bucket.DeleteObject(destObjectName)
144         c.Assert(err, IsNil)
145         os.Remove(newFile)
146
147         // Specify 5 routines which is the same as parts count
148         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(5))
149         c.Assert(err, IsNil)
150
151         err = s.bucket.GetObjectToFile(destObjectName, newFile)
152         c.Assert(err, IsNil)
153
154         eq, err = compareFiles(fileName, newFile)
155         c.Assert(err, IsNil)
156         c.Assert(eq, Equals, true)
157
158         err = s.bucket.DeleteObject(destObjectName)
159         c.Assert(err, IsNil)
160         os.Remove(newFile)
161
162         // Specify routine count 10, which is more than parts count
163         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(10))
164         c.Assert(err, IsNil)
165
166         err = s.bucket.GetObjectToFile(destObjectName, newFile)
167         c.Assert(err, IsNil)
168
169         eq, err = compareFiles(fileName, newFile)
170         c.Assert(err, IsNil)
171         c.Assert(eq, Equals, true)
172
173         err = s.bucket.DeleteObject(destObjectName)
174         c.Assert(err, IsNil)
175         os.Remove(newFile)
176
177         // Invalid routine count, will use single routine
178         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(-1))
179         c.Assert(err, IsNil)
180
181         err = s.bucket.GetObjectToFile(destObjectName, newFile)
182         c.Assert(err, IsNil)
183
184         eq, err = compareFiles(fileName, newFile)
185         c.Assert(err, IsNil)
186         c.Assert(eq, Equals, true)
187
188         err = s.bucket.DeleteObject(destObjectName)
189         c.Assert(err, IsNil)
190         os.Remove(newFile)
191
192         // Option
193         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(3), Meta("myprop", "mypropval"))
194
195         meta, err := s.bucket.GetObjectDetailedMeta(destObjectName)
196         c.Assert(err, IsNil)
197         c.Assert(meta.Get("X-Oss-Meta-Myprop"), Equals, "mypropval")
198
199         err = s.bucket.GetObjectToFile(destObjectName, 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(destObjectName)
207         c.Assert(err, IsNil)
208         os.Remove(newFile)
209
210         err = s.bucket.DeleteObject(srcObjectName)
211         c.Assert(err, IsNil)
212 }
213
214 // CopyErrorHooker is a copypart request hook
215 func CopyErrorHooker(part copyPart) error {
216         if part.Number == 5 {
217                 time.Sleep(time.Second)
218                 return fmt.Errorf("ErrorHooker")
219         }
220         return nil
221 }
222
223 // TestCopyRoutineWithoutRecoveryNegative is a multiple routines copy without checkpoint
224 func (s *OssCopySuite) TestCopyRoutineWithoutRecoveryNegative(c *C) {
225         srcObjectName := objectNamePrefix + RandStr(8)
226         destObjectName := srcObjectName + "-dest"
227         fileName := "../sample/BingWallpaper-2015-11-07.jpg"
228
229         // Upload source file
230         err := s.bucket.UploadFile(srcObjectName, fileName, 100*1024, Routines(3))
231         c.Assert(err, IsNil)
232
233         copyPartHooker = CopyErrorHooker
234         // Worker routine errors
235         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 100*1024, Routines(2))
236
237         c.Assert(err, NotNil)
238         c.Assert(err.Error(), Equals, "ErrorHooker")
239         copyPartHooker = defaultCopyPartHook
240
241         // Source bucket does not exist
242         err = s.bucket.CopyFile("notexist", srcObjectName, destObjectName, 100*1024, Routines(2))
243         c.Assert(err, NotNil)
244
245         // Target object does not exist
246         err = s.bucket.CopyFile(bucketName, "notexist", destObjectName, 100*1024, Routines(2))
247
248         // The part size is invalid
249         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024, Routines(2))
250         c.Assert(err, NotNil)
251
252         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*1024*1024*100, Routines(2))
253         c.Assert(err, NotNil)
254
255         // Delete the source file
256         err = s.bucket.DeleteObject(srcObjectName)
257         c.Assert(err, IsNil)
258 }
259
260 // TestCopyRoutineWithRecovery is a multiple routines copy with resumable recovery
261 func (s *OssCopySuite) TestCopyRoutineWithRecovery(c *C) {
262         srcObjectName := objectNamePrefix + RandStr(8)
263         destObjectName := srcObjectName + "-dest"
264         fileName := "../sample/BingWallpaper-2015-11-07.jpg"
265         newFile := RandStr(8) + ".jpg"
266
267         // Upload source file
268         err := s.bucket.UploadFile(srcObjectName, fileName, 100*1024, Routines(3))
269         c.Assert(err, IsNil)
270         os.Remove(newFile)
271
272         // Routines default value, CP's default path is destObjectName+.cp
273         // Copy object with checkpoint enabled, single runtine.
274         // Copy 4 parts---the CopyErrorHooker makes sure the copy of part 5 will fail.
275         copyPartHooker = CopyErrorHooker
276         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Checkpoint(true, destObjectName+".cp"))
277         c.Assert(err, NotNil)
278         c.Assert(err.Error(), Equals, "ErrorHooker")
279         copyPartHooker = defaultCopyPartHook
280
281         // Check CP
282         ccp := copyCheckpoint{}
283         err = ccp.load(destObjectName + ".cp")
284         c.Assert(err, IsNil)
285         c.Assert(ccp.Magic, Equals, copyCpMagic)
286         c.Assert(len(ccp.MD5), Equals, len("LC34jZU5xK4hlxi3Qn3XGQ=="))
287         c.Assert(ccp.SrcBucketName, Equals, bucketName)
288         c.Assert(ccp.SrcObjectKey, Equals, srcObjectName)
289         c.Assert(ccp.DestBucketName, Equals, bucketName)
290         c.Assert(ccp.DestObjectKey, Equals, destObjectName)
291         c.Assert(len(ccp.CopyID), Equals, len("3F79722737D1469980DACEDCA325BB52"))
292         c.Assert(ccp.ObjStat.Size, Equals, int64(482048))
293         c.Assert(len(ccp.ObjStat.LastModified), Equals, len("2015-12-17 18:43:03 +0800 CST"))
294         c.Assert(ccp.ObjStat.Etag, Equals, "\"2351E662233817A7AE974D8C5B0876DD-5\"")
295         c.Assert(len(ccp.Parts), Equals, 5)
296         c.Assert(len(ccp.todoParts()), Equals, 1)
297         c.Assert(ccp.PartStat[4], Equals, false)
298
299         // Second copy, finish the last part
300         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Checkpoint(true, destObjectName+".cp"))
301         c.Assert(err, IsNil)
302
303         err = s.bucket.GetObjectToFile(destObjectName, newFile)
304         c.Assert(err, IsNil)
305
306         eq, err := compareFiles(fileName, newFile)
307         c.Assert(err, IsNil)
308         c.Assert(eq, Equals, true)
309
310         err = s.bucket.DeleteObject(destObjectName)
311         c.Assert(err, IsNil)
312         os.Remove(newFile)
313
314         err = ccp.load(fileName + ".cp")
315         c.Assert(err, NotNil)
316
317         //multicopy with empty checkpoint path
318         copyPartHooker = CopyErrorHooker
319         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Checkpoint(true, ""))
320         c.Assert(err, NotNil)
321         c.Assert(err.Error(), Equals, "ErrorHooker")
322         copyPartHooker = defaultCopyPartHook
323         ccp = copyCheckpoint{}
324         err = ccp.load(destObjectName + ".cp")
325         c.Assert(err, NotNil)
326
327         //multi copy with checkpoint dir
328         copyPartHooker = CopyErrorHooker
329         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(2), CheckpointDir(true, "./"))
330         c.Assert(err, NotNil)
331         c.Assert(err.Error(), Equals, "ErrorHooker")
332         copyPartHooker = defaultCopyPartHook
333
334         // Check CP
335         ccp = copyCheckpoint{}
336         cpConf := cpConfig{IsEnable: true, DirPath: "./"}
337         cpFilePath := getCopyCpFilePath(&cpConf, bucketName, srcObjectName, s.bucket.BucketName, destObjectName, "")
338         err = ccp.load(cpFilePath)
339         c.Assert(err, IsNil)
340         c.Assert(ccp.Magic, Equals, copyCpMagic)
341         c.Assert(len(ccp.MD5), Equals, len("LC34jZU5xK4hlxi3Qn3XGQ=="))
342         c.Assert(ccp.SrcBucketName, Equals, bucketName)
343         c.Assert(ccp.SrcObjectKey, Equals, srcObjectName)
344         c.Assert(ccp.DestBucketName, Equals, bucketName)
345         c.Assert(ccp.DestObjectKey, Equals, destObjectName)
346         c.Assert(len(ccp.CopyID), Equals, len("3F79722737D1469980DACEDCA325BB52"))
347         c.Assert(ccp.ObjStat.Size, Equals, int64(482048))
348         c.Assert(len(ccp.ObjStat.LastModified), Equals, len("2015-12-17 18:43:03 +0800 CST"))
349         c.Assert(ccp.ObjStat.Etag, Equals, "\"2351E662233817A7AE974D8C5B0876DD-5\"")
350         c.Assert(len(ccp.Parts), Equals, 5)
351         c.Assert(len(ccp.todoParts()), Equals, 1)
352         c.Assert(ccp.PartStat[4], Equals, false)
353
354         // Second copy, finish the last part.
355         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(2), CheckpointDir(true, "./"))
356         c.Assert(err, IsNil)
357
358         err = s.bucket.GetObjectToFile(destObjectName, newFile)
359         c.Assert(err, IsNil)
360
361         eq, err = compareFiles(fileName, newFile)
362         c.Assert(err, IsNil)
363         c.Assert(eq, Equals, true)
364
365         err = s.bucket.DeleteObject(destObjectName)
366         c.Assert(err, IsNil)
367         os.Remove(newFile)
368
369         err = ccp.load(srcObjectName + ".cp")
370         c.Assert(err, NotNil)
371
372         // First copy without error.
373         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(3), Checkpoint(true, destObjectName+".cp"))
374         c.Assert(err, IsNil)
375
376         err = s.bucket.GetObjectToFile(destObjectName, newFile)
377         c.Assert(err, IsNil)
378
379         eq, err = compareFiles(fileName, newFile)
380         c.Assert(err, IsNil)
381         c.Assert(eq, Equals, true)
382
383         err = s.bucket.DeleteObject(destObjectName)
384         c.Assert(err, IsNil)
385         os.Remove(newFile)
386
387         // Copy with multiple coroutines, no errors.
388         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(10), Checkpoint(true, destObjectName+".cp"))
389         c.Assert(err, IsNil)
390
391         err = s.bucket.GetObjectToFile(destObjectName, newFile)
392         c.Assert(err, IsNil)
393
394         eq, err = compareFiles(fileName, newFile)
395         c.Assert(err, IsNil)
396         c.Assert(eq, Equals, true)
397
398         err = s.bucket.DeleteObject(destObjectName)
399         c.Assert(err, IsNil)
400         os.Remove(newFile)
401
402         // Option
403         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(5), Checkpoint(true, destObjectName+".cp"), Meta("myprop", "mypropval"))
404         c.Assert(err, IsNil)
405
406         meta, err := s.bucket.GetObjectDetailedMeta(destObjectName)
407         c.Assert(err, IsNil)
408         c.Assert(meta.Get("X-Oss-Meta-Myprop"), Equals, "mypropval")
409
410         err = s.bucket.GetObjectToFile(destObjectName, newFile)
411         c.Assert(err, IsNil)
412
413         eq, err = compareFiles(fileName, newFile)
414         c.Assert(err, IsNil)
415         c.Assert(eq, Equals, true)
416
417         err = s.bucket.DeleteObject(destObjectName)
418         c.Assert(err, IsNil)
419         os.Remove(newFile)
420
421         // Delete the source file
422         err = s.bucket.DeleteObject(srcObjectName)
423         c.Assert(err, IsNil)
424 }
425
426 // TestCopyRoutineWithRecoveryNegative is a multiple routineed copy without checkpoint
427 func (s *OssCopySuite) TestCopyRoutineWithRecoveryNegative(c *C) {
428         srcObjectName := objectNamePrefix + RandStr(8)
429         destObjectName := srcObjectName + "-dest"
430
431         // Source bucket does not exist
432         err := s.bucket.CopyFile("notexist", srcObjectName, destObjectName, 100*1024, Checkpoint(true, destObjectName+".cp"))
433         c.Assert(err, NotNil)
434         c.Assert(err, NotNil)
435
436         // Source object does not exist
437         err = s.bucket.CopyFile(bucketName, "notexist", destObjectName, 100*1024, Routines(2), Checkpoint(true, destObjectName+".cp"))
438         c.Assert(err, NotNil)
439
440         // Specify part size is invalid.
441         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024, Checkpoint(true, destObjectName+".cp"))
442         c.Assert(err, NotNil)
443
444         err = s.bucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*1024*1024*100, Routines(2), Checkpoint(true, destObjectName+".cp"))
445         c.Assert(err, NotNil)
446 }
447
448 // TestCopyFileCrossBucket is a cross bucket's direct copy.
449 func (s *OssCopySuite) TestCopyFileCrossBucket(c *C) {
450         destBucketName := bucketName + "-desc"
451         srcObjectName := objectNamePrefix + RandStr(8)
452         destObjectName := srcObjectName + "-dest"
453         fileName := "../sample/BingWallpaper-2015-11-07.jpg"
454         newFile := RandStr(8) + ".jpg"
455
456         destBucket, err := s.client.Bucket(destBucketName)
457         c.Assert(err, IsNil)
458
459         // Create a target bucket
460         err = s.client.CreateBucket(destBucketName)
461
462         // Upload source file
463         err = s.bucket.UploadFile(srcObjectName, fileName, 100*1024, Routines(3))
464         c.Assert(err, IsNil)
465         os.Remove(newFile)
466
467         // Copy files
468         err = destBucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(5), Checkpoint(true, destObjectName+".cp"))
469         c.Assert(err, IsNil)
470
471         err = destBucket.GetObjectToFile(destObjectName, newFile)
472         c.Assert(err, IsNil)
473
474         eq, err := compareFiles(fileName, newFile)
475         c.Assert(err, IsNil)
476         c.Assert(eq, Equals, true)
477
478         err = destBucket.DeleteObject(destObjectName)
479         c.Assert(err, IsNil)
480         os.Remove(newFile)
481
482         // Copy file with options
483         err = destBucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, Routines(10), Checkpoint(true, "copy.cp"), Meta("myprop", "mypropval"))
484         c.Assert(err, IsNil)
485
486         err = destBucket.GetObjectToFile(destObjectName, newFile)
487         c.Assert(err, IsNil)
488
489         eq, err = compareFiles(fileName, newFile)
490         c.Assert(err, IsNil)
491         c.Assert(eq, Equals, true)
492
493         err = destBucket.DeleteObject(destObjectName)
494         c.Assert(err, IsNil)
495         os.Remove(newFile)
496
497         // Delete target bucket
498         ForceDeleteBucket(s.client, destBucketName, c)
499 }
500
501 func (s *OssCopySuite) TestVersioningCopyFileCrossBucket(c *C) {
502         // create a bucket with default proprety
503         client, err := New(endpoint, accessID, accessKey)
504         c.Assert(err, IsNil)
505
506         bucketName := bucketNamePrefix + RandLowStr(6)
507         err = client.CreateBucket(bucketName)
508         c.Assert(err, IsNil)
509
510         bucket, err := client.Bucket(bucketName)
511
512         // put bucket version:enabled
513         var versioningConfig VersioningConfig
514         versioningConfig.Status = string(VersionEnabled)
515         err = client.SetBucketVersioning(bucketName, versioningConfig)
516         c.Assert(err, IsNil)
517
518         // begin test
519         objectName := objectNamePrefix + RandStr(8)
520         fileName := "test-file-" + RandStr(8)
521         fileData := RandStr(500 * 1024)
522         CreateFile(fileName, fileData, c)
523         newFile := "test-file-" + RandStr(8)
524         destBucketName := bucketName + "-desc"
525         srcObjectName := objectNamePrefix + RandStr(8)
526         destObjectName := srcObjectName + "-dest"
527
528         // Create dest bucket
529         err = client.CreateBucket(destBucketName)
530         c.Assert(err, IsNil)
531         destBucket, err := client.Bucket(destBucketName)
532         c.Assert(err, IsNil)
533
534         err = client.SetBucketVersioning(destBucketName, versioningConfig)
535         c.Assert(err, IsNil)
536
537         // Upload source file
538         var respHeader http.Header
539         options := []Option{Routines(3), GetResponseHeader(&respHeader)}
540         err = bucket.UploadFile(srcObjectName, fileName, 100*1024, options...)
541         versionId := GetVersionId(respHeader)
542         c.Assert(len(versionId) > 0, Equals, true)
543
544         c.Assert(err, IsNil)
545         os.Remove(newFile)
546
547         // overwrite emtpy object
548         err = bucket.PutObject(srcObjectName, strings.NewReader(""))
549         c.Assert(err, IsNil)
550
551         // Copy files
552         var respCopyHeader http.Header
553         options = []Option{Routines(5), Checkpoint(true, destObjectName+".cp"), GetResponseHeader(&respCopyHeader), VersionId(versionId)}
554         err = destBucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, options...)
555         c.Assert(err, IsNil)
556         versionIdCopy := GetVersionId(respCopyHeader)
557         c.Assert(len(versionIdCopy) > 0, Equals, true)
558
559         err = destBucket.GetObjectToFile(destObjectName, newFile, VersionId(versionIdCopy))
560         c.Assert(err, IsNil)
561
562         eq, err := compareFiles(fileName, newFile)
563         c.Assert(err, IsNil)
564         c.Assert(eq, Equals, true)
565
566         err = destBucket.DeleteObject(destObjectName)
567         c.Assert(err, IsNil)
568         os.Remove(newFile)
569
570         // Copy file with options meta
571         options = []Option{Routines(10), Checkpoint(true, "copy.cp"), Meta("myprop", "mypropval"), GetResponseHeader(&respCopyHeader), VersionId(versionId)}
572         err = destBucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, options...)
573         c.Assert(err, IsNil)
574         versionIdCopy = GetVersionId(respCopyHeader)
575
576         err = destBucket.GetObjectToFile(destObjectName, newFile, VersionId(versionIdCopy))
577         c.Assert(err, IsNil)
578
579         eq, err = compareFiles(fileName, newFile)
580         c.Assert(err, IsNil)
581         c.Assert(eq, Equals, true)
582
583         os.Remove(fileName)
584         os.Remove(newFile)
585         destBucket.DeleteObject(destObjectName)
586         bucket.DeleteObject(objectName)
587         ForceDeleteBucket(client, bucketName, c)
588         ForceDeleteBucket(client, destBucketName, c)
589 }
590
591 // TestCopyFileChoiceOptions
592 func (s *OssCopySuite) TestCopyFileChoiceOptions(c *C) {
593         destBucketName := bucketName + "-desc"
594         srcObjectName := objectNamePrefix + RandStr(8)
595         destObjectName := srcObjectName + "-dest"
596         fileName := "../sample/BingWallpaper-2015-11-07.jpg"
597         newFile := RandStr(8) + ".jpg"
598
599         destBucket, err := s.client.Bucket(destBucketName)
600         c.Assert(err, IsNil)
601
602         // Create a target bucket
603         err = s.client.CreateBucket(destBucketName)
604
605         // Upload source file
606         err = s.bucket.UploadFile(srcObjectName, fileName, 100*1024, Routines(3))
607         c.Assert(err, IsNil)
608         os.Remove(newFile)
609
610         // copyfile with properties
611         options := []Option{
612                 ObjectACL(ACLPublicRead),
613                 RequestPayer(Requester),
614                 TrafficLimitHeader(1024 * 1024 * 8),
615                 ObjectStorageClass(StorageArchive),
616                 ServerSideEncryption("AES256"),
617                 Routines(5), // without checkpoint
618         }
619
620         // Copy files
621         err = destBucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, options...)
622         c.Assert(err, IsNil)
623
624         // check object
625         meta, err := destBucket.GetObjectDetailedMeta(destObjectName)
626         c.Assert(err, IsNil)
627         c.Assert(meta.Get("X-Oss-Storage-Class"), Equals, "Archive")
628         c.Assert(meta.Get("X-Oss-Server-Side-Encryption"), Equals, "AES256")
629
630         aclResult, err := destBucket.GetObjectACL(destObjectName)
631         c.Assert(aclResult.ACL, Equals, "public-read")
632         c.Assert(err, IsNil)
633
634         err = destBucket.DeleteObject(destObjectName)
635         c.Assert(err, IsNil)
636         os.Remove(newFile)
637
638         // Copy file with options
639         options = []Option{
640                 ObjectACL(ACLPublicRead),
641                 RequestPayer(Requester),
642                 TrafficLimitHeader(1024 * 1024 * 8),
643                 ObjectStorageClass(StorageArchive),
644                 ServerSideEncryption("AES256"),
645                 Routines(10),
646                 Checkpoint(true, "copy.cp"), // with checkpoint
647         }
648
649         err = destBucket.CopyFile(bucketName, srcObjectName, destObjectName, 1024*100, options...)
650         c.Assert(err, IsNil)
651
652         // check object
653         meta, err = destBucket.GetObjectDetailedMeta(destObjectName)
654         c.Assert(err, IsNil)
655         c.Assert(meta.Get("X-Oss-Storage-Class"), Equals, "Archive")
656         c.Assert(meta.Get("X-Oss-Server-Side-Encryption"), Equals, "AES256")
657
658         aclResult, err = destBucket.GetObjectACL(destObjectName)
659         c.Assert(aclResult.ACL, Equals, "public-read")
660         c.Assert(err, IsNil)
661
662         err = destBucket.DeleteObject(destObjectName)
663         c.Assert(err, IsNil)
664         os.Remove(newFile)
665
666         // Delete target bucket
667         err = s.client.DeleteBucket(destBucketName)
668         c.Assert(err, IsNil)
669 }