multipart_test.go 28 KB

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