multipart_test.go 26 KB

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