download_test.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. package oss
  2. import (
  3. "fmt"
  4. "os"
  5. "time"
  6. . "gopkg.in/check.v1"
  7. )
  8. type OssDownloadSuite struct {
  9. client *Client
  10. bucket *Bucket
  11. }
  12. var _ = Suite(&OssDownloadSuite{})
  13. // Run once when the suite starts running
  14. func (s *OssDownloadSuite) SetUpSuite(c *C) {
  15. client, err := New(endpoint, accessID, accessKey)
  16. c.Assert(err, IsNil)
  17. s.client = client
  18. s.client.CreateBucket(bucketName)
  19. time.Sleep(5 * time.Second)
  20. bucket, err := s.client.Bucket(bucketName)
  21. c.Assert(err, IsNil)
  22. s.bucket = bucket
  23. testLogger.Println("test download started")
  24. }
  25. // Run before each test or benchmark starts running
  26. func (s *OssDownloadSuite) TearDownSuite(c *C) {
  27. // Delete Part
  28. lmur, err := s.bucket.ListMultipartUploads()
  29. c.Assert(err, IsNil)
  30. for _, upload := range lmur.Uploads {
  31. var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName,
  32. Key: upload.Key, UploadID: upload.UploadID}
  33. err = s.bucket.AbortMultipartUpload(imur)
  34. c.Assert(err, IsNil)
  35. }
  36. // Delete Objects
  37. lor, err := s.bucket.ListObjects()
  38. c.Assert(err, IsNil)
  39. for _, object := range lor.Objects {
  40. err = s.bucket.DeleteObject(object.Key)
  41. c.Assert(err, IsNil)
  42. }
  43. testLogger.Println("test download completed")
  44. }
  45. // Run after each test or benchmark runs
  46. func (s *OssDownloadSuite) SetUpTest(c *C) {
  47. err := removeTempFiles("../oss", ".jpg")
  48. c.Assert(err, IsNil)
  49. }
  50. // Run once after all tests or benchmarks have finished running
  51. func (s *OssDownloadSuite) TearDownTest(c *C) {
  52. err := removeTempFiles("../oss", ".jpg")
  53. c.Assert(err, IsNil)
  54. err = removeTempFiles("../oss", ".temp")
  55. c.Assert(err, IsNil)
  56. }
  57. // TestUploadRoutineWithoutRecovery 多线程无断点恢复的下载
  58. func (s *OssDownloadSuite) TestDownloadRoutineWithoutRecovery(c *C) {
  59. objectName := objectNamePrefix + "tdrwr"
  60. fileName := "../sample/BingWallpaper-2015-11-07.jpg"
  61. newFile := "down-new-file.jpg"
  62. // 上传文件
  63. err := s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
  64. c.Assert(err, IsNil)
  65. // 使用默认值下载
  66. err = s.bucket.DownloadFile(objectName, newFile, 100*1024)
  67. c.Assert(err, IsNil)
  68. // check
  69. eq, err := compareFiles(fileName, newFile)
  70. c.Assert(err, IsNil)
  71. c.Assert(eq, Equals, true)
  72. // 使用2个协程下载,小于总分片数5
  73. os.Remove(newFile)
  74. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(2))
  75. c.Assert(err, IsNil)
  76. // check
  77. eq, err = compareFiles(fileName, newFile)
  78. c.Assert(err, IsNil)
  79. c.Assert(eq, Equals, true)
  80. // 使用5个协程下载,等于总分片数5
  81. os.Remove(newFile)
  82. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(5))
  83. c.Assert(err, IsNil)
  84. // check
  85. eq, err = compareFiles(fileName, newFile)
  86. c.Assert(err, IsNil)
  87. c.Assert(eq, Equals, true)
  88. // 使用10个协程下载,大于总分片数5
  89. os.Remove(newFile)
  90. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(10))
  91. c.Assert(err, IsNil)
  92. // check
  93. eq, err = compareFiles(fileName, newFile)
  94. c.Assert(err, IsNil)
  95. c.Assert(eq, Equals, true)
  96. err = s.bucket.DeleteObject(objectName)
  97. c.Assert(err, IsNil)
  98. }
  99. // ErrorHooker DownloadPart请求Hook
  100. func DownErrorHooker(part downloadPart) error {
  101. if part.Index == 4 {
  102. time.Sleep(time.Second)
  103. return fmt.Errorf("ErrorHooker")
  104. }
  105. return nil
  106. }
  107. // TestDownloadRoutineWithRecovery 多线程有断点恢复的下载
  108. func (s *OssDownloadSuite) TestDownloadRoutineWithRecovery(c *C) {
  109. objectName := objectNamePrefix + "tdrtr"
  110. fileName := "../sample/BingWallpaper-2015-11-07.jpg"
  111. newFile := "down-new-file-2.jpg"
  112. // 上传文件
  113. err := s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
  114. c.Assert(err, IsNil)
  115. // 下载,CP使用默认值
  116. downloadPartHooker = DownErrorHooker
  117. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Checkpoint(true, ""))
  118. c.Assert(err, NotNil)
  119. c.Assert(err.Error(), Equals, "ErrorHooker")
  120. downloadPartHooker = defaultDownloadPartHook
  121. // check
  122. dcp := downloadCheckpoint{}
  123. err = dcp.load(newFile + ".cp")
  124. c.Assert(err, IsNil)
  125. c.Assert(dcp.Magic, Equals, downloadCpMagic)
  126. c.Assert(len(dcp.MD5), Equals, len("LC34jZU5xK4hlxi3Qn3XGQ=="))
  127. c.Assert(dcp.FilePath, Equals, newFile)
  128. c.Assert(dcp.ObjStat.Size, Equals, int64(482048))
  129. c.Assert(len(dcp.ObjStat.LastModified), Equals, len("2015-12-17 18:43:03 +0800 CST"))
  130. c.Assert(dcp.ObjStat.Etag, Equals, "\"2351E662233817A7AE974D8C5B0876DD-5\"")
  131. c.Assert(dcp.Object, Equals, objectName)
  132. c.Assert(len(dcp.Parts), Equals, 5)
  133. c.Assert(len(dcp.todoParts()), Equals, 1)
  134. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Checkpoint(true, ""))
  135. c.Assert(err, IsNil)
  136. err = dcp.load(newFile + ".cp")
  137. c.Assert(err, NotNil)
  138. eq, err := compareFiles(fileName, newFile)
  139. c.Assert(err, IsNil)
  140. c.Assert(eq, Equals, true)
  141. // 下载,指定CP
  142. os.Remove(newFile)
  143. downloadPartHooker = DownErrorHooker
  144. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Checkpoint(true, objectName+".cp"))
  145. c.Assert(err, NotNil)
  146. c.Assert(err.Error(), Equals, "ErrorHooker")
  147. downloadPartHooker = defaultDownloadPartHook
  148. // check
  149. dcp = downloadCheckpoint{}
  150. err = dcp.load(objectName + ".cp")
  151. c.Assert(err, IsNil)
  152. c.Assert(dcp.Magic, Equals, downloadCpMagic)
  153. c.Assert(len(dcp.MD5), Equals, len("LC34jZU5xK4hlxi3Qn3XGQ=="))
  154. c.Assert(dcp.FilePath, Equals, newFile)
  155. c.Assert(dcp.ObjStat.Size, Equals, int64(482048))
  156. c.Assert(len(dcp.ObjStat.LastModified), Equals, len("2015-12-17 18:43:03 +0800 CST"))
  157. c.Assert(dcp.ObjStat.Etag, Equals, "\"2351E662233817A7AE974D8C5B0876DD-5\"")
  158. c.Assert(dcp.Object, Equals, objectName)
  159. c.Assert(len(dcp.Parts), Equals, 5)
  160. c.Assert(len(dcp.todoParts()), Equals, 1)
  161. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Checkpoint(true, objectName+".cp"))
  162. c.Assert(err, IsNil)
  163. err = dcp.load(objectName + ".cp")
  164. c.Assert(err, NotNil)
  165. eq, err = compareFiles(fileName, newFile)
  166. c.Assert(err, IsNil)
  167. c.Assert(eq, Equals, true)
  168. // 一次完成下载,中间没有错误
  169. os.Remove(newFile)
  170. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Checkpoint(true, ""))
  171. c.Assert(err, IsNil)
  172. err = dcp.load(newFile + ".cp")
  173. c.Assert(err, NotNil)
  174. eq, err = compareFiles(fileName, newFile)
  175. c.Assert(err, IsNil)
  176. c.Assert(eq, Equals, true)
  177. // 一次完成下载,中间没有错误
  178. os.Remove(newFile)
  179. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(10), Checkpoint(true, ""))
  180. c.Assert(err, IsNil)
  181. err = dcp.load(newFile + ".cp")
  182. c.Assert(err, NotNil)
  183. eq, err = compareFiles(fileName, newFile)
  184. c.Assert(err, IsNil)
  185. c.Assert(eq, Equals, true)
  186. err = s.bucket.DeleteObject(objectName)
  187. c.Assert(err, IsNil)
  188. }
  189. // TestDownloadOption 选项
  190. func (s *OssDownloadSuite) TestDownloadOption(c *C) {
  191. objectName := objectNamePrefix + "tdmo"
  192. fileName := "../sample/BingWallpaper-2015-11-07.jpg"
  193. newFile := "down-new-file-3.jpg"
  194. // 上传文件
  195. err := s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
  196. c.Assert(err, IsNil)
  197. meta, err := s.bucket.GetObjectDetailedMeta(objectName)
  198. c.Assert(err, IsNil)
  199. // IfMatch
  200. os.Remove(newFile)
  201. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(3), IfMatch(meta.Get("Etag")))
  202. c.Assert(err, IsNil)
  203. eq, err := compareFiles(fileName, newFile)
  204. c.Assert(err, IsNil)
  205. c.Assert(eq, Equals, true)
  206. // IfNoneMatch
  207. os.Remove(newFile)
  208. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(3), IfNoneMatch(meta.Get("Etag")))
  209. c.Assert(err, NotNil)
  210. // IfMatch
  211. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(3), Checkpoint(true, ""), IfMatch(meta.Get("Etag")))
  212. c.Assert(err, IsNil)
  213. eq, err = compareFiles(fileName, newFile)
  214. c.Assert(err, IsNil)
  215. c.Assert(eq, Equals, true)
  216. // IfNoneMatch
  217. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(3), Checkpoint(true, ""), IfNoneMatch(meta.Get("Etag")))
  218. c.Assert(err, NotNil)
  219. }
  220. // TestDownloadObjectChange 上传过程中文件修改了
  221. func (s *OssDownloadSuite) TestDownloadObjectChange(c *C) {
  222. objectName := objectNamePrefix + "tdloc"
  223. fileName := "../sample/BingWallpaper-2015-11-07.jpg"
  224. newFile := "down-new-file-4.jpg"
  225. // 上传文件
  226. err := s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
  227. c.Assert(err, IsNil)
  228. // 下载,CP使用默认值
  229. downloadPartHooker = DownErrorHooker
  230. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Checkpoint(true, ""))
  231. c.Assert(err, NotNil)
  232. c.Assert(err.Error(), Equals, "ErrorHooker")
  233. downloadPartHooker = defaultDownloadPartHook
  234. err = s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
  235. c.Assert(err, IsNil)
  236. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Checkpoint(true, ""))
  237. c.Assert(err, IsNil)
  238. eq, err := compareFiles(fileName, newFile)
  239. c.Assert(err, IsNil)
  240. c.Assert(eq, Equals, true)
  241. }
  242. // TestDownloadNegative Download Negative
  243. func (s *OssDownloadSuite) TestDownloadNegative(c *C) {
  244. objectName := objectNamePrefix + "tdn"
  245. fileName := "../sample/BingWallpaper-2015-11-07.jpg"
  246. newFile := "down-new-file-3.jpg"
  247. // 上传文件
  248. err := s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
  249. c.Assert(err, IsNil)
  250. // worker线程错误
  251. downloadPartHooker = DownErrorHooker
  252. err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(2))
  253. c.Assert(err, NotNil)
  254. c.Assert(err.Error(), Equals, "ErrorHooker")
  255. downloadPartHooker = defaultDownloadPartHook
  256. // 本地文件不存在
  257. err = s.bucket.DownloadFile(objectName, "/tmp/", 100*1024, Routines(2))
  258. c.Assert(err, NotNil)
  259. // 指定的分片大小无效
  260. err = s.bucket.DownloadFile(objectName, newFile, 0, Routines(2))
  261. c.Assert(err, NotNil)
  262. err = s.bucket.DownloadFile(objectName, newFile, 1024*1024*1024*100, Routines(2))
  263. c.Assert(err, NotNil)
  264. err = s.bucket.DeleteObject(objectName)
  265. c.Assert(err, IsNil)
  266. // 本地文件不存在
  267. err = s.bucket.DownloadFile(objectName, "/tmp/", 100*1024, Checkpoint(true, ""))
  268. c.Assert(err, NotNil)
  269. err = s.bucket.DownloadFile(objectName, "/tmp/", 100*1024, Routines(2), Checkpoint(true, ""))
  270. c.Assert(err, NotNil)
  271. // 指定的分片大小无效
  272. err = s.bucket.DownloadFile(objectName, newFile, -1, Checkpoint(true, ""))
  273. c.Assert(err, NotNil)
  274. err = s.bucket.DownloadFile(objectName, newFile, 0, Routines(2), Checkpoint(true, ""))
  275. c.Assert(err, NotNil)
  276. err = s.bucket.DownloadFile(objectName, newFile, 1024*1024*1024*100, Checkpoint(true, ""))
  277. c.Assert(err, NotNil)
  278. err = s.bucket.DownloadFile(objectName, newFile, 1024*1024*1024*100, Routines(2), Checkpoint(true, ""))
  279. c.Assert(err, NotNil)
  280. }