restapi_test.rs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. /*************************************************************************
  2. *
  3. * Copyright (C) 2018-2024 Ruilin Peng (Nick) <[email protected]>.
  4. *
  5. * smartdns is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * smartdns is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. mod common;
  19. use common::TestDnsRequest;
  20. use nix::libc::c_char;
  21. use reqwest;
  22. use serde_json::json;
  23. use smartdns_ui::{http_api_msg, http_jwt::JwtClaims, smartdns::LogLevel};
  24. use std::ffi::CString;
  25. #[tokio::test(flavor = "multi_thread")]
  26. async fn test_rest_api_login() {
  27. let mut server = common::TestServer::new();
  28. server.set_log_level(LogLevel::DEBUG);
  29. assert!(server.start().is_ok());
  30. let c = reqwest::Client::new();
  31. let body = json!({
  32. "username": "admin",
  33. "password": "password",
  34. });
  35. let res = c
  36. .post(server.get_url("/api/auth/login"))
  37. .body(body.to_string())
  38. .send()
  39. .await
  40. .unwrap();
  41. let code = res.status();
  42. let body = res.text().await.unwrap();
  43. println!("res: {}", body);
  44. assert_eq!(code, 200);
  45. let result = http_api_msg::api_msg_parse_auth_token(&body);
  46. assert!(result.is_ok());
  47. let token = result.unwrap();
  48. assert!(!token.token.is_empty());
  49. let mut validation = jsonwebtoken::Validation::new(jsonwebtoken::Algorithm::HS256);
  50. validation.insecure_disable_signature_validation();
  51. let calims = jsonwebtoken::decode::<JwtClaims>(
  52. &token.token,
  53. &jsonwebtoken::DecodingKey::from_secret(&[]),
  54. &validation,
  55. );
  56. println!("calims: {:?}", calims);
  57. assert_eq!(token.expires_in, "600");
  58. assert!(calims.is_ok());
  59. let calims = calims.unwrap();
  60. let calims = calims.claims;
  61. assert_eq!(calims.user, "admin");
  62. }
  63. #[test]
  64. fn test_rest_api_logout() {
  65. let mut server = common::TestServer::new();
  66. server.set_log_level(LogLevel::DEBUG);
  67. assert!(server.start().is_ok());
  68. let mut client = common::TestClient::new(&server.get_host());
  69. client.set_with_auth_header(false);
  70. let res = client.login("admin", "password");
  71. assert!(res.is_ok());
  72. let c = client.get("/api/cache/count");
  73. assert!(c.is_ok());
  74. let (code, _) = c.unwrap();
  75. assert_eq!(code, 200);
  76. let ret = client.logout();
  77. assert!(ret.is_ok());
  78. let c = client.get("/api/cache/count");
  79. assert!(c.is_ok());
  80. let (code, _) = c.unwrap();
  81. assert_eq!(code, 401);
  82. }
  83. #[tokio::test(flavor = "multi_thread")]
  84. async fn test_rest_api_login_incorrect() {
  85. let mut server = common::TestServer::new();
  86. server.set_log_level(LogLevel::DEBUG);
  87. assert!(server.start().is_ok());
  88. let c = reqwest::Client::new();
  89. let body = json!({
  90. "username": "admin",
  91. "password": "wrongpassword",
  92. });
  93. let res = c
  94. .post(server.get_url("/api/auth/login"))
  95. .body(body.to_string())
  96. .send()
  97. .await
  98. .unwrap();
  99. let code = res.status();
  100. let body = res.text().await.unwrap();
  101. println!("res: {}", body);
  102. assert_eq!(code, 401);
  103. let result = http_api_msg::api_msg_parse_error(&body);
  104. assert!(result.is_ok());
  105. assert_eq!(result.unwrap(), "Incorrect username or password.");
  106. }
  107. #[test]
  108. fn test_rest_api_change_password() {
  109. let mut server = common::TestServer::new();
  110. server.set_log_level(LogLevel::DEBUG);
  111. assert!(server.start().is_ok());
  112. let mut client = common::TestClient::new(&server.get_host());
  113. let res = client.login("admin", "password");
  114. assert!(res.is_ok());
  115. let password_msg =
  116. http_api_msg::api_msg_gen_auth_password_change("wrong_oldpassword", "newpassword");
  117. let c = client.put("/api/auth/password", password_msg.as_str());
  118. assert!(c.is_ok());
  119. let (code, _) = c.unwrap();
  120. assert_eq!(code, 403);
  121. let password_msg = http_api_msg::api_msg_gen_auth_password_change("password", "newpassword");
  122. let c = client.put("/api/auth/password", password_msg.as_str());
  123. assert!(c.is_ok());
  124. let (code, _) = c.unwrap();
  125. assert_eq!(code, 204);
  126. let res = client.login("admin", "password");
  127. assert!(!res.is_ok());
  128. }
  129. #[test]
  130. fn test_rest_api_cache_count() {
  131. let mut server = common::TestServer::new();
  132. server.set_log_level(LogLevel::DEBUG);
  133. assert!(server.start().is_ok());
  134. let mut client = common::TestClient::new(&server.get_host());
  135. let res = client.login("admin", "password");
  136. assert!(res.is_ok());
  137. let c = client.get("/api/cache/count");
  138. assert!(c.is_ok());
  139. let (code, body) = c.unwrap();
  140. assert_eq!(code, 200);
  141. let count = http_api_msg::api_msg_parse_cache_number(&body);
  142. assert!(count.is_ok());
  143. assert_eq!(count.unwrap(), 0);
  144. }
  145. #[test]
  146. fn test_rest_api_auth_refresh() {
  147. let mut server = common::TestServer::new();
  148. server.set_log_level(LogLevel::DEBUG);
  149. assert!(server.start().is_ok());
  150. let mut client = common::TestClient::new(&server.get_host());
  151. let res = client.login("admin", "password");
  152. assert!(res.is_ok());
  153. let c = client.post("/api/auth/refresh", "");
  154. assert!(c.is_ok());
  155. let (code, body) = c.unwrap();
  156. assert_eq!(code, 200);
  157. let token = http_api_msg::api_msg_parse_auth_token(&body);
  158. assert!(token.is_ok());
  159. let token = token.unwrap();
  160. assert!(!token.token.is_empty());
  161. assert_eq!(token.expires_in, "600");
  162. println!("token: {:?}", token);
  163. }
  164. #[test]
  165. fn test_rest_api_auth_check() {
  166. let mut server = common::TestServer::new();
  167. server.set_log_level(LogLevel::DEBUG);
  168. assert!(server.start().is_ok());
  169. let mut client = common::TestClient::new(&server.get_host());
  170. let c = client.get("/api/auth/check");
  171. assert!(c.is_ok());
  172. let (code, _) = c.unwrap();
  173. assert_eq!(code, 401);
  174. let res = client.login("admin", "password");
  175. assert!(res.is_ok());
  176. let c = client.get("/api/auth/check");
  177. assert!(c.is_ok());
  178. let (code, _) = c.unwrap();
  179. assert_eq!(code, 200);
  180. }
  181. #[test]
  182. fn test_rest_api_no_permission() {
  183. let mut server = common::TestServer::new();
  184. server.set_log_level(LogLevel::DEBUG);
  185. assert!(server.start().is_ok());
  186. let client = common::TestClient::new(&server.get_host());
  187. let c = client.get("/api/cache/count");
  188. assert!(c.is_ok());
  189. let (code, body) = c.unwrap();
  190. assert_eq!(code, 401);
  191. println!("body: {}", body);
  192. let error_msg = http_api_msg::api_msg_parse_error(&body);
  193. assert!(error_msg.is_ok());
  194. assert_eq!(error_msg.unwrap(), "Please login.");
  195. }
  196. #[test]
  197. fn test_rest_api_404() {
  198. let mut server = common::TestServer::new();
  199. server.set_log_level(LogLevel::DEBUG);
  200. assert!(server.start().is_ok());
  201. let mut client = common::TestClient::new(&server.get_host());
  202. let res = client.login("admin", "password");
  203. assert!(res.is_ok());
  204. let c = client.post("/api/404", "");
  205. assert!(c.is_ok());
  206. let (code, body) = c.unwrap();
  207. assert_eq!(code, 404);
  208. let error_msg = http_api_msg::api_msg_parse_error(&body);
  209. assert!(error_msg.is_ok());
  210. assert_eq!(error_msg.unwrap(), "API not found.");
  211. }
  212. #[test]
  213. fn test_rest_api_log_stream() {
  214. let mut server = common::TestServer::new();
  215. server.set_log_level(LogLevel::DEBUG);
  216. assert!(server.start().is_ok());
  217. let mut client = common::TestClient::new(&server.get_host());
  218. let res = client.login("admin", "password");
  219. assert!(res.is_ok());
  220. let socket = client.websocket("/api/log/stream");
  221. assert!(socket.is_ok());
  222. let mut socket = socket.unwrap();
  223. _ = socket.send(tungstenite::Message::Text("aaaa".to_string()));
  224. _ = socket.close(None);
  225. }
  226. #[test]
  227. fn test_rest_api_log_level() {
  228. let mut server = common::TestServer::new();
  229. server.set_log_level(LogLevel::DEBUG);
  230. server.set_one_instance(true);
  231. assert!(server.start().is_ok());
  232. let mut client = common::TestClient::new(&server.get_host());
  233. let res = client.login("admin", "password");
  234. assert!(res.is_ok());
  235. let c = client.get("/api/log/level");
  236. assert!(c.is_ok());
  237. let (code, body) = c.unwrap();
  238. assert_eq!(code, 200);
  239. let log_level = http_api_msg::api_msg_parse_loglevel(&body);
  240. assert!(log_level.is_ok());
  241. assert_eq!(log_level.unwrap(), LogLevel::DEBUG);
  242. let level_msg = http_api_msg::api_msg_gen_loglevel(LogLevel::ERROR);
  243. let c = client.put("/api/log/level", level_msg.as_str());
  244. assert!(c.is_ok());
  245. let (code, body) = c.unwrap();
  246. assert_eq!(code, 204);
  247. println!("body: {}", body);
  248. assert_eq!(smartdns_ui::smartdns::dns_log_get_level(), LogLevel::ERROR);
  249. }
  250. #[test]
  251. fn test_rest_api_get_domain() {
  252. let mut server = common::TestServer::new();
  253. server.set_log_level(LogLevel::DEBUG);
  254. assert!(server.start().is_ok());
  255. for i in 0..1024 {
  256. let mut request = TestDnsRequest::new();
  257. request.domain = format!("{}.com", i);
  258. request.id = i as u16;
  259. assert!(server.send_test_dnsrequest(request).is_ok());
  260. }
  261. let mut client = common::TestClient::new(&server.get_host());
  262. let res = client.login("admin", "password");
  263. assert!(res.is_ok());
  264. let c = client.get("/api/domain/count");
  265. assert!(c.is_ok());
  266. let (code, body) = c.unwrap();
  267. assert_eq!(code, 200);
  268. let count = http_api_msg::api_msg_parse_count(&body);
  269. assert!(count.is_ok());
  270. assert_eq!(count.unwrap(), 1024);
  271. let c = client.get("/api/domain?page_num=11&page_size=10&order=asc");
  272. assert!(c.is_ok());
  273. let (code, body) = c.unwrap();
  274. assert_eq!(code, 200);
  275. let result = http_api_msg::api_msg_parse_domain_list(&body);
  276. assert!(result.is_ok());
  277. let result = result.unwrap();
  278. assert_eq!(result.len(), 10);
  279. assert_eq!(result[0].id, 101);
  280. assert_eq!(result[0].domain, "100.com");
  281. }
  282. #[test]
  283. fn test_rest_api_get_by_id() {
  284. let mut server = common::TestServer::new();
  285. server.set_log_level(LogLevel::DEBUG);
  286. assert!(server.start().is_ok());
  287. for i in 0..1024 {
  288. let mut request = TestDnsRequest::new();
  289. request.domain = format!("{}.com", i);
  290. request.id = i as u16;
  291. assert!(server.send_test_dnsrequest(request).is_ok());
  292. }
  293. let mut client = common::TestClient::new(&server.get_host());
  294. let res = client.login("admin", "password");
  295. assert!(res.is_ok());
  296. let c = client.get("/api/domain/1000");
  297. assert!(c.is_ok());
  298. let (code, body) = c.unwrap();
  299. assert_eq!(code, 200);
  300. let result = http_api_msg::api_msg_parse_domain(&body);
  301. assert!(result.is_ok());
  302. let result = result.unwrap();
  303. assert_eq!(result.id, 1000);
  304. assert_eq!(result.domain, "999.com");
  305. }
  306. #[test]
  307. fn test_rest_api_delete_domain_by_id() {
  308. let mut server = common::TestServer::new();
  309. server.set_log_level(LogLevel::DEBUG);
  310. assert!(server.start().is_ok());
  311. for i in 0..1024 {
  312. let mut request = TestDnsRequest::new();
  313. request.domain = format!("{}.com", i);
  314. request.id = i as u16;
  315. assert!(server.send_test_dnsrequest(request).is_ok());
  316. }
  317. let mut client = common::TestClient::new(&server.get_host());
  318. let res = client.login("admin", "password");
  319. assert!(res.is_ok());
  320. let c = client.delete("/api/domain/1000");
  321. assert!(c.is_ok());
  322. let (code, _) = c.unwrap();
  323. assert_eq!(code, 204);
  324. let c = client.get("/api/domain/1000");
  325. assert!(c.is_ok());
  326. let (code, _) = c.unwrap();
  327. assert_eq!(code, 404);
  328. let c = client.get("/api/domain/count");
  329. assert!(c.is_ok());
  330. let (code, body) = c.unwrap();
  331. assert_eq!(code, 200);
  332. let count = http_api_msg::api_msg_parse_count(&body);
  333. assert!(count.is_ok());
  334. assert_eq!(count.unwrap(), 1023);
  335. }
  336. #[test]
  337. fn test_rest_api_server_version() {
  338. let mut server = common::TestServer::new();
  339. server.set_log_level(LogLevel::DEBUG);
  340. assert!(server.start().is_ok());
  341. let client = common::TestClient::new(&server.get_host());
  342. let c = client.get("/api/server/version");
  343. assert!(c.is_ok());
  344. let (code, body) = c.unwrap();
  345. assert_eq!(code, 200);
  346. let version = http_api_msg::api_msg_parse_version(&body);
  347. assert!(version.is_ok());
  348. let version = version.unwrap();
  349. assert_eq!(version.0, smartdns_ui::smartdns::smartdns_version());
  350. if env!("GIT_VERSION").is_empty() {
  351. assert_eq!(version.1, env!("CARGO_PKG_VERSION"));
  352. return;
  353. }
  354. let check_version = std::format!("{} ({})", env!("CARGO_PKG_VERSION"), env!("GIT_VERSION"));
  355. assert_eq!(version.1, check_version);
  356. }
  357. #[test]
  358. fn test_rest_api_https_server() {
  359. let mut server = common::TestServer::new();
  360. server.set_log_level(LogLevel::DEBUG);
  361. server.enable_mock_server();
  362. server.set_https(true);
  363. assert!(server.start().is_ok());
  364. let client = common::TestClient::new(&server.get_host());
  365. let c = client.get("/api/server/version");
  366. assert!(c.is_ok());
  367. let (code, body) = c.unwrap();
  368. assert_eq!(code, 200);
  369. let version = http_api_msg::api_msg_parse_version(&body);
  370. assert!(version.is_ok());
  371. let version = version.unwrap();
  372. assert_eq!(version.0, smartdns_ui::smartdns::smartdns_version());
  373. if env!("GIT_VERSION").is_empty() {
  374. assert_eq!(version.1, env!("CARGO_PKG_VERSION"));
  375. return;
  376. }
  377. let check_version = std::format!("{} ({})", env!("CARGO_PKG_VERSION"), env!("GIT_VERSION"));
  378. assert_eq!(version.1, check_version);
  379. }
  380. #[test]
  381. fn test_rest_api_settings() {
  382. let mut server = common::TestServer::new();
  383. server.set_log_level(LogLevel::DEBUG);
  384. assert!(server.start().is_ok());
  385. let mut client = common::TestClient::new(&server.get_host());
  386. let res = client.login("admin", "password");
  387. assert!(res.is_ok());
  388. let c = client.get("/api/config/settings");
  389. assert!(c.is_ok());
  390. let (code, body) = c.unwrap();
  391. assert_eq!(code, 200);
  392. let settings = http_api_msg::api_msg_parse_key_value(&body);
  393. assert!(settings.is_ok());
  394. let mut settings = std::collections::HashMap::new();
  395. settings.insert("key1".to_string(), "value1".to_string());
  396. settings.insert("key2".to_string(), "value2".to_string());
  397. let body = http_api_msg::api_msg_gen_key_value(&settings);
  398. let c = client.put("/api/config/settings", body.as_str());
  399. assert!(c.is_ok());
  400. let (code, _) = c.unwrap();
  401. assert_eq!(code, 204);
  402. let c = client.get("/api/config/settings");
  403. assert!(c.is_ok());
  404. let (code, body) = c.unwrap();
  405. assert_eq!(code, 200);
  406. let settings = http_api_msg::api_msg_parse_key_value(&body);
  407. assert!(settings.is_ok());
  408. let settings = settings.unwrap();
  409. assert_eq!(settings.len(), 7);
  410. assert_eq!(settings["key1"], "value1");
  411. }
  412. #[test]
  413. fn test_rest_api_get_client() {
  414. let mut server = common::TestServer::new();
  415. server.set_log_level(LogLevel::INFO);
  416. assert!(server.start().is_ok());
  417. for i in 0..1024 {
  418. let mut request = TestDnsRequest::new();
  419. request.domain = format!("{}.com", i);
  420. request.remote_addr = format!("client-{}", i);
  421. request.id = i as u16;
  422. assert!(server.send_test_dnsrequest(request).is_ok());
  423. }
  424. let mut client = common::TestClient::new(&server.get_host());
  425. let res = client.login("admin", "password");
  426. assert!(res.is_ok());
  427. let c = client.get("/api/client");
  428. assert!(c.is_ok());
  429. let (code, body) = c.unwrap();
  430. assert_eq!(code, 200);
  431. let list = http_api_msg::api_msg_parse_client_list(&body);
  432. assert!(list.is_ok());
  433. let list = list.unwrap();
  434. assert_eq!(list.len(), 1024);
  435. }
  436. #[test]
  437. fn test_rest_api_stats_top() {
  438. let mut server = common::TestServer::new();
  439. server.set_log_level(LogLevel::DEBUG);
  440. assert!(server.start().is_ok());
  441. for i in 0..1024 {
  442. let mut request = TestDnsRequest::new();
  443. if i < 512 {
  444. request.domain = format!("a.com");
  445. request.remote_addr = format!("192.168.1.1");
  446. } else if i < 512 + 256 + 128 {
  447. request.domain = format!("b.com");
  448. request.remote_addr = format!("192.168.1.2");
  449. } else {
  450. request.domain = format!("c.com");
  451. request.remote_addr = format!("192.168.1.3");
  452. }
  453. assert!(server.send_test_dnsrequest(request).is_ok());
  454. }
  455. server.get_data_server().get_stat().refresh();
  456. let mut client = common::TestClient::new(&server.get_host());
  457. let res = client.login("admin", "password");
  458. assert!(res.is_ok());
  459. let c = client.get("/api/stats/top/client");
  460. assert!(c.is_ok());
  461. let (code, body) = c.unwrap();
  462. assert_eq!(code, 200);
  463. let list = http_api_msg::api_msg_parse_top_client_list(&body);
  464. assert!(list.is_ok());
  465. let list = list.unwrap();
  466. assert_eq!(list.len(), 3);
  467. assert_eq!(list[0].client_ip, "192.168.1.1");
  468. assert_eq!(list[0].count, 512);
  469. assert_eq!(list[2].client_ip, "192.168.1.3");
  470. assert_eq!(list[2].count, 128);
  471. let c = client.get("/api/stats/top/domain");
  472. assert!(c.is_ok());
  473. let (code, body) = c.unwrap();
  474. assert_eq!(code, 200);
  475. let list = http_api_msg::api_msg_parse_top_domain_list(&body);
  476. assert!(list.is_ok());
  477. let list = list.unwrap();
  478. assert_eq!(list.len(), 3);
  479. assert_eq!(list[0].domain, "a.com");
  480. assert_eq!(list[0].count, 512);
  481. assert_eq!(list[2].domain, "c.com");
  482. assert_eq!(list[2].count, 128);
  483. }
  484. #[test]
  485. fn test_rest_api_stats_overview() {
  486. let mut server = common::TestServer::new();
  487. server.set_log_level(LogLevel::DEBUG);
  488. server.enable_mock_server();
  489. assert!(server.start().is_ok());
  490. let mut client = common::TestClient::new(&server.get_host());
  491. let res = client.login("admin", "password");
  492. assert!(res.is_ok());
  493. let server_name;
  494. unsafe {
  495. smartdns_ui::smartdns::smartdns_c::dns_stats
  496. .avg_time
  497. .avg_time = 22.0 as f32;
  498. smartdns_ui::smartdns::smartdns_c::dns_stats
  499. .request
  500. .blocked_count = 10;
  501. smartdns_ui::smartdns::smartdns_c::dns_stats.request.total = 15;
  502. server_name = smartdns_ui::smartdns::smartdns_get_server_name();
  503. }
  504. let c = client.get("/api/stats/overview");
  505. assert!(c.is_ok());
  506. let (code, body) = c.unwrap();
  507. assert_eq!(code, 200);
  508. let overview = http_api_msg::api_msg_parse_stats_overview(&body);
  509. assert!(overview.is_ok());
  510. let overview = overview.unwrap();
  511. assert_eq!(overview.db_size > 0, true);
  512. assert_eq!(overview.server_name, server_name);
  513. }
  514. #[test]
  515. fn test_rest_api_stats_metrics() {
  516. let mut server = common::TestServer::new();
  517. server.set_log_level(LogLevel::DEBUG);
  518. server.enable_mock_server();
  519. assert!(server.start().is_ok());
  520. let mut client = common::TestClient::new(&server.get_host());
  521. let res = client.login("admin", "password");
  522. assert!(res.is_ok());
  523. unsafe {
  524. smartdns_ui::smartdns::smartdns_c::dns_stats
  525. .avg_time
  526. .avg_time = 22.0 as f32;
  527. smartdns_ui::smartdns::smartdns_c::dns_stats
  528. .request
  529. .blocked_count = 10;
  530. smartdns_ui::smartdns::smartdns_c::dns_stats.request.total = 15;
  531. }
  532. for i in 0..1024 {
  533. let mut request = TestDnsRequest::new();
  534. request.domain = format!("{}.com", i);
  535. request.remote_addr = format!("client-{}", i);
  536. request.is_blocked = i % 2 == 0;
  537. assert!(server.send_test_dnsrequest(request).is_ok());
  538. }
  539. let c = client.get("/api/stats/metrics");
  540. assert!(c.is_ok());
  541. let (code, body) = c.unwrap();
  542. assert_eq!(code, 200);
  543. let metrics = http_api_msg::api_msg_parse_metrics_data(&body);
  544. assert!(metrics.is_ok());
  545. let metrics = metrics.unwrap();
  546. assert_eq!(metrics.avg_query_time, 22.0 as f64);
  547. assert_eq!(metrics.cache_hit_rate, 0 as f64);
  548. assert_eq!(metrics.total_query_count, 1024);
  549. assert_eq!(metrics.block_query_count, 1024 / 2);
  550. }
  551. #[test]
  552. fn test_rest_api_get_hourly_query_count() {
  553. let mut server = common::TestServer::new();
  554. server.set_log_level(LogLevel::DEBUG);
  555. assert!(server.start().is_ok());
  556. for i in 0..1024 {
  557. let mut request = TestDnsRequest::new();
  558. request.domain = format!("{}.com", i);
  559. request.remote_addr = format!("client-{}", i);
  560. assert!(server.send_test_dnsrequest(request).is_ok());
  561. }
  562. let mut client = common::TestClient::new(&server.get_host());
  563. let res = client.login("admin", "password");
  564. assert!(res.is_ok());
  565. let c = client.get("/api/stats/hourly-query-count");
  566. assert!(c.is_ok());
  567. let (code, body) = c.unwrap();
  568. assert_eq!(code, 200);
  569. let list = http_api_msg::api_msg_parse_hourly_query_count(&body);
  570. assert!(list.is_ok());
  571. let list = list.unwrap();
  572. assert_eq!(list.hourly_query_count.len(), 1);
  573. assert_eq!(list.hourly_query_count[0].query_count, 1024);
  574. }
  575. #[test]
  576. fn test_rest_api_server_status() {
  577. let mut server = common::TestServer::new();
  578. server.set_log_level(LogLevel::DEBUG);
  579. server.enable_mock_server();
  580. assert!(server.start().is_ok());
  581. let mut client = common::TestClient::new(&server.get_host());
  582. let res = client.login("admin", "password");
  583. assert!(res.is_ok());
  584. unsafe {
  585. let server_type = smartdns_ui::smartdns::smartdns_c::dns_server_type_t_DNS_SERVER_UDP;
  586. let mut flags: smartdns_ui::smartdns::smartdns_c::client_dns_server_flags =
  587. std::mem::zeroed();
  588. let ip = CString::new("1.2.3.4").expect("CString::new failed");
  589. let port = 3353;
  590. smartdns_ui::smartdns::smartdns_c::dns_client_add_server(
  591. ip.as_ptr() as *const c_char,
  592. port,
  593. server_type,
  594. &mut flags,
  595. );
  596. }
  597. let c = client.get("/api/upstream-server");
  598. assert!(c.is_ok());
  599. let (code, body) = c.unwrap();
  600. assert_eq!(code, 200);
  601. let server_list = http_api_msg::api_msg_parse_upstream_server_list(&body);
  602. assert!(server_list.is_ok());
  603. let server_list = server_list.unwrap();
  604. assert!(server_list.len() > 0);
  605. let exists = server_list.iter().any(|server| server.ip == "1.2.3.4");
  606. assert!(exists);
  607. }