bucket_op_test.cpp 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515
  1. // Copyright (c) 2017, Tencent Inc.
  2. // All rights reserved.
  3. //
  4. // Author: sevenyou <sevenyou@tencent.com>
  5. // Created: 08/23/17
  6. // Description:
  7. #include "cos_api.h"
  8. #include "util/test_utils.h"
  9. #include "util/string_util.h"
  10. #include "gtest/gtest.h"
  11. namespace qcloud_cos {
  12. /*
  13. export CPP_SDK_V5_ACCESS_KEY=xxx
  14. export CPP_SDK_V5_SECRET_KEY=xxx
  15. export CPP_SDK_V5_REGION=ap-guangzhou
  16. export CPP_SDK_V5_UIN=xxx
  17. export CPP_SDK_V5_APPID=xxx
  18. export COS_CPP_V5_TAG=""
  19. export COS_CPP_V5_USE_DNS_CACHE="true"
  20. export CPP_SDK_V5_OTHER_ACCESS_KEY=xxx
  21. export CPP_SDK_V5_OTHER_SECRET_KEY=xxx
  22. export CPP_SDK_V5_OTHER_REGION=ap-hongkong
  23. export CPP_SDK_V5_OTHER_UIN=xxx
  24. */
  25. class BucketOpTest : public testing::Test {
  26. protected:
  27. static void SetUpTestCase() {
  28. std::cout << "================SetUpTestCase Begin===================="
  29. << std::endl;
  30. m_config = new CosConfig("./config.json");
  31. m_config->SetAccessKey(GetEnvVar("CPP_SDK_V5_ACCESS_KEY"));
  32. m_config->SetSecretKey(GetEnvVar("CPP_SDK_V5_SECRET_KEY"));
  33. m_config->SetRegion(GetEnvVar("CPP_SDK_V5_REGION"));
  34. m_client = new CosAPI(*m_config);
  35. m_config2 = new CosConfig("./config.json");
  36. m_config2->SetAccessKey(GetEnvVar("CPP_SDK_V5_OTHER_ACCESS_KEY"));
  37. m_config2->SetSecretKey(GetEnvVar("CPP_SDK_V5_OTHER_SECRET_KEY"));
  38. m_config2->SetRegion(GetEnvVar("CPP_SDK_V5_OTHER_REGION"));
  39. m_client2 = new CosAPI(*m_config2);
  40. if (GetEnvVar("COS_CPP_V5_USE_DNS_CACHE") == "true") {
  41. std::cout << "================USE DNS CACHE===================="
  42. << std::endl;
  43. CosSysConfig::SetUseDnsCache(true);
  44. }
  45. m_bucket_name = "coscppsdkv5ut" + GetEnvVar("COS_CPP_V5_TAG") + "-" +
  46. GetEnvVar("CPP_SDK_V5_APPID");
  47. m_bucket_name2 = "coscppsdkv5utotherregion" + GetEnvVar("COS_CPP_V5_TAG") +
  48. "-" + GetEnvVar("CPP_SDK_V5_APPID");
  49. m_bucket_name_nil = "coscppsdkv5utt" + GetEnvVar("COS_CPP_V5_TAG") + "-" +
  50. GetEnvVar("CPP_SDK_V5_APPID");
  51. m_bucket_name_wrong = "coscppsdkv5utt" + GetEnvVar("COS_CPP_V5_TAG") + "-" +
  52. GetEnvVar("CPP_SDK_V5_APPID") + "1123456";
  53. m_owner = GetEnvVar("CPP_SDK_V5_UIN");
  54. m_owner2 = GetEnvVar("CPP_SDK_V5_OTHER_UIN");
  55. std::cout << "================SetUpTestCase End===================="
  56. << std::endl;
  57. try{
  58. qcloud_cos::CosConfig * _config = new CosConfig("./config.json");
  59. _config->SetAccessKey(GetEnvVar("CPP_SDK_V5_ACCESS_KEY"));
  60. _config->SetSecretKey(GetEnvVar("CPP_SDK_V5_SECRET_KEY"));
  61. _config->SetRegion("ap-guangzhou@xxxx");
  62. qcloud_cos::CosAPI * _client = new CosAPI(*_config);
  63. }
  64. catch(const std::exception& e){
  65. EXPECT_EQ(e.what(), "Invalid region configuration in CosConfig :ap-guangzhou@xxxx");
  66. }
  67. try{
  68. qcloud_cos::CosConfig * _config = new CosConfig("./config.json");
  69. _config->SetAccessKey(GetEnvVar("CPP_SDK_V5_ACCESS_KEY"));
  70. _config->SetSecretKey(GetEnvVar("CPP_SDK_V5_SECRET_KEY"));
  71. _config->SetRegion("ap-guangzhou");
  72. qcloud_cos::CosAPI * _client = new CosAPI(*_config);
  73. qcloud_cos::PutBucketReq req("bucket_name-12500000000@xxxx");
  74. req.SetBucketName("bucket_name-12500000000@xxxx");
  75. qcloud_cos::PutBucketResp resp;
  76. _client->PutBucket(req,&resp);
  77. }
  78. catch(const std::exception& e)
  79. {
  80. EXPECT_EQ(e.what(), "Invalid bucket_name argument :bucket_name-12500000000@xxxx");
  81. }
  82. }
  83. static void TearDownTestCase() {
  84. std::cout << "================TearDownTestCase Begin===================="
  85. << std::endl;
  86. // 清空Object,删除Bucket
  87. std::vector<std::string> bucket_list = {m_bucket_name, m_bucket_name2};
  88. for (auto& bucketname : bucket_list) {
  89. CosAPI* client;
  90. ;
  91. if (bucketname == m_bucket_name) {
  92. client = m_client;
  93. } else {
  94. client = m_client2;
  95. }
  96. GetBucketObjectVersionsReq req(bucketname);
  97. GetBucketObjectVersionsResp resp;
  98. CosResult result = client->GetBucketObjectVersions(req, &resp);
  99. EXPECT_TRUE(result.IsSucc());
  100. const std::vector<COSVersionSummary>& summs = resp.GetVersionSummary();
  101. for (std::vector<COSVersionSummary>::const_iterator c_itr = summs.begin();
  102. c_itr != summs.end(); ++c_itr) {
  103. const COSVersionSummary& summ = *c_itr;
  104. DeleteObjectReq del_req(bucketname, summ.m_key);
  105. DeleteObjectResp del_resp;
  106. if (!summ.m_version_id.empty()) {
  107. del_req.SetXCosVersionId(summ.m_version_id);
  108. }
  109. CosResult del_result = client->DeleteObject(del_req, &del_resp);
  110. EXPECT_TRUE(del_result.IsSucc());
  111. if (!del_result.IsSucc()) {
  112. std::cout << "DeleteObject Failed, check object=" << summ.m_key
  113. << std::endl;
  114. }
  115. }
  116. {
  117. DeleteBucketReq req(bucketname);
  118. DeleteBucketResp resp;
  119. CosResult result = client->DeleteBucket(req, &resp);
  120. EXPECT_TRUE(result.IsSucc());
  121. }
  122. }
  123. delete m_client;
  124. delete m_config;
  125. delete m_client2;
  126. delete m_config2;
  127. std::cout << "================TearDownTestCase End===================="
  128. << std::endl;
  129. }
  130. protected:
  131. static CosConfig* m_config;
  132. static CosAPI* m_client;
  133. static std::string m_bucket_name;
  134. static std::string m_bucket_name_nil;
  135. static std::string m_bucket_name_wrong;
  136. static std::string m_owner;
  137. static CosConfig* m_config2;
  138. static CosAPI* m_client2;
  139. static std::string m_bucket_name2;
  140. static std::string m_owner2;
  141. };
  142. CosConfig* BucketOpTest::m_config = NULL;
  143. CosConfig* BucketOpTest::m_config2 = NULL;
  144. CosAPI* BucketOpTest::m_client = NULL;
  145. CosAPI* BucketOpTest::m_client2 = NULL;
  146. std::string BucketOpTest::m_bucket_name = "";
  147. std::string BucketOpTest::m_bucket_name2 = "";
  148. std::string BucketOpTest::m_bucket_name_nil = "";
  149. std::string BucketOpTest::m_bucket_name_wrong = "";
  150. std::string BucketOpTest::m_owner = "";
  151. std::string BucketOpTest::m_owner2 = "";
  152. TEST_F(BucketOpTest, PutBucketTest) {
  153. {
  154. PutBucketReq req(m_bucket_name);
  155. PutBucketResp resp;
  156. CosResult result = m_client->PutBucket(req, &resp);
  157. EXPECT_TRUE(result.IsSucc());
  158. }
  159. {
  160. PutBucketReq req(m_bucket_name2);
  161. PutBucketResp resp;
  162. // req.SetXCosAcl("public-read-write");
  163. CosResult result = m_client2->PutBucket(req, &resp);
  164. EXPECT_TRUE(result.IsSucc());
  165. }
  166. }
  167. TEST_F(BucketOpTest, GetServiceTest) {
  168. bool use_dns_cache = CosSysConfig::GetUseDnsCache();
  169. CosSysConfig::SetUseDnsCache(false);
  170. // normal true
  171. {
  172. GetServiceReq req;
  173. GetServiceResp resp;
  174. req.AddParam("range","gt");
  175. req.AddParam("max-keys", "5");
  176. auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch());
  177. req.AddParam("create-time",std::to_string(ms.count()-3600000));
  178. CosResult result = m_client2->GetService(req, &resp);
  179. EXPECT_TRUE(result.IsSucc());
  180. }
  181. CosSysConfig::SetUseDnsCache(use_dns_cache);
  182. }
  183. TEST_F(BucketOpTest, SetCredentailTest) {
  184. {
  185. qcloud_cos::CosConfig config(00000,"secretId","secretKey",GetEnvVar("CPP_SDK_V5_OTHER_REGION"));
  186. qcloud_cos::CosAPI cos(config);
  187. cos.SetCredentail(GetEnvVar("CPP_SDK_V5_ACCESS_KEY"),GetEnvVar("CPP_SDK_V5_SECRET_KEY"),"");
  188. EXPECT_EQ(config.GetAccessKey(), "secretId");
  189. EXPECT_EQ(config.GetAppId(), 00000);
  190. EXPECT_EQ(config.GetSecretKey(), "secretKey");
  191. EXPECT_EQ(config.GetRegion(), GetEnvVar("CPP_SDK_V5_OTHER_REGION"));
  192. bool result = cos.IsBucketExist(m_bucket_name2);
  193. EXPECT_TRUE(result);
  194. }
  195. }
  196. TEST_F(BucketOpTest, IsBucketExistTest) {
  197. // normal true
  198. {
  199. bool result = m_client2->IsBucketExist(m_bucket_name2);
  200. EXPECT_TRUE(result);
  201. }
  202. // wrong false
  203. {
  204. bool result = m_client2->IsBucketExist(m_bucket_name_nil);
  205. EXPECT_TRUE(!result);
  206. }
  207. }
  208. TEST_F(BucketOpTest, DescribeDocProcessTest) {
  209. bool use_dns_cache = CosSysConfig::GetUseDnsCache();
  210. CosSysConfig::SetUseDnsCache(false);
  211. {
  212. DescribeDocProcessBucketsReq req;
  213. DescribeDocProcessBucketsResp resp;
  214. CosResult result = m_client->DescribeDocProcessBuckets(req, &resp);
  215. EXPECT_TRUE(result.IsSucc());
  216. EXPECT_EQ(resp.GetServer(), "tencent-ci");
  217. }
  218. CosSysConfig::SetUseDnsCache(use_dns_cache);
  219. }
  220. TEST_F(BucketOpTest, DescribeMediaTest) {
  221. bool use_dns_cache = CosSysConfig::GetUseDnsCache();
  222. CosSysConfig::SetUseDnsCache(false);
  223. {
  224. DescribeMediaBucketsReq req;
  225. DescribeMediaBucketsResp resp;
  226. CosResult result = m_client->DescribeMediaBuckets(req, &resp);
  227. EXPECT_TRUE(result.IsSucc());
  228. EXPECT_EQ(resp.GetServer(), "tencent-ci");
  229. }
  230. CosSysConfig::SetUseDnsCache(use_dns_cache);
  231. }
  232. TEST_F(BucketOpTest, HeadBucketTest) {
  233. // normal 200
  234. {
  235. HeadBucketReq req(m_bucket_name2);
  236. HeadBucketResp resp;
  237. // CosResult result = m_client->HeadBucket(req, &resp);
  238. CosResult result = m_client2->HeadBucket(req, &resp);
  239. EXPECT_TRUE(result.IsSucc());
  240. }
  241. // wrong bucket 404
  242. {
  243. HeadBucketReq req(m_bucket_name_nil);
  244. HeadBucketResp resp;
  245. CosResult result = m_client->HeadBucket(req, &resp);
  246. EXPECT_TRUE(!result.IsSucc());
  247. EXPECT_EQ(result.GetHttpStatus(), 404);
  248. }
  249. // wrong appid 400
  250. {
  251. // HeadBucketReq req(m_bucket_name);
  252. HeadBucketReq req(m_bucket_name_wrong);
  253. HeadBucketResp resp;
  254. CosResult result = m_client->HeadBucket(req, &resp);
  255. EXPECT_TRUE(!result.IsSucc());
  256. EXPECT_EQ(result.GetHttpStatus(), 404);
  257. }
  258. }
  259. TEST_F(BucketOpTest, PutBucketDomainTest) {
  260. // 400
  261. {
  262. qcloud_cos::PutBucketDomainReq req(m_bucket_name2);
  263. DomainRule rules;
  264. rules.SetStatus("ENABLED");
  265. rules.SetName("111");
  266. rules.SetType("REST");
  267. req.SetDomainRule(rules);
  268. PutBucketDomainResp resp;
  269. CosResult result = m_client2->PutBucketDomain(req, &resp);
  270. EXPECT_TRUE(!result.IsSucc());
  271. EXPECT_EQ(result.GetHttpStatus(), 400);
  272. }
  273. }
  274. TEST_F(BucketOpTest, GetBucketDomainTest) {
  275. // 404
  276. {
  277. GetBucketDomainReq req(m_bucket_name2);
  278. GetBucketDomainResp resp;
  279. CosResult result = m_client2->GetBucketDomain(req, &resp);
  280. EXPECT_TRUE(!result.IsSucc());
  281. EXPECT_EQ(result.GetHttpStatus(), 404);
  282. }
  283. }
  284. TEST_F(BucketOpTest, GetBucketLocationTest) {
  285. // normal CPP_SDK_V5_REGION
  286. {
  287. std::string location = m_client2->GetBucketLocation(m_bucket_name2);
  288. EXPECT_EQ(location, GetEnvVar("CPP_SDK_V5_OTHER_REGION"));
  289. }
  290. // wrong ""
  291. {
  292. std::string location = m_client2->GetBucketLocation(m_bucket_name_wrong);
  293. EXPECT_EQ(location, "");
  294. }
  295. }
  296. TEST_F(BucketOpTest, BucketIntelligentTieringTest) {
  297. bool use_dns_cache = CosSysConfig::GetUseDnsCache();
  298. CosSysConfig::SetUseDnsCache(false);
  299. std::string ittest_bucket_name = "ittest-" + GetEnvVar("CPP_SDK_V5_APPID");
  300. {
  301. PutBucketReq req(ittest_bucket_name);
  302. PutBucketResp resp;
  303. CosResult result = m_client->PutBucket(req, &resp);
  304. EXPECT_TRUE(result.IsSucc());
  305. }
  306. {
  307. PutBucketIntelligentTieringReq req(ittest_bucket_name);
  308. PutBucketIntelligentTieringResp resp;
  309. req.SetStatus(true);
  310. req.SetDays(60);
  311. CosResult result = m_client->PutBucketIntelligentTiering(req, &resp);
  312. EXPECT_TRUE(result.IsSucc());
  313. }
  314. {
  315. GetBucketIntelligentTieringReq req(ittest_bucket_name);
  316. GetBucketIntelligentTieringResp resp;
  317. CosResult result = m_client->GetBucketIntelligentTiering(req, &resp);
  318. EXPECT_TRUE(result.IsSucc());
  319. EXPECT_EQ(resp.GetStatus(), "Enabled");
  320. EXPECT_EQ(resp.GetDays(), 60);
  321. }
  322. {
  323. DeleteBucketReq req(ittest_bucket_name);
  324. DeleteBucketResp resp;
  325. CosResult result = m_client->DeleteBucket(req, &resp);
  326. EXPECT_TRUE(result.IsSucc());
  327. }
  328. CosSysConfig::SetUseDnsCache(use_dns_cache);
  329. }
  330. TEST_F(BucketOpTest, ListMultipartUpload) {
  331. {
  332. std::string object_name = "testlistuploadpartsdiffer";
  333. InitMultiUploadReq init_req(m_bucket_name, object_name);
  334. InitMultiUploadResp init_resp;
  335. CosResult init_result = m_client->InitMultiUpload(init_req, &init_resp);
  336. EXPECT_TRUE(init_result.IsSucc());
  337. std::string upload_id = init_resp.GetUploadId();
  338. ListMultipartUploadReq req(m_bucket_name);
  339. req.SetPrefix(object_name);
  340. ListMultipartUploadResp resp;
  341. CosResult list_result = m_client->ListMultipartUpload(req, &resp);
  342. EXPECT_TRUE(list_result.IsSucc());
  343. EXPECT_EQ(m_bucket_name, resp.GetName());
  344. EXPECT_EQ("", resp.GetEncodingType());
  345. EXPECT_EQ("", resp.GetMarker());
  346. EXPECT_EQ("", resp.GetUploadIdMarker());
  347. std::vector<Upload> rst = resp.GetUpload();
  348. for (std::vector<qcloud_cos::Upload>::const_iterator itr = rst.begin();
  349. itr != rst.end(); ++itr) {
  350. const qcloud_cos::Upload& upload = *itr;
  351. EXPECT_EQ(object_name, upload.m_key);
  352. EXPECT_EQ(upload_id, upload.m_uploadid);
  353. EXPECT_EQ("STANDARD", upload.m_storage_class);
  354. }
  355. AbortMultiUploadReq abort_req(m_bucket_name, object_name, upload_id);
  356. AbortMultiUploadResp abort_resp;
  357. CosResult abort_result = m_client->AbortMultiUpload(abort_req, &abort_resp);
  358. EXPECT_TRUE(abort_result.IsSucc());
  359. }
  360. }
  361. TEST_F(BucketOpTest, GetBucketTest) {
  362. // 查询空的Bucket
  363. {
  364. GetBucketReq req(m_bucket_name);
  365. GetBucketResp resp;
  366. req.SetPrefix("test/");
  367. req.SetDelimiter("/");
  368. req.SetEncodingType("url");
  369. req.SetMarker("marker");
  370. req.SetMaxKeys(100);
  371. CosResult result = m_client->GetBucket(req, &resp);
  372. ASSERT_TRUE(result.IsSucc());
  373. }
  374. // 添加Object
  375. {
  376. std::string prefixA = "prefixA_";
  377. std::string prefixB = "prefixB_";
  378. for (int i = 0; i < 5; ++i) {
  379. {
  380. std::istringstream iss(prefixA + StringUtil::IntToString(i));
  381. PutObjectByStreamReq req(m_bucket_name,
  382. prefixA + StringUtil::IntToString(i), iss);
  383. req.SetXCosStorageClass(kStorageClassStandardIA);
  384. PutObjectByStreamResp resp;
  385. CosResult result = m_client->PutObject(req, &resp);
  386. EXPECT_TRUE(result.IsSucc());
  387. }
  388. {
  389. std::istringstream iss(prefixB + StringUtil::IntToString(i));
  390. PutObjectByStreamReq req(m_bucket_name,
  391. prefixB + StringUtil::IntToString(i), iss);
  392. req.SetXCosStorageClass(kStorageClassStandardIA);
  393. PutObjectByStreamResp resp;
  394. CosResult result = m_client->PutObject(req, &resp);
  395. EXPECT_TRUE(result.IsSucc());
  396. }
  397. }
  398. }
  399. // GetBucket, maxkey=1
  400. {
  401. GetBucketReq req(m_bucket_name);
  402. GetBucketResp resp;
  403. req.SetPrefix("prefixB_");
  404. req.SetMaxKeys(1);
  405. CosResult result = m_client->GetBucket(req, &resp);
  406. EXPECT_TRUE(result.IsSucc());
  407. EXPECT_EQ(m_bucket_name, resp.GetName());
  408. EXPECT_EQ("prefixB_", resp.GetPrefix());
  409. EXPECT_TRUE(resp.IsTruncated());
  410. EXPECT_EQ("prefixB_0", resp.GetNextMarker());
  411. const std::vector<Content>& contents = resp.GetContents();
  412. EXPECT_EQ(1, contents.size());
  413. }
  414. // GetBucket, truncated
  415. {
  416. GetBucketReq req(m_bucket_name);
  417. GetBucketResp resp;
  418. req.SetPrefix("prefixA_");
  419. req.SetMaxKeys(3);
  420. CosResult result = m_client->GetBucket(req, &resp);
  421. EXPECT_TRUE(result.IsSucc());
  422. EXPECT_EQ(m_bucket_name, resp.GetName());
  423. EXPECT_EQ("prefixA_", resp.GetPrefix());
  424. EXPECT_EQ("prefixA_2", resp.GetNextMarker());
  425. EXPECT_TRUE(resp.IsTruncated());
  426. const std::vector<Content>& contents = resp.GetContents();
  427. EXPECT_EQ(3, contents.size());
  428. }
  429. // GetBucket, not truncated
  430. {
  431. GetBucketReq req(m_bucket_name);
  432. GetBucketResp resp;
  433. req.SetPrefix("prefixA_");
  434. req.SetMaxKeys(5);
  435. CosResult result = m_client->GetBucket(req, &resp);
  436. EXPECT_TRUE(result.IsSucc());
  437. EXPECT_EQ(m_bucket_name, resp.GetName());
  438. EXPECT_EQ("prefixA_", resp.GetPrefix());
  439. EXPECT_EQ("", resp.GetNextMarker());
  440. EXPECT_FALSE(resp.IsTruncated());
  441. const std::vector<Content>& contents = resp.GetContents();
  442. EXPECT_EQ(5, contents.size());
  443. }
  444. // GetBucket
  445. {
  446. GetBucketReq req(m_bucket_name);
  447. GetBucketResp resp;
  448. req.SetPrefix("prefix");
  449. CosResult result = m_client->GetBucket(req, &resp);
  450. EXPECT_TRUE(result.IsSucc());
  451. EXPECT_EQ(m_bucket_name, resp.GetName());
  452. EXPECT_EQ("prefix", resp.GetPrefix());
  453. EXPECT_FALSE(resp.IsTruncated());
  454. EXPECT_EQ("", resp.GetNextMarker());
  455. const std::vector<Content>& contents = resp.GetContents();
  456. EXPECT_EQ(10, contents.size());
  457. const Content& cnt_01 = contents[0];
  458. EXPECT_EQ("prefixA_0", cnt_01.m_key);
  459. EXPECT_EQ("3be03ea31c1d6ce899f419c04cbf1ea9", cnt_01.m_etag);
  460. EXPECT_EQ("9", cnt_01.m_size);
  461. EXPECT_EQ("STANDARD_IA", cnt_01.m_storage_class);
  462. }
  463. sleep(1);
  464. }
  465. TEST_F(BucketOpTest, PutBucketVersioningTest) {
  466. PutBucketVersioningReq req(m_bucket_name);
  467. PutBucketVersioningResp resp;
  468. req.SetStatus(true);
  469. CosResult result = m_client->PutBucketVersioning(req, &resp);
  470. EXPECT_TRUE(result.IsSucc());
  471. sleep(1);
  472. }
  473. TEST_F(BucketOpTest, GetBucketVersioningTest) {
  474. sleep(5);
  475. // 1. 查看开启版本管理的Bucket状态
  476. {
  477. GetBucketVersioningReq req(m_bucket_name);
  478. GetBucketVersioningResp resp;
  479. CosResult result = m_client->GetBucketVersioning(req, &resp);
  480. EXPECT_TRUE(result.IsSucc());
  481. EXPECT_EQ(1, resp.GetStatus());
  482. }
  483. // 2. 查看未开启版本管理的Bucket状态
  484. {
  485. GetBucketVersioningReq req(m_bucket_name2);
  486. GetBucketVersioningResp resp;
  487. CosResult result = m_client2->GetBucketVersioning(req, &resp);
  488. EXPECT_TRUE(result.IsSucc());
  489. EXPECT_EQ(0, resp.GetStatus());
  490. }
  491. // 3. 暂停版本管理
  492. {
  493. {
  494. PutBucketVersioningReq req(m_bucket_name);
  495. PutBucketVersioningResp resp;
  496. req.SetStatus(false);
  497. CosResult result = m_client->PutBucketVersioning(req, &resp);
  498. EXPECT_TRUE(result.IsSucc());
  499. }
  500. sleep(5);
  501. {
  502. GetBucketVersioningReq req(m_bucket_name);
  503. GetBucketVersioningResp resp;
  504. CosResult result = m_client->GetBucketVersioning(req, &resp);
  505. EXPECT_TRUE(result.IsSucc());
  506. EXPECT_EQ(2, resp.GetStatus());
  507. }
  508. }
  509. // 4. 重新开启
  510. {
  511. {
  512. PutBucketVersioningReq req(m_bucket_name);
  513. PutBucketVersioningResp resp;
  514. req.SetStatus(true);
  515. CosResult result = m_client->PutBucketVersioning(req, &resp);
  516. EXPECT_TRUE(result.IsSucc());
  517. }
  518. sleep(5);
  519. {
  520. GetBucketVersioningReq req(m_bucket_name);
  521. GetBucketVersioningResp resp;
  522. CosResult result = m_client->GetBucketVersioning(req, &resp);
  523. EXPECT_TRUE(result.IsSucc());
  524. EXPECT_EQ(1, resp.GetStatus());
  525. }
  526. }
  527. }
  528. TEST_F(BucketOpTest, PutBucketReplicationTest) {
  529. // 前置条件源和目标Bucket必须开启多版本
  530. {{PutBucketVersioningReq req(m_bucket_name);
  531. PutBucketVersioningResp resp;
  532. req.SetStatus(true);
  533. CosResult result = m_client->PutBucketVersioning(req, &resp);
  534. EXPECT_TRUE(result.IsSucc());
  535. }
  536. {
  537. PutBucketVersioningReq req(m_bucket_name2);
  538. PutBucketVersioningResp resp;
  539. req.SetStatus(true);
  540. CosResult result = m_client2->PutBucketVersioning(req, &resp);
  541. EXPECT_TRUE(result.IsSucc());
  542. }
  543. } // namespace qcloud_cos
  544. //添加跨区复制规则时,会检查园区可达性,比如金融园区只能和金融园区互通、普通园区只能和普通园区互通
  545. //需要保证两个园区类型相同
  546. {
  547. PutBucketReplicationReq req(m_bucket_name);
  548. PutBucketReplicationResp resp;
  549. #if 0
  550. std::string appid = StringUtil::Uint64ToString(m_config2->GetAppId());
  551. std::string bucket_name = m_bucket_name2;
  552. if (appid == "0") {
  553. ssize_t pos = bucket_name.find("-");
  554. if (pos != std::string::npos) {
  555. appid = m_bucket_name2.substr(pos + 1);
  556. bucket_name = m_bucket_name2.substr(0, pos);
  557. }
  558. }
  559. #endif
  560. // std::string dest = "qcs:id/0:cos:" +
  561. // StringUtil::StringRemovePrefix(m_config2->GetRegion(), "cos.")
  562. // + ":appid/" + appid + ":" + bucket_name;
  563. std::string dest =
  564. "qcs::cos:" +
  565. StringUtil::StringRemovePrefix(m_config2->GetRegion(), "cos.") +
  566. "::" + m_bucket_name2;
  567. std::cout << "dest=" << dest << std::endl;
  568. ReplicationRule rule00("prefix_A", dest, "Standard", "rule_00");
  569. ReplicationRule rule01("prefix_B", dest, "Standard_IA", "rule_01");
  570. req.AddReplicationRule(rule00);
  571. req.AddReplicationRule(rule01);
  572. CosResult result = m_client->PutBucketReplication(req, &resp);
  573. ASSERT_TRUE(result.IsSucc());
  574. }
  575. }
  576. TEST_F(BucketOpTest, GetBucketReplicationTest) {
  577. GetBucketReplicationReq req(m_bucket_name);
  578. GetBucketReplicationResp resp;
  579. CosResult result = m_client->GetBucketReplication(req, &resp);
  580. }
  581. TEST_F(BucketOpTest, DeleteBucketReplicationTest) {
  582. DeleteBucketReplicationReq req(m_bucket_name);
  583. DeleteBucketReplicationResp resp;
  584. CosResult result = m_client->DeleteBucketReplication(req, &resp);
  585. ASSERT_TRUE(result.IsSucc());
  586. }
  587. TEST_F(BucketOpTest, PutBucketLifecycleTest) {
  588. PutBucketLifecycleReq req(m_bucket_name);
  589. PutBucketLifecycleResp resp;
  590. {
  591. LifecycleRule rule;
  592. rule.SetIsEnable(true);
  593. rule.SetId("lifecycle_rule00");
  594. LifecycleFilter filter;
  595. filter.SetPrefix("sevenyou_e0");
  596. // LifecycleTag tag0 = {"tag_key0", "tag_value0" };
  597. // LifecycleTag tag1 = {"tag_key1", "tag_value1" };
  598. // filter.AddTag(tag0);
  599. // filter.AddTag(tag1);
  600. rule.SetFilter(filter);
  601. // Days in the Expiration action for filter must be greater than Days in the
  602. // Transition action
  603. LifecycleExpiration expiration;
  604. expiration.SetDays(31);
  605. rule.SetExpiration(expiration);
  606. LifecycleTransition transition;
  607. transition.SetDays(30);
  608. transition.SetStorageClass("STANDARD_IA");
  609. rule.AddTransition(transition);
  610. LifecycleNonCurrTransition non_cur_transition;
  611. non_cur_transition.SetDays(5);
  612. non_cur_transition.SetStorageClass("STANDARD_IA");
  613. rule.SetNonCurrTransition(non_cur_transition);
  614. LifecycleNonCurrExpiration non_cur_expiration;
  615. non_cur_expiration.SetDays(8);
  616. rule.SetNonCurrExpiration(non_cur_expiration);
  617. AbortIncompleteMultipartUpload abort_upload;
  618. abort_upload.m_days_after_init = 3;
  619. rule.SetAbortIncompleteMultiUpload(abort_upload);
  620. req.AddRule(rule);
  621. }
  622. {
  623. LifecycleRule rule;
  624. rule.SetIsEnable(true);
  625. rule.SetId("lifecycle_rule01");
  626. LifecycleFilter filter;
  627. filter.SetPrefix("sevenyou_e1");
  628. rule.SetFilter(filter);
  629. LifecycleTransition transition;
  630. transition.SetDays(60);
  631. transition.SetStorageClass("STANDARD");
  632. rule.AddTransition(transition);
  633. #if 0
  634. LifecycleTransition transition2;
  635. transition2.SetDays(30);
  636. transition2.SetStorageClass("STANDARD_IA");
  637. rule.AddTransition(transition2);
  638. #endif
  639. req.AddRule(rule);
  640. }
  641. {
  642. LifecycleRule rule;
  643. rule.SetIsEnable(false);
  644. rule.SetId("lifecycle_rule02");
  645. LifecycleFilter filter;
  646. filter.SetPrefix("sevenyou_e2");
  647. rule.SetFilter(filter);
  648. LifecycleTransition transition;
  649. transition.SetDays(30);
  650. transition.SetStorageClass("STANDARD_IA");
  651. rule.AddTransition(transition);
  652. req.AddRule(rule);
  653. }
  654. CosResult result = m_client->PutBucketLifecycle(req, &resp);
  655. EXPECT_TRUE(result.IsSucc());
  656. sleep(1);
  657. }
  658. TEST_F(BucketOpTest, GetBucketLifecycleTest) {
  659. sleep(1);
  660. GetBucketLifecycleReq req(m_bucket_name);
  661. GetBucketLifecycleResp resp;
  662. CosResult result = m_client->GetBucketLifecycle(req, &resp);
  663. ASSERT_TRUE(result.IsSucc());
  664. const std::vector<LifecycleRule>& rules = resp.GetRules();
  665. ASSERT_EQ(3, rules.size());
  666. // 验证第一条rule
  667. {
  668. const LifecycleRule& rule = rules[0];
  669. EXPECT_TRUE(rule.IsEnable());
  670. EXPECT_EQ("lifecycle_rule00", rule.GetId());
  671. EXPECT_EQ("sevenyou_e0", rule.GetFilter().GetPrefix());
  672. // Tag不能与Abort/DeleteMarker一起使用
  673. // ASSERT_EQ(2, rule.GetFilter().GetTags().size());
  674. // EXPECT_EQ("tag0_key", rule.GetFilter().GetTags()[0].key);
  675. // EXPECT_EQ("tag0_value", rule.GetFilter().GetTags()[0].value);
  676. // EXPECT_EQ("tag1_key", rule.GetFilter().GetTags()[1].key);
  677. // EXPECT_EQ("tag1_value", rule.GetFilter().GetTags()[1].value);
  678. const LifecycleExpiration& expiration = rule.GetExpiration();
  679. EXPECT_EQ(31, expiration.GetDays());
  680. const std::vector<LifecycleTransition>& transitions = rule.GetTransitions();
  681. EXPECT_EQ(30, transitions[0].GetDays());
  682. EXPECT_EQ("STANDARD_IA", transitions[0].GetStorageClass());
  683. const LifecycleNonCurrExpiration& non_cur_expiration =
  684. rule.GetNonCurrExpiration();
  685. EXPECT_EQ(8, non_cur_expiration.GetDays());
  686. const LifecycleNonCurrTransition& non_cur_transition =
  687. rule.GetNonCurrTransition();
  688. EXPECT_EQ(5, non_cur_transition.GetDays());
  689. EXPECT_EQ("STANDARD_IA", non_cur_transition.GetStorageClass());
  690. }
  691. EXPECT_TRUE(rules[1].IsEnable());
  692. EXPECT_EQ("lifecycle_rule01", rules[1].GetId());
  693. EXPECT_FALSE(rules[2].IsEnable());
  694. EXPECT_EQ("lifecycle_rule02", rules[2].GetId());
  695. }
  696. TEST_F(BucketOpTest, DeleteBucketLifecycleTest) {
  697. DeleteBucketLifecycleReq req(m_bucket_name);
  698. DeleteBucketLifecycleResp resp;
  699. CosResult result = m_client->DeleteBucketLifecycle(req, &resp);
  700. EXPECT_TRUE(result.IsSucc());
  701. }
  702. TEST_F(BucketOpTest, PutBucketACLTest) {
  703. sleep(1);
  704. // 1. Put
  705. {
  706. PutBucketACLReq req(m_bucket_name);
  707. PutBucketACLResp resp;
  708. Owner owner = {"qcs::cam::uin/" + m_owner + ":uin/" + m_owner,
  709. "qcs::cam::uin/" + m_owner + ":uin/" + m_owner};
  710. Grant grant;
  711. req.SetOwner(owner);
  712. grant.m_perm = "READ";
  713. grant.m_grantee.m_type = "RootAccount";
  714. grant.m_grantee.m_uri = "http://cam.qcloud.com/groups/global/AllUsers";
  715. grant.m_grantee.m_id = "qcs::cam::uin/" + m_owner2 + ":uin/" + m_owner2;
  716. grant.m_grantee.m_display_name =
  717. "qcs::cam::uin/" + m_owner2 + ":uin/" + m_owner2;
  718. req.AddAccessControlList(grant);
  719. CosResult result = m_client->PutBucketACL(req, &resp);
  720. EXPECT_TRUE(result.IsSucc());
  721. sleep(5);
  722. }
  723. }
  724. TEST_F(BucketOpTest, GetBucketACLTest) {
  725. GetBucketACLReq req(m_bucket_name);
  726. GetBucketACLResp resp;
  727. CosResult result = m_client->GetBucketACL(req, &resp);
  728. ASSERT_TRUE(result.IsSucc());
  729. const std::vector<qcloud_cos::Grant>& grants = resp.GetAccessControlList();
  730. EXPECT_EQ(1, grants.size());
  731. sleep(1);
  732. }
  733. TEST_F(BucketOpTest, PutBucketCORSTest) {
  734. PutBucketCORSReq req(m_bucket_name);
  735. PutBucketCORSResp resp;
  736. {
  737. CORSRule rule;
  738. rule.m_id = "cors_rule_00";
  739. rule.m_max_age_secs = "600";
  740. rule.m_allowed_headers.push_back("x-cos-meta-test");
  741. rule.m_allowed_origins.push_back("http://www.qq.com");
  742. rule.m_allowed_origins.push_back("http://www.qcloud.com");
  743. rule.m_allowed_methods.push_back("PUT");
  744. rule.m_allowed_methods.push_back("GET");
  745. rule.m_expose_headers.push_back("x-cos-expose");
  746. req.AddRule(rule);
  747. }
  748. {
  749. CORSRule rule;
  750. rule.m_id = "cors_rule_01";
  751. rule.m_max_age_secs = "30";
  752. rule.m_allowed_origins.push_back("http://www.qcloud100.com");
  753. rule.m_allowed_methods.push_back("HEAD");
  754. req.AddRule(rule);
  755. }
  756. CosResult result = m_client->PutBucketCORS(req, &resp);
  757. ASSERT_TRUE(result.IsSucc());
  758. sleep(1);
  759. }
  760. TEST_F(BucketOpTest, GetBucketCORSTest) {
  761. sleep(5);
  762. GetBucketCORSReq req(m_bucket_name);
  763. GetBucketCORSResp resp;
  764. CosResult result = m_client->GetBucketCORS(req, &resp);
  765. ASSERT_TRUE(result.IsSucc());
  766. std::vector<CORSRule> rules = resp.GetCORSRules();
  767. ASSERT_EQ(2, rules.size());
  768. EXPECT_EQ("cors_rule_00", rules[0].m_id);
  769. EXPECT_EQ("600", rules[0].m_max_age_secs);
  770. ASSERT_EQ(2, rules[0].m_allowed_origins.size());
  771. EXPECT_EQ("http://www.qq.com", rules[0].m_allowed_origins[0]);
  772. EXPECT_EQ("http://www.qcloud.com", rules[0].m_allowed_origins[1]);
  773. EXPECT_EQ("x-cos-meta-test", rules[0].m_allowed_headers[0]);
  774. EXPECT_EQ("PUT", rules[0].m_allowed_methods[0]);
  775. EXPECT_EQ("GET", rules[0].m_allowed_methods[1]);
  776. EXPECT_EQ("x-cos-expose", rules[0].m_expose_headers[0]);
  777. EXPECT_EQ("cors_rule_01", rules[1].m_id);
  778. EXPECT_EQ("30", rules[1].m_max_age_secs);
  779. ASSERT_EQ(1, rules[1].m_allowed_origins.size());
  780. EXPECT_EQ("http://www.qcloud100.com", rules[1].m_allowed_origins[0]);
  781. EXPECT_EQ("HEAD", rules[1].m_allowed_methods[0]);
  782. sleep(1);
  783. }
  784. TEST_F(BucketOpTest, DeleteBucketCORSTest) {
  785. {
  786. DeleteBucketCORSReq req(m_bucket_name);
  787. DeleteBucketCORSResp resp;
  788. CosResult result = m_client->DeleteBucketCORS(req, &resp);
  789. ASSERT_TRUE(result.IsSucc());
  790. }
  791. {
  792. GetBucketCORSReq req(m_bucket_name);
  793. GetBucketCORSResp resp;
  794. CosResult result = m_client->GetBucketCORS(req, &resp);
  795. ASSERT_FALSE(result.IsSucc());
  796. }
  797. sleep(1);
  798. }
  799. TEST_F(BucketOpTest, GetBucketObjectVersions) {
  800. // 1. 开启版本管理
  801. {
  802. PutBucketVersioningReq req(m_bucket_name);
  803. PutBucketVersioningResp resp;
  804. req.SetStatus(true);
  805. CosResult result = m_client->PutBucketVersioning(req, &resp);
  806. ASSERT_TRUE(result.IsSucc());
  807. }
  808. // 2. 上传文件
  809. {
  810. {
  811. std::istringstream iss("put object1");
  812. PutObjectByStreamReq req(m_bucket_name, "object_test", iss);
  813. req.SetXCosStorageClass(kStorageClassStandardIA);
  814. PutObjectByStreamResp resp;
  815. CosResult result = m_client->PutObject(req, &resp);
  816. ASSERT_TRUE(result.IsSucc());
  817. }
  818. {
  819. std::istringstream iss("put object2");
  820. PutObjectByStreamReq req(m_bucket_name, "object_test", iss);
  821. req.SetXCosStorageClass(kStorageClassStandardIA);
  822. PutObjectByStreamResp resp;
  823. CosResult result = m_client->PutObject(req, &resp);
  824. ASSERT_TRUE(result.IsSucc());
  825. }
  826. {
  827. std::istringstream iss("put object3");
  828. PutObjectByStreamReq req(m_bucket_name, "object_test2", iss);
  829. PutObjectByStreamResp resp;
  830. CosResult result = m_client->PutObject(req, &resp);
  831. ASSERT_TRUE(result.IsSucc());
  832. }
  833. {
  834. std::istringstream iss("put object4");
  835. PutObjectByStreamReq req(m_bucket_name, "bad_prefix_object_test", iss);
  836. PutObjectByStreamResp resp;
  837. CosResult result = m_client->PutObject(req, &resp);
  838. ASSERT_TRUE(result.IsSucc());
  839. }
  840. sleep(1);
  841. }
  842. // 3. 删除文件
  843. {
  844. DeleteObjectReq del_req(m_bucket_name, "object_test2");
  845. DeleteObjectResp del_resp;
  846. CosResult del_result = m_client->DeleteObject(del_req, &del_resp);
  847. ASSERT_TRUE(del_result.IsSucc());
  848. }
  849. // 4. 获取Object版本
  850. // object_test
  851. // 有两个版本,object_test2有两个把呢不能(旧版本,最新版本标记删除)
  852. {
  853. GetBucketObjectVersionsReq req(m_bucket_name);
  854. req.SetPrefix("object_test");
  855. GetBucketObjectVersionsResp resp;
  856. CosResult result = m_client->GetBucketObjectVersions(req, &resp);
  857. ASSERT_TRUE(result.IsSucc());
  858. EXPECT_EQ(m_bucket_name, resp.GetBucketName());
  859. EXPECT_EQ("object_test", resp.GetPrefix());
  860. EXPECT_FALSE(resp.IsTruncated());
  861. const std::vector<COSVersionSummary>& summs = resp.GetVersionSummary();
  862. EXPECT_EQ(4, summs.size());
  863. sleep(1);
  864. }
  865. }
  866. TEST_F(BucketOpTest, DeleteBucketTest) {
  867. // TODO
  868. // 未删除Object,删除Bucket返回false
  869. // 有BUG,如果此时删除bucket,则后一步get versions只返回一个版本
  870. {
  871. // DeleteBucketReq req(m_bucket_name);
  872. // DeleteBucketResp resp;
  873. // CosResult result = m_client->DeleteBucket(req, &resp);
  874. // EXPECT_FALSE(result.IsSucc());
  875. // sleep(1);
  876. }
  877. // 清空Object
  878. {
  879. {
  880. GetBucketObjectVersionsReq req(m_bucket_name);
  881. GetBucketObjectVersionsResp resp;
  882. CosResult result = m_client->GetBucketObjectVersions(req, &resp);
  883. EXPECT_TRUE(result.IsSucc());
  884. const std::vector<COSVersionSummary>& summs = resp.GetVersionSummary();
  885. for (std::vector<COSVersionSummary>::const_iterator c_itr = summs.begin();
  886. c_itr != summs.end(); ++c_itr) {
  887. const COSVersionSummary& summ = *c_itr;
  888. DeleteObjectReq del_req(m_bucket_name, summ.m_key);
  889. DeleteObjectResp del_resp;
  890. if (!summ.m_version_id.empty()) {
  891. del_req.SetXCosVersionId(summ.m_version_id);
  892. }
  893. CosResult del_result = m_client->DeleteObject(del_req, &del_resp);
  894. EXPECT_TRUE(del_result.IsSucc());
  895. if (!del_result.IsSucc()) {
  896. std::cout << "DeleteObject Failed, check object=" << summ.m_key
  897. << std::endl;
  898. }
  899. }
  900. sleep(1);
  901. }
  902. {
  903. GetBucketObjectVersionsReq req(m_bucket_name2);
  904. GetBucketObjectVersionsResp resp;
  905. CosResult result = m_client2->GetBucketObjectVersions(req, &resp);
  906. EXPECT_TRUE(result.IsSucc());
  907. const std::vector<COSVersionSummary>& summs = resp.GetVersionSummary();
  908. for (std::vector<COSVersionSummary>::const_iterator c_itr = summs.begin();
  909. c_itr != summs.end(); ++c_itr) {
  910. const COSVersionSummary& summ = *c_itr;
  911. DeleteObjectReq del_req(m_bucket_name2, summ.m_key);
  912. DeleteObjectResp del_resp;
  913. if (!summ.m_version_id.empty()) {
  914. del_req.SetXCosVersionId(summ.m_version_id);
  915. }
  916. CosResult del_result = m_client2->DeleteObject(del_req, &del_resp);
  917. EXPECT_TRUE(del_result.IsSucc());
  918. if (!del_result.IsSucc()) {
  919. std::cout << "DeleteObject Failed, check object=" << summ.m_key
  920. << std::endl;
  921. }
  922. }
  923. sleep(1);
  924. }
  925. }
  926. // Tear down的时候再删除bucket
  927. // 删除Bucket
  928. //{
  929. // {
  930. // DeleteBucketReq req(m_bucket_name);
  931. // DeleteBucketResp resp;
  932. // CosResult result = m_client->DeleteBucket(req, &resp);
  933. // EXPECT_TRUE(result.IsSucc());
  934. // }
  935. // {
  936. // DeleteBucketReq req(m_bucket_name2);
  937. // DeleteBucketResp resp;
  938. // CosResult result = m_client2->DeleteBucket(req, &resp);
  939. // EXPECT_TRUE(result.IsSucc());
  940. // }
  941. // sleep(1);
  942. //}
  943. }
  944. TEST_F(BucketOpTest, PutBucketLogging) {
  945. // bucket日志配置,成功返回true, 失败返回false
  946. {
  947. PutBucketLoggingReq req(m_bucket_name);
  948. PutBucketLoggingResp resp;
  949. LoggingEnabled rules;
  950. rules.SetTargetBucket(m_bucket_name);
  951. rules.SetTargetPrefix("/cos-access-log/");
  952. req.SetLoggingEnabled(rules);
  953. CosResult result = m_client->PutBucketLogging(req, &resp);
  954. EXPECT_TRUE(result.IsSucc());
  955. }
  956. {
  957. GetBucketLoggingReq req(m_bucket_name);
  958. GetBucketLoggingResp resp;
  959. CosResult result = m_client->GetBucketLogging(req, &resp);
  960. EXPECT_TRUE(result.IsSucc());
  961. LoggingEnabled loggingenabled = resp.GetLoggingEnabled();
  962. EXPECT_EQ(m_bucket_name, loggingenabled.GetTargetBucket());
  963. EXPECT_EQ("/cos-access-log/", loggingenabled.GetTargetPrefix());
  964. }
  965. sleep(1);
  966. }
  967. TEST_F(BucketOpTest, PutBucketWebsite) {
  968. // 为存储桶配置静态网站,成功返回true,失败返回false
  969. // 为存储桶配置静态网站
  970. {
  971. PutBucketWebsiteReq req(m_bucket_name);
  972. PutBucketWebsiteResp resp;
  973. req.SetSuffix("index.xml"); //必选项
  974. req.SetProtocol("https");
  975. req.SetKey("Error.html");
  976. //设置重定向规则,最多设置100条
  977. //设置第一条规则
  978. RoutingRule routerule1;
  979. Condition temp_condtion1;
  980. temp_condtion1.SetHttpErrorCodeReturnedEquals(404); //需要设置,默认404
  981. routerule1.SetCondition(temp_condtion1);
  982. Redirect temp_redirect1;
  983. temp_redirect1.SetProtocol("https");
  984. temp_redirect1.SetReplaceKeyWith("404.htmp");
  985. routerule1.SetRedirect(temp_redirect1);
  986. //设置第二条规则
  987. RoutingRule routerule2;
  988. Condition temp_condtion2;
  989. temp_condtion2.SetHttpErrorCodeReturnedEquals(403); //需要设置,默认404
  990. routerule2.SetCondition(temp_condtion2);
  991. Redirect temp_redirect2;
  992. temp_redirect2.SetProtocol("https");
  993. temp_redirect2.SetReplaceKeyWith("403.htmp");
  994. routerule2.SetRedirect(temp_redirect2);
  995. req.AddRoutingRule(routerule1);
  996. req.AddRoutingRule(routerule2);
  997. CosResult result = m_client->PutBucketWebsite(req, &resp);
  998. EXPECT_TRUE(result.IsSucc());
  999. sleep(1);
  1000. }
  1001. {
  1002. // 获取与存储桶关联的静态网站配置信息
  1003. GetBucketWebsiteReq req(m_bucket_name);
  1004. GetBucketWebsiteResp resp;
  1005. CosResult result = m_client->GetBucketWebsite(req, &resp);
  1006. EXPECT_TRUE(result.IsSucc());
  1007. EXPECT_EQ("https", resp.GetProtocol());
  1008. EXPECT_EQ("Error.html", resp.GetKey());
  1009. EXPECT_EQ("index.xml", resp.GetSuffix());
  1010. std::vector<RoutingRule> routingrules = resp.GetRoutingRules();
  1011. std::vector<RoutingRule>::iterator it = routingrules.begin();
  1012. const Condition& condition = it->GetCondition();
  1013. EXPECT_EQ(404, condition.GetHttpErrorCodeReturnedEquals());
  1014. // EXPECT_EQ("https", condition.GetKeyPrefixEquals());
  1015. const Redirect& redirect = it->GetRedirect();
  1016. EXPECT_EQ("https", redirect.GetProtocol());
  1017. EXPECT_EQ("404.htmp", redirect.GetReplaceKeyWith());
  1018. ++it;
  1019. const Condition& condition2 = it->GetCondition();
  1020. EXPECT_EQ(403, condition2.GetHttpErrorCodeReturnedEquals());
  1021. ;
  1022. EXPECT_EQ("https", redirect.GetProtocol());
  1023. EXPECT_EQ("404.htmp", redirect.GetReplaceKeyWith());
  1024. }
  1025. {
  1026. DeleteBucketWebsiteReq req(m_bucket_name);
  1027. DeleteBucketWebsiteResp resp;
  1028. CosResult result = m_client->DeleteBucketWebsite(req, &resp);
  1029. EXPECT_TRUE(result.IsSucc());
  1030. }
  1031. sleep(1);
  1032. }
  1033. TEST_F(BucketOpTest, PutBucketTagging) {
  1034. // 为存储桶配置Tag,成功返回true,失败返回false
  1035. {
  1036. std::vector<Tag> tagset;
  1037. Tag tag1;
  1038. tag1.SetKey("age");
  1039. tag1.SetValue("19");
  1040. Tag tag2;
  1041. tag2.SetKey("name");
  1042. tag2.SetValue("xiaoming");
  1043. tagset.push_back(tag1);
  1044. tagset.push_back(tag2);
  1045. PutBucketTaggingReq req(m_bucket_name);
  1046. req.SetTagSet(tagset);
  1047. PutBucketTaggingResp resp;
  1048. CosResult result = m_client->PutBucketTagging(req, &resp);
  1049. EXPECT_TRUE(result.IsSucc());
  1050. }
  1051. {
  1052. GetBucketTaggingReq req(m_bucket_name);
  1053. GetBucketTaggingResp resp;
  1054. CosResult result = m_client->GetBucketTagging(req, &resp);
  1055. EXPECT_TRUE(result.IsSucc());
  1056. std::vector<Tag> tagSet = resp.GetTagSet();
  1057. std::vector<Tag>::iterator it = tagSet.begin();
  1058. EXPECT_EQ("age", it->GetKey());
  1059. EXPECT_EQ("19", it->GetValue());
  1060. ++it;
  1061. EXPECT_EQ("name", it->GetKey());
  1062. EXPECT_EQ("xiaoming", it->GetValue());
  1063. }
  1064. {
  1065. DeleteBucketTaggingReq req(m_bucket_name);
  1066. DeleteBucketTaggingResp resp;
  1067. CosResult result = m_client->DeleteBucketTagging(req, &resp);
  1068. EXPECT_TRUE(result.IsSucc());
  1069. }
  1070. sleep(1);
  1071. }
  1072. TEST_F(BucketOpTest, PutBucketInventory) {
  1073. // 为存储桶配置清单,成功返回true,失败返回false
  1074. {
  1075. PutBucketInventoryReq req(m_bucket_name);
  1076. req.SetId("list3");
  1077. COSBucketDestination destination;
  1078. destination.SetFormat("CSV");
  1079. // destination.SetAccountId("100010974959");
  1080. destination.SetAccountId(m_owner);
  1081. std::string target_bucket =
  1082. "qcs::cos:" + m_config->GetRegion() + "::" + m_bucket_name;
  1083. destination.SetBucket(target_bucket);
  1084. destination.SetPrefix("/");
  1085. destination.SetEncryption(true);
  1086. OptionalFields fields;
  1087. fields.SetIsSize(true);
  1088. fields.SetIsLastModified(true);
  1089. fields.SetIsStorageClass(true);
  1090. fields.SetIsMultipartUploaded(true);
  1091. fields.SetIsReplicationStatus(true);
  1092. fields.SetIsEtag(true);
  1093. Inventory inventory;
  1094. inventory.SetIsEnable(true);
  1095. inventory.SetIncludedObjectVersions("All");
  1096. inventory.SetFilter("/");
  1097. inventory.SetId(req.GetId());
  1098. inventory.SetFrequency("Daily");
  1099. inventory.SetCOSBucketDestination(destination);
  1100. inventory.SetOptionalFields(fields);
  1101. req.SetInventory(inventory);
  1102. PutBucketInventoryResp resp;
  1103. CosResult result = m_client->PutBucketInventory(req, &resp);
  1104. EXPECT_TRUE(result.IsSucc());
  1105. }
  1106. {
  1107. PutBucketInventoryReq req(m_bucket_name);
  1108. req.SetId("list2");
  1109. COSBucketDestination destination;
  1110. destination.SetFormat("CSV");
  1111. // destination.SetAccountId("10001223951");
  1112. // destination.SetBucket("qcs::cos:ap-guangzhou::loggtest-1259743198");
  1113. destination.SetAccountId(m_owner);
  1114. std::string target_bucket =
  1115. "qcs::cos:" + m_config->GetRegion() + "::" + m_bucket_name;
  1116. destination.SetBucket(target_bucket);
  1117. destination.SetPrefix("/");
  1118. destination.SetEncryption(true);
  1119. OptionalFields fields;
  1120. fields.SetIsSize(true);
  1121. fields.SetIsLastModified(false);
  1122. fields.SetIsStorageClass(true);
  1123. fields.SetIsMultipartUploaded(true);
  1124. fields.SetIsReplicationStatus(false);
  1125. fields.SetIsEtag(false);
  1126. Inventory inventory;
  1127. inventory.SetIsEnable(true);
  1128. inventory.SetIncludedObjectVersions("All");
  1129. inventory.SetFilter("/");
  1130. inventory.SetId(req.GetId());
  1131. inventory.SetFrequency("Daily");
  1132. inventory.SetCOSBucketDestination(destination);
  1133. inventory.SetOptionalFields(fields);
  1134. req.SetInventory(inventory);
  1135. PutBucketInventoryResp resp;
  1136. CosResult result = m_client->PutBucketInventory(req, &resp);
  1137. EXPECT_TRUE(result.IsSucc());
  1138. sleep(1);
  1139. }
  1140. {
  1141. GetBucketInventoryReq req(m_bucket_name);
  1142. GetBucketInventoryResp resp;
  1143. req.SetId("list3");
  1144. CosResult result = m_client->GetBucketInventory(req, &resp);
  1145. EXPECT_TRUE(result.IsSucc());
  1146. const Inventory inventory = resp.GetInventory();
  1147. EXPECT_TRUE(inventory.GetIsEnable());
  1148. EXPECT_EQ("All", inventory.GetIncludedObjectVersions());
  1149. EXPECT_EQ("/", inventory.GetFilter());
  1150. EXPECT_EQ("list3", inventory.GetId());
  1151. EXPECT_EQ("Daily", inventory.GetFrequency());
  1152. COSBucketDestination destination = inventory.GetCOSBucketDestination();
  1153. EXPECT_EQ("CSV", destination.GetFormat());
  1154. // EXPECT_EQ("100010974951", destination.GetAccountId());
  1155. EXPECT_EQ(m_owner, destination.GetAccountId());
  1156. std::string target_bucket =
  1157. "qcs::cos:" + m_config->GetRegion() + "::" + m_bucket_name;
  1158. EXPECT_EQ(target_bucket, destination.GetBucket());
  1159. EXPECT_TRUE(destination.GetEncryption());
  1160. OptionalFields fields = inventory.GetOptionalFields();
  1161. EXPECT_TRUE(fields.GetIsSize());
  1162. EXPECT_TRUE(fields.GetIsLastModified());
  1163. EXPECT_TRUE(fields.GetIsStorageClass());
  1164. EXPECT_TRUE(fields.GetIsMultipartUploaded());
  1165. EXPECT_TRUE(fields.GetIsReplicationStatus());
  1166. EXPECT_TRUE(fields.GetIsETag());
  1167. }
  1168. {
  1169. ListBucketInventoryConfigurationsReq req(m_bucket_name);
  1170. ListBucketInventoryConfigurationsResp resp;
  1171. CosResult result = m_client->ListBucketInventoryConfigurations(req, &resp);
  1172. std::vector<Inventory> inventory_vec = resp.GetInventory();
  1173. std::vector<Inventory>::iterator itr = inventory_vec.begin();
  1174. EXPECT_TRUE(result.IsSucc());
  1175. COSBucketDestination destination;
  1176. OptionalFields fields;
  1177. for (; itr != inventory_vec.end(); ++itr) {
  1178. std::string target_bucket =
  1179. "qcs::cos:" + m_config->GetRegion() + "::" + m_bucket_name;
  1180. if (itr->GetId() == "list2") {
  1181. EXPECT_TRUE(itr->GetIsEnable());
  1182. EXPECT_EQ("All", itr->GetIncludedObjectVersions());
  1183. EXPECT_EQ("/", itr->GetFilter());
  1184. EXPECT_EQ("list2", itr->GetId());
  1185. EXPECT_EQ("Daily", itr->GetFrequency());
  1186. destination = itr->GetCOSBucketDestination();
  1187. EXPECT_EQ("CSV", destination.GetFormat());
  1188. // EXPECT_EQ("100010974951", destination.GetAccountId());
  1189. // EXPECT_EQ("qcs::cos:ap-guangzhou::loggtest-1259743191",
  1190. // destination.GetBucket());
  1191. EXPECT_EQ(m_owner, destination.GetAccountId());
  1192. EXPECT_EQ(target_bucket, destination.GetBucket());
  1193. EXPECT_TRUE(destination.GetEncryption());
  1194. fields = itr->GetOptionalFields();
  1195. EXPECT_TRUE(fields.GetIsSize());
  1196. EXPECT_TRUE(!fields.GetIsLastModified());
  1197. EXPECT_TRUE(fields.GetIsStorageClass());
  1198. EXPECT_TRUE(fields.GetIsMultipartUploaded());
  1199. EXPECT_TRUE(!fields.GetIsReplicationStatus());
  1200. EXPECT_TRUE(!fields.GetIsETag());
  1201. } else {
  1202. EXPECT_TRUE(itr->GetIsEnable());
  1203. EXPECT_EQ("All", itr->GetIncludedObjectVersions());
  1204. EXPECT_EQ("/", itr->GetFilter());
  1205. EXPECT_EQ("list3", itr->GetId());
  1206. EXPECT_EQ("Daily", itr->GetFrequency());
  1207. destination = itr->GetCOSBucketDestination();
  1208. EXPECT_EQ("CSV", destination.GetFormat());
  1209. // EXPECT_EQ("100010974951", destination.GetAccountId());
  1210. // EXPECT_EQ("qcs::cos:ap-guangzhou::test3-1259743191",
  1211. // destination.GetBucket());
  1212. EXPECT_EQ(m_owner, destination.GetAccountId());
  1213. EXPECT_EQ(target_bucket, destination.GetBucket());
  1214. EXPECT_TRUE(destination.GetEncryption());
  1215. fields = itr->GetOptionalFields();
  1216. EXPECT_TRUE(fields.GetIsSize());
  1217. EXPECT_TRUE(fields.GetIsLastModified());
  1218. EXPECT_TRUE(fields.GetIsStorageClass());
  1219. EXPECT_TRUE(fields.GetIsMultipartUploaded());
  1220. EXPECT_TRUE(fields.GetIsReplicationStatus());
  1221. EXPECT_TRUE(fields.GetIsETag());
  1222. }
  1223. }
  1224. }
  1225. {
  1226. DeleteBucketInventoryReq req(m_bucket_name);
  1227. DeleteBucketInventoryResp resp;
  1228. req.SetId("list3");
  1229. CosResult result = m_client->DeleteBucketInventory(req, &resp);
  1230. EXPECT_TRUE(result.IsSucc());
  1231. }
  1232. {
  1233. DeleteBucketInventoryReq req(m_bucket_name);
  1234. DeleteBucketInventoryResp resp;
  1235. req.SetId("list2");
  1236. CosResult result = m_client->DeleteBucketInventory(req, &resp);
  1237. EXPECT_TRUE(result.IsSucc());
  1238. }
  1239. }
  1240. TEST_F(BucketOpTest, BucketReferer) {
  1241. {
  1242. PutBucketRefererReq req(m_bucket_name);
  1243. PutBucketRefererResp resp;
  1244. req.SetStatus("Enabled");
  1245. req.SetRefererType("White-List");
  1246. req.AddDomain("test1.com");
  1247. req.AddDomain("test2.com");
  1248. CosResult result = m_client->PutBucketReferer(req, &resp);
  1249. EXPECT_TRUE(result.IsSucc());
  1250. }
  1251. {
  1252. GetBucketRefererReq req(m_bucket_name);
  1253. GetBucketRefererResp resp;
  1254. CosResult result = m_client->GetBucketReferer(req, &resp);
  1255. EXPECT_TRUE(result.IsSucc());
  1256. EXPECT_EQ("Enabled", resp.GetStatus());
  1257. EXPECT_EQ("White-List", resp.GetRefererType());
  1258. EXPECT_EQ(2, resp.GetDomainList().size());
  1259. EXPECT_EQ("test1.com", resp.GetDomainList()[0]);
  1260. EXPECT_EQ("test2.com", resp.GetDomainList()[1]);
  1261. EXPECT_EQ("Deny", resp.GetEmptyReferConf());
  1262. }
  1263. }
  1264. TEST_F(BucketOpTest, InvalidConfig) {
  1265. qcloud_cos::CosConfig config(123, "ak", "", "ap-guangzhou");
  1266. ASSERT_FALSE(config.GetRegion().empty());
  1267. qcloud_cos::CosAPI cos(config);
  1268. HeadBucketReq req("test-bucket-1253960454");
  1269. HeadBucketResp resp;
  1270. CosResult result = cos.HeadBucket(req, &resp);
  1271. ASSERT_TRUE(!result.IsSucc());
  1272. ASSERT_EQ(result.GetErrorMsg(),
  1273. "Invalid access_key secret_key or region, please check your "
  1274. "configuration");
  1275. }
  1276. TEST_F(BucketOpTest, BucketPolicyTest) {
  1277. {
  1278. PutBucketPolicyReq req(m_bucket_name);
  1279. PutBucketPolicyResp resp;
  1280. std::string bucket_policy =
  1281. " {"
  1282. " \"Statement\": ["
  1283. " {"
  1284. " \"Principal\": {"
  1285. " \"qcs\": ["
  1286. " \"*\""
  1287. " ]"
  1288. " },"
  1289. " \"Effect\": \"allow\","
  1290. " \"Action\": ["
  1291. " \"cos:PutObject\""
  1292. " ],"
  1293. " \"Resource\": [" //这里改成允许的路径前缀,可以根据自己网站的用户登录态判断允许上传的具体路径,例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用)
  1294. " \"qcs::cos:";
  1295. bucket_policy += GetEnvVar("CPP_SDK_V5_REGION");
  1296. bucket_policy += ":uid/";
  1297. bucket_policy += GetEnvVar("CPP_SDK_V5_APPID");
  1298. bucket_policy += ":";
  1299. bucket_policy += m_bucket_name;
  1300. bucket_policy += "/*\""
  1301. " ],"
  1302. " \"Condition\": {"
  1303. " \"string_equal\": {"
  1304. " \"cos:x-cos-mime-limit\": \"image/jpeg\""
  1305. " }"
  1306. " }"
  1307. " }"
  1308. " ],"
  1309. " \"Version\": \"2.0\""
  1310. " }";
  1311. req.SetBody(bucket_policy);
  1312. CosResult result = m_client->PutBucketPolicy(req, &resp);
  1313. EXPECT_TRUE(result.IsSucc());
  1314. }
  1315. {
  1316. GetBucketPolicyReq req(m_bucket_name);
  1317. GetBucketPolicyResp resp;
  1318. CosResult result = m_client->GetBucketPolicy(req, &resp);
  1319. EXPECT_TRUE(result.IsSucc());
  1320. }
  1321. {
  1322. DeleteBucketPolicyReq req(m_bucket_name);
  1323. DeleteBucketPolicyResp resp;
  1324. CosResult result = m_client->DeleteBucketPolicy(req, &resp);
  1325. EXPECT_TRUE(result.IsSucc());
  1326. }
  1327. }
  1328. } // namespace qcloud_cos