brpc_naming_service_unittest.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  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 <stdio.h>
  18. #include <gtest/gtest.h>
  19. #include <vector>
  20. #include "butil/string_printf.h"
  21. #include "butil/files/temp_file.h"
  22. #include "bthread/bthread.h"
  23. #ifdef BAIDU_INTERNAL
  24. #include "brpc/policy/baidu_naming_service.h"
  25. #endif
  26. #include "brpc/policy/consul_naming_service.h"
  27. #include "brpc/policy/domain_naming_service.h"
  28. #include "brpc/policy/file_naming_service.h"
  29. #include "brpc/policy/list_naming_service.h"
  30. #include "brpc/policy/remote_file_naming_service.h"
  31. #include "brpc/policy/discovery_naming_service.h"
  32. #include "echo.pb.h"
  33. #include "brpc/server.h"
  34. namespace brpc {
  35. DECLARE_int32(health_check_interval);
  36. namespace policy {
  37. DECLARE_bool(consul_enable_degrade_to_file_naming_service);
  38. DECLARE_string(consul_file_naming_service_dir);
  39. DECLARE_string(consul_service_discovery_url);
  40. DECLARE_string(discovery_api_addr);
  41. DECLARE_string(discovery_env);
  42. DECLARE_int32(discovery_renew_interval_s);
  43. } // policy
  44. } // brpc
  45. namespace {
  46. bool IsIPListEqual(const std::set<butil::ip_t>& s1, const std::set<butil::ip_t>& s2) {
  47. if (s1.size() != s2.size()) {
  48. return false;
  49. }
  50. for (auto it1 = s1.begin(), it2 = s2.begin(); it1 != s1.end(); ++it1, ++it2) {
  51. if (*it1 != *it2) {
  52. return false;
  53. }
  54. }
  55. return true;
  56. }
  57. TEST(NamingServiceTest, sanity) {
  58. std::vector<brpc::ServerNode> servers;
  59. #ifdef BAIDU_INTERNAL
  60. brpc::policy::BaiduNamingService bns;
  61. ASSERT_EQ(0, bns.GetServers("qa-pbrpc.SAT.tjyx", &servers));
  62. #endif
  63. brpc::policy::DomainNamingService dns;
  64. ASSERT_EQ(0, dns.GetServers("baidu.com:1234", &servers));
  65. ASSERT_EQ(2u, servers.size());
  66. ASSERT_EQ(1234, servers[0].addr.port);
  67. ASSERT_EQ(1234, servers[1].addr.port);
  68. const std::set<butil::ip_t> expected_ips{servers[0].addr.ip, servers[1].addr.ip};
  69. ASSERT_EQ(0, dns.GetServers("baidu.com", &servers));
  70. ASSERT_EQ(2u, servers.size());
  71. const std::set<butil::ip_t> ip_list1{servers[0].addr.ip, servers[1].addr.ip};
  72. ASSERT_TRUE(IsIPListEqual(expected_ips, ip_list1));
  73. ASSERT_EQ(80, servers[0].addr.port);
  74. ASSERT_EQ(80, servers[1].addr.port);
  75. ASSERT_EQ(0, dns.GetServers("baidu.com:1234/useless1/useless2", &servers));
  76. ASSERT_EQ(2u, servers.size());
  77. const std::set<butil::ip_t> ip_list2{servers[0].addr.ip, servers[1].addr.ip};
  78. ASSERT_TRUE(IsIPListEqual(expected_ips, ip_list2));
  79. ASSERT_EQ(1234, servers[0].addr.port);
  80. ASSERT_EQ(1234, servers[1].addr.port);
  81. ASSERT_EQ(0, dns.GetServers("baidu.com/useless1/useless2", &servers));
  82. ASSERT_EQ(2u, servers.size());
  83. const std::set<butil::ip_t> ip_list3{servers[0].addr.ip, servers[1].addr.ip};
  84. ASSERT_TRUE(IsIPListEqual(expected_ips, ip_list3));
  85. ASSERT_EQ(80, servers[0].addr.port);
  86. ASSERT_EQ(80, servers[1].addr.port);
  87. const char *address_list[] = {
  88. "10.127.0.1:1234",
  89. "10.128.0.1:1234",
  90. "10.129.0.1:1234",
  91. "localhost:1234",
  92. "baidu.com:1234"
  93. };
  94. butil::TempFile tmp_file;
  95. {
  96. FILE* fp = fopen(tmp_file.fname(), "w");
  97. for (size_t i = 0; i < ARRAY_SIZE(address_list); ++i) {
  98. ASSERT_TRUE(fprintf(fp, "%s\n", address_list[i]));
  99. }
  100. fclose(fp);
  101. }
  102. brpc::policy::FileNamingService fns;
  103. ASSERT_EQ(0, fns.GetServers(tmp_file.fname(), &servers));
  104. ASSERT_EQ(ARRAY_SIZE(address_list), servers.size());
  105. for (size_t i = 0; i < ARRAY_SIZE(address_list) - 2; ++i) {
  106. std::ostringstream oss;
  107. oss << servers[i];
  108. ASSERT_EQ(address_list[i], oss.str()) << "i=" << i;
  109. }
  110. std::string s;
  111. for (size_t i = 0; i < ARRAY_SIZE(address_list); ++i) {
  112. ASSERT_EQ(0, butil::string_appendf(&s, "%s,", address_list[i]));
  113. }
  114. brpc::policy::ListNamingService lns;
  115. ASSERT_EQ(0, lns.GetServers(s.c_str(), &servers));
  116. ASSERT_EQ(ARRAY_SIZE(address_list), servers.size());
  117. for (size_t i = 0; i < ARRAY_SIZE(address_list) - 2; ++i) {
  118. std::ostringstream oss;
  119. oss << servers[i];
  120. ASSERT_EQ(address_list[i], oss.str()) << "i=" << i;
  121. }
  122. }
  123. TEST(NamingServiceTest, invalid_port) {
  124. std::vector<brpc::ServerNode> servers;
  125. #ifdef BAIDU_INTERNAL
  126. brpc::policy::BaiduNamingService bns;
  127. ASSERT_EQ(0, bns.GetServers("qa-pbrpc.SAT.tjyx:main", &servers));
  128. #endif
  129. brpc::policy::DomainNamingService dns;
  130. ASSERT_EQ(-1, dns.GetServers("baidu.com:", &servers));
  131. ASSERT_EQ(-1, dns.GetServers("baidu.com:123a", &servers));
  132. ASSERT_EQ(-1, dns.GetServers("baidu.com:99999", &servers));
  133. }
  134. TEST(NamingServiceTest, wrong_name) {
  135. std::vector<brpc::ServerNode> servers;
  136. #ifdef BAIDU_INTERNAL
  137. brpc::policy::BaiduNamingService bns;
  138. ASSERT_EQ(-1, bns.GetServers("Wrong", &servers));
  139. #endif
  140. const char *address_list[] = {
  141. "10.127.0.1:1234",
  142. "10.128.0.1:12302344",
  143. "10.129.0.1:1234",
  144. "10.128.0.1:",
  145. "10.128.0.1",
  146. "localhost:1234",
  147. "baidu.com:1234",
  148. "LOCAL:1234"
  149. };
  150. butil::TempFile tmp_file;
  151. {
  152. FILE *fp = fopen(tmp_file.fname(), "w");
  153. for (size_t i = 0; i < ARRAY_SIZE(address_list); ++i) {
  154. ASSERT_TRUE(fprintf(fp, "%s\n", address_list[i]));
  155. }
  156. fclose(fp);
  157. }
  158. brpc::policy::FileNamingService fns;
  159. ASSERT_EQ(0, fns.GetServers(tmp_file.fname(), &servers));
  160. ASSERT_EQ(ARRAY_SIZE(address_list) - 4, servers.size());
  161. std::string s;
  162. for (size_t i = 0; i < ARRAY_SIZE(address_list); ++i) {
  163. ASSERT_EQ(0, butil::string_appendf(&s, ", %s", address_list[i]));
  164. }
  165. brpc::policy::ListNamingService lns;
  166. ASSERT_EQ(0, lns.GetServers(s.c_str(), &servers));
  167. ASSERT_EQ(ARRAY_SIZE(address_list) - 4, servers.size());
  168. }
  169. class UserNamingServiceImpl : public test::UserNamingService {
  170. public:
  171. UserNamingServiceImpl() : list_names_count(0), touch_count(0) {}
  172. ~UserNamingServiceImpl() { }
  173. void ListNames(google::protobuf::RpcController* cntl_base,
  174. const test::HttpRequest*,
  175. test::HttpResponse*,
  176. google::protobuf::Closure* done) {
  177. brpc::ClosureGuard done_guard(done);
  178. brpc::Controller* cntl = (brpc::Controller*)cntl_base;
  179. cntl->http_response().set_content_type("text/plain");
  180. cntl->response_attachment().append(
  181. "0.0.0.0:8635 tag1\r\n0.0.0.0:8636 tag2\n"
  182. "0.0.0.0:8635 tag3\r\n0.0.0.0:8636\r\n");
  183. list_names_count.fetch_add(1);
  184. }
  185. void Touch(google::protobuf::RpcController*,
  186. const test::HttpRequest*,
  187. test::HttpResponse*,
  188. google::protobuf::Closure* done) {
  189. brpc::ClosureGuard done_guard(done);
  190. touch_count.fetch_add(1);
  191. }
  192. butil::atomic<int64_t> list_names_count;
  193. butil::atomic<int64_t> touch_count;
  194. };
  195. TEST(NamingServiceTest, remotefile) {
  196. brpc::Server server1;
  197. UserNamingServiceImpl svc1;
  198. ASSERT_EQ(0, server1.AddService(&svc1, brpc::SERVER_DOESNT_OWN_SERVICE));
  199. ASSERT_EQ(0, server1.Start("localhost:8635", NULL));
  200. brpc::Server server2;
  201. UserNamingServiceImpl svc2;
  202. ASSERT_EQ(0, server2.AddService(&svc2, brpc::SERVER_DOESNT_OWN_SERVICE));
  203. ASSERT_EQ(0, server2.Start("localhost:8636", NULL));
  204. butil::EndPoint n1;
  205. ASSERT_EQ(0, butil::str2endpoint("0.0.0.0:8635", &n1));
  206. butil::EndPoint n2;
  207. ASSERT_EQ(0, butil::str2endpoint("0.0.0.0:8636", &n2));
  208. std::vector<brpc::ServerNode> expected_servers;
  209. expected_servers.push_back(brpc::ServerNode(n1, "tag1"));
  210. expected_servers.push_back(brpc::ServerNode(n2, "tag2"));
  211. expected_servers.push_back(brpc::ServerNode(n1, "tag3"));
  212. expected_servers.push_back(brpc::ServerNode(n2));
  213. std::sort(expected_servers.begin(), expected_servers.end());
  214. std::vector<brpc::ServerNode> servers;
  215. brpc::policy::RemoteFileNamingService rfns;
  216. ASSERT_EQ(0, rfns.GetServers("0.0.0.0:8635/UserNamingService/ListNames", &servers));
  217. ASSERT_EQ(expected_servers.size(), servers.size());
  218. std::sort(servers.begin(), servers.end());
  219. for (size_t i = 0; i < expected_servers.size(); ++i) {
  220. ASSERT_EQ(expected_servers[i], servers[i]);
  221. }
  222. ASSERT_EQ(0, rfns.GetServers("http://0.0.0.0:8635/UserNamingService/ListNames", &servers));
  223. ASSERT_EQ(expected_servers.size(), servers.size());
  224. std::sort(servers.begin(), servers.end());
  225. for (size_t i = 0; i < expected_servers.size(); ++i) {
  226. ASSERT_EQ(expected_servers[i], servers[i]);
  227. }
  228. }
  229. class ConsulNamingServiceImpl : public test::UserNamingService {
  230. public:
  231. ConsulNamingServiceImpl() : list_names_count(0), touch_count(0) {
  232. }
  233. ~ConsulNamingServiceImpl() { }
  234. void ListNames(google::protobuf::RpcController* cntl_base,
  235. const test::HttpRequest*,
  236. test::HttpResponse*,
  237. google::protobuf::Closure* done) {
  238. brpc::ClosureGuard done_guard(done);
  239. brpc::Controller* cntl = (brpc::Controller*)cntl_base;
  240. cntl->http_response().SetHeader("X-Consul-Index", "1");
  241. cntl->response_attachment().append(
  242. R"([
  243. {
  244. "Node": {
  245. "ID": "44454c4c-4e00-1050-8052-b7c04f4b5931",
  246. "Node": "sh-qs-10.121.36.189",
  247. "Address": "10.121.36.189",
  248. "Datacenter": "shjj",
  249. "TaggedAddresses": {
  250. "lan": "10.121.36.189",
  251. "wan": "10.121.36.189"
  252. },
  253. "Meta": {
  254. "consul-network-segment": ""
  255. },
  256. "CreateIndex": 4820296,
  257. "ModifyIndex": 4823818
  258. },
  259. "Service": {
  260. "ID": "10.121.36.189_8003_qs_show_leaf",
  261. "Service": "qs_show_leaf",
  262. "Tags": ["1"],
  263. "Address": "10.121.36.189",
  264. "Port": 8003,
  265. "EnableTagOverride": false,
  266. "CreateIndex": 6515285,
  267. "ModifyIndex": 6515285
  268. },
  269. "Checks": [
  270. {
  271. "Node": "sh-qs-10.121.36.189",
  272. "CheckID": "serfHealth",
  273. "Name": "Serf Health Status",
  274. "Status": "passing",
  275. "Notes": "",
  276. "Output": "Agent alive and reachable",
  277. "ServiceID": "",
  278. "ServiceName": "",
  279. "ServiceTags": [ ],
  280. "CreateIndex": 4820296,
  281. "ModifyIndex": 4820296
  282. },
  283. {
  284. "Node": "sh-qs-10.121.36.189",
  285. "CheckID": "service:10.121.36.189_8003_qs_show_leaf",
  286. "Name": "Service 'qs_show_leaf' check",
  287. "Status": "passing",
  288. "Notes": "",
  289. "Output": "TCP connect 10.121.36.189:8003: Success",
  290. "ServiceID": "10.121.36.189_8003_qs_show_leaf",
  291. "ServiceName": "qs_show_leaf",
  292. "ServiceTags": [ ],
  293. "CreateIndex": 6515285,
  294. "ModifyIndex": 6702198
  295. }
  296. ]
  297. },
  298. {
  299. "Node": {
  300. "ID": "44454c4c-4b00-1050-8052-b6c04f4b5931",
  301. "Node": "sh-qs-10.121.36.190",
  302. "Address": "10.121.36.190",
  303. "Datacenter": "shjj",
  304. "TaggedAddresses": {
  305. "lan": "10.121.36.190",
  306. "wan": "10.121.36.190"
  307. },
  308. "Meta": {
  309. "consul-network-segment": ""
  310. },
  311. "CreateIndex": 4820296,
  312. "ModifyIndex": 4823751
  313. },
  314. "Service": {
  315. "ID": "10.121.36.190_8003_qs_show_leaf",
  316. "Service": "qs_show_leaf",
  317. "Tags": ["2"],
  318. "Address": "10.121.36.190",
  319. "Port": 8003,
  320. "EnableTagOverride": false,
  321. "CreateIndex": 6515635,
  322. "ModifyIndex": 6515635
  323. },
  324. "Checks": [
  325. {
  326. "Node": "sh-qs-10.121.36.190",
  327. "CheckID": "serfHealth",
  328. "Name": "Serf Health Status",
  329. "Status": "passing",
  330. "Notes": "",
  331. "Output": "Agent alive and reachable",
  332. "ServiceID": "",
  333. "ServiceName": "",
  334. "ServiceTags": [ ],
  335. "CreateIndex": 4820296,
  336. "ModifyIndex": 4820296
  337. },
  338. {
  339. "Node": "sh-qs-10.121.36.190",
  340. "CheckID": "service:10.121.36.190_8003_qs_show_leaf",
  341. "Name": "Service 'qs_show_leaf' check",
  342. "Status": "passing",
  343. "Notes": "",
  344. "Output": "TCP connect 10.121.36.190:8003: Success",
  345. "ServiceID": "10.121.36.190_8003_qs_show_leaf",
  346. "ServiceName": "qs_show_leaf",
  347. "ServiceTags": [ ],
  348. "CreateIndex": 6515635,
  349. "ModifyIndex": 6705515
  350. }
  351. ]
  352. }
  353. ])");
  354. list_names_count.fetch_add(1);
  355. }
  356. void Touch(google::protobuf::RpcController*,
  357. const test::HttpRequest*,
  358. test::HttpResponse*,
  359. google::protobuf::Closure* done) {
  360. brpc::ClosureGuard done_guard(done);
  361. touch_count.fetch_add(1);
  362. }
  363. butil::atomic<int64_t> list_names_count;
  364. butil::atomic<int64_t> touch_count;
  365. };
  366. TEST(NamingServiceTest, consul_with_backup_file) {
  367. brpc::policy::FLAGS_consul_enable_degrade_to_file_naming_service = true;
  368. const int saved_hc_interval = brpc::FLAGS_health_check_interval;
  369. brpc::FLAGS_health_check_interval = 1;
  370. const char *address_list[] = {
  371. "10.127.0.1:1234",
  372. "10.128.0.1:1234",
  373. "10.129.0.1:1234",
  374. };
  375. butil::TempFile tmp_file;
  376. const char * service_name = tmp_file.fname();
  377. {
  378. FILE* fp = fopen(tmp_file.fname(), "w");
  379. for (size_t i = 0; i < ARRAY_SIZE(address_list); ++i) {
  380. ASSERT_TRUE(fprintf(fp, "%s\n", address_list[i]));
  381. }
  382. fclose(fp);
  383. }
  384. std::cout << tmp_file.fname() << std::endl;
  385. std::vector<brpc::ServerNode> servers;
  386. brpc::policy::ConsulNamingService cns;
  387. ASSERT_EQ(0, cns.GetServers(service_name, &servers));
  388. ASSERT_EQ(ARRAY_SIZE(address_list), servers.size());
  389. for (size_t i = 0; i < ARRAY_SIZE(address_list); ++i) {
  390. std::ostringstream oss;
  391. oss << servers[i];
  392. ASSERT_EQ(address_list[i], oss.str()) << "i=" << i;
  393. }
  394. brpc::Server server;
  395. ConsulNamingServiceImpl svc;
  396. std::string restful_map(brpc::policy::FLAGS_consul_service_discovery_url);
  397. restful_map.append("/");
  398. restful_map.append(service_name);
  399. restful_map.append(" => ListNames");
  400. ASSERT_EQ(0, server.AddService(&svc,
  401. brpc::SERVER_DOESNT_OWN_SERVICE,
  402. restful_map.c_str()));
  403. ASSERT_EQ(0, server.Start("localhost:8500", NULL));
  404. bthread_usleep(5000000);
  405. butil::EndPoint n1;
  406. ASSERT_EQ(0, butil::str2endpoint("10.121.36.189:8003", &n1));
  407. butil::EndPoint n2;
  408. ASSERT_EQ(0, butil::str2endpoint("10.121.36.190:8003", &n2));
  409. std::vector<brpc::ServerNode> expected_servers;
  410. expected_servers.push_back(brpc::ServerNode(n1, "1"));
  411. expected_servers.push_back(brpc::ServerNode(n2, "2"));
  412. std::sort(expected_servers.begin(), expected_servers.end());
  413. servers.clear();
  414. ASSERT_EQ(0, cns.GetServers(service_name, &servers));
  415. ASSERT_EQ(expected_servers.size(), servers.size());
  416. std::sort(servers.begin(), servers.end());
  417. for (size_t i = 0; i < expected_servers.size(); ++i) {
  418. ASSERT_EQ(expected_servers[i], servers[i]);
  419. }
  420. brpc::FLAGS_health_check_interval = saved_hc_interval;
  421. }
  422. static const std::string s_fetchs_result = R"({
  423. "code":0,
  424. "message":"0",
  425. "ttl":1,
  426. "data":{
  427. "admin.test":{
  428. "instances":[
  429. {
  430. "region":"",
  431. "zone":"sh001",
  432. "env":"uat",
  433. "appid":"admin.test",
  434. "treeid":0,
  435. "hostname":"host123",
  436. "http":"",
  437. "rpc":"",
  438. "version":"123",
  439. "metadata":{
  440. "weight": "10",
  441. "cluster": ""
  442. },
  443. "addrs":[
  444. "http://127.0.0.1:8999",
  445. "grpc://127.0.1.1:9000"
  446. ],
  447. "status":1,
  448. "reg_timestamp":1539001034551496412,
  449. "up_timestamp":1539001034551496412,
  450. "renew_timestamp":1539001034551496412,
  451. "dirty_timestamp":1539001034551496412,
  452. "latest_timestamp":1539001034551496412
  453. }
  454. ],
  455. "zone_instances":{
  456. "sh001":[
  457. {
  458. "region":"",
  459. "zone":"sh001",
  460. "env":"uat",
  461. "appid":"admin.test",
  462. "treeid":0,
  463. "hostname":"host123",
  464. "http":"",
  465. "rpc":"",
  466. "version":"123",
  467. "metadata":{
  468. "weight": "10",
  469. "cluster": ""
  470. },
  471. "addrs":[
  472. "http://127.0.0.1:8999",
  473. "grpc://127.0.1.1:9000"
  474. ],
  475. "status":1,
  476. "reg_timestamp":1539001034551496412,
  477. "up_timestamp":1539001034551496412,
  478. "renew_timestamp":1539001034551496412,
  479. "dirty_timestamp":1539001034551496412,
  480. "latest_timestamp":1539001034551496412
  481. }
  482. ]
  483. },
  484. "latest_timestamp":1539001034551496412,
  485. "latest_timestamp_str":"1539001034"
  486. }
  487. }
  488. })";
  489. static std::string s_nodes_result = R"({
  490. "code": 0,
  491. "message": "0",
  492. "ttl": 1,
  493. "data": [
  494. {
  495. "addr": "127.0.0.1:8635",
  496. "status": 0,
  497. "zone": ""
  498. }, {
  499. "addr": "172.18.33.51:7171",
  500. "status": 0,
  501. "zone": ""
  502. }, {
  503. "addr": "172.18.33.52:7171",
  504. "status": 0,
  505. "zone": ""
  506. }
  507. ]
  508. })";
  509. class DiscoveryNamingServiceImpl : public test::DiscoveryNamingService {
  510. public:
  511. DiscoveryNamingServiceImpl()
  512. : _renew_count(0)
  513. , _cancel_count(0) {}
  514. virtual ~DiscoveryNamingServiceImpl() {}
  515. void Nodes(google::protobuf::RpcController* cntl_base,
  516. const test::HttpRequest*,
  517. test::HttpResponse*,
  518. google::protobuf::Closure* done) {
  519. brpc::ClosureGuard done_guard(done);
  520. brpc::Controller* cntl = static_cast<brpc::Controller*>(cntl_base);
  521. cntl->response_attachment().append(s_nodes_result);
  522. }
  523. void Fetchs(google::protobuf::RpcController* cntl_base,
  524. const test::HttpRequest*,
  525. test::HttpResponse*,
  526. google::protobuf::Closure* done) {
  527. brpc::ClosureGuard done_guard(done);
  528. brpc::Controller* cntl = static_cast<brpc::Controller*>(cntl_base);
  529. cntl->response_attachment().append(s_fetchs_result);
  530. }
  531. void Register(google::protobuf::RpcController* cntl_base,
  532. const test::HttpRequest*,
  533. test::HttpResponse*,
  534. google::protobuf::Closure* done) {
  535. brpc::ClosureGuard done_guard(done);
  536. brpc::Controller* cntl = static_cast<brpc::Controller*>(cntl_base);
  537. auto body = cntl->request_attachment().to_string();
  538. for (brpc::QuerySplitter sp(body); sp; ++sp) {
  539. if (sp.key() == "addrs") {
  540. _addrs.insert(sp.value().as_string());
  541. }
  542. }
  543. cntl->response_attachment().append(R"({
  544. "code": 0,
  545. "message": "0"
  546. })");
  547. return;
  548. }
  549. void Renew(google::protobuf::RpcController* cntl_base,
  550. const test::HttpRequest*,
  551. test::HttpResponse*,
  552. google::protobuf::Closure* done) {
  553. brpc::ClosureGuard done_guard(done);
  554. brpc::Controller* cntl = static_cast<brpc::Controller*>(cntl_base);
  555. cntl->response_attachment().append(R"({
  556. "code": 0,
  557. "message": "0"
  558. })");
  559. _renew_count++;
  560. return;
  561. }
  562. void Cancel(google::protobuf::RpcController* cntl_base,
  563. const test::HttpRequest*,
  564. test::HttpResponse*,
  565. google::protobuf::Closure* done) {
  566. brpc::ClosureGuard done_guard(done);
  567. brpc::Controller* cntl = static_cast<brpc::Controller*>(cntl_base);
  568. cntl->response_attachment().append(R"({
  569. "code": 0,
  570. "message": "0"
  571. })");
  572. _cancel_count++;
  573. _addrs.clear();
  574. return;
  575. }
  576. int RenewCount() const { return _renew_count; }
  577. int CancelCount() const { return _cancel_count; }
  578. bool HasAddr(const std::string& addr) const {
  579. return _addrs.find(addr) != _addrs.end();
  580. }
  581. int AddrCount() const { return _addrs.size(); }
  582. private:
  583. int _renew_count;
  584. int _cancel_count;
  585. std::set<std::string> _addrs;
  586. };
  587. TEST(NamingServiceTest, discovery_sanity) {
  588. brpc::policy::FLAGS_discovery_api_addr = "http://127.0.0.1:8635/discovery/nodes";
  589. brpc::policy::FLAGS_discovery_renew_interval_s = 1;
  590. brpc::Server server;
  591. DiscoveryNamingServiceImpl svc;
  592. std::string rest_mapping =
  593. "/discovery/nodes => Nodes, "
  594. "/discovery/fetchs => Fetchs, "
  595. "/discovery/register => Register, "
  596. "/discovery/renew => Renew, "
  597. "/discovery/cancel => Cancel";
  598. ASSERT_EQ(0, server.AddService(&svc, brpc::SERVER_DOESNT_OWN_SERVICE,
  599. rest_mapping.c_str()));
  600. ASSERT_EQ(0, server.Start("localhost:8635", NULL));
  601. brpc::policy::DiscoveryNamingService dcns;
  602. std::vector<brpc::ServerNode> servers;
  603. ASSERT_EQ(0, dcns.GetServers("admin.test", &servers));
  604. ASSERT_EQ((size_t)1, servers.size());
  605. brpc::policy::DiscoveryRegisterParam dparam;
  606. dparam.appid = "main.test";
  607. dparam.hostname = "hostname";
  608. dparam.addrs = "grpc://10.0.0.1:8000";
  609. dparam.env = "dev";
  610. dparam.zone = "sh001";
  611. dparam.status = 1;
  612. dparam.version = "v1";
  613. {
  614. brpc::policy::DiscoveryClient dc;
  615. }
  616. // Cancel is called iff Register is called
  617. ASSERT_EQ(svc.CancelCount(), 0);
  618. {
  619. brpc::policy::DiscoveryClient dc;
  620. // Two Register should start one Renew task , and make
  621. // svc.RenewCount() be one.
  622. ASSERT_EQ(0, dc.Register(dparam));
  623. ASSERT_EQ(0, dc.Register(dparam));
  624. bthread_usleep(100000);
  625. ASSERT_TRUE(svc.HasAddr("grpc://10.0.0.1:8000"));
  626. ASSERT_FALSE(svc.HasAddr("http://10.0.0.1:8000"));
  627. }
  628. ASSERT_EQ(svc.RenewCount(), 1);
  629. ASSERT_EQ(svc.CancelCount(), 1);
  630. ASSERT_FALSE(svc.HasAddr("grpc://10.0.0.1:8000"));
  631. ASSERT_FALSE(svc.HasAddr("http://10.0.0.1:8000"));
  632. // addrs splitted by `,'
  633. dparam.addrs = ",grpc://10.0.0.1:8000,,http://10.0.0.1:8000,";
  634. {
  635. brpc::policy::DiscoveryClient dc;
  636. ASSERT_EQ(0, dc.Register(dparam));
  637. ASSERT_TRUE(svc.HasAddr("grpc://10.0.0.1:8000"));
  638. ASSERT_TRUE(svc.HasAddr("http://10.0.0.1:8000"));
  639. ASSERT_FALSE(svc.HasAddr(std::string()));
  640. ASSERT_EQ(2, svc.AddrCount());
  641. }
  642. }
  643. } //namespace