multipart_test.go 26 KB

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