crc_test.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package oss
  2. import (
  3. "crypto/md5"
  4. "encoding/base64"
  5. "io"
  6. "io/ioutil"
  7. "os"
  8. "strings"
  9. "time"
  10. . "gopkg.in/check.v1"
  11. )
  12. type OssCrcSuite struct {
  13. client *Client
  14. bucket *Bucket
  15. }
  16. var _ = Suite(&OssCrcSuite{})
  17. // Run once when the suite starts running
  18. func (s *OssCrcSuite) SetUpSuite(c *C) {
  19. client, err := New(endpoint, accessID, accessKey)
  20. c.Assert(err, IsNil)
  21. s.client = client
  22. s.client.CreateBucket(bucketName)
  23. time.Sleep(5 * time.Second)
  24. bucket, err := s.client.Bucket(bucketName)
  25. c.Assert(err, IsNil)
  26. s.bucket = bucket
  27. testLogger.Println("test crc started")
  28. }
  29. // Run before each test or benchmark starts running
  30. func (s *OssCrcSuite) TearDownSuite(c *C) {
  31. // Delete Part
  32. lmur, err := s.bucket.ListMultipartUploads()
  33. c.Assert(err, IsNil)
  34. for _, upload := range lmur.Uploads {
  35. var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName,
  36. Key: upload.Key, UploadID: upload.UploadID}
  37. err = s.bucket.AbortMultipartUpload(imur)
  38. c.Assert(err, IsNil)
  39. }
  40. // Delete Objects
  41. lor, err := s.bucket.ListObjects()
  42. c.Assert(err, IsNil)
  43. for _, object := range lor.Objects {
  44. err = s.bucket.DeleteObject(object.Key)
  45. c.Assert(err, IsNil)
  46. }
  47. testLogger.Println("test crc completed")
  48. }
  49. // Run after each test or benchmark runs
  50. func (s *OssCrcSuite) SetUpTest(c *C) {
  51. err := removeTempFiles("../oss", ".jpg")
  52. c.Assert(err, IsNil)
  53. }
  54. // Run once after all tests or benchmarks have finished running
  55. func (s *OssCrcSuite) TearDownTest(c *C) {
  56. err := removeTempFiles("../oss", ".jpg")
  57. c.Assert(err, IsNil)
  58. }
  59. // TestEnableCRCAndMD5 开启MD5和CRC校验
  60. func (s *OssCrcSuite) TestEnableCRCAndMD5(c *C) {
  61. objectName := objectNamePrefix + "tecam"
  62. fileName := "../sample/BingWallpaper-2015-11-07.jpg"
  63. newFileName := "BingWallpaper-2015-11-07-2.jpg"
  64. objectValue := "大江东去,浪淘尽,千古风流人物。 故垒西边,人道是、三国周郎赤壁。 乱石穿空,惊涛拍岸,卷起千堆雪。 江山如画,一时多少豪杰。" +
  65. "遥想公谨当年,小乔初嫁了,雄姿英发。 羽扇纶巾,谈笑间、樯橹灰飞烟灭。故国神游,多情应笑我,早生华发,人生如梦,一尊还酹江月。"
  66. client, err := New(endpoint, accessID, accessKey, EnableCRC(true), EnableMD5(true), MD5ThresholdCalcInMemory(200*1024))
  67. c.Assert(err, IsNil)
  68. bucket, err := client.Bucket(bucketName)
  69. c.Assert(err, IsNil)
  70. // PutObject
  71. err = bucket.PutObject(objectName, strings.NewReader(objectValue))
  72. c.Assert(err, IsNil)
  73. // GetObject
  74. body, err := bucket.GetObject(objectName)
  75. c.Assert(err, IsNil)
  76. _, err = ioutil.ReadAll(body)
  77. c.Assert(err, IsNil)
  78. body.Close()
  79. // GetObjectWithCRC
  80. body, calcCRC, srvCRC, err := bucket.GetObjectWithCRC(objectName)
  81. c.Assert(err, IsNil)
  82. str, err := readBody(body)
  83. c.Assert(err, IsNil)
  84. c.Assert(str, Equals, objectValue)
  85. c.Assert(calcCRC.Sum64(), Equals, srvCRC)
  86. // PutObjectFromFile
  87. err = bucket.PutObjectFromFile(objectName, fileName)
  88. c.Assert(err, IsNil)
  89. // GetObjectToFile
  90. err = bucket.GetObjectToFile(objectName, newFileName)
  91. c.Assert(err, IsNil)
  92. eq, err := compareFiles(fileName, newFileName)
  93. c.Assert(err, IsNil)
  94. c.Assert(eq, Equals, true)
  95. // DeleteObject
  96. err = bucket.DeleteObject(objectName)
  97. c.Assert(err, IsNil)
  98. // AppendObject
  99. var nextPos int64
  100. nextPos, err = s.bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
  101. c.Assert(err, IsNil)
  102. err = s.bucket.DeleteObject(objectName)
  103. c.Assert(err, IsNil)
  104. // MultipartUpload
  105. chunks, err := SplitFileByPartSize(fileName, 100*1024)
  106. imurUpload, err := bucket.InitiateMultipartUpload(objectName)
  107. c.Assert(err, IsNil)
  108. var partsUpload []UploadPart
  109. for _, chunk := range chunks {
  110. part, err := bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
  111. c.Assert(err, IsNil)
  112. partsUpload = append(partsUpload, part)
  113. }
  114. _, err = bucket.CompleteMultipartUpload(imurUpload, partsUpload)
  115. c.Assert(err, IsNil)
  116. // Check MultipartUpload
  117. err = bucket.GetObjectToFile(objectName, newFileName)
  118. c.Assert(err, IsNil)
  119. eq, err = compareFiles(fileName, newFileName)
  120. c.Assert(err, IsNil)
  121. c.Assert(eq, Equals, true)
  122. // DeleteObjects
  123. _, err = bucket.DeleteObjects([]string{objectName})
  124. c.Assert(err, IsNil)
  125. }
  126. // TestDisableCRCAndMD5 关闭MD5和CRC校验
  127. func (s *OssCrcSuite) TestDisableCRCAndMD5(c *C) {
  128. objectName := objectNamePrefix + "tdcam"
  129. fileName := "../sample/BingWallpaper-2015-11-07.jpg"
  130. newFileName := "BingWallpaper-2015-11-07-3.jpg"
  131. objectValue := "大江东去,浪淘尽,千古风流人物。 故垒西边,人道是、三国周郎赤壁。 乱石穿空,惊涛拍岸,卷起千堆雪。 江山如画,一时多少豪杰。" +
  132. "遥想公谨当年,小乔初嫁了,雄姿英发。 羽扇纶巾,谈笑间、樯橹灰飞烟灭。故国神游,多情应笑我,早生华发,人生如梦,一尊还酹江月。"
  133. client, err := New(endpoint, accessID, accessKey, EnableCRC(false), EnableMD5(false))
  134. c.Assert(err, IsNil)
  135. bucket, err := client.Bucket(bucketName)
  136. c.Assert(err, IsNil)
  137. // PutObject
  138. err = bucket.PutObject(objectName, strings.NewReader(objectValue))
  139. c.Assert(err, IsNil)
  140. // GetObject
  141. body, err := bucket.GetObject(objectName)
  142. c.Assert(err, IsNil)
  143. _, err = ioutil.ReadAll(body)
  144. c.Assert(err, IsNil)
  145. body.Close()
  146. // GetObjectWithCRC
  147. body, _, _, err = bucket.GetObjectWithCRC(objectName)
  148. c.Assert(err, IsNil)
  149. str, err := readBody(body)
  150. c.Assert(err, IsNil)
  151. c.Assert(str, Equals, objectValue)
  152. // PutObjectFromFile
  153. err = bucket.PutObjectFromFile(objectName, fileName)
  154. c.Assert(err, IsNil)
  155. // GetObjectToFile
  156. err = bucket.GetObjectToFile(objectName, newFileName)
  157. c.Assert(err, IsNil)
  158. eq, err := compareFiles(fileName, newFileName)
  159. c.Assert(err, IsNil)
  160. c.Assert(eq, Equals, true)
  161. // DeleteObject
  162. err = bucket.DeleteObject(objectName)
  163. c.Assert(err, IsNil)
  164. // AppendObject
  165. var nextPos int64
  166. nextPos, err = s.bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos)
  167. c.Assert(err, IsNil)
  168. err = s.bucket.DeleteObject(objectName)
  169. c.Assert(err, IsNil)
  170. // MultipartUpload
  171. chunks, err := SplitFileByPartSize(fileName, 100*1024)
  172. imurUpload, err := bucket.InitiateMultipartUpload(objectName)
  173. c.Assert(err, IsNil)
  174. var partsUpload []UploadPart
  175. for _, chunk := range chunks {
  176. part, err := bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
  177. c.Assert(err, IsNil)
  178. partsUpload = append(partsUpload, part)
  179. }
  180. _, err = bucket.CompleteMultipartUpload(imurUpload, partsUpload)
  181. c.Assert(err, IsNil)
  182. // Check MultipartUpload
  183. err = bucket.GetObjectToFile(objectName, newFileName)
  184. c.Assert(err, IsNil)
  185. eq, err = compareFiles(fileName, newFileName)
  186. c.Assert(err, IsNil)
  187. c.Assert(eq, Equals, true)
  188. // DeleteObjects
  189. _, err = bucket.DeleteObjects([]string{objectName})
  190. c.Assert(err, IsNil)
  191. }
  192. // TestDisableCRCAndMD5 关闭MD5和CRC校验
  193. func (s *OssCrcSuite) TestSpecifyContentMD5(c *C) {
  194. objectName := objectNamePrefix + "tdcam"
  195. fileName := "../sample/BingWallpaper-2015-11-07.jpg"
  196. objectValue := "大江东去,浪淘尽,千古风流人物。 故垒西边,人道是、三国周郎赤壁。 乱石穿空,惊涛拍岸,卷起千堆雪。 江山如画,一时多少豪杰。" +
  197. "遥想公谨当年,小乔初嫁了,雄姿英发。 羽扇纶巾,谈笑间、樯橹灰飞烟灭。故国神游,多情应笑我,早生华发,人生如梦,一尊还酹江月。"
  198. mh := md5.Sum([]byte(objectValue))
  199. md5B64 := base64.StdEncoding.EncodeToString(mh[:])
  200. // PutObject
  201. err := s.bucket.PutObject(objectName, strings.NewReader(objectValue), ContentMD5(md5B64))
  202. c.Assert(err, IsNil)
  203. // PutObjectFromFile
  204. file, err := os.Open(fileName)
  205. md5 := md5.New()
  206. io.Copy(md5, file)
  207. mdHex := base64.StdEncoding.EncodeToString(md5.Sum(nil)[:])
  208. err = s.bucket.PutObjectFromFile(objectName, fileName, ContentMD5(mdHex))
  209. c.Assert(err, IsNil)
  210. err = s.bucket.DeleteObject(objectName)
  211. c.Assert(err, IsNil)
  212. // AppendObject
  213. var nextPos int64
  214. nextPos, err = s.bucket.AppendObject(objectName, strings.NewReader(objectValue), nextPos, ContentMD5(md5B64))
  215. c.Assert(err, IsNil)
  216. err = s.bucket.DeleteObject(objectName)
  217. c.Assert(err, IsNil)
  218. // MultipartUpload
  219. imurUpload, err := s.bucket.InitiateMultipartUpload(objectName)
  220. c.Assert(err, IsNil)
  221. var partsUpload []UploadPart
  222. part, err := s.bucket.UploadPart(imurUpload, strings.NewReader(objectValue), (int64)(len([]byte(objectValue))), 1)
  223. c.Assert(err, IsNil)
  224. partsUpload = append(partsUpload, part)
  225. _, err = s.bucket.CompleteMultipartUpload(imurUpload, partsUpload)
  226. c.Assert(err, IsNil)
  227. // DeleteObject
  228. err = s.bucket.DeleteObject(objectName)
  229. c.Assert(err, IsNil)
  230. }