multipart_test.go 28 KB

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