test_nodelist.c 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270
  1. /* Copyright (c) 2007-2019, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. /**
  4. * \file test_nodelist.c
  5. * \brief Unit tests for nodelist related functions.
  6. **/
  7. #define NODELIST_PRIVATE
  8. #include "core/or/or.h"
  9. #include "lib/crypt_ops/crypto_rand.h"
  10. #include "feature/nodelist/describe.h"
  11. #include "feature/nodelist/networkstatus.h"
  12. #include "feature/nodelist/nodefamily.h"
  13. #include "feature/nodelist/nodelist.h"
  14. #include "feature/nodelist/torcert.h"
  15. #include "core/or/extend_info_st.h"
  16. #include "feature/nodelist/microdesc_st.h"
  17. #include "feature/nodelist/networkstatus_st.h"
  18. #include "feature/nodelist/node_st.h"
  19. #include "feature/nodelist/nodefamily_st.h"
  20. #include "feature/nodelist/routerinfo_st.h"
  21. #include "feature/nodelist/routerstatus_st.h"
  22. #include "test/test.h"
  23. #include "test/log_test_helpers.h"
  24. /** Test the case when node_get_by_id() returns NULL,
  25. * node_get_verbose_nickname_by_id should return the base 16 encoding
  26. * of the id.
  27. */
  28. static void
  29. test_nodelist_node_get_verbose_nickname_by_id_null_node(void *arg)
  30. {
  31. char vname[MAX_VERBOSE_NICKNAME_LEN+1];
  32. const char ID[] = "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
  33. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA";
  34. (void) arg;
  35. /* make sure node_get_by_id returns NULL */
  36. tt_assert(!node_get_by_id(ID));
  37. node_get_verbose_nickname_by_id(ID, vname);
  38. tt_str_op(vname,OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
  39. done:
  40. return;
  41. }
  42. /** For routers without named flag, get_verbose_nickname should return
  43. * "Fingerprint~Nickname"
  44. */
  45. static void
  46. test_nodelist_node_get_verbose_nickname_not_named(void *arg)
  47. {
  48. node_t mock_node;
  49. routerstatus_t mock_rs;
  50. char vname[MAX_VERBOSE_NICKNAME_LEN+1];
  51. (void) arg;
  52. memset(&mock_node, 0, sizeof(node_t));
  53. memset(&mock_rs, 0, sizeof(routerstatus_t));
  54. /* verbose nickname should use ~ instead of = for unnamed routers */
  55. strlcpy(mock_rs.nickname, "TestOR", sizeof(mock_rs.nickname));
  56. mock_node.rs = &mock_rs;
  57. memcpy(mock_node.identity,
  58. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
  59. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
  60. DIGEST_LEN);
  61. node_get_verbose_nickname(&mock_node, vname);
  62. tt_str_op(vname,OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR");
  63. done:
  64. return;
  65. }
  66. /** A node should be considered a directory server if it has an open dirport
  67. * or it accepts tunnelled directory requests.
  68. */
  69. static void
  70. test_nodelist_node_is_dir(void *arg)
  71. {
  72. (void)arg;
  73. routerstatus_t rs;
  74. routerinfo_t ri;
  75. node_t node;
  76. memset(&node, 0, sizeof(node_t));
  77. memset(&rs, 0, sizeof(routerstatus_t));
  78. memset(&ri, 0, sizeof(routerinfo_t));
  79. tt_assert(!node_is_dir(&node));
  80. node.rs = &rs;
  81. tt_assert(!node_is_dir(&node));
  82. rs.is_v2_dir = 1;
  83. tt_assert(node_is_dir(&node));
  84. rs.is_v2_dir = 0;
  85. rs.dir_port = 1;
  86. tt_assert(! node_is_dir(&node));
  87. node.rs = NULL;
  88. tt_assert(!node_is_dir(&node));
  89. node.ri = &ri;
  90. ri.supports_tunnelled_dir_requests = 1;
  91. tt_assert(node_is_dir(&node));
  92. ri.supports_tunnelled_dir_requests = 0;
  93. ri.dir_port = 1;
  94. tt_assert(! node_is_dir(&node));
  95. done:
  96. return;
  97. }
  98. static networkstatus_t *dummy_ns = NULL;
  99. static networkstatus_t *
  100. mock_networkstatus_get_latest_consensus(void)
  101. {
  102. return dummy_ns;
  103. }
  104. static networkstatus_t *
  105. mock_networkstatus_get_latest_consensus_by_flavor(consensus_flavor_t f)
  106. {
  107. tor_assert(f == FLAV_MICRODESC);
  108. return dummy_ns;
  109. }
  110. static void
  111. test_nodelist_ed_id(void *arg)
  112. {
  113. #define N_NODES 5
  114. routerstatus_t *rs[N_NODES];
  115. microdesc_t *md[N_NODES];
  116. routerinfo_t *ri[N_NODES];
  117. networkstatus_t *ns;
  118. int i;
  119. (void)arg;
  120. ns = tor_malloc_zero(sizeof(networkstatus_t));
  121. ns->flavor = FLAV_MICRODESC;
  122. ns->routerstatus_list = smartlist_new();
  123. dummy_ns = ns;
  124. MOCK(networkstatus_get_latest_consensus,
  125. mock_networkstatus_get_latest_consensus);
  126. MOCK(networkstatus_get_latest_consensus_by_flavor,
  127. mock_networkstatus_get_latest_consensus_by_flavor);
  128. /* Make a bunch of dummy objects that we can play around with. Only set the
  129. necessary fields */
  130. for (i = 0; i < N_NODES; ++i) {
  131. rs[i] = tor_malloc_zero(sizeof(*rs[i]));
  132. md[i] = tor_malloc_zero(sizeof(*md[i]));
  133. ri[i] = tor_malloc_zero(sizeof(*ri[i]));
  134. crypto_rand(md[i]->digest, sizeof(md[i]->digest));
  135. md[i]->ed25519_identity_pkey = tor_malloc(sizeof(ed25519_public_key_t));
  136. crypto_rand((char*)md[i]->ed25519_identity_pkey,
  137. sizeof(ed25519_public_key_t));
  138. crypto_rand(rs[i]->identity_digest, sizeof(rs[i]->identity_digest));
  139. memcpy(ri[i]->cache_info.identity_digest, rs[i]->identity_digest,
  140. DIGEST_LEN);
  141. memcpy(rs[i]->descriptor_digest, md[i]->digest, DIGEST256_LEN);
  142. ri[i]->cache_info.signing_key_cert = tor_malloc_zero(sizeof(tor_cert_t));
  143. memcpy(&ri[i]->cache_info.signing_key_cert->signing_key,
  144. md[i]->ed25519_identity_pkey, sizeof(ed25519_public_key_t));
  145. if (i < 3)
  146. smartlist_add(ns->routerstatus_list, rs[i]);
  147. }
  148. tt_int_op(0, OP_EQ, smartlist_len(nodelist_get_list()));
  149. nodelist_set_consensus(ns);
  150. tt_int_op(3, OP_EQ, smartlist_len(nodelist_get_list()));
  151. /* No Ed25519 info yet, so nothing has an ED id. */
  152. tt_ptr_op(NULL, OP_EQ, node_get_by_ed25519_id(md[0]->ed25519_identity_pkey));
  153. /* Register the first one by md, then look it up. */
  154. node_t *n = nodelist_add_microdesc(md[0]);
  155. tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[0]->ed25519_identity_pkey));
  156. /* Register the second by ri, then look it up. */
  157. routerinfo_t *ri_old = NULL;
  158. n = nodelist_set_routerinfo(ri[1], &ri_old);
  159. tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[1]->ed25519_identity_pkey));
  160. tt_ptr_op(ri_old, OP_EQ, NULL);
  161. /* Register it by md too. */
  162. node_t *n2 = nodelist_add_microdesc(md[1]);
  163. tt_ptr_op(n2, OP_EQ, n);
  164. tt_ptr_op(n, OP_EQ, node_get_by_ed25519_id(md[1]->ed25519_identity_pkey));
  165. /* Register the 4th by ri only -- we never put it into the networkstatus,
  166. * so it has to be independent */
  167. node_t *n3 = nodelist_set_routerinfo(ri[3], &ri_old);
  168. tt_ptr_op(n3, OP_EQ, node_get_by_ed25519_id(md[3]->ed25519_identity_pkey));
  169. tt_ptr_op(ri_old, OP_EQ, NULL);
  170. tt_int_op(4, OP_EQ, smartlist_len(nodelist_get_list()));
  171. /* Register the 5th by ri only, and rewrite its ed25519 pubkey to be
  172. * the same as the 4th, to test the duplicate ed25519 key logging in
  173. * nodelist.c */
  174. memcpy(md[4]->ed25519_identity_pkey, md[3]->ed25519_identity_pkey,
  175. sizeof(ed25519_public_key_t));
  176. memcpy(&ri[4]->cache_info.signing_key_cert->signing_key,
  177. md[3]->ed25519_identity_pkey, sizeof(ed25519_public_key_t));
  178. setup_capture_of_logs(LOG_NOTICE);
  179. node_t *n4 = nodelist_set_routerinfo(ri[4], &ri_old);
  180. tt_ptr_op(ri_old, OP_EQ, NULL);
  181. tt_int_op(5, OP_EQ, smartlist_len(nodelist_get_list()));
  182. tt_ptr_op(n4, OP_NE, node_get_by_ed25519_id(md[3]->ed25519_identity_pkey));
  183. tt_ptr_op(n3, OP_EQ, node_get_by_ed25519_id(md[3]->ed25519_identity_pkey));
  184. expect_log_msg_containing("Reused ed25519_id");
  185. done:
  186. teardown_capture_of_logs();
  187. for (i = 0; i < N_NODES; ++i) {
  188. tor_free(rs[i]);
  189. tor_free(md[i]->ed25519_identity_pkey);
  190. tor_free(md[i]);
  191. tor_free(ri[i]->cache_info.signing_key_cert);
  192. tor_free(ri[i]);
  193. }
  194. smartlist_clear(ns->routerstatus_list);
  195. networkstatus_vote_free(ns);
  196. UNMOCK(networkstatus_get_latest_consensus);
  197. UNMOCK(networkstatus_get_latest_consensus_by_flavor);
  198. #undef N_NODES
  199. }
  200. static void
  201. test_nodelist_nodefamily(void *arg)
  202. {
  203. (void)arg;
  204. /* hex ID digests */
  205. const char h1[] = "5B435D6869206861206C65207363617270652070";
  206. const char h2[] = "75C3B220616E6461726520696E206769726F2061";
  207. const char h3[] = "2074726F766172206461206D616E67696172652C";
  208. const char h4[] = "206D656E747265206E6F6E2076616C65206C2769";
  209. const char h5[] = "6E766572736F2E202D2D5072696D6F204C657669";
  210. /* binary ID digests */
  211. uint8_t d1[DIGEST_LEN], d2[DIGEST_LEN], d3[DIGEST_LEN], d4[DIGEST_LEN],
  212. d5[DIGEST_LEN];
  213. base16_decode((char*)d1, sizeof(d1), h1, strlen(h1));
  214. base16_decode((char*)d2, sizeof(d2), h2, strlen(h2));
  215. base16_decode((char*)d3, sizeof(d3), h3, strlen(h3));
  216. base16_decode((char*)d4, sizeof(d4), h4, strlen(h4));
  217. base16_decode((char*)d5, sizeof(d5), h5, strlen(h5));
  218. char *enc=NULL, *enc2=NULL;
  219. nodefamily_t *nf1 = NULL;
  220. nodefamily_t *nf2 = NULL;
  221. nodefamily_t *nf3 = NULL;
  222. enc = nodefamily_format(NULL);
  223. tt_str_op(enc, OP_EQ, "");
  224. tor_free(enc);
  225. /* Make sure that sorting and de-duplication work. */
  226. tor_asprintf(&enc, "$%s hello", h1);
  227. nf1 = nodefamily_parse(enc, NULL, 0);
  228. tt_assert(nf1);
  229. tor_free(enc);
  230. tor_asprintf(&enc, "hello hello $%s hello", h1);
  231. nf2 = nodefamily_parse(enc, NULL, 0);
  232. tt_assert(nf2);
  233. tt_ptr_op(nf1, OP_EQ, nf2);
  234. tor_free(enc);
  235. tor_asprintf(&enc, "%s $%s hello", h1, h1);
  236. nf3 = nodefamily_parse(enc, NULL, 0);
  237. tt_assert(nf3);
  238. tt_ptr_op(nf1, OP_EQ, nf3);
  239. tor_free(enc);
  240. tt_assert(nodefamily_contains_rsa_id(nf1, d1));
  241. tt_assert(! nodefamily_contains_rsa_id(nf1, d2));
  242. tt_assert(nodefamily_contains_nickname(nf1, "hello"));
  243. tt_assert(nodefamily_contains_nickname(nf1, "HELLO"));
  244. tt_assert(! nodefamily_contains_nickname(nf1, "goodbye"));
  245. tt_int_op(nf1->refcnt, OP_EQ, 3);
  246. nodefamily_free(nf3);
  247. tt_int_op(nf1->refcnt, OP_EQ, 2);
  248. /* Try parsing with a provided self RSA digest. */
  249. nf3 = nodefamily_parse("hello ", d1, 0);
  250. tt_assert(nf3);
  251. tt_ptr_op(nf1, OP_EQ, nf3);
  252. /* Do we get the expected result when we re-encode? */
  253. tor_asprintf(&enc, "$%s hello", h1);
  254. enc2 = nodefamily_format(nf1);
  255. tt_str_op(enc2, OP_EQ, enc);
  256. tor_free(enc2);
  257. tor_free(enc);
  258. /* Make sure that we get a different result if we give a different digest. */
  259. nodefamily_free(nf3);
  260. tor_asprintf(&enc, "hello $%s hello", h3);
  261. nf3 = nodefamily_parse(enc, NULL, 0);
  262. tt_assert(nf3);
  263. tt_ptr_op(nf1, OP_NE, nf3);
  264. tor_free(enc);
  265. tt_assert(nodefamily_contains_rsa_id(nf3, d3));
  266. tt_assert(! nodefamily_contains_rsa_id(nf3, d2));
  267. tt_assert(! nodefamily_contains_rsa_id(nf3, d1));
  268. tt_assert(nodefamily_contains_nickname(nf3, "hello"));
  269. tt_assert(! nodefamily_contains_nickname(nf3, "goodbye"));
  270. nodefamily_free(nf1);
  271. nodefamily_free(nf2);
  272. nodefamily_free(nf3);
  273. /* Try one with several digests, all with nicknames appended, in different
  274. formats. */
  275. tor_asprintf(&enc, "%s $%s $%s=res $%s~ist", h1, h2, h3, h4);
  276. nf1 = nodefamily_parse(enc, d5, 0);
  277. tt_assert(nf1);
  278. tt_assert(nodefamily_contains_rsa_id(nf1, d1));
  279. tt_assert(nodefamily_contains_rsa_id(nf1, d2));
  280. tt_assert(nodefamily_contains_rsa_id(nf1, d3));
  281. tt_assert(nodefamily_contains_rsa_id(nf1, d4));
  282. tt_assert(nodefamily_contains_rsa_id(nf1, d5));
  283. /* Nicknames aren't preserved when ids are present, since node naming is
  284. * deprecated */
  285. tt_assert(! nodefamily_contains_nickname(nf3, "res"));
  286. tor_free(enc);
  287. tor_asprintf(&enc, "$%s $%s $%s $%s $%s", h4, h3, h1, h5, h2);
  288. enc2 = nodefamily_format(nf1);
  289. tt_str_op(enc, OP_EQ, enc2);
  290. tor_free(enc);
  291. tor_free(enc2);
  292. /* Try ones where we parse the empty string. */
  293. nf2 = nodefamily_parse("", NULL, 0);
  294. nf3 = nodefamily_parse("", d4, 0);
  295. tt_assert(nf2);
  296. tt_assert(nf3);
  297. tt_ptr_op(nf2, OP_NE, nf3);
  298. tt_assert(! nodefamily_contains_rsa_id(nf2, d4));
  299. tt_assert(nodefamily_contains_rsa_id(nf3, d4));
  300. tt_assert(! nodefamily_contains_rsa_id(nf2, d5));
  301. tt_assert(! nodefamily_contains_rsa_id(nf3, d5));
  302. tt_assert(! nodefamily_contains_nickname(nf2, "fred"));
  303. tt_assert(! nodefamily_contains_nickname(nf3, "bosco"));
  304. /* The NULL family should contain nothing. */
  305. tt_assert(! nodefamily_contains_rsa_id(NULL, d4));
  306. tt_assert(! nodefamily_contains_rsa_id(NULL, d5));
  307. done:
  308. tor_free(enc);
  309. tor_free(enc2);
  310. nodefamily_free(nf1);
  311. nodefamily_free(nf2);
  312. nodefamily_free(nf3);
  313. nodefamily_free_all();
  314. }
  315. static void
  316. test_nodelist_nodefamily_parse_err(void *arg)
  317. {
  318. (void)arg;
  319. nodefamily_t *nf1 = NULL;
  320. char *enc = NULL;
  321. const char *semibogus =
  322. "sdakljfdslkfjdsaklfjdkl9sdf " // too long for nickname
  323. "$jkASDFLkjsadfjhkl " // not hex
  324. "$7468696e67732d696e2d7468656d73656c766573 " // ok
  325. "reticulatogranulate "// ok
  326. "$73656d69616e7468726f706f6c6f676963616c6c79 " // too long for hex
  327. "$616273656e746d696e6465646e6573736573" // too short for hex
  328. ;
  329. setup_capture_of_logs(LOG_WARN);
  330. // We only get two items when we parse this.
  331. for (int reject = 0; reject <= 1; ++reject) {
  332. for (int log_at_warn = 0; log_at_warn <= 1; ++log_at_warn) {
  333. unsigned flags = log_at_warn ? NF_WARN_MALFORMED : 0;
  334. flags |= reject ? NF_REJECT_MALFORMED : 0;
  335. nf1 = nodefamily_parse(semibogus, NULL, flags);
  336. if (reject) {
  337. tt_assert(nf1 == NULL);
  338. } else {
  339. tt_assert(nf1);
  340. enc = nodefamily_format(nf1);
  341. tt_str_op(enc, OP_EQ,
  342. "$7468696E67732D696E2D7468656D73656C766573 "
  343. "reticulatogranulate");
  344. tor_free(enc);
  345. }
  346. if (log_at_warn) {
  347. expect_log_msg_containing("$616273656e746d696e6465646e6573736573");
  348. expect_log_msg_containing("sdakljfdslkfjdsaklfjdkl9sdf");
  349. } else {
  350. tt_int_op(mock_saved_log_n_entries(), OP_EQ, 0);
  351. }
  352. mock_clean_saved_logs();
  353. }
  354. }
  355. done:
  356. tor_free(enc);
  357. nodefamily_free(nf1);
  358. teardown_capture_of_logs();
  359. }
  360. static const node_t *
  361. mock_node_get_by_id(const char *id)
  362. {
  363. if (fast_memeq(id, "!!!!!!!!!!!!!!!!!!!!", DIGEST_LEN))
  364. return NULL;
  365. // use tor_free, not node_free.
  366. node_t *fake_node = tor_malloc_zero(sizeof(node_t));
  367. memcpy(fake_node->identity, id, DIGEST_LEN);
  368. return fake_node;
  369. }
  370. static const node_t *
  371. mock_node_get_by_nickname(const char *nn, unsigned flags)
  372. {
  373. (void)flags;
  374. if (!strcmp(nn, "nonesuch"))
  375. return NULL;
  376. // use tor_free, not node_free.
  377. node_t *fake_node = tor_malloc_zero(sizeof(node_t));
  378. strlcpy(fake_node->identity, nn, DIGEST_LEN);
  379. return fake_node;
  380. }
  381. static void
  382. test_nodelist_nodefamily_lookup(void *arg)
  383. {
  384. (void)arg;
  385. MOCK(node_get_by_nickname, mock_node_get_by_nickname);
  386. MOCK(node_get_by_id, mock_node_get_by_id);
  387. smartlist_t *sl = smartlist_new();
  388. nodefamily_t *nf1 = NULL;
  389. char *mem_op_hex_tmp = NULL;
  390. // 'null' is allowed.
  391. nodefamily_add_nodes_to_smartlist(NULL, sl);
  392. tt_int_op(smartlist_len(sl), OP_EQ, 0);
  393. // Try a real family
  394. nf1 = nodefamily_parse("$EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE "
  395. "$2121212121212121212121212121212121212121 "
  396. "$3333333333333333333333333333333333333333 "
  397. "erewhon nonesuch", NULL, 0);
  398. tt_assert(nf1);
  399. nodefamily_add_nodes_to_smartlist(nf1, sl);
  400. // There were 5 elements; 2 were dropped because the mocked lookup failed.
  401. tt_int_op(smartlist_len(sl), OP_EQ, 3);
  402. const node_t *n = smartlist_get(sl, 0);
  403. test_memeq_hex(n->identity, "3333333333333333333333333333333333333333");
  404. n = smartlist_get(sl, 1);
  405. test_memeq_hex(n->identity, "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE");
  406. n = smartlist_get(sl, 2);
  407. tt_str_op(n->identity, OP_EQ, "erewhon");
  408. done:
  409. UNMOCK(node_get_by_nickname);
  410. UNMOCK(node_get_by_id);
  411. SMARTLIST_FOREACH(sl, node_t *, fake_node, tor_free(fake_node));
  412. smartlist_free(sl);
  413. nodefamily_free(nf1);
  414. tor_free(mem_op_hex_tmp);
  415. }
  416. static void
  417. test_nodelist_nickname_matches(void *arg)
  418. {
  419. (void)arg;
  420. node_t mock_node;
  421. routerstatus_t mock_rs;
  422. memset(&mock_node, 0, sizeof(mock_node));
  423. memset(&mock_rs, 0, sizeof(mock_rs));
  424. strlcpy(mock_rs.nickname, "evilgeniuses", sizeof(mock_rs.nickname));
  425. mock_node.rs = &mock_rs;
  426. memcpy(mock_node.identity, ".forabettertomorrow.", DIGEST_LEN);
  427. #define match(x) tt_assert(node_nickname_matches(&mock_node, (x)))
  428. #define no_match(x) tt_assert(! node_nickname_matches(&mock_node, (x)))
  429. match("evilgeniuses");
  430. match("EvilGeniuses");
  431. match("EvilGeniuses");
  432. match("2e666f7261626574746572746f6d6f72726f772e");
  433. match("2E666F7261626574746572746F6D6F72726F772E");
  434. match("$2e666f7261626574746572746f6d6f72726f772e");
  435. match("$2E666F7261626574746572746F6D6F72726F772E");
  436. match("$2E666F7261626574746572746F6D6F72726F772E~evilgeniuses");
  437. match("$2E666F7261626574746572746F6D6F72726F772E~EVILGENIUSES");
  438. no_match("evilgenius");
  439. no_match("evilgeniuseses");
  440. no_match("evil.genius");
  441. no_match("$2E666F7261626574746572746F6D6F72726FFFFF");
  442. no_match("2E666F7261626574746572746F6D6F72726FFFFF");
  443. no_match("$2E666F7261626574746572746F6D6F72726F772E~fred");
  444. no_match("$2E666F7261626574746572746F6D6F72726F772E=EVILGENIUSES");
  445. done:
  446. ;
  447. }
  448. static void
  449. test_nodelist_node_nodefamily(void *arg)
  450. {
  451. (void)arg;
  452. node_t mock_node1;
  453. routerstatus_t mock_rs;
  454. microdesc_t mock_md;
  455. node_t mock_node2;
  456. routerinfo_t mock_ri;
  457. smartlist_t *nodes=smartlist_new();
  458. memset(&mock_node1, 0, sizeof(mock_node1));
  459. memset(&mock_node2, 0, sizeof(mock_node2));
  460. memset(&mock_rs, 0, sizeof(mock_rs));
  461. memset(&mock_md, 0, sizeof(mock_md));
  462. memset(&mock_ri, 0, sizeof(mock_ri));
  463. mock_node1.rs = &mock_rs;
  464. mock_node1.md = &mock_md;
  465. mock_node2.ri = &mock_ri;
  466. strlcpy(mock_rs.nickname, "nodeone", sizeof(mock_rs.nickname));
  467. mock_ri.nickname = tor_strdup("nodetwo");
  468. memcpy(mock_node1.identity, "NodeOneNode1NodeOne1", DIGEST_LEN);
  469. memcpy(mock_node2.identity, "SecondNodeWe'reTestn", DIGEST_LEN);
  470. // empty families.
  471. tt_assert(! node_family_contains(&mock_node1, &mock_node2));
  472. tt_assert(! node_family_contains(&mock_node2, &mock_node1));
  473. // Families contain nodes, but not these nodes
  474. mock_ri.declared_family = smartlist_new();
  475. smartlist_add(mock_ri.declared_family, (char*)"NodeThree");
  476. mock_md.family = nodefamily_parse("NodeFour", NULL, 0);
  477. tt_assert(! node_family_contains(&mock_node1, &mock_node2));
  478. tt_assert(! node_family_contains(&mock_node2, &mock_node1));
  479. // Families contain one another.
  480. smartlist_add(mock_ri.declared_family, (char*)
  481. "4e6f64654f6e654e6f6465314e6f64654f6e6531");
  482. tt_assert(! node_family_contains(&mock_node1, &mock_node2));
  483. tt_assert(node_family_contains(&mock_node2, &mock_node1));
  484. nodefamily_free(mock_md.family);
  485. mock_md.family = nodefamily_parse(
  486. "NodeFour "
  487. "5365636f6e644e6f64655765277265546573746e", NULL, 0);
  488. tt_assert(node_family_contains(&mock_node1, &mock_node2));
  489. tt_assert(node_family_contains(&mock_node2, &mock_node1));
  490. // Try looking up families now.
  491. MOCK(node_get_by_nickname, mock_node_get_by_nickname);
  492. MOCK(node_get_by_id, mock_node_get_by_id);
  493. node_lookup_declared_family(nodes, &mock_node1);
  494. tt_int_op(smartlist_len(nodes), OP_EQ, 2);
  495. const node_t *n = smartlist_get(nodes, 0);
  496. tt_mem_op(n->identity, OP_EQ, "SecondNodeWe'reTestn", DIGEST_LEN);
  497. n = smartlist_get(nodes, 1);
  498. tt_str_op(n->identity, OP_EQ, "nodefour");
  499. // free, try the other one.
  500. SMARTLIST_FOREACH(nodes, node_t *, x, tor_free(x));
  501. smartlist_clear(nodes);
  502. node_lookup_declared_family(nodes, &mock_node2);
  503. tt_int_op(smartlist_len(nodes), OP_EQ, 2);
  504. n = smartlist_get(nodes, 0);
  505. // This gets a truncated hex hex ID since it was looked up by name
  506. tt_str_op(n->identity, OP_EQ, "NodeThree");
  507. n = smartlist_get(nodes, 1);
  508. tt_str_op(n->identity, OP_EQ, "4e6f64654f6e654e6f6");
  509. done:
  510. UNMOCK(node_get_by_nickname);
  511. UNMOCK(node_get_by_id);
  512. smartlist_free(mock_ri.declared_family);
  513. nodefamily_free(mock_md.family);
  514. tor_free(mock_ri.nickname);
  515. // use tor_free, these aren't real nodes
  516. SMARTLIST_FOREACH(nodes, node_t *, x, tor_free(x));
  517. smartlist_free(nodes);
  518. }
  519. static void
  520. test_nodelist_nodefamily_canonicalize(void *arg)
  521. {
  522. (void)arg;
  523. char *c = NULL;
  524. c = nodefamily_canonicalize("", NULL, 0);
  525. tt_str_op(c, OP_EQ, "");
  526. tor_free(c);
  527. uint8_t own_id[20];
  528. memset(own_id, 0, sizeof(own_id));
  529. c = nodefamily_canonicalize(
  530. "alice BOB caroL %potrzebie !!!@#@# "
  531. "$bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb=fred "
  532. "ffffffffffffffffffffffffffffffffffffffff "
  533. "$cccccccccccccccccccccccccccccccccccccccc ", own_id, 0);
  534. tt_str_op(c, OP_EQ,
  535. "!!!@#@# "
  536. "$0000000000000000000000000000000000000000 "
  537. "$BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB "
  538. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC "
  539. "$FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF "
  540. "%potrzebie "
  541. "alice bob carol");
  542. done:
  543. tor_free(c);
  544. }
  545. /** format_node_description() should return
  546. * "Fingerprint~Nickname at IPv4 and [IPv6]".
  547. * The nickname and addresses are optional.
  548. */
  549. static void
  550. test_nodelist_format_node_description(void *arg)
  551. {
  552. char mock_digest[DIGEST_LEN];
  553. char mock_nickname[MAX_NICKNAME_LEN+1];
  554. tor_addr_t mock_null_ip;
  555. tor_addr_t mock_ipv4;
  556. tor_addr_t mock_ipv6;
  557. char ndesc[NODE_DESC_BUF_LEN];
  558. const char *rv = NULL;
  559. (void) arg;
  560. /* Clear variables */
  561. memset(ndesc, 0, sizeof(ndesc));
  562. memset(mock_digest, 0, sizeof(mock_digest));
  563. memset(mock_nickname, 0, sizeof(mock_nickname));
  564. memset(&mock_null_ip, 0, sizeof(mock_null_ip));
  565. memset(&mock_ipv4, 0, sizeof(mock_ipv4));
  566. memset(&mock_ipv6, 0, sizeof(mock_ipv6));
  567. /* Set variables */
  568. memcpy(mock_digest,
  569. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
  570. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
  571. sizeof(mock_digest));
  572. strlcpy(mock_nickname, "TestOR7890123456789", sizeof(mock_nickname));
  573. tor_addr_parse(&mock_ipv4, "111.222.233.244");
  574. tor_addr_parse(&mock_ipv6, "[1111:2222:3333:4444:5555:6666:7777:8888]");
  575. /* Test function with variables */
  576. rv = format_node_description(ndesc,
  577. mock_digest,
  578. NULL,
  579. NULL,
  580. 0);
  581. tt_ptr_op(rv, OP_EQ, ndesc);
  582. tt_str_op(ndesc, OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
  583. /* format node description should use ~ because named is deprecated */
  584. rv = format_node_description(ndesc,
  585. mock_digest,
  586. mock_nickname,
  587. NULL,
  588. 0);
  589. tt_ptr_op(rv, OP_EQ, ndesc);
  590. tt_str_op(ndesc, OP_EQ,
  591. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~""TestOR7890123456789");
  592. /* Try a null IP address, rather than NULL */
  593. rv = format_node_description(ndesc,
  594. mock_digest,
  595. mock_nickname,
  596. &mock_null_ip,
  597. 0);
  598. tt_ptr_op(rv, OP_EQ, ndesc);
  599. tt_str_op(ndesc, OP_EQ,
  600. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789");
  601. /* Try some real IP addresses */
  602. rv = format_node_description(ndesc,
  603. mock_digest,
  604. NULL,
  605. &mock_ipv4,
  606. 0);
  607. tt_ptr_op(rv, OP_EQ, ndesc);
  608. tt_str_op(ndesc, OP_EQ,
  609. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA at 111.222.233.244");
  610. rv = format_node_description(ndesc,
  611. mock_digest,
  612. mock_nickname,
  613. &mock_ipv6,
  614. 0);
  615. tt_ptr_op(rv, OP_EQ, ndesc);
  616. tt_str_op(ndesc, OP_EQ,
  617. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  618. "[1111:2222:3333:4444:5555:6666:7777:8888]");
  619. rv = format_node_description(ndesc,
  620. mock_digest,
  621. mock_nickname,
  622. &mock_ipv6,
  623. tor_addr_to_ipv4h(&mock_ipv4));
  624. tt_ptr_op(rv, OP_EQ, ndesc);
  625. tt_str_op(ndesc, OP_EQ,
  626. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  627. "111.222.233.244 and [1111:2222:3333:4444:5555:6666:7777:8888]");
  628. /* test NULL handling */
  629. rv = format_node_description(NULL, NULL, NULL, NULL, 0);
  630. tt_str_op(rv, OP_EQ, "<NULL BUFFER>");
  631. rv = format_node_description(ndesc, NULL, NULL, NULL, 0);
  632. tt_ptr_op(rv, OP_EQ, ndesc);
  633. tt_str_op(rv, OP_EQ, "<NULL ID DIGEST>");
  634. done:
  635. return;
  636. }
  637. /** router_describe() is a wrapper for format_node_description(), see that
  638. * test for details.
  639. *
  640. * The routerinfo-only node_describe() tests are in this function,
  641. * so we can re-use the same mocked variables.
  642. */
  643. static void
  644. test_nodelist_router_describe(void *arg)
  645. {
  646. char mock_nickname[MAX_NICKNAME_LEN+1];
  647. tor_addr_t mock_ipv4;
  648. routerinfo_t mock_ri_ipv4;
  649. routerinfo_t mock_ri_ipv6;
  650. routerinfo_t mock_ri_dual;
  651. const char *rv = NULL;
  652. (void) arg;
  653. /* Clear variables */
  654. memset(mock_nickname, 0, sizeof(mock_nickname));
  655. memset(&mock_ipv4, 0, sizeof(mock_ipv4));
  656. memset(&mock_ri_ipv4, 0, sizeof(mock_ri_ipv4));
  657. memset(&mock_ri_ipv6, 0, sizeof(mock_ri_ipv6));
  658. memset(&mock_ri_dual, 0, sizeof(mock_ri_dual));
  659. /* Set up the dual-stack routerinfo */
  660. memcpy(mock_ri_dual.cache_info.identity_digest,
  661. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
  662. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
  663. sizeof(mock_ri_dual.cache_info.identity_digest));
  664. strlcpy(mock_nickname, "TestOR7890123456789", sizeof(mock_nickname));
  665. mock_ri_dual.nickname = mock_nickname;
  666. tor_addr_parse(&mock_ipv4, "111.222.233.244");
  667. mock_ri_dual.addr = tor_addr_to_ipv4h(&mock_ipv4);
  668. tor_addr_parse(&mock_ri_dual.ipv6_addr,
  669. "[1111:2222:3333:4444:5555:6666:7777:8888]");
  670. /* Create and modify the other routerinfos.
  671. * mock_nickname is referenced from all 3 routerinfos.
  672. * That's ok, all their memory is static. */
  673. memcpy(&mock_ri_ipv4, &mock_ri_dual, sizeof(mock_ri_ipv4));
  674. memcpy(&mock_ri_ipv6, &mock_ri_dual, sizeof(mock_ri_ipv6));
  675. /* Clear the unnecessary addresses */
  676. memset(&mock_ri_ipv4.ipv6_addr, 0, sizeof(mock_ri_ipv4.ipv6_addr));
  677. mock_ri_ipv6.addr = 0;
  678. /* We don't test the no-nickname and no-IP cases, because they're covered by
  679. * format_node_description(), and we don't expect to see them in Tor code. */
  680. /* Try some real IP addresses */
  681. rv = router_describe(&mock_ri_ipv4);
  682. tt_str_op(rv, OP_EQ,
  683. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  684. "111.222.233.244");
  685. rv = router_describe(&mock_ri_ipv6);
  686. tt_str_op(rv, OP_EQ,
  687. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  688. "[1111:2222:3333:4444:5555:6666:7777:8888]");
  689. rv = router_describe(&mock_ri_dual);
  690. tt_str_op(rv, OP_EQ,
  691. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  692. "111.222.233.244 and [1111:2222:3333:4444:5555:6666:7777:8888]");
  693. /* test NULL handling */
  694. rv = router_describe(NULL);
  695. tt_str_op(rv, OP_EQ, "<null>");
  696. /* Now test a node with only these routerinfos */
  697. node_t mock_node;
  698. memset(&mock_node, 0, sizeof(mock_node));
  699. memcpy(mock_node.identity,
  700. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
  701. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
  702. sizeof(mock_node.identity));
  703. /* Try some real IP addresses */
  704. mock_node.ri = &mock_ri_ipv4;
  705. rv = node_describe(&mock_node);
  706. tt_str_op(rv, OP_EQ,
  707. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  708. "111.222.233.244");
  709. mock_node.ri = &mock_ri_ipv6;
  710. rv = node_describe(&mock_node);
  711. tt_str_op(rv, OP_EQ,
  712. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  713. "[1111:2222:3333:4444:5555:6666:7777:8888]");
  714. mock_node.ri = &mock_ri_dual;
  715. rv = node_describe(&mock_node);
  716. tt_str_op(rv, OP_EQ,
  717. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  718. "111.222.233.244 and [1111:2222:3333:4444:5555:6666:7777:8888]");
  719. done:
  720. return;
  721. }
  722. /** node_describe() is a wrapper for format_node_description(), see that
  723. * test for details.
  724. *
  725. * The routerinfo-only and routerstatus-only node_describe() tests are in
  726. * test_nodelist_router_describe() and test_nodelist_routerstatus_describe(),
  727. * so we can re-use their mocked variables.
  728. */
  729. static void
  730. test_nodelist_node_describe(void *arg)
  731. {
  732. char mock_nickname[MAX_NICKNAME_LEN+1];
  733. tor_addr_t mock_ipv4;
  734. const char *rv = NULL;
  735. (void) arg;
  736. /* Routerinfos */
  737. routerinfo_t mock_ri_dual;
  738. /* Clear variables */
  739. memset(mock_nickname, 0, sizeof(mock_nickname));
  740. memset(&mock_ipv4, 0, sizeof(mock_ipv4));
  741. memset(&mock_ri_dual, 0, sizeof(mock_ri_dual));
  742. /* Set up the dual-stack routerinfo */
  743. memcpy(mock_ri_dual.cache_info.identity_digest,
  744. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
  745. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
  746. sizeof(mock_ri_dual.cache_info.identity_digest));
  747. strlcpy(mock_nickname, "TestOR7890123456789", sizeof(mock_nickname));
  748. mock_ri_dual.nickname = mock_nickname;
  749. tor_addr_parse(&mock_ipv4, "111.222.233.244");
  750. mock_ri_dual.addr = tor_addr_to_ipv4h(&mock_ipv4);
  751. tor_addr_parse(&mock_ri_dual.ipv6_addr,
  752. "[1111:2222:3333:4444:5555:6666:7777:8888]");
  753. /* Routerstatuses */
  754. routerstatus_t mock_rs_ipv4;
  755. routerstatus_t mock_rs_dual;
  756. /* Clear variables */
  757. memset(&mock_ipv4, 0, sizeof(mock_ipv4));
  758. memset(&mock_rs_ipv4, 0, sizeof(mock_rs_ipv4));
  759. memset(&mock_rs_dual, 0, sizeof(mock_rs_dual));
  760. /* Set up the dual-stack routerstatus */
  761. memcpy(mock_rs_dual.identity_digest,
  762. "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB"
  763. "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB",
  764. sizeof(mock_rs_dual.identity_digest));
  765. strlcpy(mock_rs_dual.nickname, "Bbb",
  766. sizeof(mock_rs_dual.nickname));
  767. tor_addr_parse(&mock_ipv4, "2.2.2.2");
  768. mock_rs_dual.addr = tor_addr_to_ipv4h(&mock_ipv4);
  769. tor_addr_parse(&mock_rs_dual.ipv6_addr,
  770. "[bbbb::bbbb]");
  771. /* Create and modify the other routerstatus. */
  772. memcpy(&mock_rs_ipv4, &mock_rs_dual, sizeof(mock_rs_ipv4));
  773. /* Clear the unnecessary IPv6 address */
  774. memset(&mock_rs_ipv4.ipv6_addr, 0, sizeof(mock_rs_ipv4.ipv6_addr));
  775. /* Microdescs */
  776. microdesc_t mock_md_null;
  777. microdesc_t mock_md_ipv6;
  778. /* Clear variables */
  779. memset(&mock_md_null, 0, sizeof(mock_md_null));
  780. memset(&mock_md_ipv6, 0, sizeof(mock_md_ipv6));
  781. /* Set up the microdesc */
  782. tor_addr_parse(&mock_md_ipv6.ipv6_addr,
  783. "[eeee::6000:6000]");
  784. /* Set up the node */
  785. node_t mock_node;
  786. memset(&mock_node, 0, sizeof(mock_node));
  787. memcpy(mock_node.identity,
  788. "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC"
  789. "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC",
  790. sizeof(mock_node.identity));
  791. /* Test that the routerinfo and routerstatus work separately, but the
  792. * identity comes from the node */
  793. mock_node.ri = &mock_ri_dual;
  794. mock_node.rs = NULL;
  795. mock_node.md = NULL;
  796. rv = node_describe(&mock_node);
  797. tt_str_op(rv, OP_EQ,
  798. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~TestOR7890123456789 at "
  799. "111.222.233.244 and [1111:2222:3333:4444:5555:6666:7777:8888]");
  800. mock_node.ri = NULL;
  801. mock_node.rs = &mock_rs_ipv4;
  802. mock_node.md = NULL;
  803. rv = node_describe(&mock_node);
  804. tt_str_op(rv, OP_EQ,
  805. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  806. "2.2.2.2");
  807. mock_node.ri = NULL;
  808. mock_node.rs = &mock_rs_dual;
  809. mock_node.md = NULL;
  810. rv = node_describe(&mock_node);
  811. tt_str_op(rv, OP_EQ,
  812. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  813. "2.2.2.2 and [bbbb::bbbb]");
  814. /* Test that the routerstatus overrides the routerinfo */
  815. mock_node.ri = &mock_ri_dual;
  816. mock_node.rs = &mock_rs_ipv4;
  817. mock_node.md = NULL;
  818. rv = node_describe(&mock_node);
  819. tt_str_op(rv, OP_EQ,
  820. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  821. "2.2.2.2");
  822. mock_node.ri = &mock_ri_dual;
  823. mock_node.rs = &mock_rs_dual;
  824. mock_node.md = NULL;
  825. rv = node_describe(&mock_node);
  826. tt_str_op(rv, OP_EQ,
  827. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  828. "2.2.2.2 and [bbbb::bbbb]");
  829. /* Test that the microdesc IPv6 is used if the routerinfo doesn't have IPv6
  830. */
  831. mock_node.ri = NULL;
  832. mock_node.rs = &mock_rs_ipv4;
  833. mock_node.md = &mock_md_ipv6;
  834. rv = node_describe(&mock_node);
  835. tt_str_op(rv, OP_EQ,
  836. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  837. "2.2.2.2 and [eeee::6000:6000]");
  838. mock_node.ri = NULL;
  839. mock_node.rs = &mock_rs_ipv4;
  840. mock_node.md = &mock_md_null;
  841. rv = node_describe(&mock_node);
  842. tt_str_op(rv, OP_EQ,
  843. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  844. "2.2.2.2");
  845. mock_node.ri = NULL;
  846. mock_node.rs = &mock_rs_dual;
  847. mock_node.md = &mock_md_ipv6;
  848. rv = node_describe(&mock_node);
  849. tt_str_op(rv, OP_EQ,
  850. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  851. "2.2.2.2 and [bbbb::bbbb]");
  852. mock_node.ri = NULL;
  853. mock_node.rs = &mock_rs_dual;
  854. mock_node.md = &mock_md_null;
  855. rv = node_describe(&mock_node);
  856. tt_str_op(rv, OP_EQ,
  857. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  858. "2.2.2.2 and [bbbb::bbbb]");
  859. /* Test that the routerinfo doesn't change the results above
  860. */
  861. mock_node.ri = &mock_ri_dual;
  862. mock_node.rs = &mock_rs_ipv4;
  863. mock_node.md = &mock_md_ipv6;
  864. rv = node_describe(&mock_node);
  865. tt_str_op(rv, OP_EQ,
  866. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  867. "2.2.2.2 and [eeee::6000:6000]");
  868. mock_node.ri = &mock_ri_dual;
  869. mock_node.rs = &mock_rs_ipv4;
  870. mock_node.md = &mock_md_null;
  871. rv = node_describe(&mock_node);
  872. tt_str_op(rv, OP_EQ,
  873. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  874. "2.2.2.2");
  875. mock_node.ri = &mock_ri_dual;
  876. mock_node.rs = &mock_rs_dual;
  877. mock_node.md = &mock_md_ipv6;
  878. rv = node_describe(&mock_node);
  879. tt_str_op(rv, OP_EQ,
  880. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  881. "2.2.2.2 and [bbbb::bbbb]");
  882. mock_node.ri = &mock_ri_dual;
  883. mock_node.rs = &mock_rs_dual;
  884. mock_node.md = &mock_md_null;
  885. rv = node_describe(&mock_node);
  886. tt_str_op(rv, OP_EQ,
  887. "$CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC~Bbb at "
  888. "2.2.2.2 and [bbbb::bbbb]");
  889. /* test NULL handling */
  890. rv = node_describe(NULL);
  891. tt_str_op(rv, OP_EQ, "<null>");
  892. mock_node.ri = NULL;
  893. mock_node.rs = NULL;
  894. mock_node.md = NULL;
  895. rv = node_describe(&mock_node);
  896. tt_str_op(rv, OP_EQ,
  897. "<null rs and ri>");
  898. done:
  899. return;
  900. }
  901. /** routerstatus_describe() is a wrapper for format_node_description(), see
  902. * that test for details.
  903. *
  904. * The routerstatus-only node_describe() tests are in this function,
  905. * so we can re-use the same mocked variables.
  906. */
  907. static void
  908. test_nodelist_routerstatus_describe(void *arg)
  909. {
  910. tor_addr_t mock_ipv4;
  911. routerstatus_t mock_rs_ipv4;
  912. routerstatus_t mock_rs_ipv6;
  913. routerstatus_t mock_rs_dual;
  914. const char *rv = NULL;
  915. (void) arg;
  916. /* Clear variables */
  917. memset(&mock_ipv4, 0, sizeof(mock_ipv4));
  918. memset(&mock_rs_ipv4, 0, sizeof(mock_rs_ipv4));
  919. memset(&mock_rs_ipv6, 0, sizeof(mock_rs_ipv6));
  920. memset(&mock_rs_dual, 0, sizeof(mock_rs_dual));
  921. /* Set up the dual-stack routerstatus */
  922. memcpy(mock_rs_dual.identity_digest,
  923. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
  924. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
  925. sizeof(mock_rs_dual.identity_digest));
  926. strlcpy(mock_rs_dual.nickname, "TestOR7890123456789",
  927. sizeof(mock_rs_dual.nickname));
  928. tor_addr_parse(&mock_ipv4, "111.222.233.244");
  929. mock_rs_dual.addr = tor_addr_to_ipv4h(&mock_ipv4);
  930. tor_addr_parse(&mock_rs_dual.ipv6_addr,
  931. "[1111:2222:3333:4444:5555:6666:7777:8888]");
  932. /* Create and modify the other routerstatuses. */
  933. memcpy(&mock_rs_ipv4, &mock_rs_dual, sizeof(mock_rs_ipv4));
  934. memcpy(&mock_rs_ipv6, &mock_rs_dual, sizeof(mock_rs_ipv6));
  935. /* Clear the unnecessary addresses */
  936. memset(&mock_rs_ipv4.ipv6_addr, 0, sizeof(mock_rs_ipv4.ipv6_addr));
  937. mock_rs_ipv6.addr = 0;
  938. /* We don't test the no-nickname and no-IP cases, because they're covered by
  939. * format_node_description(), and we don't expect to see them in Tor code. */
  940. /* Try some real IP addresses */
  941. rv = routerstatus_describe(&mock_rs_ipv4);
  942. tt_str_op(rv, OP_EQ,
  943. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  944. "111.222.233.244");
  945. rv = routerstatus_describe(&mock_rs_ipv6);
  946. tt_str_op(rv, OP_EQ,
  947. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  948. "[1111:2222:3333:4444:5555:6666:7777:8888]");
  949. rv = routerstatus_describe(&mock_rs_dual);
  950. tt_str_op(rv, OP_EQ,
  951. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  952. "111.222.233.244 and [1111:2222:3333:4444:5555:6666:7777:8888]");
  953. /* test NULL handling */
  954. rv = routerstatus_describe(NULL);
  955. tt_str_op(rv, OP_EQ, "<null>");
  956. /* Now test a node with only these routerstatuses */
  957. node_t mock_node;
  958. memset(&mock_node, 0, sizeof(mock_node));
  959. memcpy(mock_node.identity,
  960. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
  961. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
  962. sizeof(mock_node.identity));
  963. /* Try some real IP addresses */
  964. mock_node.rs = &mock_rs_ipv4;
  965. rv = node_describe(&mock_node);
  966. tt_str_op(rv, OP_EQ,
  967. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  968. "111.222.233.244");
  969. mock_node.rs = &mock_rs_ipv6;
  970. rv = node_describe(&mock_node);
  971. tt_str_op(rv, OP_EQ,
  972. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  973. "[1111:2222:3333:4444:5555:6666:7777:8888]");
  974. mock_node.rs = &mock_rs_dual;
  975. rv = node_describe(&mock_node);
  976. tt_str_op(rv, OP_EQ,
  977. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  978. "111.222.233.244 and [1111:2222:3333:4444:5555:6666:7777:8888]");
  979. done:
  980. return;
  981. }
  982. /** extend_info_describe() is a wrapper for format_node_description(), see
  983. * that test for details.
  984. */
  985. static void
  986. test_nodelist_extend_info_describe(void *arg)
  987. {
  988. extend_info_t mock_ei_ipv4;
  989. extend_info_t mock_ei_ipv6;
  990. const char *rv = NULL;
  991. (void) arg;
  992. /* Clear variables */
  993. memset(&mock_ei_ipv4, 0, sizeof(mock_ei_ipv4));
  994. memset(&mock_ei_ipv6, 0, sizeof(mock_ei_ipv6));
  995. /* Set up the IPv4 extend info */
  996. memcpy(mock_ei_ipv4.identity_digest,
  997. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
  998. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
  999. sizeof(mock_ei_ipv4.identity_digest));
  1000. strlcpy(mock_ei_ipv4.nickname, "TestOR7890123456789",
  1001. sizeof(mock_ei_ipv4.nickname));
  1002. tor_addr_parse(&mock_ei_ipv4.addr, "111.222.233.244");
  1003. /* Create and modify the other extend info. */
  1004. memcpy(&mock_ei_ipv6, &mock_ei_ipv4, sizeof(mock_ei_ipv6));
  1005. tor_addr_parse(&mock_ei_ipv6.addr,
  1006. "[1111:2222:3333:4444:5555:6666:7777:8888]");
  1007. /* We don't test the no-nickname and no-IP cases, because they're covered by
  1008. * format_node_description(), and we don't expect to see them in Tor code. */
  1009. /* Try some real IP addresses */
  1010. rv = extend_info_describe(&mock_ei_ipv4);
  1011. tt_str_op(rv, OP_EQ,
  1012. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  1013. "111.222.233.244");
  1014. rv = extend_info_describe(&mock_ei_ipv6);
  1015. tt_str_op(rv, OP_EQ,
  1016. "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR7890123456789 at "
  1017. "[1111:2222:3333:4444:5555:6666:7777:8888]");
  1018. /* Extend infos only have one IP address, so there is no dual case */
  1019. /* test NULL handling */
  1020. rv = extend_info_describe(NULL);
  1021. tt_str_op(rv, OP_EQ, "<null>");
  1022. done:
  1023. return;
  1024. }
  1025. /** router_get_verbose_nickname() should return "Fingerprint~Nickname"
  1026. */
  1027. static void
  1028. test_nodelist_router_get_verbose_nickname(void *arg)
  1029. {
  1030. routerinfo_t mock_ri;
  1031. char mock_nickname[MAX_NICKNAME_LEN+1];
  1032. char vname[MAX_VERBOSE_NICKNAME_LEN+1];
  1033. (void) arg;
  1034. memset(&mock_ri, 0, sizeof(routerinfo_t));
  1035. memset(mock_nickname, 0, sizeof(mock_nickname));
  1036. mock_ri.nickname = mock_nickname;
  1037. /* verbose nickname should use ~ because named is deprecated */
  1038. strlcpy(mock_nickname, "TestOR", sizeof(mock_nickname));
  1039. memcpy(mock_ri.cache_info.identity_digest,
  1040. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
  1041. "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
  1042. DIGEST_LEN);
  1043. router_get_verbose_nickname(vname, &mock_ri);
  1044. tt_str_op(vname, OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR");
  1045. /* test NULL router handling */
  1046. router_get_verbose_nickname(vname, NULL);
  1047. tt_str_op(vname, OP_EQ, "<null>");
  1048. router_get_verbose_nickname(NULL, &mock_ri);
  1049. router_get_verbose_nickname(NULL, NULL);
  1050. done:
  1051. return;
  1052. }
  1053. #define NODE(name, flags) \
  1054. { #name, test_nodelist_##name, (flags), NULL, NULL }
  1055. struct testcase_t nodelist_tests[] = {
  1056. NODE(node_get_verbose_nickname_by_id_null_node, TT_FORK),
  1057. NODE(node_get_verbose_nickname_not_named, TT_FORK),
  1058. NODE(node_is_dir, TT_FORK),
  1059. NODE(ed_id, TT_FORK),
  1060. NODE(nodefamily, TT_FORK),
  1061. NODE(nodefamily_parse_err, TT_FORK),
  1062. NODE(nodefamily_lookup, TT_FORK),
  1063. NODE(nickname_matches, 0),
  1064. NODE(node_nodefamily, TT_FORK),
  1065. NODE(nodefamily_canonicalize, 0),
  1066. NODE(format_node_description, 0),
  1067. NODE(router_describe, 0),
  1068. NODE(node_describe, 0),
  1069. NODE(routerstatus_describe, 0),
  1070. NODE(extend_info_describe, 0),
  1071. NODE(router_get_verbose_nickname, 0),
  1072. END_OF_TESTCASES
  1073. };