16 type OssCrcSuite struct {
21 var _ = Suite(&OssCrcSuite{})
23 // SetUpSuite runs once when the suite starts running
24 func (s *OssCrcSuite) 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 crc started")
38 // TearDownSuite runs before each test or benchmark starts running
39 func (s *OssCrcSuite) TearDownSuite(c *C) {
41 keyMarker := KeyMarker("")
42 uploadIDMarker := UploadIDMarker("")
44 lmur, err := s.bucket.ListMultipartUploads(keyMarker, uploadIDMarker)
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)
52 keyMarker = KeyMarker(lmur.NextKeyMarker)
53 uploadIDMarker = UploadIDMarker(lmur.NextUploadIDMarker)
54 if !lmur.IsTruncated {
62 lor, err := s.bucket.ListObjects(marker)
64 for _, object := range lor.Objects {
65 err = s.bucket.DeleteObject(object.Key)
68 marker = Marker(lor.NextMarker)
75 err := s.client.DeleteBucket(s.bucket.BucketName)
78 testLogger.Println("test crc completed")
81 // SetUpTest runs after each test or benchmark runs
82 func (s *OssCrcSuite) SetUpTest(c *C) {
83 err := removeTempFiles("../oss", ".jpg")
87 // TearDownTest runs once after all tests or benchmarks have finished running
88 func (s *OssCrcSuite) TearDownTest(c *C) {
89 err := removeTempFiles("../oss", ".jpg")
93 // TestCRCGolden tests OSS's CRC64
94 func (s *OssCrcSuite) TestCRCGolden(c *C) {
100 var crcGolden = []crcTest{
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"},
134 var tab = crc64.MakeTable(crc64.ISO)
136 for i := 0; i < len(crcGolden); i++ {
137 golden := crcGolden[i]
138 crc := NewCRC(tab, 0)
139 io.WriteString(crc, golden.in)
142 c.Assert(sum, Equals, golden.out)
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)
152 hash := crc64.New(tabECMA)
153 io.WriteString(hash, str)
155 c.Assert(crc1, Equals, crc)
157 // Test CRC64 combine
158 hash = crc64.New(tabECMA)
159 io.WriteString(hash, str[0:pos])
162 hash = crc64.New(tabECMA)
163 io.WriteString(hash, str[pos:len(str)])
166 crc1 = CRC64Combine(crc1, crc2, uint64(len(str)-pos))
167 c.Assert(crc1, Equals, crc)
170 // TestCRCCombine tests CRC64Combine
171 func (s *OssCrcSuite) TestCRCCombine(c *C) {
173 testCRC64Combine(c, str, (len(str)+1)>>1, 0x995DC9BBDF1939FA)
175 str = "This is a test of the emergency broadcast system."
176 testCRC64Combine(c, str, (len(str)+1)>>1, 0x27DB187FC15BBC72)
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"
184 for i := 0; i <= len(str); i++ {
185 hash := crc64.New(tab)
186 io.WriteString(hash, string(str[0:i]))
189 hash = crc64.New(tab)
190 io.WriteString(hash, string(str[i:len(str)]))
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)
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"
204 body, err := ioutil.ReadFile(fileName)
207 for i := 0; i < 10; i++ {
208 fileParts, err := SplitFileByPartNum(fileName, 1+rand.Intn(9999))
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))
218 testLogger.Println("TestCRCRandomCombine:", crc, i, fileParts)
219 c.Assert(crc == 0x2B612D24FFF64222, Equals, true)
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 := "空山新雨后,天气晚来秋。明月松间照,清泉石上流。竹喧归浣女,莲动下渔舟。随意春芳歇,王孙自可留。"
230 client, err := New(endpoint, accessID, accessKey, EnableCRC(true), EnableMD5(true), MD5ThresholdCalcInMemory(200*1024))
232 bucket, err := client.Bucket(bucketName)
236 err = bucket.PutObject(objectName, strings.NewReader(objectValue))
240 body, err := bucket.GetObject(objectName)
242 _, err = ioutil.ReadAll(body)
247 getResult, err := bucket.DoGetObject(&GetObjectRequest{objectName}, nil)
249 str, err := readBody(getResult.Response.Body)
251 c.Assert(str, Equals, objectValue)
252 c.Assert(getResult.ClientCRC.Sum64(), Equals, getResult.ServerCRC)
255 err = bucket.PutObjectFromFile(objectName, fileName)
259 err = bucket.GetObjectToFile(objectName, newFileName)
261 eq, err := compareFiles(fileName, newFileName)
263 c.Assert(eq, Equals, true)
266 err = bucket.DeleteObject(objectName)
271 nextPos, err = bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
273 nextPos, err = bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
276 err = bucket.DeleteObject(objectName)
279 request := &AppendObjectRequest{
280 ObjectKey: objectName,
281 Reader: strings.NewReader(objectValue),
284 appendResult, err := bucket.DoAppendObject(request, []Option{InitCRC(0)})
286 request.Position = appendResult.NextPosition
287 appendResult, err = bucket.DoAppendObject(request, []Option{InitCRC(appendResult.CRC)})
290 err = s.bucket.DeleteObject(objectName)
294 chunks, err := SplitFileByPartSize(fileName, 100*1024)
295 imurUpload, err := bucket.InitiateMultipartUpload(objectName)
297 var partsUpload []UploadPart
299 for _, chunk := range chunks {
300 part, err := bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
302 partsUpload = append(partsUpload, part)
305 _, err = bucket.CompleteMultipartUpload(imurUpload, partsUpload)
308 // Check MultipartUpload
309 err = bucket.GetObjectToFile(objectName, newFileName)
311 eq, err = compareFiles(fileName, newFileName)
313 c.Assert(eq, Equals, true)
316 _, err = bucket.DeleteObjects([]string{objectName})
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 := "中岁颇好道,晚家南山陲。兴来每独往,胜事空自知。行到水穷处,坐看云起时。偶然值林叟,谈笑无还期。"
327 client, err := New(endpoint, accessID, accessKey, EnableCRC(false), EnableMD5(false))
329 bucket, err := client.Bucket(bucketName)
333 err = bucket.PutObject(objectName, strings.NewReader(objectValue))
337 body, err := bucket.GetObject(objectName)
339 _, err = ioutil.ReadAll(body)
344 getResult, err := bucket.DoGetObject(&GetObjectRequest{objectName}, nil)
346 str, err := readBody(getResult.Response.Body)
348 c.Assert(str, Equals, objectValue)
351 err = bucket.PutObjectFromFile(objectName, fileName)
355 err = bucket.GetObjectToFile(objectName, newFileName)
357 eq, err := compareFiles(fileName, newFileName)
359 c.Assert(eq, Equals, true)
362 err = bucket.DeleteObject(objectName)
367 nextPos, err = bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
369 nextPos, err = bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
372 err = bucket.DeleteObject(objectName)
375 request := &AppendObjectRequest{
376 ObjectKey: objectName,
377 Reader: strings.NewReader(objectValue),
380 appendResult, err := bucket.DoAppendObject(request, []Option{InitCRC(0)})
382 request.Position = appendResult.NextPosition
383 appendResult, err = bucket.DoAppendObject(request, []Option{InitCRC(appendResult.CRC)})
386 err = s.bucket.DeleteObject(objectName)
390 chunks, err := SplitFileByPartSize(fileName, 100*1024)
391 imurUpload, err := bucket.InitiateMultipartUpload(objectName)
393 var partsUpload []UploadPart
395 for _, chunk := range chunks {
396 part, err := bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
398 partsUpload = append(partsUpload, part)
401 _, err = bucket.CompleteMultipartUpload(imurUpload, partsUpload)
404 // Check MultipartUpload
405 err = bucket.GetObjectToFile(objectName, newFileName)
407 eq, err = compareFiles(fileName, newFileName)
409 c.Assert(eq, Equals, true)
412 _, err = bucket.DeleteObjects([]string{objectName})
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 := "积雨空林烟火迟,蒸藜炊黍饷东菑。漠漠水田飞白鹭,阴阴夏木啭黄鹂。山中习静观朝槿,松下清斋折露葵。野老与人争席罢,海鸥何事更相疑。"
422 mh := md5.Sum([]byte(objectValue))
423 md5B64 := base64.StdEncoding.EncodeToString(mh[:])
426 err := s.bucket.PutObject(objectName, strings.NewReader(objectValue), ContentMD5(md5B64))
430 file, err := os.Open(fileName)
433 mdHex := base64.StdEncoding.EncodeToString(md5.Sum(nil)[:])
434 err = s.bucket.PutObjectFromFile(objectName, fileName, ContentMD5(mdHex))
437 err = s.bucket.DeleteObject(objectName)
442 nextPos, err = s.bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
444 nextPos, err = s.bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
447 err = s.bucket.DeleteObject(objectName)
450 request := &AppendObjectRequest{
451 ObjectKey: objectName,
452 Reader: strings.NewReader(objectValue),
455 appendResult, err := s.bucket.DoAppendObject(request, []Option{InitCRC(0)})
457 request.Position = appendResult.NextPosition
458 appendResult, err = s.bucket.DoAppendObject(request, []Option{InitCRC(appendResult.CRC)})
461 err = s.bucket.DeleteObject(objectName)
465 imurUpload, err := s.bucket.InitiateMultipartUpload(objectName)
468 var partsUpload []UploadPart
469 part, err := s.bucket.UploadPart(imurUpload, strings.NewReader(objectValue), (int64)(len([]byte(objectValue))), 1)
471 partsUpload = append(partsUpload, part)
473 _, err = s.bucket.CompleteMultipartUpload(imurUpload, partsUpload)
477 err = s.bucket.DeleteObject(objectName)
481 // TestAppendObjectNegative
482 func (s *OssCrcSuite) TestAppendObjectNegative(c *C) {
483 objectName := objectNamePrefix + RandStr(8)
484 objectValue := "空山不见人,但闻人语响。返影入深林,复照青苔上。"
486 nextPos, err := s.bucket.AppendObject(objectName, strings.NewReader(objectValue), 0, InitCRC(0))
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)