brpc_uri_unittest.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. // Licensed to the Apache Software Foundation (ASF) under one
  2. // or more contributor license agreements. See the NOTICE file
  3. // distributed with this work for additional information
  4. // regarding copyright ownership. The ASF licenses this file
  5. // to you under the Apache License, Version 2.0 (the
  6. // "License"); you may not use this file except in compliance
  7. // with the License. You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing,
  12. // software distributed under the License is distributed on an
  13. // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  14. // KIND, either express or implied. See the License for the
  15. // specific language governing permissions and limitations
  16. // under the License.
  17. #include <gtest/gtest.h>
  18. #include "brpc/uri.h"
  19. TEST(URITest, everything) {
  20. brpc::URI uri;
  21. std::string uri_str = " foobar://user:passwd@www.baidu.com:80/s?wd=uri#frag ";
  22. ASSERT_EQ(0, uri.SetHttpURL(uri_str));
  23. ASSERT_EQ("foobar", uri.scheme());
  24. ASSERT_EQ(80, uri.port());
  25. ASSERT_EQ("www.baidu.com", uri.host());
  26. ASSERT_EQ("/s", uri.path());
  27. ASSERT_EQ("user:passwd", uri.user_info());
  28. ASSERT_EQ("frag", uri.fragment());
  29. ASSERT_TRUE(uri.GetQuery("wd"));
  30. ASSERT_EQ(*uri.GetQuery("wd"), "uri");
  31. ASSERT_FALSE(uri.GetQuery("nonkey"));
  32. std::string scheme;
  33. std::string host_out;
  34. int port_out = -1;
  35. brpc::ParseURL(uri_str.c_str(), &scheme, &host_out, &port_out);
  36. ASSERT_EQ("foobar", scheme);
  37. ASSERT_EQ("www.baidu.com", host_out);
  38. ASSERT_EQ(80, port_out);
  39. }
  40. TEST(URITest, only_host) {
  41. brpc::URI uri;
  42. ASSERT_EQ(0, uri.SetHttpURL(" foo1://www.baidu1.com?wd=uri2&nonkey=22 "));
  43. ASSERT_EQ("foo1", uri.scheme());
  44. ASSERT_EQ(-1, uri.port());
  45. ASSERT_EQ("www.baidu1.com", uri.host());
  46. ASSERT_EQ("", uri.path());
  47. ASSERT_EQ("", uri.user_info());
  48. ASSERT_EQ("", uri.fragment());
  49. ASSERT_EQ(2u, uri.QueryCount());
  50. ASSERT_TRUE(uri.GetQuery("wd"));
  51. ASSERT_EQ(*uri.GetQuery("wd"), "uri2");
  52. ASSERT_TRUE(uri.GetQuery("nonkey"));
  53. ASSERT_EQ(*uri.GetQuery("nonkey"), "22");
  54. ASSERT_EQ(0, uri.SetHttpURL("foo2://www.baidu2.com:1234?wd=uri2&nonkey=22 "));
  55. ASSERT_EQ("foo2", uri.scheme());
  56. ASSERT_EQ(1234, uri.port());
  57. ASSERT_EQ("www.baidu2.com", uri.host());
  58. ASSERT_EQ("", uri.path());
  59. ASSERT_EQ("", uri.user_info());
  60. ASSERT_EQ("", uri.fragment());
  61. ASSERT_EQ(2u, uri.QueryCount());
  62. ASSERT_TRUE(uri.GetQuery("wd"));
  63. ASSERT_EQ(*uri.GetQuery("wd"), "uri2");
  64. ASSERT_TRUE(uri.GetQuery("nonkey"));
  65. ASSERT_EQ(*uri.GetQuery("nonkey"), "22");
  66. ASSERT_EQ(0, uri.SetHttpURL(" www.baidu3.com:4321 "));
  67. ASSERT_EQ("", uri.scheme());
  68. ASSERT_EQ(4321, uri.port());
  69. ASSERT_EQ("www.baidu3.com", uri.host());
  70. ASSERT_EQ("", uri.path());
  71. ASSERT_EQ("", uri.user_info());
  72. ASSERT_EQ("", uri.fragment());
  73. ASSERT_EQ(0u, uri.QueryCount());
  74. ASSERT_EQ(0, uri.SetHttpURL(" www.baidu4.com "));
  75. ASSERT_EQ("", uri.scheme());
  76. ASSERT_EQ(-1, uri.port());
  77. ASSERT_EQ("www.baidu4.com", uri.host());
  78. ASSERT_EQ("", uri.path());
  79. ASSERT_EQ("", uri.user_info());
  80. ASSERT_EQ("", uri.fragment());
  81. ASSERT_EQ(0u, uri.QueryCount());
  82. }
  83. TEST(URITest, no_scheme) {
  84. brpc::URI uri;
  85. ASSERT_EQ(0, uri.SetHttpURL(" user:passwd2@www.baidu1.com/s?wd=uri2&nonkey=22#frag "));
  86. ASSERT_EQ("", uri.scheme());
  87. ASSERT_EQ(-1, uri.port());
  88. ASSERT_EQ("www.baidu1.com", uri.host());
  89. ASSERT_EQ("/s", uri.path());
  90. ASSERT_EQ("user:passwd2", uri.user_info());
  91. ASSERT_EQ("frag", uri.fragment());
  92. ASSERT_TRUE(uri.GetQuery("wd"));
  93. ASSERT_EQ(*uri.GetQuery("wd"), "uri2");
  94. ASSERT_TRUE(uri.GetQuery("nonkey"));
  95. ASSERT_EQ(*uri.GetQuery("nonkey"), "22");
  96. }
  97. TEST(URITest, no_scheme_and_user_info) {
  98. brpc::URI uri;
  99. ASSERT_EQ(0, uri.SetHttpURL(" www.baidu2.com/s?wd=uri2&nonkey=22#frag "));
  100. ASSERT_EQ("", uri.scheme());
  101. ASSERT_EQ(-1, uri.port());
  102. ASSERT_EQ("www.baidu2.com", uri.host());
  103. ASSERT_EQ("/s", uri.path());
  104. ASSERT_EQ("", uri.user_info());
  105. ASSERT_EQ("frag", uri.fragment());
  106. ASSERT_TRUE(uri.GetQuery("wd"));
  107. ASSERT_EQ(*uri.GetQuery("wd"), "uri2");
  108. ASSERT_TRUE(uri.GetQuery("nonkey"));
  109. ASSERT_EQ(*uri.GetQuery("nonkey"), "22");
  110. }
  111. TEST(URITest, no_host) {
  112. brpc::URI uri;
  113. ASSERT_EQ(0, uri.SetHttpURL(" /sb?wd=uri3#frag2 ")) << uri.status();
  114. ASSERT_EQ("", uri.scheme());
  115. ASSERT_EQ(-1, uri.port());
  116. ASSERT_EQ("", uri.host());
  117. ASSERT_EQ("/sb", uri.path());
  118. ASSERT_EQ("", uri.user_info());
  119. ASSERT_EQ("frag2", uri.fragment());
  120. ASSERT_TRUE(uri.GetQuery("wd"));
  121. ASSERT_EQ(*uri.GetQuery("wd"), "uri3");
  122. ASSERT_FALSE(uri.GetQuery("nonkey"));
  123. // set_path should do as its name says.
  124. uri.set_path("/x/y/z/");
  125. ASSERT_EQ("", uri.scheme());
  126. ASSERT_EQ(-1, uri.port());
  127. ASSERT_EQ("", uri.host());
  128. ASSERT_EQ("/x/y/z/", uri.path());
  129. ASSERT_EQ("", uri.user_info());
  130. ASSERT_EQ("frag2", uri.fragment());
  131. ASSERT_TRUE(uri.GetQuery("wd"));
  132. ASSERT_EQ(*uri.GetQuery("wd"), "uri3");
  133. ASSERT_FALSE(uri.GetQuery("nonkey"));
  134. }
  135. TEST(URITest, consecutive_ampersand) {
  136. brpc::URI uri;
  137. uri._query = "&key1=value1&&key3=value3";
  138. ASSERT_TRUE(uri.GetQuery("key1"));
  139. ASSERT_TRUE(uri.GetQuery("key3"));
  140. ASSERT_FALSE(uri.GetQuery("key2"));
  141. ASSERT_EQ("value1", *uri.GetQuery("key1"));
  142. ASSERT_EQ("value3", *uri.GetQuery("key3"));
  143. }
  144. TEST(URITest, only_equality) {
  145. brpc::URI uri;
  146. uri._query = "key1=&&key2&&=&key3=value3";
  147. ASSERT_TRUE(uri.GetQuery("key1"));
  148. ASSERT_EQ("", *uri.GetQuery("key1"));
  149. ASSERT_TRUE(uri.GetQuery("key2"));
  150. ASSERT_EQ("", *uri.GetQuery("key2"));
  151. ASSERT_TRUE(uri.GetQuery("key3"));
  152. ASSERT_EQ("value3", *uri.GetQuery("key3"));
  153. }
  154. TEST(URITest, set_query) {
  155. brpc::URI uri;
  156. uri._query = "key1=&&key2&&=&key3=value3";
  157. ASSERT_TRUE(uri.GetQuery("key1"));
  158. ASSERT_TRUE(uri.GetQuery("key3"));
  159. ASSERT_EQ("value3", *uri.GetQuery("key3"));
  160. ASSERT_TRUE(uri.GetQuery("key2"));
  161. // overwrite value
  162. uri.SetQuery("key3", "value4");
  163. ASSERT_EQ("value4", *uri.GetQuery("key3"));
  164. uri.SetQuery("key2", "value2");
  165. ASSERT_TRUE(uri.GetQuery("key2"));
  166. ASSERT_EQ("value2", *uri.GetQuery("key2"));
  167. }
  168. TEST(URITest, set_h2_path) {
  169. brpc::URI uri;
  170. uri.SetH2Path("/dir?key1=&&key2&&=&key3=value3");
  171. ASSERT_EQ("/dir", uri.path());
  172. ASSERT_TRUE(uri.GetQuery("key1"));
  173. ASSERT_TRUE(uri.GetQuery("key2"));
  174. ASSERT_TRUE(uri.GetQuery("key3"));
  175. ASSERT_EQ("value3", *uri.GetQuery("key3"));
  176. uri.SetH2Path("dir?key1=&&key2&&=&key3=value3");
  177. ASSERT_EQ("dir", uri.path());
  178. ASSERT_TRUE(uri.GetQuery("key1"));
  179. ASSERT_TRUE(uri.GetQuery("key2"));
  180. ASSERT_TRUE(uri.GetQuery("key3"));
  181. ASSERT_EQ("value3", *uri.GetQuery("key3"));
  182. uri.SetH2Path("/dir?key1=&&key2&&=&key3=value3#frag1");
  183. ASSERT_EQ("/dir", uri.path());
  184. ASSERT_TRUE(uri.GetQuery("key1"));
  185. ASSERT_TRUE(uri.GetQuery("key2"));
  186. ASSERT_TRUE(uri.GetQuery("key3"));
  187. ASSERT_EQ("value3", *uri.GetQuery("key3"));
  188. ASSERT_EQ("frag1", uri.fragment());
  189. }
  190. TEST(URITest, generate_h2_path) {
  191. brpc::URI uri;
  192. const std::string ref1 = "/dir?key1=&&key2&&=&key3=value3";
  193. uri.SetH2Path(ref1);
  194. ASSERT_EQ("/dir", uri.path());
  195. ASSERT_EQ(3u, uri.QueryCount());
  196. ASSERT_TRUE(uri.GetQuery("key1"));
  197. ASSERT_TRUE(uri.GetQuery("key2"));
  198. ASSERT_TRUE(uri.GetQuery("key3"));
  199. ASSERT_EQ("value3", *uri.GetQuery("key3"));
  200. std::string path1;
  201. uri.GenerateH2Path(&path1);
  202. ASSERT_EQ(ref1, path1);
  203. uri.SetQuery("key3", "value3.3");
  204. ASSERT_EQ(3u, uri.QueryCount());
  205. ASSERT_EQ(1u, uri.RemoveQuery("key1"));
  206. ASSERT_EQ(2u, uri.QueryCount());
  207. ASSERT_EQ("key2&key3=value3.3", uri.query());
  208. uri.GenerateH2Path(&path1);
  209. ASSERT_EQ("/dir?key2&key3=value3.3", path1);
  210. const std::string ref2 = "/dir2?key1=&&key2&&=&key3=value3#frag2";
  211. uri.SetH2Path(ref2);
  212. ASSERT_EQ("/dir2", uri.path());
  213. ASSERT_TRUE(uri.GetQuery("key1"));
  214. ASSERT_TRUE(uri.GetQuery("key2"));
  215. ASSERT_TRUE(uri.GetQuery("key3"));
  216. ASSERT_EQ("value3", *uri.GetQuery("key3"));
  217. ASSERT_EQ("frag2", uri.fragment());
  218. std::string path2;
  219. uri.GenerateH2Path(&path2);
  220. ASSERT_EQ(ref2, path2);
  221. const std::string ref3 = "/dir3#frag3";
  222. uri.SetH2Path(ref3);
  223. ASSERT_EQ("/dir3", uri.path());
  224. ASSERT_EQ("frag3", uri.fragment());
  225. std::string path3;
  226. uri.GenerateH2Path(&path3);
  227. ASSERT_EQ(ref3, path3);
  228. const std::string ref4 = "/dir4";
  229. uri.SetH2Path(ref4);
  230. ASSERT_EQ("/dir4", uri.path());
  231. std::string path4;
  232. uri.GenerateH2Path(&path4);
  233. ASSERT_EQ(ref4, path4);
  234. }
  235. TEST(URITest, only_one_key) {
  236. brpc::URI uri;
  237. uri._query = "key1";
  238. ASSERT_TRUE(uri.GetQuery("key1"));
  239. ASSERT_EQ("", *uri.GetQuery("key1"));
  240. }
  241. TEST(URITest, empty_host) {
  242. brpc::URI uri;
  243. ASSERT_EQ(0, uri.SetHttpURL("http://"));
  244. ASSERT_EQ("", uri.host());
  245. ASSERT_EQ("", uri.path());
  246. }
  247. TEST(URITest, invalid_spaces) {
  248. brpc::URI uri;
  249. ASSERT_EQ(-1, uri.SetHttpURL("foo bar://user:passwd@www.baidu.com:80/s?wd=uri#frag"));
  250. ASSERT_STREQ("Invalid space in url", uri.status().error_cstr());
  251. ASSERT_EQ(-1, uri.SetHttpURL("foobar://us er:passwd@www.baidu.com:80/s?wd=uri#frag"));
  252. ASSERT_STREQ("Invalid space in url", uri.status().error_cstr());
  253. ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:pass wd@www.baidu.com:80/s?wd=uri#frag"));
  254. ASSERT_STREQ("Invalid space in url", uri.status().error_cstr());
  255. ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www. baidu.com:80/s?wd=uri#frag"));
  256. ASSERT_STREQ("Invalid space in url", uri.status().error_cstr());
  257. ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/ s?wd=uri#frag"));
  258. ASSERT_STREQ("Invalid space in path", uri.status().error_cstr());
  259. ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s ?wd=uri#frag"));
  260. ASSERT_STREQ("Invalid space in path", uri.status().error_cstr());
  261. ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s? wd=uri#frag"));
  262. ASSERT_STREQ("Invalid space in query", uri.status().error_cstr());
  263. ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s?w d=uri#frag"));
  264. ASSERT_STREQ("Invalid space in query", uri.status().error_cstr());
  265. ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s?wd=uri #frag"));
  266. ASSERT_STREQ("Invalid space in query", uri.status().error_cstr());
  267. ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s?wd=uri# frag"));
  268. ASSERT_STREQ("Invalid space in fragment", uri.status().error_cstr());
  269. ASSERT_EQ(-1, uri.SetHttpURL("foobar://user:passwd@www.baidu.com:80/s?wd=uri#fr ag"));
  270. ASSERT_STREQ("Invalid space in fragment", uri.status().error_cstr());
  271. }
  272. TEST(URITest, invalid_query) {
  273. brpc::URI uri;
  274. ASSERT_EQ(0, uri.SetHttpURL("http://a.b.c/?a-b-c:def"));
  275. ASSERT_EQ("a-b-c:def", uri.query());
  276. }
  277. TEST(URITest, print_url) {
  278. brpc::URI uri;
  279. const std::string url1 = "http://user:passwd@a.b.c/?d=c&a=b&e=f#frg1";
  280. ASSERT_EQ(0, uri.SetHttpURL(url1));
  281. std::ostringstream oss;
  282. uri.Print(oss);
  283. ASSERT_EQ("http://a.b.c/?d=c&a=b&e=f#frg1", oss.str());
  284. oss.str("");
  285. uri.PrintWithoutHost(oss);
  286. ASSERT_EQ("/?d=c&a=b&e=f#frg1", oss.str());
  287. const std::string url2 = "http://a.b.c/?d=c&a=b&e=f#frg1";
  288. ASSERT_EQ(0, uri.SetHttpURL(url2));
  289. oss.str("");
  290. uri.Print(oss);
  291. ASSERT_EQ(url2, oss.str());
  292. oss.str("");
  293. uri.PrintWithoutHost(oss);
  294. ASSERT_EQ("/?d=c&a=b&e=f#frg1", oss.str());
  295. uri.SetQuery("e", "f2");
  296. uri.SetQuery("f", "g");
  297. ASSERT_EQ((size_t)1, uri.RemoveQuery("a"));
  298. oss.str("");
  299. uri.Print(oss);
  300. ASSERT_EQ("http://a.b.c/?d=c&e=f2&f=g#frg1", oss.str());
  301. oss.str("");
  302. uri.PrintWithoutHost(oss);
  303. ASSERT_EQ("/?d=c&e=f2&f=g#frg1", oss.str());
  304. }
  305. TEST(URITest, copy_and_assign) {
  306. brpc::URI uri;
  307. const std::string url = "http://user:passwd@a.b.c/?d=c&a=b&e=f#frg1";
  308. ASSERT_EQ(0, uri.SetHttpURL(url));
  309. brpc::URI uri2 = uri;
  310. }
  311. TEST(URITest, query_remover_sanity) {
  312. std::string query = "key1=value1&key2=value2&key3=value3";
  313. brpc::QueryRemover qr(&query);
  314. ASSERT_TRUE(qr);
  315. ASSERT_EQ(qr.key(), "key1");
  316. ASSERT_EQ(qr.value(), "value1");
  317. ++qr;
  318. ASSERT_EQ(qr.key(), "key2");
  319. ASSERT_EQ(qr.value(), "value2");
  320. ++qr;
  321. ASSERT_EQ(qr.key(), "key3");
  322. ASSERT_EQ(qr.value(), "value3");
  323. ++qr;
  324. ASSERT_FALSE(qr);
  325. }
  326. TEST(URITest, query_remover_remove_current_key_and_value) {
  327. std::string query = "key1=value1&key2=value2&key3=value3";
  328. brpc::QueryRemover qr(&query);
  329. ASSERT_TRUE(qr);
  330. qr.remove_current_key_and_value();
  331. ASSERT_EQ(qr.modified_query(), "key2=value2&key3=value3");
  332. qr.remove_current_key_and_value(); /* expected to have not effect */
  333. qr.remove_current_key_and_value(); /* expected to have not effect */
  334. ++qr;
  335. ASSERT_TRUE(qr);
  336. qr.remove_current_key_and_value();
  337. ASSERT_EQ(qr.modified_query(), "key3=value3");
  338. ++qr;
  339. ASSERT_TRUE(qr);
  340. qr.remove_current_key_and_value();
  341. ASSERT_EQ(qr.modified_query(), "");
  342. ++qr;
  343. ASSERT_FALSE(qr);
  344. }
  345. TEST(URITest, query_remover_random_remove) {
  346. std::string query = "key1=value1&key2=value2&key3=value3&key4=value4"
  347. "&key5=value5&key6=value6";
  348. brpc::QueryRemover qr(&query);
  349. ASSERT_TRUE(qr);
  350. ++qr;
  351. ++qr;
  352. ASSERT_TRUE(qr);
  353. qr.remove_current_key_and_value();
  354. ++qr;
  355. ++qr;
  356. qr.remove_current_key_and_value();
  357. ASSERT_EQ(qr.modified_query(), "key1=value1&key2=value2&key4=value4&key6=value6");
  358. }
  359. TEST(URITest, query_remover_onekey_remove) {
  360. std::string query = "key1=value1&key2=value2&key3=value3&key4=value4"
  361. "&key5=value5&key6=value6";
  362. brpc::QueryRemover qr(&query);
  363. ASSERT_TRUE(qr);
  364. ++qr;
  365. ++qr;
  366. ++qr;
  367. qr.remove_current_key_and_value();
  368. ++qr;
  369. ++qr;
  370. ASSERT_TRUE(qr);
  371. ++qr;
  372. ASSERT_FALSE(qr);
  373. ++qr;
  374. ++qr;
  375. ASSERT_EQ(qr.modified_query(), "key1=value1&key2=value2&key3=value3&key5=value5&key6=value6");
  376. }
  377. TEST(URITest, query_remover_consecutive_ampersand) {
  378. std::string query = "key1=value1&&&key2=value2&key3=value3&&";
  379. brpc::QueryRemover qr(&query);
  380. ASSERT_TRUE(qr);
  381. qr.remove_current_key_and_value();
  382. ASSERT_EQ(qr.modified_query(), "key2=value2&key3=value3&&");
  383. ++qr;
  384. qr.remove_current_key_and_value();
  385. ASSERT_EQ(qr.modified_query(), "key3=value3&&");
  386. qr++;
  387. qr.remove_current_key_and_value();
  388. ASSERT_EQ(qr.modified_query(), "");
  389. ++qr;
  390. ASSERT_FALSE(qr);
  391. }
  392. TEST(URITest, query_remover_only_equality) {
  393. std::string query ="key1=&&key2&=&key3=value3";
  394. brpc::QueryRemover qr(&query);
  395. ASSERT_TRUE(qr);
  396. ASSERT_EQ(qr.key(), "key1");
  397. ASSERT_EQ(qr.value(), "");
  398. ++qr;
  399. ASSERT_EQ(qr.key(), "key2");
  400. ASSERT_EQ(qr.value(), "");
  401. ++qr;
  402. ASSERT_EQ(qr.key(), "");
  403. ASSERT_EQ(qr.value(), "");
  404. qr.remove_current_key_and_value();
  405. ++qr;
  406. ASSERT_EQ(qr.key(), "key3");
  407. ASSERT_EQ(qr.value(), "value3");
  408. ++qr;
  409. ASSERT_FALSE(qr);
  410. ASSERT_EQ(qr.modified_query(), "key1=&&key2&key3=value3");
  411. }
  412. TEST(URITest, query_remover_only_one_key) {
  413. std::string query = "key1";
  414. brpc::QueryRemover qr(&query);
  415. ASSERT_TRUE(qr);
  416. ASSERT_EQ(qr.key(), "key1");
  417. ASSERT_EQ(qr.value(), "");
  418. qr.remove_current_key_and_value();
  419. ++qr;
  420. ASSERT_FALSE(qr);
  421. ASSERT_EQ(qr.modified_query(), "");
  422. }
  423. TEST(URITest, query_remover_no_modify) {
  424. std::string query = "key1=value1&key2=value2&key3=value3";
  425. brpc::QueryRemover qr(&query);
  426. ASSERT_TRUE(qr);
  427. ASSERT_EQ(qr.key(), "key1");
  428. ASSERT_EQ(qr.value(), "value1");
  429. ++qr;
  430. ++qr;
  431. ++qr;
  432. ASSERT_FALSE(qr);
  433. ASSERT_EQ(qr.modified_query(), query);
  434. }
  435. TEST(URITest, query_remover_key_value_not_changed_after_modified_query) {
  436. std::string query = "key1=value1&key2=value2&key3=value3";
  437. brpc::QueryRemover qr(&query);
  438. ASSERT_TRUE(qr);
  439. ++qr;
  440. ASSERT_EQ(qr.key(), "key2");
  441. ASSERT_EQ(qr.value(), "value2");
  442. qr.remove_current_key_and_value();
  443. std::string new_query = qr.modified_query();
  444. ASSERT_EQ(new_query, "key1=value1&key3=value3");
  445. ASSERT_EQ(qr.key(), "key2");
  446. ASSERT_EQ(qr.value(), "value2");
  447. }
  448. TEST(URITest, valid_character) {
  449. brpc::URI uri;
  450. ASSERT_EQ(0, uri.SetHttpURL("www.baidu2.com':/?#[]@!$&()*+,;=-._~%"));
  451. }