test_oss_multipart.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  1. #include "CuTest.h"
  2. #include "aos_log.h"
  3. #include "aos_util.h"
  4. #include "aos_string.h"
  5. #include "aos_status.h"
  6. #include "aos_transport.h"
  7. #include "aos_http_io.h"
  8. #include "oss_auth.h"
  9. #include "oss_util.h"
  10. #include "oss_xml.h"
  11. #include "oss_api.h"
  12. #include "oss_config.h"
  13. #include "oss_test_util.h"
  14. #include "oss_multipart.c"
  15. void test_multipart_setup(CuTest *tc)
  16. {
  17. aos_pool_t *p = NULL;
  18. int is_cname = 0;
  19. aos_status_t *s = NULL;
  20. oss_request_options_t *options = NULL;
  21. oss_acl_e oss_acl = OSS_ACL_PRIVATE;
  22. //create test bucket
  23. aos_pool_create(&p, NULL);
  24. options = oss_request_options_create(p);
  25. init_test_request_options(options, is_cname);
  26. s = create_test_bucket(options, TEST_BUCKET_NAME, oss_acl);
  27. CuAssertIntEquals(tc, 200, s->code);
  28. aos_pool_destroy(p);
  29. }
  30. void test_multipart_cleanup(CuTest *tc)
  31. {
  32. aos_pool_t *p = NULL;
  33. int is_cname = 0;
  34. aos_string_t bucket;
  35. oss_request_options_t *options = NULL;
  36. char *object_name = "oss_test_multipart_upload";
  37. char *object_name1 = "oss_test_multipart_upload_from_file";
  38. char *object_name2 = "oss_test_upload_part_copy_dest_object";
  39. char *object_name3 = "oss_test_upload_part_copy_source_object";
  40. char *object_name4 = "oss_test_list_upload_part_with_empty";
  41. char *object_name5 = "test_oss_get_sorted_uploaded_part";
  42. char *object_name6 = "test_oss_get_sorted_uploaded_part_with_empty";
  43. aos_table_t *resp_headers = NULL;
  44. aos_pool_create(&p, NULL);
  45. options = oss_request_options_create(p);
  46. init_test_request_options(options, is_cname);
  47. //delete test object
  48. delete_test_object(options, TEST_BUCKET_NAME, object_name);
  49. delete_test_object(options, TEST_BUCKET_NAME, object_name1);
  50. delete_test_object(options, TEST_BUCKET_NAME, object_name2);
  51. delete_test_object(options, TEST_BUCKET_NAME, object_name3);
  52. delete_test_object(options, TEST_BUCKET_NAME, object_name4);
  53. delete_test_object(options, TEST_BUCKET_NAME, object_name5);
  54. delete_test_object(options, TEST_BUCKET_NAME, object_name6);
  55. //delete test bucket
  56. aos_str_set(&bucket, TEST_BUCKET_NAME);
  57. oss_delete_bucket(options, &bucket, &resp_headers);
  58. apr_sleep(apr_time_from_sec(3));
  59. aos_pool_destroy(p);
  60. }
  61. void test_init_abort_multipart_upload(CuTest *tc)
  62. {
  63. aos_pool_t *p = NULL;
  64. char *object_name = "oss_test_abort_multipart_upload";
  65. oss_request_options_t *options = NULL;
  66. int is_cname = 0;
  67. aos_string_t upload_id;
  68. aos_status_t *s = NULL;
  69. //test init multipart
  70. aos_pool_create(&p, NULL);
  71. options = oss_request_options_create(p);
  72. init_test_request_options(options, is_cname);
  73. s = init_test_multipart_upload(options, TEST_BUCKET_NAME, object_name, &upload_id);
  74. CuAssertIntEquals(tc, 200, s->code);
  75. CuAssertTrue(tc, upload_id.len > 0);
  76. CuAssertPtrNotNull(tc, upload_id.data);
  77. //abort multipart
  78. s = abort_test_multipart_upload(options, TEST_BUCKET_NAME, object_name, &upload_id);
  79. CuAssertIntEquals(tc, 204, s->code);
  80. aos_pool_destroy(p);
  81. printf("test_init_abort_multipart_upload ok\n");
  82. }
  83. void test_list_multipart_upload(CuTest *tc)
  84. {
  85. aos_pool_t *p = NULL;
  86. aos_string_t bucket;
  87. char *object_name1 = "oss_test_abort_multipart_upload1";
  88. char *object_name2 = "oss_test_abort_multipart_upload2";
  89. int is_cname = 0;
  90. oss_request_options_t *options = NULL;
  91. aos_string_t upload_id1;
  92. aos_string_t upload_id2;
  93. aos_status_t *s = NULL;
  94. aos_table_t *resp_headers;
  95. oss_list_multipart_upload_params_t *params = NULL;
  96. char *expect_next_key_marker = "oss_test_abort_multipart_upload1";
  97. aos_pool_create(&p, NULL);
  98. options = oss_request_options_create(p);
  99. init_test_request_options(options, is_cname);
  100. s = init_test_multipart_upload(options, TEST_BUCKET_NAME, object_name1, &upload_id1);
  101. CuAssertIntEquals(tc, 200, s->code);
  102. s = init_test_multipart_upload(options, TEST_BUCKET_NAME, object_name2, &upload_id2);
  103. CuAssertIntEquals(tc, 200, s->code);
  104. params = oss_create_list_multipart_upload_params(p);
  105. params->max_ret = 1;
  106. aos_str_set(&bucket, TEST_BUCKET_NAME);
  107. s = oss_list_multipart_upload(options, &bucket, params, &resp_headers);
  108. CuAssertIntEquals(tc, 200, s->code);
  109. CuAssertIntEquals(tc, 1, params->truncated);
  110. CuAssertStrEquals(tc, expect_next_key_marker, params->next_key_marker.data);
  111. CuAssertPtrNotNull(tc, resp_headers);
  112. aos_list_init(&params->upload_list);
  113. aos_str_set(&params->key_marker, params->next_key_marker.data);
  114. aos_str_set(&params->upload_id_marker, params->next_upload_id_marker.data);
  115. s = oss_list_multipart_upload(options, &bucket, params, &resp_headers);
  116. CuAssertIntEquals(tc, 200, s->code);
  117. //CuAssertIntEquals(tc, 0, params->truncated);
  118. s = abort_test_multipart_upload(options, TEST_BUCKET_NAME, object_name1, &upload_id1);
  119. CuAssertIntEquals(tc, 204, s->code);
  120. s = abort_test_multipart_upload(options, TEST_BUCKET_NAME, object_name2, &upload_id2);
  121. CuAssertIntEquals(tc, 204, s->code);
  122. aos_pool_destroy(p);
  123. printf("test_list_multipart_upload ok\n");
  124. }
  125. void test_multipart_upload(CuTest *tc)
  126. {
  127. aos_pool_t *p = NULL;
  128. aos_string_t bucket;
  129. char *object_name = "oss_test_multipart_upload";
  130. aos_string_t object;
  131. int is_cname = 0;
  132. oss_request_options_t *options = NULL;
  133. aos_status_t *s = NULL;
  134. aos_list_t buffer;
  135. aos_table_t *headers = NULL;
  136. aos_table_t *upload_part_resp_headers = NULL;
  137. oss_list_upload_part_params_t *params = NULL;
  138. aos_table_t *list_part_resp_headers = NULL;
  139. aos_string_t upload_id;
  140. aos_list_t complete_part_list;
  141. oss_list_part_content_t *part_content1 = NULL;
  142. oss_list_part_content_t *part_content2 = NULL;
  143. oss_complete_part_content_t *complete_content1 = NULL;
  144. oss_complete_part_content_t *complete_content2 = NULL;
  145. aos_table_t *complete_resp_headers = NULL;
  146. aos_table_t *head_resp_headers = NULL;
  147. int part_num = 1;
  148. int part_num1 = 2;
  149. char *expect_part_num_marker = "1";
  150. char *content_type_for_complete = "application/octet-stream";
  151. char *actual_content_type = NULL;
  152. aos_pool_create(&p, NULL);
  153. options = oss_request_options_create(p);
  154. init_test_request_options(options, is_cname);
  155. aos_str_set(&bucket, TEST_BUCKET_NAME);
  156. aos_str_set(&object, object_name);
  157. headers = aos_table_make(options->pool, 2);
  158. //init mulitipart
  159. s = init_test_multipart_upload(options, TEST_BUCKET_NAME, object_name, &upload_id);
  160. CuAssertIntEquals(tc, 200, s->code);
  161. //upload part
  162. aos_list_init(&buffer);
  163. make_random_body(p, 200, &buffer);
  164. s = oss_upload_part_from_buffer(options, &bucket, &object, &upload_id,
  165. part_num, &buffer, &upload_part_resp_headers);
  166. CuAssertIntEquals(tc, 200, s->code);
  167. CuAssertPtrNotNull(tc, upload_part_resp_headers);
  168. aos_list_init(&buffer);
  169. make_random_body(p, 200, &buffer);
  170. s = oss_upload_part_from_buffer(options, &bucket, &object, &upload_id,
  171. part_num1, &buffer, &upload_part_resp_headers);
  172. CuAssertIntEquals(tc, 200, s->code);
  173. CuAssertPtrNotNull(tc, upload_part_resp_headers);
  174. //list part
  175. params = oss_create_list_upload_part_params(p);
  176. params->max_ret = 1;
  177. aos_list_init(&complete_part_list);
  178. s = oss_list_upload_part(options, &bucket, &object, &upload_id,
  179. params, &list_part_resp_headers);
  180. CuAssertIntEquals(tc, 200, s->code);
  181. CuAssertIntEquals(tc, 1, params->truncated);
  182. CuAssertStrEquals(tc, expect_part_num_marker,
  183. params->next_part_number_marker.data);
  184. CuAssertPtrNotNull(tc, list_part_resp_headers);
  185. aos_list_for_each_entry(oss_list_part_content_t, part_content1, &params->part_list, node) {
  186. complete_content1 = oss_create_complete_part_content(p);
  187. aos_str_set(&complete_content1->part_number, part_content1->part_number.data);
  188. aos_str_set(&complete_content1->etag, part_content1->etag.data);
  189. aos_list_add_tail(&complete_content1->node, &complete_part_list);
  190. }
  191. aos_list_init(&params->part_list);
  192. aos_str_set(&params->part_number_marker, params->next_part_number_marker.data);
  193. s = oss_list_upload_part(options, &bucket, &object, &upload_id, params, &list_part_resp_headers);
  194. CuAssertIntEquals(tc, 200, s->code);
  195. CuAssertIntEquals(tc, 0, params->truncated);
  196. CuAssertPtrNotNull(tc, list_part_resp_headers);
  197. aos_list_for_each_entry(oss_list_part_content_t, part_content2, &params->part_list, node) {
  198. complete_content2 = oss_create_complete_part_content(p);
  199. aos_str_set(&complete_content2->part_number, part_content2->part_number.data);
  200. aos_str_set(&complete_content2->etag, part_content2->etag.data);
  201. aos_list_add_tail(&complete_content2->node, &complete_part_list);
  202. }
  203. //complete multipart
  204. apr_table_add(headers, OSS_CONTENT_TYPE, content_type_for_complete);
  205. s = oss_complete_multipart_upload(options, &bucket, &object, &upload_id,
  206. &complete_part_list, headers, &complete_resp_headers);
  207. CuAssertIntEquals(tc, 200, s->code);
  208. CuAssertPtrNotNull(tc, complete_resp_headers);
  209. //check content type
  210. apr_table_clear(headers);
  211. s = oss_head_object(options, &bucket, &object, headers, &head_resp_headers);
  212. CuAssertIntEquals(tc, 200, s->code);
  213. CuAssertPtrNotNull(tc, head_resp_headers);
  214. actual_content_type = (char*)(apr_table_get(head_resp_headers, OSS_CONTENT_TYPE));
  215. CuAssertStrEquals(tc, content_type_for_complete, actual_content_type);
  216. aos_pool_destroy(p);
  217. printf("test_multipart_upload ok\n");
  218. }
  219. void test_multipart_upload_from_file(CuTest *tc)
  220. {
  221. aos_pool_t *p = NULL;
  222. aos_string_t bucket;
  223. char *object_name = "oss_test_multipart_upload_from_file";
  224. char *file_path = "test_upload_part_copy.file";
  225. FILE* fd = NULL;
  226. aos_string_t object;
  227. int is_cname = 0;
  228. oss_request_options_t *options = NULL;
  229. aos_status_t *s = NULL;
  230. oss_upload_file_t *upload_file = NULL;
  231. aos_table_t *upload_part_resp_headers = NULL;
  232. oss_list_upload_part_params_t *params = NULL;
  233. aos_table_t *list_part_resp_headers = NULL;
  234. aos_string_t upload_id;
  235. aos_list_t complete_part_list;
  236. oss_list_part_content_t *part_content1 = NULL;
  237. oss_complete_part_content_t *complete_content1 = NULL;
  238. aos_table_t *complete_resp_headers = NULL;
  239. aos_string_t data;
  240. int part_num = 1;
  241. int part_num1 = 2;
  242. aos_pool_create(&p, NULL);
  243. options = oss_request_options_create(p);
  244. init_test_request_options(options, is_cname);
  245. aos_str_set(&bucket, TEST_BUCKET_NAME);
  246. aos_str_set(&object, object_name);
  247. // create multipart upload local file
  248. make_rand_string(p, 10 * 1024 * 1024, &data);
  249. fd = fopen(file_path, "w");
  250. CuAssertTrue(tc, fd != NULL);
  251. fwrite(data.data, sizeof(data.data[0]), data.len, fd);
  252. fclose(fd);
  253. //init mulitipart
  254. s = init_test_multipart_upload(options, TEST_BUCKET_NAME, object_name, &upload_id);
  255. CuAssertIntEquals(tc, 200, s->code);
  256. //upload part from file
  257. upload_file = oss_create_upload_file(p);
  258. aos_str_set(&upload_file->filename, file_path);
  259. upload_file->file_pos = 0;
  260. upload_file->file_last = 200 * 1024; //200k
  261. s = oss_upload_part_from_file(options, &bucket, &object, &upload_id,
  262. part_num, upload_file, &upload_part_resp_headers);
  263. CuAssertIntEquals(tc, 200, s->code);
  264. CuAssertPtrNotNull(tc, upload_part_resp_headers);
  265. upload_file->file_pos = 200 *1024;//remain content start pos
  266. upload_file->file_last = get_file_size(file_path);
  267. s = oss_upload_part_from_file(options, &bucket, &object, &upload_id,
  268. part_num1, upload_file, &upload_part_resp_headers);
  269. CuAssertIntEquals(tc, 200, s->code);
  270. CuAssertPtrNotNull(tc, upload_part_resp_headers);
  271. //list part
  272. params = oss_create_list_upload_part_params(p);
  273. aos_str_set(&params->part_number_marker, "");
  274. params->max_ret = 10;
  275. params->truncated = 0;
  276. aos_list_init(&complete_part_list);
  277. s = oss_list_upload_part(options, &bucket, &object, &upload_id, params, &list_part_resp_headers);
  278. CuAssertIntEquals(tc, 200, s->code);
  279. CuAssertIntEquals(tc, 0, params->truncated);
  280. CuAssertPtrNotNull(tc, list_part_resp_headers);
  281. aos_list_for_each_entry(oss_list_part_content_t, part_content1, &params->part_list, node) {
  282. complete_content1 = oss_create_complete_part_content(p);
  283. aos_str_set(&complete_content1->part_number, part_content1->part_number.data);
  284. aos_str_set(&complete_content1->etag, part_content1->etag.data);
  285. aos_list_add_tail(&complete_content1->node, &complete_part_list);
  286. }
  287. //complete multipart
  288. s = oss_complete_multipart_upload(options, &bucket, &object, &upload_id,
  289. &complete_part_list, NULL, &complete_resp_headers);
  290. CuAssertIntEquals(tc, 200, s->code);
  291. CuAssertPtrNotNull(tc, complete_resp_headers);
  292. remove(file_path);
  293. aos_pool_destroy(p);
  294. printf("test_multipart_upload_from_file ok\n");
  295. }
  296. void test_upload_part_copy(CuTest *tc)
  297. {
  298. aos_pool_t *p = NULL;
  299. oss_request_options_t *options = NULL;
  300. int is_cname = 0;
  301. aos_string_t upload_id;
  302. oss_list_upload_part_params_t *list_upload_part_params = NULL;
  303. oss_upload_part_copy_params_t *upload_part_copy_params1 = NULL;
  304. oss_upload_part_copy_params_t *upload_part_copy_params2 = NULL;
  305. aos_table_t *headers = NULL;
  306. aos_table_t *query_params = NULL;
  307. aos_table_t *resp_headers = NULL;
  308. aos_table_t *list_part_resp_headers = NULL;
  309. aos_list_t complete_part_list;
  310. oss_list_part_content_t *part_content = NULL;
  311. oss_complete_part_content_t *complete_content = NULL;
  312. aos_table_t *complete_resp_headers = NULL;
  313. aos_status_t *s = NULL;
  314. int part1 = 1;
  315. int part2 = 2;
  316. char *local_filename = "test_upload_part_copy.file";
  317. char *download_filename = "test_upload_part_copy.file.download";
  318. char *source_object_name = "oss_test_upload_part_copy_source_object";
  319. char *dest_object_name = "oss_test_upload_part_copy_dest_object";
  320. FILE *fd = NULL;
  321. aos_string_t download_file;
  322. aos_string_t dest_bucket;
  323. aos_string_t dest_object;
  324. int64_t range_start1 = 0;
  325. int64_t range_end1 = 6000000;
  326. int64_t range_start2 = 6000001;
  327. int64_t range_end2;
  328. aos_string_t data;
  329. aos_pool_create(&p, NULL);
  330. options = oss_request_options_create(p);
  331. // create multipart upload local file
  332. make_rand_string(p, 10 * 1024 * 1024, &data);
  333. fd = fopen(local_filename, "w");
  334. CuAssertTrue(tc, fd != NULL);
  335. fwrite(data.data, sizeof(data.data[0]), data.len, fd);
  336. fclose(fd);
  337. init_test_request_options(options, is_cname);
  338. headers = aos_table_make(p, 0);
  339. s = create_test_object_from_file(options, TEST_BUCKET_NAME, source_object_name,
  340. local_filename, headers);
  341. CuAssertIntEquals(tc, 200, s->code);
  342. CuAssertPtrNotNull(tc, headers);
  343. //init mulitipart
  344. s = init_test_multipart_upload(options, TEST_BUCKET_NAME, dest_object_name, &upload_id);
  345. CuAssertIntEquals(tc, 200, s->code);
  346. //upload part copy 1
  347. upload_part_copy_params1 = oss_create_upload_part_copy_params(p);
  348. aos_str_set(&upload_part_copy_params1->source_bucket, TEST_BUCKET_NAME);
  349. aos_str_set(&upload_part_copy_params1->source_object, source_object_name);
  350. aos_str_set(&upload_part_copy_params1->dest_bucket, TEST_BUCKET_NAME);
  351. aos_str_set(&upload_part_copy_params1->dest_object, dest_object_name);
  352. aos_str_set(&upload_part_copy_params1->upload_id, upload_id.data);
  353. upload_part_copy_params1->part_num = part1;
  354. upload_part_copy_params1->range_start = range_start1;
  355. upload_part_copy_params1->range_end = range_end1;
  356. headers = aos_table_make(p, 0);
  357. s = oss_upload_part_copy(options, upload_part_copy_params1, headers, &resp_headers);
  358. CuAssertIntEquals(tc, 200, s->code);
  359. CuAssertPtrNotNull(tc, resp_headers);
  360. //upload part copy 2
  361. resp_headers = NULL;
  362. range_end2 = get_file_size(local_filename) - 1;
  363. upload_part_copy_params2 = oss_create_upload_part_copy_params(p);
  364. aos_str_set(&upload_part_copy_params2->source_bucket, TEST_BUCKET_NAME);
  365. aos_str_set(&upload_part_copy_params2->source_object, source_object_name);
  366. aos_str_set(&upload_part_copy_params2->dest_bucket, TEST_BUCKET_NAME);
  367. aos_str_set(&upload_part_copy_params2->dest_object, dest_object_name);
  368. aos_str_set(&upload_part_copy_params2->upload_id, upload_id.data);
  369. upload_part_copy_params2->part_num = part2;
  370. upload_part_copy_params2->range_start = range_start2;
  371. upload_part_copy_params2->range_end = range_end2;
  372. headers = aos_table_make(p, 0);
  373. s = oss_upload_part_copy(options, upload_part_copy_params2, headers, &resp_headers);
  374. CuAssertIntEquals(tc, 200, s->code);
  375. CuAssertPtrNotNull(tc, resp_headers);
  376. //list part
  377. list_upload_part_params = oss_create_list_upload_part_params(p);
  378. list_upload_part_params->max_ret = 10;
  379. aos_list_init(&complete_part_list);
  380. aos_str_set(&dest_bucket, TEST_BUCKET_NAME);
  381. aos_str_set(&dest_object, dest_object_name);
  382. s = oss_list_upload_part(options, &dest_bucket, &dest_object, &upload_id,
  383. list_upload_part_params, &list_part_resp_headers);
  384. aos_list_for_each_entry(oss_list_part_content_t, part_content, &list_upload_part_params->part_list, node) {
  385. complete_content = oss_create_complete_part_content(p);
  386. aos_str_set(&complete_content->part_number, part_content->part_number.data);
  387. aos_str_set(&complete_content->etag, part_content->etag.data);
  388. aos_list_add_tail(&complete_content->node, &complete_part_list);
  389. }
  390. //complete multipart
  391. headers = aos_table_make(p, 0);
  392. s = oss_complete_multipart_upload(options, &dest_bucket, &dest_object,
  393. &upload_id, &complete_part_list, headers, &complete_resp_headers);
  394. CuAssertIntEquals(tc, 200, s->code);
  395. CuAssertPtrNotNull(tc, complete_resp_headers);
  396. //check upload copy part content equal to local file
  397. headers = aos_table_make(p, 0);
  398. aos_str_set(&download_file, download_filename);
  399. s = oss_get_object_to_file(options, &dest_bucket, &dest_object, headers,
  400. query_params, &download_file, &resp_headers);
  401. CuAssertIntEquals(tc, 200, s->code);
  402. CuAssertIntEquals(tc, get_file_size(local_filename), get_file_size(download_filename));
  403. CuAssertPtrNotNull(tc, resp_headers);
  404. remove(download_filename);
  405. remove(local_filename);
  406. aos_pool_destroy(p);
  407. printf("test_upload_part_copy ok\n");
  408. }
  409. void test_upload_file_failed_without_uploadid(CuTest *tc)
  410. {
  411. aos_pool_t *p = NULL;
  412. aos_string_t bucket;
  413. char *object_name = "oss_test_multipart_upload_from_file";
  414. aos_string_t object;
  415. int is_cname = 0;
  416. oss_request_options_t *options = NULL;
  417. aos_status_t *s = NULL;
  418. int part_size = 100*1024;
  419. aos_string_t upload_id;
  420. aos_string_t filepath;
  421. aos_pool_create(&p, NULL);
  422. options = oss_request_options_create(p);
  423. init_test_request_options(options, is_cname);
  424. aos_str_set(&bucket, "invalid_bucket");
  425. aos_str_set(&object, object_name);
  426. aos_str_null(&upload_id);
  427. aos_str_set(&filepath, __FILE__);
  428. s = oss_upload_file(options, &bucket, &object, &upload_id, &filepath,
  429. part_size, NULL);
  430. CuAssertIntEquals(tc, 404, s->code);
  431. aos_pool_destroy(p);
  432. printf("test_upload_file_failed_without_uploadid ok\n");
  433. }
  434. void test_upload_file(CuTest *tc)
  435. {
  436. aos_pool_t *p = NULL;
  437. aos_string_t bucket;
  438. char *object_name = "oss_test_multipart_upload_from_file";
  439. aos_string_t object;
  440. int is_cname = 0;
  441. oss_request_options_t *options = NULL;
  442. aos_status_t *s = NULL;
  443. int part_size = 100 * 1024;
  444. aos_string_t upload_id;
  445. aos_string_t filepath;
  446. aos_pool_create(&p, NULL);
  447. options = oss_request_options_create(p);
  448. init_test_request_options(options, is_cname);
  449. aos_str_set(&bucket, TEST_BUCKET_NAME);
  450. aos_str_set(&object, object_name);
  451. aos_str_null(&upload_id);
  452. aos_str_set(&filepath, __FILE__);
  453. s = oss_upload_file(options, &bucket, &object, &upload_id, &filepath,
  454. part_size, NULL);
  455. CuAssertIntEquals(tc, 200, s->code);
  456. aos_pool_destroy(p);
  457. printf("test_upload_file ok\n");
  458. }
  459. void test_upload_file_from_recover(CuTest *tc)
  460. {
  461. aos_pool_t *p = NULL;
  462. aos_string_t bucket;
  463. char *object_name = "oss_test_multipart_upload_from_file";
  464. aos_string_t object;
  465. int is_cname = 0;
  466. oss_request_options_t *options = NULL;
  467. aos_status_t *s = NULL;
  468. int part_size = 100*1024;
  469. aos_string_t upload_id;
  470. aos_string_t filepath;
  471. aos_pool_create(&p, NULL);
  472. options = oss_request_options_create(p);
  473. init_test_request_options(options, is_cname);
  474. aos_str_set(&bucket, TEST_BUCKET_NAME);
  475. aos_str_set(&object, object_name);
  476. //init mulitipart
  477. s = init_test_multipart_upload(options, TEST_BUCKET_NAME,
  478. object_name, &upload_id);
  479. CuAssertIntEquals(tc, 200, s->code);
  480. aos_str_set(&filepath, __FILE__);
  481. s = oss_upload_file(options, &bucket, &object, &upload_id, &filepath,
  482. part_size, NULL);
  483. CuAssertIntEquals(tc, 200, s->code);
  484. aos_pool_destroy(p);
  485. printf("test_upload_file_from_recover ok\n");
  486. }
  487. void test_upload_file_from_recover_failed(CuTest *tc)
  488. {
  489. aos_pool_t *p = NULL;
  490. aos_string_t bucket;
  491. char *object_name = "oss_test_multipart_upload_from_file";
  492. aos_string_t object;
  493. int is_cname = 0;
  494. oss_request_options_t *options = NULL;
  495. aos_status_t *s = NULL;
  496. int part_size = 100*1024;
  497. aos_string_t upload_id;
  498. aos_string_t filepath;
  499. aos_pool_create(&p, NULL);
  500. options = oss_request_options_create(p);
  501. init_test_request_options(options, is_cname);
  502. aos_str_set(&bucket, TEST_BUCKET_NAME);
  503. aos_str_set(&object, object_name);
  504. //init mulitipart
  505. s = init_test_multipart_upload(options, TEST_BUCKET_NAME,
  506. object_name, &upload_id);
  507. CuAssertIntEquals(tc, 200, s->code);
  508. aos_str_set(&filepath, __FILE__);
  509. aos_str_set(&bucket, "invalid_bucket");
  510. s = oss_upload_file(options, &bucket, &object, &upload_id, &filepath,
  511. part_size, NULL);
  512. CuAssertIntEquals(tc, 404, s->code);
  513. //abort multipart
  514. s = abort_test_multipart_upload(options, TEST_BUCKET_NAME,
  515. object_name, &upload_id);
  516. CuAssertIntEquals(tc, 204, s->code);
  517. aos_pool_destroy(p);
  518. printf("test_upload_file_from_recover_failed ok\n");
  519. }
  520. void test_list_upload_part_with_empty(CuTest *tc)
  521. {
  522. aos_pool_t *p = NULL;
  523. aos_string_t bucket;
  524. char *object_name = "oss_test_list_upload_part_with_empty";
  525. aos_string_t object;
  526. int is_cname = 0;
  527. oss_request_options_t *options = NULL;
  528. aos_status_t *s = NULL;
  529. aos_table_t *headers = NULL;
  530. oss_list_upload_part_params_t *params = NULL;
  531. aos_table_t *list_part_resp_headers = NULL;
  532. aos_string_t upload_id;
  533. aos_list_t complete_part_list;
  534. aos_table_t *complete_resp_headers = NULL;
  535. char *content_type_for_complete = "video/MP2T";
  536. oss_list_part_content_t *part_content1 = NULL;
  537. oss_complete_part_content_t *complete_content1 = NULL;
  538. aos_pool_create(&p, NULL);
  539. options = oss_request_options_create(p);
  540. init_test_request_options(options, is_cname);
  541. aos_str_set(&bucket, TEST_BUCKET_NAME);
  542. aos_str_set(&object, object_name);
  543. headers = aos_table_make(options->pool, 2);
  544. //init mulitipart
  545. s = init_test_multipart_upload(options, TEST_BUCKET_NAME, object_name, &upload_id);
  546. CuAssertIntEquals(tc, 200, s->code);
  547. //list part
  548. params = oss_create_list_upload_part_params(p);
  549. params->max_ret = 1;
  550. aos_list_init(&complete_part_list);
  551. s = oss_list_upload_part(options, &bucket, &object, &upload_id,
  552. params, &list_part_resp_headers);
  553. CuAssertIntEquals(tc, 200, s->code);
  554. CuAssertIntEquals(tc, 0, params->truncated);
  555. CuAssertStrEquals(tc, NULL, params->next_part_number_marker.data);
  556. CuAssertPtrNotNull(tc, list_part_resp_headers);
  557. // test for #OSS-1161
  558. aos_list_for_each_entry(oss_list_part_content_t, part_content1, &params->part_list, node) {
  559. complete_content1 = oss_create_complete_part_content(p);
  560. aos_str_set(&complete_content1->part_number, part_content1->part_number.data);
  561. aos_str_set(&complete_content1->etag, part_content1->etag.data);
  562. aos_list_add_tail(&complete_content1->node, &complete_part_list);
  563. }
  564. //complete multipart
  565. apr_table_add(headers, OSS_CONTENT_TYPE, content_type_for_complete);
  566. s = oss_complete_multipart_upload(options, &bucket, &object, &upload_id,
  567. &complete_part_list, headers, &complete_resp_headers);
  568. CuAssertIntEquals(tc, 200, s->code);
  569. CuAssertPtrNotNull(tc, complete_resp_headers);
  570. delete_test_object(options, TEST_BUCKET_NAME, object_name);
  571. aos_pool_destroy(p);
  572. printf("test_list_upload_part_with_empty ok\n");
  573. }
  574. void test_oss_get_sorted_uploaded_part(CuTest *tc)
  575. {
  576. aos_pool_t *p = NULL;
  577. aos_string_t bucket;
  578. char *object_name = "test_oss_get_sorted_uploaded_part";
  579. aos_string_t object;
  580. int is_cname = 0;
  581. oss_request_options_t *options = NULL;
  582. aos_status_t *s = NULL;
  583. aos_list_t buffer;
  584. aos_table_t *headers = NULL;
  585. aos_table_t *upload_part_resp_headers = NULL;
  586. aos_string_t upload_id;
  587. aos_list_t complete_part_list;
  588. aos_table_t *complete_resp_headers = NULL;
  589. int part_num = 1;
  590. int part_num1 = 2;
  591. int part_count = 0;
  592. char *content_type_for_complete = "video/MP2T";
  593. aos_pool_create(&p, NULL);
  594. options = oss_request_options_create(p);
  595. init_test_request_options(options, is_cname);
  596. aos_str_set(&bucket, TEST_BUCKET_NAME);
  597. aos_str_set(&object, object_name);
  598. //init mulitipart
  599. s = init_test_multipart_upload(options, TEST_BUCKET_NAME,
  600. object_name, &upload_id);
  601. CuAssertIntEquals(tc, 200, s->code);
  602. //upload part
  603. aos_list_init(&buffer);
  604. make_random_body(p, 200, &buffer);
  605. s = oss_upload_part_from_buffer(options, &bucket, &object, &upload_id,
  606. part_num, &buffer, &upload_part_resp_headers);
  607. CuAssertIntEquals(tc, 200, s->code);
  608. CuAssertPtrNotNull(tc, upload_part_resp_headers);
  609. aos_list_init(&buffer);
  610. make_random_body(p, 200, &buffer);
  611. s = oss_upload_part_from_buffer(options, &bucket, &object, &upload_id,
  612. part_num1, &buffer, &upload_part_resp_headers);
  613. CuAssertIntEquals(tc, 200, s->code);
  614. CuAssertPtrNotNull(tc, upload_part_resp_headers);
  615. //get sorted uploaded part
  616. aos_list_init(&complete_part_list);
  617. s = oss_get_sorted_uploaded_part(options, &bucket, &object,
  618. &upload_id, &complete_part_list, &part_count);
  619. CuAssertIntEquals(tc, 200, s->code);
  620. CuAssertIntEquals(tc, 2, part_count);
  621. //complete multipart
  622. headers = aos_table_make(options->pool, 1);
  623. apr_table_add(headers, OSS_CONTENT_TYPE, content_type_for_complete);
  624. s = oss_complete_multipart_upload(options, &bucket, &object, &upload_id,
  625. &complete_part_list, headers, &complete_resp_headers);
  626. CuAssertIntEquals(tc, 200, s->code);
  627. CuAssertPtrNotNull(tc, complete_resp_headers);
  628. delete_test_object(options, TEST_BUCKET_NAME, object_name);
  629. aos_pool_destroy(p);
  630. printf("test_oss_get_sorted_uploaded_part ok\n");
  631. }
  632. void test_oss_get_sorted_uploaded_part_with_empty(CuTest *tc)
  633. {
  634. aos_pool_t *p = NULL;
  635. aos_string_t bucket;
  636. char *object_name = "test_oss_get_sorted_uploaded_part_with_empty";
  637. aos_string_t object;
  638. int is_cname = 0;
  639. oss_request_options_t *options = NULL;
  640. aos_status_t *s = NULL;
  641. aos_string_t upload_id;
  642. aos_list_t complete_part_list;
  643. int part_count = 0;
  644. aos_pool_create(&p, NULL);
  645. options = oss_request_options_create(p);
  646. init_test_request_options(options, is_cname);
  647. aos_str_set(&bucket, TEST_BUCKET_NAME);
  648. aos_str_set(&object, object_name);
  649. //init mulitipart
  650. s = init_test_multipart_upload(options, TEST_BUCKET_NAME,
  651. object_name, &upload_id);
  652. CuAssertIntEquals(tc, 200, s->code);
  653. //get sorted uploaded part
  654. aos_list_init(&complete_part_list);
  655. s = oss_get_sorted_uploaded_part(options, &bucket, &object, &upload_id,
  656. &complete_part_list, &part_count);
  657. CuAssertIntEquals(tc, 200, s->code);
  658. CuAssertIntEquals(tc, 0, part_count);
  659. //abort multipart
  660. s = abort_test_multipart_upload(options, TEST_BUCKET_NAME,
  661. object_name, &upload_id);
  662. CuAssertIntEquals(tc, 204, s->code);
  663. delete_test_object(options, TEST_BUCKET_NAME, object_name);
  664. aos_pool_destroy(p);
  665. printf("test_oss_get_sorted_uploaded_part_with_empty ok\n");
  666. }
  667. CuSuite *test_oss_multipart()
  668. {
  669. CuSuite* suite = CuSuiteNew();
  670. SUITE_ADD_TEST(suite, test_multipart_setup);
  671. SUITE_ADD_TEST(suite, test_init_abort_multipart_upload);
  672. SUITE_ADD_TEST(suite, test_list_multipart_upload);
  673. SUITE_ADD_TEST(suite, test_multipart_upload);
  674. SUITE_ADD_TEST(suite, test_multipart_upload_from_file);
  675. SUITE_ADD_TEST(suite, test_upload_file);
  676. SUITE_ADD_TEST(suite, test_upload_file_failed_without_uploadid);
  677. SUITE_ADD_TEST(suite, test_upload_file_from_recover);
  678. SUITE_ADD_TEST(suite, test_upload_file_from_recover_failed);
  679. SUITE_ADD_TEST(suite, test_upload_part_copy);
  680. SUITE_ADD_TEST(suite, test_list_upload_part_with_empty);
  681. SUITE_ADD_TEST(suite, test_oss_get_sorted_uploaded_part);
  682. SUITE_ADD_TEST(suite, test_oss_get_sorted_uploaded_part_with_empty);
  683. SUITE_ADD_TEST(suite, test_multipart_cleanup);
  684. return suite;
  685. }