OSDN Git Service

Create ossClient.go (#574)
[bytom/vapor.git] / vendor / github.com / aliyun / aliyun-oss-go-sdk / oss / crc_test.go
1 package oss
2
3 import (
4         "crypto/md5"
5         "encoding/base64"
6         "hash/crc64"
7         "io"
8         "io/ioutil"
9         "math/rand"
10         "os"
11         "strings"
12
13         . "gopkg.in/check.v1"
14 )
15
16 type OssCrcSuite struct {
17         client *Client
18         bucket *Bucket
19 }
20
21 var _ = Suite(&OssCrcSuite{})
22
23 // SetUpSuite runs once when the suite starts running
24 func (s *OssCrcSuite) SetUpSuite(c *C) {
25         client, err := New(endpoint, accessID, accessKey)
26         c.Assert(err, IsNil)
27         s.client = client
28
29         s.client.CreateBucket(bucketName)
30
31         bucket, err := s.client.Bucket(bucketName)
32         c.Assert(err, IsNil)
33         s.bucket = bucket
34
35         testLogger.Println("test crc started")
36 }
37
38 // TearDownSuite runs before each test or benchmark starts running
39 func (s *OssCrcSuite) TearDownSuite(c *C) {
40         // Delete part
41         keyMarker := KeyMarker("")
42         uploadIDMarker := UploadIDMarker("")
43         for {
44                 lmur, err := s.bucket.ListMultipartUploads(keyMarker, uploadIDMarker)
45                 c.Assert(err, IsNil)
46                 for _, upload := range lmur.Uploads {
47                         var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName,
48                                 Key: upload.Key, UploadID: upload.UploadID}
49                         err = s.bucket.AbortMultipartUpload(imur)
50                         c.Assert(err, IsNil)
51                 }
52                 keyMarker = KeyMarker(lmur.NextKeyMarker)
53                 uploadIDMarker = UploadIDMarker(lmur.NextUploadIDMarker)
54                 if !lmur.IsTruncated {
55                         break
56                 }
57         }
58
59         // Delete objects
60         marker := Marker("")
61         for {
62                 lor, err := s.bucket.ListObjects(marker)
63                 c.Assert(err, IsNil)
64                 for _, object := range lor.Objects {
65                         err = s.bucket.DeleteObject(object.Key)
66                         c.Assert(err, IsNil)
67                 }
68                 marker = Marker(lor.NextMarker)
69                 if !lor.IsTruncated {
70                         break
71                 }
72         }
73
74         // Delete bucket
75         err := s.client.DeleteBucket(s.bucket.BucketName)
76         c.Assert(err, IsNil)
77
78         testLogger.Println("test crc completed")
79 }
80
81 // SetUpTest runs after each test or benchmark runs
82 func (s *OssCrcSuite) SetUpTest(c *C) {
83         err := removeTempFiles("../oss", ".jpg")
84         c.Assert(err, IsNil)
85 }
86
87 // TearDownTest runs once after all tests or benchmarks have finished running
88 func (s *OssCrcSuite) TearDownTest(c *C) {
89         err := removeTempFiles("../oss", ".jpg")
90         c.Assert(err, IsNil)
91 }
92
93 // TestCRCGolden tests OSS's CRC64
94 func (s *OssCrcSuite) TestCRCGolden(c *C) {
95         type crcTest struct {
96                 out uint64
97                 in  string
98         }
99
100         var crcGolden = []crcTest{
101                 {0x0, ""},
102                 {0x3420000000000000, "a"},
103                 {0x36c4200000000000, "ab"},
104                 {0x3776c42000000000, "abc"},
105                 {0x336776c420000000, "abcd"},
106                 {0x32d36776c4200000, "abcde"},
107                 {0x3002d36776c42000, "abcdef"},
108                 {0x31b002d36776c420, "abcdefg"},
109                 {0xe21b002d36776c4, "abcdefgh"},
110                 {0x8b6e21b002d36776, "abcdefghi"},
111                 {0x7f5b6e21b002d367, "abcdefghij"},
112                 {0x8ec0e7c835bf9cdf, "Discard medicine more than two years old."},
113                 {0xc7db1759e2be5ab4, "He who has a shady past knows that nice guys finish last."},
114                 {0xfbf9d9603a6fa020, "I wouldn't marry him with a ten foot pole."},
115                 {0xeafc4211a6daa0ef, "Free! Free!/A trip/to Mars/for 900/empty jars/Burma Shave"},
116                 {0x3e05b21c7a4dc4da, "The days of the digital watch are numbered.  -Tom Stoppard"},
117                 {0x5255866ad6ef28a6, "Nepal premier won't resign."},
118                 {0x8a79895be1e9c361, "For every action there is an equal and opposite government program."},
119                 {0x8878963a649d4916, "His money is twice tainted: 'taint yours and 'taint mine."},
120                 {0xa7b9d53ea87eb82f, "There is no reason for any individual to have a computer in their home. -Ken Olsen, 1977"},
121                 {0xdb6805c0966a2f9c, "It's a tiny change to the code and not completely disgusting. - Bob Manchek"},
122                 {0xf3553c65dacdadd2, "size:  a.out:  bad magic"},
123                 {0x9d5e034087a676b9, "The major problem is with sendmail.  -Mark Horton"},
124                 {0xa6db2d7f8da96417, "Give me a rock, paper and scissors and I will move the world.  CCFestoon"},
125                 {0x325e00cd2fe819f9, "If the enemy is within range, then so are you."},
126                 {0x88c6600ce58ae4c6, "It's well we cannot hear the screams/That we create in others' dreams."},
127                 {0x28c4a3f3b769e078, "You remind me of a TV show, but that's all right: I watch it anyway."},
128                 {0xa698a34c9d9f1dca, "C is as portable as Stonehedge!!"},
129                 {0xf6c1e2a8c26c5cfc, "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"},
130                 {0xd402559dfe9b70c, "The fugacity of a constituent in a mixture of gases at a given temperature is proportional to its mole fraction.  Lewis-Randall Rule"},
131                 {0xdb6efff26aa94946, "How can you write a big system without C++?  -Paul Glick"},
132         }
133
134         var tab = crc64.MakeTable(crc64.ISO)
135
136         for i := 0; i < len(crcGolden); i++ {
137                 golden := crcGolden[i]
138                 crc := NewCRC(tab, 0)
139                 io.WriteString(crc, golden.in)
140                 sum := crc.Sum64()
141
142                 c.Assert(sum, Equals, golden.out)
143         }
144 }
145
146 // testCRC64Combine tests CRC64 on vector[0..pos] which should have CRC64 crc.
147 // Also test CRC64Combine on vector[] split in two.
148 func testCRC64Combine(c *C, str string, pos int, crc uint64) {
149         tabECMA := crc64.MakeTable(crc64.ECMA)
150
151         // Test CRC64
152         hash := crc64.New(tabECMA)
153         io.WriteString(hash, str)
154         crc1 := hash.Sum64()
155         c.Assert(crc1, Equals, crc)
156
157         // Test CRC64 combine
158         hash = crc64.New(tabECMA)
159         io.WriteString(hash, str[0:pos])
160         crc1 = hash.Sum64()
161
162         hash = crc64.New(tabECMA)
163         io.WriteString(hash, str[pos:len(str)])
164         crc2 := hash.Sum64()
165
166         crc1 = CRC64Combine(crc1, crc2, uint64(len(str)-pos))
167         c.Assert(crc1, Equals, crc)
168 }
169
170 // TestCRCCombine tests CRC64Combine
171 func (s *OssCrcSuite) TestCRCCombine(c *C) {
172         str := "123456789"
173         testCRC64Combine(c, str, (len(str)+1)>>1, 0x995DC9BBDF1939FA)
174
175         str = "This is a test of the emergency broadcast system."
176         testCRC64Combine(c, str, (len(str)+1)>>1, 0x27DB187FC15BBC72)
177 }
178
179 // TestCRCRepeatedCombine tests CRC64Combine
180 func (s *OssCrcSuite) TestCRCRepeatedCombine(c *C) {
181         tab := crc64.MakeTable(crc64.ECMA)
182         str := "Even if I could be Shakespeare, I think I should still choose to be Faraday. - A. Huxley"
183
184         for i := 0; i <= len(str); i++ {
185                 hash := crc64.New(tab)
186                 io.WriteString(hash, string(str[0:i]))
187                 prev := hash.Sum64()
188
189                 hash = crc64.New(tab)
190                 io.WriteString(hash, string(str[i:len(str)]))
191                 post := hash.Sum64()
192
193                 crc := CRC64Combine(prev, post, uint64(len(str)-i))
194                 testLogger.Println("TestCRCRepeatedCombine:", prev, post, crc, i, len(str))
195                 c.Assert(crc == 0x7AD25FAFA1710407, Equals, true)
196         }
197 }
198
199 // TestCRCRandomCombine tests CRC64Combine
200 func (s *OssCrcSuite) TestCRCRandomCombine(c *C) {
201         tab := crc64.MakeTable(crc64.ECMA)
202         fileName := "../sample/BingWallpaper-2015-11-07.jpg"
203
204         body, err := ioutil.ReadFile(fileName)
205         c.Assert(err, IsNil)
206
207         for i := 0; i < 10; i++ {
208                 fileParts, err := SplitFileByPartNum(fileName, 1+rand.Intn(9999))
209                 c.Assert(err, IsNil)
210
211                 var crc uint64
212                 for _, part := range fileParts {
213                         calc := NewCRC(tab, 0)
214                         calc.Write(body[part.Offset : part.Offset+part.Size])
215                         crc = CRC64Combine(crc, calc.Sum64(), (uint64)(part.Size))
216                 }
217
218                 testLogger.Println("TestCRCRandomCombine:", crc, i, fileParts)
219                 c.Assert(crc == 0x2B612D24FFF64222, Equals, true)
220         }
221 }
222
223 // TestEnableCRCAndMD5 tests MD5 and CRC check
224 func (s *OssCrcSuite) TestEnableCRCAndMD5(c *C) {
225         objectName := objectNamePrefix + RandStr(8)
226         fileName := "../sample/BingWallpaper-2015-11-07.jpg"
227         newFileName := "BingWallpaper-2015-11-07-2.jpg"
228         objectValue := "空山新雨后,天气晚来秋。明月松间照,清泉石上流。竹喧归浣女,莲动下渔舟。随意春芳歇,王孙自可留。"
229
230         client, err := New(endpoint, accessID, accessKey, EnableCRC(true), EnableMD5(true), MD5ThresholdCalcInMemory(200*1024))
231         c.Assert(err, IsNil)
232         bucket, err := client.Bucket(bucketName)
233         c.Assert(err, IsNil)
234
235         // PutObject
236         err = bucket.PutObject(objectName, strings.NewReader(objectValue))
237         c.Assert(err, IsNil)
238
239         // GetObject
240         body, err := bucket.GetObject(objectName)
241         c.Assert(err, IsNil)
242         _, err = ioutil.ReadAll(body)
243         c.Assert(err, IsNil)
244         body.Close()
245
246         // GetObjectWithCRC
247         getResult, err := bucket.DoGetObject(&GetObjectRequest{objectName}, nil)
248         c.Assert(err, IsNil)
249         str, err := readBody(getResult.Response.Body)
250         c.Assert(err, IsNil)
251         c.Assert(str, Equals, objectValue)
252         c.Assert(getResult.ClientCRC.Sum64(), Equals, getResult.ServerCRC)
253
254         // PutObjectFromFile
255         err = bucket.PutObjectFromFile(objectName, fileName)
256         c.Assert(err, IsNil)
257
258         // GetObjectToFile
259         err = bucket.GetObjectToFile(objectName, newFileName)
260         c.Assert(err, IsNil)
261         eq, err := compareFiles(fileName, newFileName)
262         c.Assert(err, IsNil)
263         c.Assert(eq, Equals, true)
264
265         // DeleteObject
266         err = bucket.DeleteObject(objectName)
267         c.Assert(err, IsNil)
268
269         // AppendObject
270         var nextPos int64
271         nextPos, err = bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
272         c.Assert(err, IsNil)
273         nextPos, err = bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
274         c.Assert(err, IsNil)
275
276         err = bucket.DeleteObject(objectName)
277         c.Assert(err, IsNil)
278
279         request := &AppendObjectRequest{
280                 ObjectKey: objectName,
281                 Reader:    strings.NewReader(objectValue),
282                 Position:  0,
283         }
284         appendResult, err := bucket.DoAppendObject(request, []Option{InitCRC(0)})
285         c.Assert(err, IsNil)
286         request.Position = appendResult.NextPosition
287         appendResult, err = bucket.DoAppendObject(request, []Option{InitCRC(appendResult.CRC)})
288         c.Assert(err, IsNil)
289
290         err = s.bucket.DeleteObject(objectName)
291         c.Assert(err, IsNil)
292
293         // MultipartUpload
294         chunks, err := SplitFileByPartSize(fileName, 100*1024)
295         imurUpload, err := bucket.InitiateMultipartUpload(objectName)
296         c.Assert(err, IsNil)
297         var partsUpload []UploadPart
298
299         for _, chunk := range chunks {
300                 part, err := bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
301                 c.Assert(err, IsNil)
302                 partsUpload = append(partsUpload, part)
303         }
304
305         _, err = bucket.CompleteMultipartUpload(imurUpload, partsUpload)
306         c.Assert(err, IsNil)
307
308         // Check MultipartUpload
309         err = bucket.GetObjectToFile(objectName, newFileName)
310         c.Assert(err, IsNil)
311         eq, err = compareFiles(fileName, newFileName)
312         c.Assert(err, IsNil)
313         c.Assert(eq, Equals, true)
314
315         // DeleteObjects
316         _, err = bucket.DeleteObjects([]string{objectName})
317         c.Assert(err, IsNil)
318 }
319
320 // TestDisableCRCAndMD5 disables MD5 and CRC
321 func (s *OssCrcSuite) TestDisableCRCAndMD5(c *C) {
322         objectName := objectNamePrefix + RandStr(8)
323         fileName := "../sample/BingWallpaper-2015-11-07.jpg"
324         newFileName := "BingWallpaper-2015-11-07-3.jpg"
325         objectValue := "中岁颇好道,晚家南山陲。兴来每独往,胜事空自知。行到水穷处,坐看云起时。偶然值林叟,谈笑无还期。"
326
327         client, err := New(endpoint, accessID, accessKey, EnableCRC(false), EnableMD5(false))
328         c.Assert(err, IsNil)
329         bucket, err := client.Bucket(bucketName)
330         c.Assert(err, IsNil)
331
332         // PutObject
333         err = bucket.PutObject(objectName, strings.NewReader(objectValue))
334         c.Assert(err, IsNil)
335
336         // GetObject
337         body, err := bucket.GetObject(objectName)
338         c.Assert(err, IsNil)
339         _, err = ioutil.ReadAll(body)
340         c.Assert(err, IsNil)
341         body.Close()
342
343         // GetObjectWithCRC
344         getResult, err := bucket.DoGetObject(&GetObjectRequest{objectName}, nil)
345         c.Assert(err, IsNil)
346         str, err := readBody(getResult.Response.Body)
347         c.Assert(err, IsNil)
348         c.Assert(str, Equals, objectValue)
349
350         // PutObjectFromFile
351         err = bucket.PutObjectFromFile(objectName, fileName)
352         c.Assert(err, IsNil)
353
354         // GetObjectToFile
355         err = bucket.GetObjectToFile(objectName, newFileName)
356         c.Assert(err, IsNil)
357         eq, err := compareFiles(fileName, newFileName)
358         c.Assert(err, IsNil)
359         c.Assert(eq, Equals, true)
360
361         // DeleteObject
362         err = bucket.DeleteObject(objectName)
363         c.Assert(err, IsNil)
364
365         // AppendObject
366         var nextPos int64
367         nextPos, err = bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
368         c.Assert(err, IsNil)
369         nextPos, err = bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
370         c.Assert(err, IsNil)
371
372         err = bucket.DeleteObject(objectName)
373         c.Assert(err, IsNil)
374
375         request := &AppendObjectRequest{
376                 ObjectKey: objectName,
377                 Reader:    strings.NewReader(objectValue),
378                 Position:  0,
379         }
380         appendResult, err := bucket.DoAppendObject(request, []Option{InitCRC(0)})
381         c.Assert(err, IsNil)
382         request.Position = appendResult.NextPosition
383         appendResult, err = bucket.DoAppendObject(request, []Option{InitCRC(appendResult.CRC)})
384         c.Assert(err, IsNil)
385
386         err = s.bucket.DeleteObject(objectName)
387         c.Assert(err, IsNil)
388
389         // MultipartUpload
390         chunks, err := SplitFileByPartSize(fileName, 100*1024)
391         imurUpload, err := bucket.InitiateMultipartUpload(objectName)
392         c.Assert(err, IsNil)
393         var partsUpload []UploadPart
394
395         for _, chunk := range chunks {
396                 part, err := bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
397                 c.Assert(err, IsNil)
398                 partsUpload = append(partsUpload, part)
399         }
400
401         _, err = bucket.CompleteMultipartUpload(imurUpload, partsUpload)
402         c.Assert(err, IsNil)
403
404         // Check MultipartUpload
405         err = bucket.GetObjectToFile(objectName, newFileName)
406         c.Assert(err, IsNil)
407         eq, err = compareFiles(fileName, newFileName)
408         c.Assert(err, IsNil)
409         c.Assert(eq, Equals, true)
410
411         // DeleteObjects
412         _, err = bucket.DeleteObjects([]string{objectName})
413         c.Assert(err, IsNil)
414 }
415
416 // TestSpecifyContentMD5 specifies MD5
417 func (s *OssCrcSuite) TestSpecifyContentMD5(c *C) {
418         objectName := objectNamePrefix + RandStr(8)
419         fileName := "../sample/BingWallpaper-2015-11-07.jpg"
420         objectValue := "积雨空林烟火迟,蒸藜炊黍饷东菑。漠漠水田飞白鹭,阴阴夏木啭黄鹂。山中习静观朝槿,松下清斋折露葵。野老与人争席罢,海鸥何事更相疑。"
421
422         mh := md5.Sum([]byte(objectValue))
423         md5B64 := base64.StdEncoding.EncodeToString(mh[:])
424
425         // PutObject
426         err := s.bucket.PutObject(objectName, strings.NewReader(objectValue), ContentMD5(md5B64))
427         c.Assert(err, IsNil)
428
429         // PutObjectFromFile
430         file, err := os.Open(fileName)
431         md5 := md5.New()
432         io.Copy(md5, file)
433         mdHex := base64.StdEncoding.EncodeToString(md5.Sum(nil)[:])
434         err = s.bucket.PutObjectFromFile(objectName, fileName, ContentMD5(mdHex))
435         c.Assert(err, IsNil)
436
437         err = s.bucket.DeleteObject(objectName)
438         c.Assert(err, IsNil)
439
440         // AppendObject
441         var nextPos int64
442         nextPos, err = s.bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
443         c.Assert(err, IsNil)
444         nextPos, err = s.bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
445         c.Assert(err, IsNil)
446
447         err = s.bucket.DeleteObject(objectName)
448         c.Assert(err, IsNil)
449
450         request := &AppendObjectRequest{
451                 ObjectKey: objectName,
452                 Reader:    strings.NewReader(objectValue),
453                 Position:  0,
454         }
455         appendResult, err := s.bucket.DoAppendObject(request, []Option{InitCRC(0)})
456         c.Assert(err, IsNil)
457         request.Position = appendResult.NextPosition
458         appendResult, err = s.bucket.DoAppendObject(request, []Option{InitCRC(appendResult.CRC)})
459         c.Assert(err, IsNil)
460
461         err = s.bucket.DeleteObject(objectName)
462         c.Assert(err, IsNil)
463
464         // MultipartUpload
465         imurUpload, err := s.bucket.InitiateMultipartUpload(objectName)
466         c.Assert(err, IsNil)
467
468         var partsUpload []UploadPart
469         part, err := s.bucket.UploadPart(imurUpload, strings.NewReader(objectValue), (int64)(len([]byte(objectValue))), 1)
470         c.Assert(err, IsNil)
471         partsUpload = append(partsUpload, part)
472
473         _, err = s.bucket.CompleteMultipartUpload(imurUpload, partsUpload)
474         c.Assert(err, IsNil)
475
476         // DeleteObject
477         err = s.bucket.DeleteObject(objectName)
478         c.Assert(err, IsNil)
479 }
480
481 // TestAppendObjectNegative
482 func (s *OssCrcSuite) TestAppendObjectNegative(c *C) {
483         objectName := objectNamePrefix + RandStr(8)
484         objectValue := "空山不见人,但闻人语响。返影入深林,复照青苔上。"
485
486         nextPos, err := s.bucket.AppendObject(objectName, strings.NewReader(objectValue), 0, InitCRC(0))
487         c.Assert(err, IsNil)
488
489         nextPos, err = s.bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos, InitCRC(0))
490         c.Assert(err, NotNil)
491         c.Assert(strings.HasPrefix(err.Error(), "oss: the crc"), Equals, true)
492 }