multipart_test.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. // multipart test
  2. package oss
  3. import (
  4. "math/rand"
  5. "net/http"
  6. "os"
  7. "strconv"
  8. "time"
  9. . "gopkg.in/check.v1"
  10. )
  11. type OssBucketMultipartSuite struct {
  12. client *Client
  13. bucket *Bucket
  14. }
  15. var _ = Suite(&OssBucketMultipartSuite{})
  16. // SetUpSuite runs once when the suite starts running
  17. func (s *OssBucketMultipartSuite) SetUpSuite(c *C) {
  18. client, err := New(endpoint, accessID, accessKey)
  19. c.Assert(err, IsNil)
  20. s.client = client
  21. s.client.CreateBucket(bucketName)
  22. time.Sleep(timeoutInOperation)
  23. bucket, err := s.client.Bucket(bucketName)
  24. c.Assert(err, IsNil)
  25. s.bucket = bucket
  26. // Delete part
  27. lmur, err := s.bucket.ListMultipartUploads()
  28. c.Assert(err, IsNil)
  29. for _, upload := range lmur.Uploads {
  30. var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName,
  31. Key: upload.Key, UploadID: upload.UploadID}
  32. err = s.bucket.AbortMultipartUpload(imur)
  33. c.Assert(err, IsNil)
  34. }
  35. // Delete objects
  36. lor, err := s.bucket.ListObjects()
  37. c.Assert(err, IsNil)
  38. for _, object := range lor.Objects {
  39. err = s.bucket.DeleteObject(object.Key)
  40. c.Assert(err, IsNil)
  41. }
  42. testLogger.Println("test multipart started")
  43. }
  44. // TearDownSuite runs before each test or benchmark starts running
  45. func (s *OssBucketMultipartSuite) TearDownSuite(c *C) {
  46. // Delete part
  47. lmur, err := s.bucket.ListMultipartUploads()
  48. c.Assert(err, IsNil)
  49. for _, upload := range lmur.Uploads {
  50. var imur = InitiateMultipartUploadResult{Bucket: s.bucket.BucketName,
  51. Key: upload.Key, UploadID: upload.UploadID}
  52. err = s.bucket.AbortMultipartUpload(imur)
  53. c.Assert(err, IsNil)
  54. }
  55. // Delete objects
  56. lor, err := s.bucket.ListObjects()
  57. c.Assert(err, IsNil)
  58. for _, object := range lor.Objects {
  59. err = s.bucket.DeleteObject(object.Key)
  60. c.Assert(err, IsNil)
  61. }
  62. // Delete bucket
  63. err = s.client.DeleteBucket(s.bucket.BucketName)
  64. c.Assert(err, IsNil)
  65. testLogger.Println("test multipart completed")
  66. }
  67. // SetUpTest runs after each test or benchmark runs
  68. func (s *OssBucketMultipartSuite) SetUpTest(c *C) {
  69. err := removeTempFiles("../oss", ".jpg")
  70. c.Assert(err, IsNil)
  71. }
  72. // TearDownTest runs once after all tests or benchmarks have finished running
  73. func (s *OssBucketMultipartSuite) TearDownTest(c *C) {
  74. err := removeTempFiles("../oss", ".jpg")
  75. c.Assert(err, IsNil)
  76. err = removeTempFiles("../oss", ".temp")
  77. c.Assert(err, IsNil)
  78. err = removeTempFiles("../oss", ".txt1")
  79. c.Assert(err, IsNil)
  80. err = removeTempFiles("../oss", ".txt2")
  81. c.Assert(err, IsNil)
  82. }
  83. // TestMultipartUpload
  84. func (s *OssBucketMultipartSuite) TestMultipartUpload(c *C) {
  85. objectName := objectNamePrefix + "tmu"
  86. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  87. chunks, err := SplitFileByPartNum(fileName, 3)
  88. c.Assert(err, IsNil)
  89. testLogger.Println("chunks:", chunks)
  90. options := []Option{
  91. Expires(futureDate), Meta("my", "myprop"),
  92. }
  93. fd, err := os.Open(fileName)
  94. c.Assert(err, IsNil)
  95. defer fd.Close()
  96. imur, err := s.bucket.InitiateMultipartUpload(objectName, options...)
  97. c.Assert(err, IsNil)
  98. var parts []UploadPart
  99. for _, chunk := range chunks {
  100. fd.Seek(chunk.Offset, os.SEEK_SET)
  101. part, err := s.bucket.UploadPart(imur, fd, chunk.Size, chunk.Number)
  102. c.Assert(err, IsNil)
  103. parts = append(parts, part)
  104. }
  105. cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
  106. c.Assert(err, IsNil)
  107. testLogger.Println("cmur:", cmur)
  108. meta, err := s.bucket.GetObjectDetailedMeta(objectName)
  109. c.Assert(err, IsNil)
  110. testLogger.Println("GetObjectDetailedMeta:", meta)
  111. c.Assert(meta.Get("X-Oss-Meta-My"), Equals, "myprop")
  112. c.Assert(meta.Get("Expires"), Equals, futureDate.Format(http.TimeFormat))
  113. c.Assert(meta.Get("X-Oss-Object-Type"), Equals, "Multipart")
  114. err = s.bucket.GetObjectToFile(objectName, "newpic1.jpg")
  115. c.Assert(err, IsNil)
  116. err = s.bucket.DeleteObject(objectName)
  117. c.Assert(err, IsNil)
  118. }
  119. // TestMultipartUploadFromFile
  120. func (s *OssBucketMultipartSuite) TestMultipartUploadFromFile(c *C) {
  121. objectName := objectNamePrefix + "tmuff"
  122. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  123. chunks, err := SplitFileByPartNum(fileName, 3)
  124. c.Assert(err, IsNil)
  125. testLogger.Println("chunks:", chunks)
  126. options := []Option{
  127. Expires(futureDate), Meta("my", "myprop"),
  128. }
  129. imur, err := s.bucket.InitiateMultipartUpload(objectName, options...)
  130. c.Assert(err, IsNil)
  131. var parts []UploadPart
  132. for _, chunk := range chunks {
  133. part, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, chunk.Number)
  134. c.Assert(err, IsNil)
  135. parts = append(parts, part)
  136. }
  137. cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
  138. c.Assert(err, IsNil)
  139. testLogger.Println("cmur:", cmur)
  140. meta, err := s.bucket.GetObjectDetailedMeta(objectName)
  141. c.Assert(err, IsNil)
  142. testLogger.Println("GetObjectDetailedMeta:", meta)
  143. c.Assert(meta.Get("X-Oss-Meta-My"), Equals, "myprop")
  144. c.Assert(meta.Get("Expires"), Equals, futureDate.Format(http.TimeFormat))
  145. c.Assert(meta.Get("X-Oss-Object-Type"), Equals, "Multipart")
  146. err = s.bucket.GetObjectToFile(objectName, "newpic1.jpg")
  147. c.Assert(err, IsNil)
  148. err = s.bucket.DeleteObject(objectName)
  149. c.Assert(err, IsNil)
  150. }
  151. // TestUploadPartCopy
  152. func (s *OssBucketMultipartSuite) TestUploadPartCopy(c *C) {
  153. objectSrc := objectNamePrefix + "tupc" + "src"
  154. objectDesc := objectNamePrefix + "tupc" + "desc"
  155. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  156. chunks, err := SplitFileByPartNum(fileName, 3)
  157. c.Assert(err, IsNil)
  158. testLogger.Println("chunks:", chunks)
  159. err = s.bucket.PutObjectFromFile(objectSrc, fileName)
  160. c.Assert(err, IsNil)
  161. options := []Option{
  162. Expires(futureDate), Meta("my", "myprop"),
  163. }
  164. imur, err := s.bucket.InitiateMultipartUpload(objectDesc, options...)
  165. c.Assert(err, IsNil)
  166. var parts []UploadPart
  167. for _, chunk := range chunks {
  168. part, err := s.bucket.UploadPartCopy(imur, bucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number))
  169. c.Assert(err, IsNil)
  170. parts = append(parts, part)
  171. }
  172. cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
  173. c.Assert(err, IsNil)
  174. testLogger.Println("cmur:", cmur)
  175. meta, err := s.bucket.GetObjectDetailedMeta(objectDesc)
  176. c.Assert(err, IsNil)
  177. testLogger.Println("GetObjectDetailedMeta:", meta)
  178. c.Assert(meta.Get("X-Oss-Meta-My"), Equals, "myprop")
  179. c.Assert(meta.Get("Expires"), Equals, futureDate.Format(http.TimeFormat))
  180. c.Assert(meta.Get("X-Oss-Object-Type"), Equals, "Multipart")
  181. err = s.bucket.GetObjectToFile(objectDesc, "newpic2.jpg")
  182. c.Assert(err, IsNil)
  183. err = s.bucket.DeleteObject(objectSrc)
  184. c.Assert(err, IsNil)
  185. err = s.bucket.DeleteObject(objectDesc)
  186. c.Assert(err, IsNil)
  187. }
  188. func (s *OssBucketMultipartSuite) TestListUploadedParts(c *C) {
  189. objectName := objectNamePrefix + "tlup"
  190. objectSrc := objectNamePrefix + "tlup" + "src"
  191. objectDesc := objectNamePrefix + "tlup" + "desc"
  192. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  193. chunks, err := SplitFileByPartSize(fileName, 100*1024)
  194. c.Assert(err, IsNil)
  195. testLogger.Println("chunks:", chunks)
  196. err = s.bucket.PutObjectFromFile(objectSrc, fileName)
  197. c.Assert(err, IsNil)
  198. // Upload
  199. imurUpload, err := s.bucket.InitiateMultipartUpload(objectName)
  200. var partsUpload []UploadPart
  201. for _, chunk := range chunks {
  202. part, err := s.bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
  203. c.Assert(err, IsNil)
  204. partsUpload = append(partsUpload, part)
  205. }
  206. // Copy
  207. imurCopy, err := s.bucket.InitiateMultipartUpload(objectDesc)
  208. var partsCopy []UploadPart
  209. for _, chunk := range chunks {
  210. part, err := s.bucket.UploadPartCopy(imurCopy, bucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number))
  211. c.Assert(err, IsNil)
  212. partsCopy = append(partsCopy, part)
  213. }
  214. // List
  215. lupr, err := s.bucket.ListUploadedParts(imurUpload)
  216. c.Assert(err, IsNil)
  217. testLogger.Println("lupr:", lupr)
  218. c.Assert(len(lupr.UploadedParts), Equals, len(chunks))
  219. lupr, err = s.bucket.ListUploadedParts(imurCopy)
  220. c.Assert(err, IsNil)
  221. testLogger.Println("lupr:", lupr)
  222. c.Assert(len(lupr.UploadedParts), Equals, len(chunks))
  223. lmur, err := s.bucket.ListMultipartUploads()
  224. c.Assert(err, IsNil)
  225. testLogger.Println("lmur:", lmur)
  226. // Complete
  227. _, err = s.bucket.CompleteMultipartUpload(imurUpload, partsUpload)
  228. c.Assert(err, IsNil)
  229. _, err = s.bucket.CompleteMultipartUpload(imurCopy, partsCopy)
  230. c.Assert(err, IsNil)
  231. // Download
  232. err = s.bucket.GetObjectToFile(objectDesc, "newpic3.jpg")
  233. c.Assert(err, IsNil)
  234. err = s.bucket.GetObjectToFile(objectName, "newpic4.jpg")
  235. c.Assert(err, IsNil)
  236. err = s.bucket.DeleteObject(objectName)
  237. c.Assert(err, IsNil)
  238. err = s.bucket.DeleteObject(objectDesc)
  239. c.Assert(err, IsNil)
  240. err = s.bucket.DeleteObject(objectSrc)
  241. c.Assert(err, IsNil)
  242. }
  243. func (s *OssBucketMultipartSuite) TestAbortMultipartUpload(c *C) {
  244. objectName := objectNamePrefix + "tamu"
  245. objectSrc := objectNamePrefix + "tamu" + "src"
  246. objectDesc := objectNamePrefix + "tamu" + "desc"
  247. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  248. chunks, err := SplitFileByPartSize(fileName, 100*1024)
  249. c.Assert(err, IsNil)
  250. testLogger.Println("chunks:", chunks)
  251. err = s.bucket.PutObjectFromFile(objectSrc, fileName)
  252. c.Assert(err, IsNil)
  253. // Upload
  254. imurUpload, err := s.bucket.InitiateMultipartUpload(objectName)
  255. var partsUpload []UploadPart
  256. for _, chunk := range chunks {
  257. part, err := s.bucket.UploadPartFromFile(imurUpload, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
  258. c.Assert(err, IsNil)
  259. partsUpload = append(partsUpload, part)
  260. }
  261. // Copy
  262. imurCopy, err := s.bucket.InitiateMultipartUpload(objectDesc)
  263. var partsCopy []UploadPart
  264. for _, chunk := range chunks {
  265. part, err := s.bucket.UploadPartCopy(imurCopy, bucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number))
  266. c.Assert(err, IsNil)
  267. partsCopy = append(partsCopy, part)
  268. }
  269. // List
  270. lupr, err := s.bucket.ListUploadedParts(imurUpload)
  271. c.Assert(err, IsNil)
  272. testLogger.Println("lupr:", lupr)
  273. c.Assert(len(lupr.UploadedParts), Equals, len(chunks))
  274. lupr, err = s.bucket.ListUploadedParts(imurCopy)
  275. c.Assert(err, IsNil)
  276. testLogger.Println("lupr:", lupr)
  277. c.Assert(len(lupr.UploadedParts), Equals, len(chunks))
  278. lmur, err := s.bucket.ListMultipartUploads()
  279. c.Assert(err, IsNil)
  280. testLogger.Println("lmur:", lmur)
  281. c.Assert(len(lmur.Uploads), Equals, 2)
  282. // Abort
  283. err = s.bucket.AbortMultipartUpload(imurUpload)
  284. c.Assert(err, IsNil)
  285. err = s.bucket.AbortMultipartUpload(imurCopy)
  286. c.Assert(err, IsNil)
  287. lmur, err = s.bucket.ListMultipartUploads()
  288. c.Assert(err, IsNil)
  289. testLogger.Println("lmur:", lmur)
  290. c.Assert(len(lmur.Uploads), Equals, 0)
  291. // Download
  292. err = s.bucket.GetObjectToFile(objectDesc, "newpic3.jpg")
  293. c.Assert(err, NotNil)
  294. err = s.bucket.GetObjectToFile(objectName, "newpic4.jpg")
  295. c.Assert(err, NotNil)
  296. }
  297. // TestUploadPartCopyWithConstraints
  298. func (s *OssBucketMultipartSuite) TestUploadPartCopyWithConstraints(c *C) {
  299. objectSrc := objectNamePrefix + "tucwc" + "src"
  300. objectDesc := objectNamePrefix + "tucwc" + "desc"
  301. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  302. chunks, err := SplitFileByPartNum(fileName, 3)
  303. c.Assert(err, IsNil)
  304. testLogger.Println("chunks:", chunks)
  305. err = s.bucket.PutObjectFromFile(objectSrc, fileName)
  306. c.Assert(err, IsNil)
  307. imur, err := s.bucket.InitiateMultipartUpload(objectDesc)
  308. var parts []UploadPart
  309. for _, chunk := range chunks {
  310. _, err = s.bucket.UploadPartCopy(imur, bucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number),
  311. CopySourceIfModifiedSince(futureDate))
  312. c.Assert(err, NotNil)
  313. }
  314. for _, chunk := range chunks {
  315. _, err = s.bucket.UploadPartCopy(imur, bucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number),
  316. CopySourceIfUnmodifiedSince(futureDate))
  317. c.Assert(err, IsNil)
  318. }
  319. meta, err := s.bucket.GetObjectDetailedMeta(objectSrc)
  320. c.Assert(err, IsNil)
  321. testLogger.Println("GetObjectDetailedMeta:", meta)
  322. for _, chunk := range chunks {
  323. _, err = s.bucket.UploadPartCopy(imur, bucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number),
  324. CopySourceIfNoneMatch(meta.Get("Etag")))
  325. c.Assert(err, NotNil)
  326. }
  327. for _, chunk := range chunks {
  328. part, err := s.bucket.UploadPartCopy(imur, bucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number),
  329. CopySourceIfMatch(meta.Get("Etag")))
  330. c.Assert(err, IsNil)
  331. parts = append(parts, part)
  332. }
  333. cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
  334. c.Assert(err, IsNil)
  335. testLogger.Println("cmur:", cmur)
  336. err = s.bucket.GetObjectToFile(objectDesc, "newpic5.jpg")
  337. c.Assert(err, IsNil)
  338. err = s.bucket.DeleteObject(objectSrc)
  339. c.Assert(err, IsNil)
  340. err = s.bucket.DeleteObject(objectDesc)
  341. c.Assert(err, IsNil)
  342. }
  343. // TestMultipartUploadFromFileOutofOrder
  344. func (s *OssBucketMultipartSuite) TestMultipartUploadFromFileOutofOrder(c *C) {
  345. objectName := objectNamePrefix + "tmuffoo"
  346. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  347. chunks, err := SplitFileByPartSize(fileName, 1024*100)
  348. shuffleArray(chunks)
  349. c.Assert(err, IsNil)
  350. testLogger.Println("chunks:", chunks)
  351. imur, err := s.bucket.InitiateMultipartUpload(objectName)
  352. var parts []UploadPart
  353. for _, chunk := range chunks {
  354. _, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
  355. c.Assert(err, IsNil)
  356. }
  357. // Double upload
  358. for _, chunk := range chunks {
  359. part, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, (int)(chunk.Number))
  360. c.Assert(err, IsNil)
  361. parts = append(parts, part)
  362. }
  363. cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
  364. c.Assert(err, IsNil)
  365. testLogger.Println("cmur:", cmur)
  366. err = s.bucket.GetObjectToFile(objectName, "newpic6.jpg")
  367. c.Assert(err, IsNil)
  368. err = s.bucket.DeleteObject(objectName)
  369. c.Assert(err, IsNil)
  370. }
  371. // TestUploadPartCopyOutofOrder
  372. func (s *OssBucketMultipartSuite) TestUploadPartCopyOutofOrder(c *C) {
  373. objectSrc := objectNamePrefix + "tupcoo" + "src"
  374. objectDesc := objectNamePrefix + "tupcoo" + "desc"
  375. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  376. chunks, err := SplitFileByPartSize(fileName, 1024*100)
  377. shuffleArray(chunks)
  378. c.Assert(err, IsNil)
  379. testLogger.Println("chunks:", chunks)
  380. err = s.bucket.PutObjectFromFile(objectSrc, fileName)
  381. c.Assert(err, IsNil)
  382. imur, err := s.bucket.InitiateMultipartUpload(objectDesc)
  383. var parts []UploadPart
  384. for _, chunk := range chunks {
  385. _, err := s.bucket.UploadPartCopy(imur, bucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number))
  386. c.Assert(err, IsNil)
  387. }
  388. // Double copy
  389. for _, chunk := range chunks {
  390. part, err := s.bucket.UploadPartCopy(imur, bucketName, objectSrc, chunk.Offset, chunk.Size, (int)(chunk.Number))
  391. c.Assert(err, IsNil)
  392. parts = append(parts, part)
  393. }
  394. cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
  395. c.Assert(err, IsNil)
  396. testLogger.Println("cmur:", cmur)
  397. err = s.bucket.GetObjectToFile(objectDesc, "newpic7.jpg")
  398. c.Assert(err, IsNil)
  399. err = s.bucket.DeleteObject(objectSrc)
  400. c.Assert(err, IsNil)
  401. err = s.bucket.DeleteObject(objectDesc)
  402. c.Assert(err, IsNil)
  403. }
  404. // TestMultipartUploadFromFileType
  405. func (s *OssBucketMultipartSuite) TestMultipartUploadFromFileType(c *C) {
  406. objectName := objectNamePrefix + "tmuffwm" + ".jpg"
  407. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  408. chunks, err := SplitFileByPartNum(fileName, 4)
  409. c.Assert(err, IsNil)
  410. testLogger.Println("chunks:", chunks)
  411. imur, err := s.bucket.InitiateMultipartUpload(objectName)
  412. var parts []UploadPart
  413. for _, chunk := range chunks {
  414. part, err := s.bucket.UploadPartFromFile(imur, fileName, chunk.Offset, chunk.Size, chunk.Number)
  415. c.Assert(err, IsNil)
  416. parts = append(parts, part)
  417. }
  418. testLogger.Println("parts:", parts)
  419. cmur, err := s.bucket.CompleteMultipartUpload(imur, parts)
  420. c.Assert(err, IsNil)
  421. testLogger.Println("cmur:", cmur)
  422. err = s.bucket.GetObjectToFile(objectName, "newpic8.jpg")
  423. c.Assert(err, IsNil)
  424. meta, err := s.bucket.GetObjectDetailedMeta(objectName)
  425. c.Assert(err, IsNil)
  426. c.Assert(meta.Get("Content-Type"), Equals, "image/jpeg")
  427. err = s.bucket.DeleteObject(objectName)
  428. c.Assert(err, IsNil)
  429. }
  430. func (s *OssBucketMultipartSuite) TestListMultipartUploads(c *C) {
  431. objectName := objectNamePrefix + "tlmu"
  432. imurs := []InitiateMultipartUploadResult{}
  433. for i := 0; i < 20; i++ {
  434. imur, err := s.bucket.InitiateMultipartUpload(objectName + strconv.Itoa(i))
  435. c.Assert(err, IsNil)
  436. imurs = append(imurs, imur)
  437. }
  438. lmpu, err := s.bucket.ListMultipartUploads()
  439. c.Assert(err, IsNil)
  440. c.Assert(len(lmpu.Uploads), Equals, 20)
  441. lmpu, err = s.bucket.ListMultipartUploads(MaxUploads(3))
  442. c.Assert(err, IsNil)
  443. c.Assert(len(lmpu.Uploads), Equals, 3)
  444. lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName))
  445. c.Assert(err, IsNil)
  446. c.Assert(len(lmpu.Uploads), Equals, 20)
  447. lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName + "1"))
  448. c.Assert(err, IsNil)
  449. c.Assert(len(lmpu.Uploads), Equals, 11)
  450. lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName + "22"))
  451. c.Assert(err, IsNil)
  452. c.Assert(len(lmpu.Uploads), Equals, 0)
  453. lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(objectName + "10"))
  454. c.Assert(err, IsNil)
  455. c.Assert(len(lmpu.Uploads), Equals, 17)
  456. lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(objectName+"10"), MaxUploads(3))
  457. c.Assert(err, IsNil)
  458. c.Assert(len(lmpu.Uploads), Equals, 3)
  459. lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectName), Delimiter("4"))
  460. c.Assert(err, IsNil)
  461. c.Assert(len(lmpu.Uploads), Equals, 18)
  462. c.Assert(len(lmpu.CommonPrefixes), Equals, 2)
  463. upLoadIDStr := randStr(3)
  464. lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(objectName+"12"), UploadIDMarker(upLoadIDStr))
  465. c.Assert(err, IsNil)
  466. checkNum := 15
  467. for _, im := range imurs {
  468. if im.Key == objectName+"12" && im.UploadID > "upLoadIDStr" {
  469. checkNum = 16
  470. break
  471. }
  472. }
  473. c.Assert(len(lmpu.Uploads), Equals, checkNum)
  474. //testLogger.Println("UploadIDMarker", lmpu.Uploads)
  475. for _, imur := range imurs {
  476. err = s.bucket.AbortMultipartUpload(imur)
  477. c.Assert(err, IsNil)
  478. }
  479. }
  480. func (s *OssBucketMultipartSuite) TestListMultipartUploadsEncodingKey(c *C) {
  481. objectName := objectNamePrefix + "让你任性让你狂" + "tlmuek"
  482. imurs := []InitiateMultipartUploadResult{}
  483. for i := 0; i < 3; i++ {
  484. imur, err := s.bucket.InitiateMultipartUpload(objectName + strconv.Itoa(i))
  485. c.Assert(err, IsNil)
  486. imurs = append(imurs, imur)
  487. }
  488. lmpu, err := s.bucket.ListMultipartUploads()
  489. c.Assert(err, IsNil)
  490. c.Assert(len(lmpu.Uploads), Equals, 3)
  491. lmpu, err = s.bucket.ListMultipartUploads(Prefix(objectNamePrefix + "让你任性让你狂tlmuek1"))
  492. c.Assert(err, IsNil)
  493. c.Assert(len(lmpu.Uploads), Equals, 1)
  494. lmpu, err = s.bucket.ListMultipartUploads(KeyMarker(objectNamePrefix + "让你任性让你狂tlmuek1"))
  495. c.Assert(err, IsNil)
  496. c.Assert(len(lmpu.Uploads), Equals, 1)
  497. lmpu, err = s.bucket.ListMultipartUploads(EncodingType("url"))
  498. c.Assert(err, IsNil)
  499. for i, upload := range lmpu.Uploads {
  500. c.Assert(upload.Key, Equals, objectNamePrefix+"让你任性让你狂tlmuek"+strconv.Itoa(i))
  501. }
  502. for _, imur := range imurs {
  503. err = s.bucket.AbortMultipartUpload(imur)
  504. c.Assert(err, IsNil)
  505. }
  506. }
  507. func (s *OssBucketMultipartSuite) TestMultipartNegative(c *C) {
  508. objectName := objectNamePrefix + "tmn"
  509. // Key tool long
  510. data := make([]byte, 100*1024)
  511. imur, err := s.bucket.InitiateMultipartUpload(string(data))
  512. c.Assert(err, NotNil)
  513. // Invalid imur
  514. fileName := "../sample/BingWallpaper-2015-11-07.jpg"
  515. fd, err := os.Open(fileName)
  516. c.Assert(err, IsNil)
  517. defer fd.Close()
  518. _, err = s.bucket.UploadPart(imur, fd, 1024, 1)
  519. c.Assert(err, NotNil)
  520. _, err = s.bucket.UploadPartFromFile(imur, fileName, 0, 1024, 1)
  521. c.Assert(err, NotNil)
  522. _, err = s.bucket.UploadPartCopy(imur, bucketName, fileName, 0, 1024, 1)
  523. c.Assert(err, NotNil)
  524. err = s.bucket.AbortMultipartUpload(imur)
  525. c.Assert(err, NotNil)
  526. _, err = s.bucket.ListUploadedParts(imur)
  527. c.Assert(err, NotNil)
  528. // Invalid exist
  529. imur, err = s.bucket.InitiateMultipartUpload(objectName)
  530. c.Assert(err, IsNil)
  531. _, err = s.bucket.UploadPart(imur, fd, 1024, 1)
  532. c.Assert(err, IsNil)
  533. _, err = s.bucket.UploadPart(imur, fd, 102400, 10001)
  534. c.Assert(err, NotNil)
  535. // _, err = s.bucket.UploadPartFromFile(imur, fileName, 0, 1024, 1)
  536. // c.Assert(err, IsNil)
  537. _, err = s.bucket.UploadPartFromFile(imur, fileName, 0, 102400, 10001)
  538. c.Assert(err, NotNil)
  539. _, err = s.bucket.UploadPartCopy(imur, bucketName, fileName, 0, 1024, 1)
  540. c.Assert(err, NotNil)
  541. _, err = s.bucket.UploadPartCopy(imur, bucketName, fileName, 0, 1024, 1000)
  542. c.Assert(err, NotNil)
  543. err = s.bucket.AbortMultipartUpload(imur)
  544. c.Assert(err, IsNil)
  545. // Invalid option
  546. _, err = s.bucket.InitiateMultipartUpload(objectName, IfModifiedSince(futureDate))
  547. c.Assert(err, IsNil)
  548. }
  549. func (s *OssBucketMultipartSuite) TestMultipartUploadFromFileBigFile(c *C) {
  550. objectName := objectNamePrefix + "tmuffbf"
  551. bigFile := "D:\\tmp\\bigfile.zip"
  552. newFile := "D:\\tmp\\newbigfile.zip"
  553. exist, err := isFileExist(bigFile)
  554. c.Assert(err, IsNil)
  555. if !exist {
  556. return
  557. }
  558. chunks, err := SplitFileByPartNum(bigFile, 64)
  559. c.Assert(err, IsNil)
  560. testLogger.Println("chunks:", chunks)
  561. imur, err := s.bucket.InitiateMultipartUpload(objectName)
  562. var parts []UploadPart
  563. start := GetNowSec()
  564. for _, chunk := range chunks {
  565. part, err := s.bucket.UploadPartFromFile(imur, bigFile, chunk.Offset, chunk.Size, (int)(chunk.Number))
  566. c.Assert(err, IsNil)
  567. parts = append(parts, part)
  568. }
  569. end := GetNowSec()
  570. testLogger.Println("Uplaod big file:", bigFile, "use sec:", end-start)
  571. testLogger.Println("parts:", parts)
  572. _, err = s.bucket.CompleteMultipartUpload(imur, parts)
  573. c.Assert(err, IsNil)
  574. start = GetNowSec()
  575. err = s.bucket.GetObjectToFile(objectName, newFile)
  576. c.Assert(err, IsNil)
  577. end = GetNowSec()
  578. testLogger.Println("Download big file:", bigFile, "use sec:", end-start)
  579. start = GetNowSec()
  580. eq, err := compareFiles(bigFile, newFile)
  581. c.Assert(err, IsNil)
  582. c.Assert(eq, Equals, true)
  583. end = GetNowSec()
  584. testLogger.Println("Compare big file:", bigFile, "use sec:", end-start)
  585. err = s.bucket.DeleteObject(objectName)
  586. c.Assert(err, IsNil)
  587. }
  588. // TestUploadFile
  589. func (s *OssBucketMultipartSuite) TestUploadFile(c *C) {
  590. objectName := objectNamePrefix + "tuff"
  591. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  592. newFile := "newfiletuff.jpg"
  593. // Upload with 100K part size
  594. err := s.bucket.UploadFile(objectName, fileName, 100*1024)
  595. c.Assert(err, IsNil)
  596. os.Remove(newFile)
  597. err = s.bucket.GetObjectToFile(objectName, newFile)
  598. c.Assert(err, IsNil)
  599. eq, err := compareFiles(fileName, newFile)
  600. c.Assert(err, IsNil)
  601. c.Assert(eq, Equals, true)
  602. err = s.bucket.DeleteObject(objectName)
  603. c.Assert(err, IsNil)
  604. // Upload with part size equals to 1/4 of the file size
  605. err = s.bucket.UploadFile(objectName, fileName, 482048/4)
  606. c.Assert(err, IsNil)
  607. os.Remove(newFile)
  608. err = s.bucket.GetObjectToFile(objectName, newFile)
  609. c.Assert(err, IsNil)
  610. eq, err = compareFiles(fileName, newFile)
  611. c.Assert(err, IsNil)
  612. c.Assert(eq, Equals, true)
  613. err = s.bucket.DeleteObject(objectName)
  614. c.Assert(err, IsNil)
  615. // Upload with part size equals to the file size
  616. err = s.bucket.UploadFile(objectName, fileName, 482048)
  617. c.Assert(err, IsNil)
  618. os.Remove(newFile)
  619. err = s.bucket.GetObjectToFile(objectName, newFile)
  620. c.Assert(err, IsNil)
  621. eq, err = compareFiles(fileName, newFile)
  622. c.Assert(err, IsNil)
  623. c.Assert(eq, Equals, true)
  624. err = s.bucket.DeleteObject(objectName)
  625. c.Assert(err, IsNil)
  626. // Upload with part size is bigger than the file size
  627. err = s.bucket.UploadFile(objectName, fileName, 482049)
  628. c.Assert(err, IsNil)
  629. os.Remove(newFile)
  630. err = s.bucket.GetObjectToFile(objectName, newFile)
  631. c.Assert(err, IsNil)
  632. eq, err = compareFiles(fileName, newFile)
  633. c.Assert(err, IsNil)
  634. c.Assert(eq, Equals, true)
  635. err = s.bucket.DeleteObject(objectName)
  636. c.Assert(err, IsNil)
  637. // Option
  638. options := []Option{
  639. Expires(futureDate),
  640. ObjectACL(ACLPublicRead),
  641. Meta("myprop", "mypropval")}
  642. err = s.bucket.UploadFile(objectName, fileName, 482049, options...)
  643. c.Assert(err, IsNil)
  644. // Check
  645. os.Remove(newFile)
  646. err = s.bucket.GetObjectToFile(objectName, newFile)
  647. c.Assert(err, IsNil)
  648. eq, err = compareFiles(fileName, newFile)
  649. c.Assert(err, IsNil)
  650. c.Assert(eq, Equals, true)
  651. acl, err := s.bucket.GetObjectACL(objectName)
  652. c.Assert(err, IsNil)
  653. testLogger.Println("GetObjectAcl:", acl)
  654. c.Assert(acl.ACL, Equals, "default")
  655. meta, err := s.bucket.GetObjectDetailedMeta(objectName)
  656. c.Assert(err, IsNil)
  657. testLogger.Println("GetObjectDetailedMeta:", meta)
  658. c.Assert(meta.Get("X-Oss-Meta-Myprop"), Equals, "mypropval")
  659. }
  660. func (s *OssBucketMultipartSuite) TestUploadFileNegative(c *C) {
  661. objectName := objectNamePrefix + "tufn"
  662. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  663. // Smaller than the required minimal part size (100KB)
  664. err := s.bucket.UploadFile(objectName, fileName, 100*1024-1)
  665. c.Assert(err, NotNil)
  666. // Bigger than the max part size (5G)
  667. err = s.bucket.UploadFile(objectName, fileName, 1024*1024*1024*5+1)
  668. c.Assert(err, NotNil)
  669. // File does not exist
  670. err = s.bucket.UploadFile(objectName, "/root/123abc9874", 1024*1024*1024)
  671. c.Assert(err, NotNil)
  672. // Invalid key , key is empty.
  673. err = s.bucket.UploadFile("", fileName, 100*1024)
  674. c.Assert(err, NotNil)
  675. }
  676. // TestDownloadFile
  677. func (s *OssBucketMultipartSuite) TestDownloadFile(c *C) {
  678. objectName := objectNamePrefix + "tdff"
  679. var fileName = "../sample/BingWallpaper-2015-11-07.jpg"
  680. newFile := "newfiletdff.jpg"
  681. err := s.bucket.UploadFile(objectName, fileName, 100*1024)
  682. c.Assert(err, IsNil)
  683. // Download file with part size of 100K
  684. err = s.bucket.DownloadFile(objectName, newFile, 100*1024)
  685. c.Assert(err, IsNil)
  686. os.Remove(newFile)
  687. err = s.bucket.GetObjectToFile(objectName, newFile)
  688. c.Assert(err, IsNil)
  689. eq, err := compareFiles(fileName, newFile)
  690. c.Assert(err, IsNil)
  691. c.Assert(eq, Equals, true)
  692. // Download the file with part size equals to 1/4 of the file size
  693. err = s.bucket.DownloadFile(objectName, newFile, 482048/4)
  694. c.Assert(err, IsNil)
  695. os.Remove(newFile)
  696. err = s.bucket.GetObjectToFile(objectName, newFile)
  697. c.Assert(err, IsNil)
  698. eq, err = compareFiles(fileName, newFile)
  699. c.Assert(err, IsNil)
  700. c.Assert(eq, Equals, true)
  701. // Download the file with part size same as the file size
  702. err = s.bucket.DownloadFile(objectName, newFile, 482048)
  703. c.Assert(err, IsNil)
  704. os.Remove(newFile)
  705. err = s.bucket.GetObjectToFile(objectName, newFile)
  706. c.Assert(err, IsNil)
  707. eq, err = compareFiles(fileName, newFile)
  708. c.Assert(err, IsNil)
  709. c.Assert(eq, Equals, true)
  710. // Download the file with part size bigger than the file size
  711. err = s.bucket.DownloadFile(objectName, newFile, 482049)
  712. c.Assert(err, IsNil)
  713. os.Remove(newFile)
  714. err = s.bucket.GetObjectToFile(objectName, newFile)
  715. c.Assert(err, IsNil)
  716. eq, err = compareFiles(fileName, newFile)
  717. c.Assert(err, IsNil)
  718. c.Assert(eq, Equals, true)
  719. // Option
  720. meta, err := s.bucket.GetObjectDetailedMeta(objectName)
  721. c.Assert(err, IsNil)
  722. testLogger.Println("GetObjectDetailedMeta:", meta)
  723. // If-Match
  724. err = s.bucket.DownloadFile(objectName, newFile, 482048/4, IfMatch(meta.Get("Etag")))
  725. c.Assert(err, IsNil)
  726. os.Remove(newFile)
  727. err = s.bucket.GetObjectToFile(objectName, newFile)
  728. c.Assert(err, IsNil)
  729. eq, err = compareFiles(fileName, newFile)
  730. c.Assert(err, IsNil)
  731. c.Assert(eq, Equals, true)
  732. // If-None-Match
  733. err = s.bucket.DownloadFile(objectName, newFile, 482048, IfNoneMatch(meta.Get("Etag")))
  734. c.Assert(err, NotNil)
  735. os.Remove(newFile)
  736. err = s.bucket.DeleteObject(objectName)
  737. c.Assert(err, IsNil)
  738. }
  739. func (s *OssBucketMultipartSuite) TestDownloadFileNegative(c *C) {
  740. objectName := objectNamePrefix + "tufn"
  741. newFile := "newfiletudff.jpg"
  742. // Smaller than the required minimal part size (100KB)
  743. err := s.bucket.DownloadFile(objectName, newFile, 100*1024-1)
  744. c.Assert(err, NotNil)
  745. // Bigger than the required max part size (5G)
  746. err = s.bucket.DownloadFile(objectName, newFile, 1024*1024*1024+1)
  747. c.Assert(err, NotNil)
  748. // File does not exist
  749. err = s.bucket.DownloadFile(objectName, "/OSS/TEMP/ZIBI/QUQU/BALA", 1024*1024*1024+1)
  750. c.Assert(err, NotNil)
  751. // Key does not exist
  752. err = s.bucket.DownloadFile(objectName, newFile, 100*1024)
  753. c.Assert(err, NotNil)
  754. }
  755. // Private
  756. func shuffleArray(chunks []FileChunk) []FileChunk {
  757. for i := range chunks {
  758. j := rand.Intn(i + 1)
  759. chunks[i], chunks[j] = chunks[j], chunks[i]
  760. }
  761. return chunks
  762. }