multipart_test.go 27 KB

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