test_controller.c 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623
  1. /* Copyright (c) 2015-2017, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #define CONTROL_PRIVATE
  4. #include "or.h"
  5. #include "bridges.h"
  6. #include "control.h"
  7. #include "entrynodes.h"
  8. #include "hs_common.h"
  9. #include "networkstatus.h"
  10. #include "rendservice.h"
  11. #include "routerlist.h"
  12. #include "nodelist.h"
  13. #include "test.h"
  14. #include "test_helpers.h"
  15. static void
  16. test_add_onion_helper_keyarg_v3(void *arg)
  17. {
  18. int ret, hs_version;
  19. add_onion_secret_key_t pk;
  20. char *key_new_blob = NULL;
  21. char *err_msg = NULL;
  22. const char *key_new_alg = NULL;
  23. (void) arg;
  24. memset(&pk, 0, sizeof(pk));
  25. /* Test explicit ED25519-V3 key generation. */
  26. ret = add_onion_helper_keyarg("NEW:ED25519-V3", 0, &key_new_alg,
  27. &key_new_blob, &pk, &hs_version,
  28. &err_msg);
  29. tt_int_op(ret, OP_EQ, 0);
  30. tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE);
  31. tt_assert(pk.v3);
  32. tt_str_op(key_new_alg, OP_EQ, "ED25519-V3");
  33. tt_assert(key_new_blob);
  34. tt_ptr_op(err_msg, OP_EQ, NULL);
  35. tor_free(pk.v3); pk.v3 = NULL;
  36. tor_free(key_new_blob);
  37. /* Test discarding the private key. */
  38. ret = add_onion_helper_keyarg("NEW:ED25519-V3", 1, &key_new_alg,
  39. &key_new_blob, &pk, &hs_version,
  40. &err_msg);
  41. tt_int_op(ret, OP_EQ, 0);
  42. tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE);
  43. tt_assert(pk.v3);
  44. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  45. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  46. tt_ptr_op(err_msg, OP_EQ, NULL);
  47. tor_free(pk.v3); pk.v3 = NULL;
  48. tor_free(key_new_blob);
  49. /* Test passing a key blob. */
  50. {
  51. /* The base64 key and hex key are the same. Hex key is 64 bytes long. The
  52. * sk has been generated randomly using python3. */
  53. const char *base64_sk =
  54. "a9bT19PqGC9Y+BmOo1IQvCGjjwxMiaaxEXZ+FKMxpEQW"
  55. "6AmSV5roThUGMRCaqQSCnR2jI1vL2QxHORzI4RxMmw==";
  56. const char *hex_sk =
  57. "\x6b\xd6\xd3\xd7\xd3\xea\x18\x2f\x58\xf8\x19\x8e\xa3\x52\x10\xbc"
  58. "\x21\xa3\x8f\x0c\x4c\x89\xa6\xb1\x11\x76\x7e\x14\xa3\x31\xa4\x44"
  59. "\x16\xe8\x09\x92\x57\x9a\xe8\x4e\x15\x06\x31\x10\x9a\xa9\x04\x82"
  60. "\x9d\x1d\xa3\x23\x5b\xcb\xd9\x0c\x47\x39\x1c\xc8\xe1\x1c\x4c\x9b";
  61. char *key_blob = NULL;
  62. tor_asprintf(&key_blob, "ED25519-V3:%s", base64_sk);
  63. tt_assert(key_blob);
  64. ret = add_onion_helper_keyarg(key_blob, 1, &key_new_alg,
  65. &key_new_blob, &pk, &hs_version,
  66. &err_msg);
  67. tor_free(key_blob);
  68. tt_int_op(ret, OP_EQ, 0);
  69. tt_int_op(hs_version, OP_EQ, HS_VERSION_THREE);
  70. tt_assert(pk.v3);
  71. tt_mem_op(pk.v3, OP_EQ, hex_sk, 64);
  72. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  73. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  74. tt_ptr_op(err_msg, OP_EQ, NULL);
  75. tor_free(pk.v3); pk.v3 = NULL;
  76. tor_free(key_new_blob);
  77. }
  78. done:
  79. tor_free(pk.v3);
  80. tor_free(key_new_blob);
  81. tor_free(err_msg);
  82. }
  83. static void
  84. test_add_onion_helper_keyarg_v2(void *arg)
  85. {
  86. int ret, hs_version;
  87. add_onion_secret_key_t pk;
  88. crypto_pk_t *pk1 = NULL;
  89. const char *key_new_alg = NULL;
  90. char *key_new_blob = NULL;
  91. char *err_msg = NULL;
  92. char *encoded = NULL;
  93. char *arg_str = NULL;
  94. (void) arg;
  95. memset(&pk, 0, sizeof(pk));
  96. /* Test explicit RSA1024 key generation. */
  97. ret = add_onion_helper_keyarg("NEW:RSA1024", 0, &key_new_alg, &key_new_blob,
  98. &pk, &hs_version, &err_msg);
  99. tt_int_op(ret, OP_EQ, 0);
  100. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  101. tt_assert(pk.v2);
  102. tt_str_op(key_new_alg, OP_EQ, "RSA1024");
  103. tt_assert(key_new_blob);
  104. tt_ptr_op(err_msg, OP_EQ, NULL);
  105. /* Test "BEST" key generation (Assumes BEST = RSA1024). */
  106. crypto_pk_free(pk.v2); pk.v2 = NULL;
  107. tor_free(key_new_blob);
  108. ret = add_onion_helper_keyarg("NEW:BEST", 0, &key_new_alg, &key_new_blob,
  109. &pk, &hs_version, &err_msg);
  110. tt_int_op(ret, OP_EQ, 0);
  111. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  112. tt_assert(pk.v2);
  113. tt_str_op(key_new_alg, OP_EQ, "RSA1024");
  114. tt_assert(key_new_blob);
  115. tt_ptr_op(err_msg, OP_EQ, NULL);
  116. /* Test discarding the private key. */
  117. crypto_pk_free(pk.v2); pk.v2 = NULL;
  118. tor_free(key_new_blob);
  119. ret = add_onion_helper_keyarg("NEW:BEST", 1, &key_new_alg, &key_new_blob,
  120. &pk, &hs_version, &err_msg);
  121. tt_int_op(ret, OP_EQ, 0);
  122. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  123. tt_assert(pk.v2);
  124. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  125. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  126. tt_ptr_op(err_msg, OP_EQ, NULL);
  127. /* Test generating a invalid key type. */
  128. crypto_pk_free(pk.v2); pk.v2 = NULL;
  129. ret = add_onion_helper_keyarg("NEW:RSA512", 0, &key_new_alg, &key_new_blob,
  130. &pk, &hs_version, &err_msg);
  131. tt_int_op(ret, OP_EQ, -1);
  132. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  133. tt_assert(!pk.v2);
  134. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  135. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  136. tt_assert(err_msg);
  137. /* Test loading a RSA1024 key. */
  138. tor_free(err_msg);
  139. pk1 = pk_generate(0);
  140. tt_int_op(0, OP_EQ, crypto_pk_base64_encode(pk1, &encoded));
  141. tor_asprintf(&arg_str, "RSA1024:%s", encoded);
  142. ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  143. &pk, &hs_version, &err_msg);
  144. tt_int_op(ret, OP_EQ, 0);
  145. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  146. tt_assert(pk.v2);
  147. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  148. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  149. tt_ptr_op(err_msg, OP_EQ, NULL);
  150. tt_int_op(crypto_pk_cmp_keys(pk1, pk.v2), OP_EQ, 0);
  151. /* Test loading a invalid key type. */
  152. tor_free(arg_str);
  153. crypto_pk_free(pk1); pk1 = NULL;
  154. crypto_pk_free(pk.v2); pk.v2 = NULL;
  155. tor_asprintf(&arg_str, "RSA512:%s", encoded);
  156. ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  157. &pk, &hs_version, &err_msg);
  158. tt_int_op(ret, OP_EQ, -1);
  159. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  160. tt_assert(!pk.v2);
  161. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  162. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  163. tt_assert(err_msg);
  164. /* Test loading a invalid key. */
  165. tor_free(arg_str);
  166. crypto_pk_free(pk.v2); pk.v2 = NULL;
  167. tor_free(err_msg);
  168. encoded[strlen(encoded)/2] = '\0';
  169. tor_asprintf(&arg_str, "RSA1024:%s", encoded);
  170. ret = add_onion_helper_keyarg(arg_str, 0, &key_new_alg, &key_new_blob,
  171. &pk, &hs_version, &err_msg);
  172. tt_int_op(ret, OP_EQ, -1);
  173. tt_int_op(hs_version, OP_EQ, HS_VERSION_TWO);
  174. tt_assert(!pk.v2);
  175. tt_ptr_op(key_new_alg, OP_EQ, NULL);
  176. tt_ptr_op(key_new_blob, OP_EQ, NULL);
  177. tt_assert(err_msg);
  178. done:
  179. crypto_pk_free(pk1);
  180. crypto_pk_free(pk.v2);
  181. tor_free(key_new_blob);
  182. tor_free(err_msg);
  183. tor_free(encoded);
  184. tor_free(arg_str);
  185. }
  186. static void
  187. test_getinfo_helper_onion(void *arg)
  188. {
  189. (void)arg;
  190. control_connection_t dummy;
  191. /* Get results out */
  192. char *answer = NULL;
  193. const char *errmsg = NULL;
  194. char *service_id = NULL;
  195. int rt = 0;
  196. dummy.ephemeral_onion_services = NULL;
  197. /* successfully get an empty answer */
  198. rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg);
  199. tt_int_op(rt, OP_EQ, 0);
  200. tt_str_op(answer, OP_EQ, "");
  201. tor_free(answer);
  202. /* successfully get an empty answer */
  203. rt = getinfo_helper_onions(&dummy, "onions/detached", &answer, &errmsg);
  204. tt_int_op(rt, OP_EQ, 0);
  205. tt_str_op(answer, OP_EQ, "");
  206. tor_free(answer);
  207. /* get an answer for one onion service */
  208. service_id = tor_strdup("dummy_onion_id");
  209. dummy.ephemeral_onion_services = smartlist_new();
  210. smartlist_add(dummy.ephemeral_onion_services, service_id);
  211. rt = getinfo_helper_onions(&dummy, "onions/current", &answer, &errmsg);
  212. tt_int_op(rt, OP_EQ, 0);
  213. tt_str_op(answer, OP_EQ, "dummy_onion_id");
  214. done:
  215. tor_free(answer);
  216. tor_free(service_id);
  217. smartlist_free(dummy.ephemeral_onion_services);
  218. }
  219. static void
  220. test_rend_service_parse_port_config(void *arg)
  221. {
  222. const char *sep = ",";
  223. rend_service_port_config_t *cfg = NULL;
  224. char *err_msg = NULL;
  225. (void)arg;
  226. /* Test "VIRTPORT" only. */
  227. cfg = rend_service_parse_port_config("80", sep, &err_msg);
  228. tt_assert(cfg);
  229. tt_ptr_op(err_msg, OP_EQ, NULL);
  230. /* Test "VIRTPORT,TARGET" (Target is port). */
  231. rend_service_port_config_free(cfg);
  232. cfg = rend_service_parse_port_config("80,8080", sep, &err_msg);
  233. tt_assert(cfg);
  234. tt_ptr_op(err_msg, OP_EQ, NULL);
  235. /* Test "VIRTPORT,TARGET" (Target is IPv4:port). */
  236. rend_service_port_config_free(cfg);
  237. cfg = rend_service_parse_port_config("80,192.0.2.1:8080", sep, &err_msg);
  238. tt_assert(cfg);
  239. tt_ptr_op(err_msg, OP_EQ, NULL);
  240. /* Test "VIRTPORT,TARGET" (Target is IPv6:port). */
  241. rend_service_port_config_free(cfg);
  242. cfg = rend_service_parse_port_config("80,[2001:db8::1]:8080", sep, &err_msg);
  243. tt_assert(cfg);
  244. tt_ptr_op(err_msg, OP_EQ, NULL);
  245. rend_service_port_config_free(cfg);
  246. cfg = NULL;
  247. /* XXX: Someone should add tests for AF_UNIX targets if supported. */
  248. /* Test empty config. */
  249. rend_service_port_config_free(cfg);
  250. cfg = rend_service_parse_port_config("", sep, &err_msg);
  251. tt_ptr_op(cfg, OP_EQ, NULL);
  252. tt_assert(err_msg);
  253. /* Test invalid port. */
  254. tor_free(err_msg);
  255. cfg = rend_service_parse_port_config("90001", sep, &err_msg);
  256. tt_ptr_op(cfg, OP_EQ, NULL);
  257. tt_assert(err_msg);
  258. tor_free(err_msg);
  259. /* unix port */
  260. cfg = NULL;
  261. /* quoted unix port */
  262. tor_free(err_msg);
  263. cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"",
  264. " ", &err_msg);
  265. tt_assert(cfg);
  266. tt_ptr_op(err_msg, OP_EQ, NULL);
  267. rend_service_port_config_free(cfg);
  268. cfg = NULL;
  269. /* quoted unix port */
  270. tor_free(err_msg);
  271. cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar\"",
  272. " ", &err_msg);
  273. tt_assert(cfg);
  274. tt_ptr_op(err_msg, OP_EQ, NULL);
  275. rend_service_port_config_free(cfg);
  276. cfg = NULL;
  277. /* quoted unix port, missing end quote */
  278. cfg = rend_service_parse_port_config("100 unix:\"/tmp/foo bar",
  279. " ", &err_msg);
  280. tt_ptr_op(cfg, OP_EQ, NULL);
  281. tt_str_op(err_msg, OP_EQ, "Couldn't process address <unix:\"/tmp/foo bar> "
  282. "from hidden service configuration");
  283. tor_free(err_msg);
  284. /* bogus IP address */
  285. MOCK(tor_addr_lookup, mock_tor_addr_lookup__fail_on_bad_addrs);
  286. cfg = rend_service_parse_port_config("100 foo!!.example.com:9000",
  287. " ", &err_msg);
  288. UNMOCK(tor_addr_lookup);
  289. tt_ptr_op(cfg, OP_EQ, NULL);
  290. tt_str_op(err_msg, OP_EQ, "Unparseable address in hidden service port "
  291. "configuration.");
  292. tor_free(err_msg);
  293. /* bogus port port */
  294. cfg = rend_service_parse_port_config("100 99999",
  295. " ", &err_msg);
  296. tt_ptr_op(cfg, OP_EQ, NULL);
  297. tt_str_op(err_msg, OP_EQ, "Unparseable or out-of-range port \"99999\" "
  298. "in hidden service port configuration.");
  299. tor_free(err_msg);
  300. done:
  301. rend_service_port_config_free(cfg);
  302. tor_free(err_msg);
  303. }
  304. static void
  305. test_add_onion_helper_clientauth(void *arg)
  306. {
  307. rend_authorized_client_t *client = NULL;
  308. char *err_msg = NULL;
  309. int created = 0;
  310. (void)arg;
  311. /* Test "ClientName" only. */
  312. client = add_onion_helper_clientauth("alice", &created, &err_msg);
  313. tt_assert(client);
  314. tt_assert(created);
  315. tt_ptr_op(err_msg, OP_EQ, NULL);
  316. rend_authorized_client_free(client);
  317. /* Test "ClientName:Blob" */
  318. client = add_onion_helper_clientauth("alice:475hGBHPlq7Mc0cRZitK/B",
  319. &created, &err_msg);
  320. tt_assert(client);
  321. tt_assert(!created);
  322. tt_ptr_op(err_msg, OP_EQ, NULL);
  323. rend_authorized_client_free(client);
  324. /* Test invalid client names */
  325. client = add_onion_helper_clientauth("no*asterisks*allowed", &created,
  326. &err_msg);
  327. tt_ptr_op(client, OP_EQ, NULL);
  328. tt_assert(err_msg);
  329. tor_free(err_msg);
  330. /* Test invalid auth cookie */
  331. client = add_onion_helper_clientauth("alice:12345", &created, &err_msg);
  332. tt_ptr_op(client, OP_EQ, NULL);
  333. tt_assert(err_msg);
  334. tor_free(err_msg);
  335. /* Test invalid syntax */
  336. client = add_onion_helper_clientauth(":475hGBHPlq7Mc0cRZitK/B", &created,
  337. &err_msg);
  338. tt_ptr_op(client, OP_EQ, NULL);
  339. tt_assert(err_msg);
  340. tor_free(err_msg);
  341. done:
  342. rend_authorized_client_free(client);
  343. tor_free(err_msg);
  344. }
  345. /* Mocks and data/variables used for GETINFO download status tests */
  346. static const download_status_t dl_status_default =
  347. { 0, 0, 0, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER,
  348. DL_SCHED_INCREMENT_FAILURE, 0, 0 };
  349. static download_status_t ns_dl_status[N_CONSENSUS_FLAVORS];
  350. static download_status_t ns_dl_status_bootstrap[N_CONSENSUS_FLAVORS];
  351. static download_status_t ns_dl_status_running[N_CONSENSUS_FLAVORS];
  352. /*
  353. * These should explore all the possible cases of download_status_to_string()
  354. * in control.c
  355. */
  356. static const download_status_t dls_sample_1 =
  357. { 1467163900, 0, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER,
  358. DL_SCHED_INCREMENT_FAILURE, 0, 0 };
  359. static const char * dls_sample_1_str =
  360. "next-attempt-at 2016-06-29 01:31:40\n"
  361. "n-download-failures 0\n"
  362. "n-download-attempts 0\n"
  363. "schedule DL_SCHED_GENERIC\n"
  364. "want-authority DL_WANT_ANY_DIRSERVER\n"
  365. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  366. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  367. "last-backoff-position 0\n"
  368. "last-delay-used 0\n";
  369. static const download_status_t dls_sample_2 =
  370. { 1467164400, 1, 2, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY,
  371. DL_SCHED_INCREMENT_FAILURE, 0, 0 };
  372. static const char * dls_sample_2_str =
  373. "next-attempt-at 2016-06-29 01:40:00\n"
  374. "n-download-failures 1\n"
  375. "n-download-attempts 2\n"
  376. "schedule DL_SCHED_CONSENSUS\n"
  377. "want-authority DL_WANT_AUTHORITY\n"
  378. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  379. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  380. "last-backoff-position 0\n"
  381. "last-delay-used 0\n";
  382. static const download_status_t dls_sample_3 =
  383. { 1467154400, 12, 25, DL_SCHED_BRIDGE, DL_WANT_ANY_DIRSERVER,
  384. DL_SCHED_INCREMENT_ATTEMPT, 0, 0 };
  385. static const char * dls_sample_3_str =
  386. "next-attempt-at 2016-06-28 22:53:20\n"
  387. "n-download-failures 12\n"
  388. "n-download-attempts 25\n"
  389. "schedule DL_SCHED_BRIDGE\n"
  390. "want-authority DL_WANT_ANY_DIRSERVER\n"
  391. "increment-on DL_SCHED_INCREMENT_ATTEMPT\n"
  392. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  393. "last-backoff-position 0\n"
  394. "last-delay-used 0\n";
  395. static const download_status_t dls_sample_4 =
  396. { 1467166600, 3, 0, DL_SCHED_GENERIC, DL_WANT_ANY_DIRSERVER,
  397. DL_SCHED_INCREMENT_FAILURE, 0, 0 };
  398. static const char * dls_sample_4_str =
  399. "next-attempt-at 2016-06-29 02:16:40\n"
  400. "n-download-failures 3\n"
  401. "n-download-attempts 0\n"
  402. "schedule DL_SCHED_GENERIC\n"
  403. "want-authority DL_WANT_ANY_DIRSERVER\n"
  404. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  405. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  406. "last-backoff-position 0\n"
  407. "last-delay-used 0\n";
  408. static const download_status_t dls_sample_5 =
  409. { 1467164600, 3, 7, DL_SCHED_CONSENSUS, DL_WANT_ANY_DIRSERVER,
  410. DL_SCHED_INCREMENT_FAILURE, 1, 2112, };
  411. static const char * dls_sample_5_str =
  412. "next-attempt-at 2016-06-29 01:43:20\n"
  413. "n-download-failures 3\n"
  414. "n-download-attempts 7\n"
  415. "schedule DL_SCHED_CONSENSUS\n"
  416. "want-authority DL_WANT_ANY_DIRSERVER\n"
  417. "increment-on DL_SCHED_INCREMENT_FAILURE\n"
  418. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  419. "last-backoff-position 1\n"
  420. "last-delay-used 2112\n";
  421. static const download_status_t dls_sample_6 =
  422. { 1467164200, 4, 9, DL_SCHED_CONSENSUS, DL_WANT_AUTHORITY,
  423. DL_SCHED_INCREMENT_ATTEMPT, 3, 432 };
  424. static const char * dls_sample_6_str =
  425. "next-attempt-at 2016-06-29 01:36:40\n"
  426. "n-download-failures 4\n"
  427. "n-download-attempts 9\n"
  428. "schedule DL_SCHED_CONSENSUS\n"
  429. "want-authority DL_WANT_AUTHORITY\n"
  430. "increment-on DL_SCHED_INCREMENT_ATTEMPT\n"
  431. "backoff DL_SCHED_RANDOM_EXPONENTIAL\n"
  432. "last-backoff-position 3\n"
  433. "last-delay-used 432\n";
  434. /* Simulated auth certs */
  435. static const char *auth_id_digest_1_str =
  436. "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061";
  437. static download_status_t auth_def_cert_download_status_1;
  438. static const char *auth_id_digest_2_str =
  439. "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99";
  440. static download_status_t auth_def_cert_download_status_2;
  441. /* Expected form of digest list returned for GETINFO downloads/cert/fps */
  442. static const char *auth_id_digest_expected_list =
  443. "63CDD326DFEF0CA020BDD3FEB45A3286FE13A061\n"
  444. "2C209FCDD8D48DC049777B8DC2C0F94A0408BE99\n";
  445. /* Signing keys for simulated auth 1 */
  446. static const char *auth_1_sk_1_str =
  447. "AA69566029B1F023BA09451B8F1B10952384EB58";
  448. static download_status_t auth_1_sk_1_dls;
  449. static const char *auth_1_sk_2_str =
  450. "710865C7F06B73C5292695A8C34F1C94F769FF72";
  451. static download_status_t auth_1_sk_2_dls;
  452. /*
  453. * Expected form of sk digest list for
  454. * GETINFO downloads/cert/<auth_id_digest_1_str>/sks
  455. */
  456. static const char *auth_1_sk_digest_expected_list =
  457. "AA69566029B1F023BA09451B8F1B10952384EB58\n"
  458. "710865C7F06B73C5292695A8C34F1C94F769FF72\n";
  459. /* Signing keys for simulated auth 2 */
  460. static const char *auth_2_sk_1_str =
  461. "4299047E00D070AD6703FE00BE7AA756DB061E62";
  462. static download_status_t auth_2_sk_1_dls;
  463. static const char *auth_2_sk_2_str =
  464. "9451B8F1B10952384EB58B5F230C0BB701626C9B";
  465. static download_status_t auth_2_sk_2_dls;
  466. /*
  467. * Expected form of sk digest list for
  468. * GETINFO downloads/cert/<auth_id_digest_2_str>/sks
  469. */
  470. static const char *auth_2_sk_digest_expected_list =
  471. "4299047E00D070AD6703FE00BE7AA756DB061E62\n"
  472. "9451B8F1B10952384EB58B5F230C0BB701626C9B\n";
  473. /* Simulated router descriptor digests or bridge identity digests */
  474. static const char *descbr_digest_1_str =
  475. "616408544C7345822696074A1A3DFA16AB381CBD";
  476. static download_status_t descbr_digest_1_dl;
  477. static const char *descbr_digest_2_str =
  478. "06E8067246967265DBCB6641631B530EFEC12DC3";
  479. static download_status_t descbr_digest_2_dl;
  480. /* Expected form of digest list returned for GETINFO downloads/desc/descs */
  481. static const char *descbr_expected_list =
  482. "616408544C7345822696074A1A3DFA16AB381CBD\n"
  483. "06E8067246967265DBCB6641631B530EFEC12DC3\n";
  484. /*
  485. * Flag to make all descbr queries fail, to simulate not being
  486. * configured such that such queries make sense.
  487. */
  488. static int disable_descbr = 0;
  489. static void
  490. reset_mocked_dl_statuses(void)
  491. {
  492. int i;
  493. for (i = 0; i < N_CONSENSUS_FLAVORS; ++i) {
  494. memcpy(&(ns_dl_status[i]), &dl_status_default,
  495. sizeof(download_status_t));
  496. memcpy(&(ns_dl_status_bootstrap[i]), &dl_status_default,
  497. sizeof(download_status_t));
  498. memcpy(&(ns_dl_status_running[i]), &dl_status_default,
  499. sizeof(download_status_t));
  500. }
  501. memcpy(&auth_def_cert_download_status_1, &dl_status_default,
  502. sizeof(download_status_t));
  503. memcpy(&auth_def_cert_download_status_2, &dl_status_default,
  504. sizeof(download_status_t));
  505. memcpy(&auth_1_sk_1_dls, &dl_status_default,
  506. sizeof(download_status_t));
  507. memcpy(&auth_1_sk_2_dls, &dl_status_default,
  508. sizeof(download_status_t));
  509. memcpy(&auth_2_sk_1_dls, &dl_status_default,
  510. sizeof(download_status_t));
  511. memcpy(&auth_2_sk_2_dls, &dl_status_default,
  512. sizeof(download_status_t));
  513. memcpy(&descbr_digest_1_dl, &dl_status_default,
  514. sizeof(download_status_t));
  515. memcpy(&descbr_digest_2_dl, &dl_status_default,
  516. sizeof(download_status_t));
  517. }
  518. static download_status_t *
  519. ns_dl_status_mock(consensus_flavor_t flavor)
  520. {
  521. return &(ns_dl_status[flavor]);
  522. }
  523. static download_status_t *
  524. ns_dl_status_bootstrap_mock(consensus_flavor_t flavor)
  525. {
  526. return &(ns_dl_status_bootstrap[flavor]);
  527. }
  528. static download_status_t *
  529. ns_dl_status_running_mock(consensus_flavor_t flavor)
  530. {
  531. return &(ns_dl_status_running[flavor]);
  532. }
  533. static void
  534. setup_ns_mocks(void)
  535. {
  536. MOCK(networkstatus_get_dl_status_by_flavor, ns_dl_status_mock);
  537. MOCK(networkstatus_get_dl_status_by_flavor_bootstrap,
  538. ns_dl_status_bootstrap_mock);
  539. MOCK(networkstatus_get_dl_status_by_flavor_running,
  540. ns_dl_status_running_mock);
  541. reset_mocked_dl_statuses();
  542. }
  543. static void
  544. clear_ns_mocks(void)
  545. {
  546. UNMOCK(networkstatus_get_dl_status_by_flavor);
  547. UNMOCK(networkstatus_get_dl_status_by_flavor_bootstrap);
  548. UNMOCK(networkstatus_get_dl_status_by_flavor_running);
  549. }
  550. static smartlist_t *
  551. cert_dl_status_auth_ids_mock(void)
  552. {
  553. char digest[DIGEST_LEN], *tmp;
  554. int len;
  555. smartlist_t *list = NULL;
  556. /* Just pretend we have only the two hard-coded digests listed above */
  557. list = smartlist_new();
  558. len = base16_decode(digest, DIGEST_LEN,
  559. auth_id_digest_1_str, strlen(auth_id_digest_1_str));
  560. tt_int_op(len, OP_EQ, DIGEST_LEN);
  561. tmp = tor_malloc(DIGEST_LEN);
  562. memcpy(tmp, digest, DIGEST_LEN);
  563. smartlist_add(list, tmp);
  564. len = base16_decode(digest, DIGEST_LEN,
  565. auth_id_digest_2_str, strlen(auth_id_digest_2_str));
  566. tt_int_op(len, OP_EQ, DIGEST_LEN);
  567. tmp = tor_malloc(DIGEST_LEN);
  568. memcpy(tmp, digest, DIGEST_LEN);
  569. smartlist_add(list, tmp);
  570. done:
  571. return list;
  572. }
  573. static download_status_t *
  574. cert_dl_status_def_for_auth_mock(const char *digest)
  575. {
  576. download_status_t *dl = NULL;
  577. char digest_str[HEX_DIGEST_LEN+1];
  578. tt_ptr_op(digest, OP_NE, NULL);
  579. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  580. digest, DIGEST_LEN);
  581. digest_str[HEX_DIGEST_LEN] = '\0';
  582. if (strcmp(digest_str, auth_id_digest_1_str) == 0) {
  583. dl = &auth_def_cert_download_status_1;
  584. } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) {
  585. dl = &auth_def_cert_download_status_2;
  586. }
  587. done:
  588. return dl;
  589. }
  590. static smartlist_t *
  591. cert_dl_status_sks_for_auth_id_mock(const char *digest)
  592. {
  593. smartlist_t *list = NULL;
  594. char sk[DIGEST_LEN];
  595. char digest_str[HEX_DIGEST_LEN+1];
  596. char *tmp;
  597. int len;
  598. tt_ptr_op(digest, OP_NE, NULL);
  599. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  600. digest, DIGEST_LEN);
  601. digest_str[HEX_DIGEST_LEN] = '\0';
  602. /*
  603. * Build a list of two hard-coded digests, depending on what we
  604. * were just passed.
  605. */
  606. if (strcmp(digest_str, auth_id_digest_1_str) == 0) {
  607. list = smartlist_new();
  608. len = base16_decode(sk, DIGEST_LEN,
  609. auth_1_sk_1_str, strlen(auth_1_sk_1_str));
  610. tt_int_op(len, OP_EQ, DIGEST_LEN);
  611. tmp = tor_malloc(DIGEST_LEN);
  612. memcpy(tmp, sk, DIGEST_LEN);
  613. smartlist_add(list, tmp);
  614. len = base16_decode(sk, DIGEST_LEN,
  615. auth_1_sk_2_str, strlen(auth_1_sk_2_str));
  616. tt_int_op(len, OP_EQ, DIGEST_LEN);
  617. tmp = tor_malloc(DIGEST_LEN);
  618. memcpy(tmp, sk, DIGEST_LEN);
  619. smartlist_add(list, tmp);
  620. } else if (strcmp(digest_str, auth_id_digest_2_str) == 0) {
  621. list = smartlist_new();
  622. len = base16_decode(sk, DIGEST_LEN,
  623. auth_2_sk_1_str, strlen(auth_2_sk_1_str));
  624. tt_int_op(len, OP_EQ, DIGEST_LEN);
  625. tmp = tor_malloc(DIGEST_LEN);
  626. memcpy(tmp, sk, DIGEST_LEN);
  627. smartlist_add(list, tmp);
  628. len = base16_decode(sk, DIGEST_LEN,
  629. auth_2_sk_2_str, strlen(auth_2_sk_2_str));
  630. tt_int_op(len, OP_EQ, DIGEST_LEN);
  631. tmp = tor_malloc(DIGEST_LEN);
  632. memcpy(tmp, sk, DIGEST_LEN);
  633. smartlist_add(list, tmp);
  634. }
  635. done:
  636. return list;
  637. }
  638. static download_status_t *
  639. cert_dl_status_fp_sk_mock(const char *fp_digest, const char *sk_digest)
  640. {
  641. download_status_t *dl = NULL;
  642. char fp_digest_str[HEX_DIGEST_LEN+1], sk_digest_str[HEX_DIGEST_LEN+1];
  643. /*
  644. * Unpack the digests so we can compare them and figure out which
  645. * dl status we want.
  646. */
  647. tt_ptr_op(fp_digest, OP_NE, NULL);
  648. base16_encode(fp_digest_str, HEX_DIGEST_LEN + 1,
  649. fp_digest, DIGEST_LEN);
  650. fp_digest_str[HEX_DIGEST_LEN] = '\0';
  651. tt_ptr_op(sk_digest, OP_NE, NULL);
  652. base16_encode(sk_digest_str, HEX_DIGEST_LEN + 1,
  653. sk_digest, DIGEST_LEN);
  654. sk_digest_str[HEX_DIGEST_LEN] = '\0';
  655. if (strcmp(fp_digest_str, auth_id_digest_1_str) == 0) {
  656. if (strcmp(sk_digest_str, auth_1_sk_1_str) == 0) {
  657. dl = &auth_1_sk_1_dls;
  658. } else if (strcmp(sk_digest_str, auth_1_sk_2_str) == 0) {
  659. dl = &auth_1_sk_2_dls;
  660. }
  661. } else if (strcmp(fp_digest_str, auth_id_digest_2_str) == 0) {
  662. if (strcmp(sk_digest_str, auth_2_sk_1_str) == 0) {
  663. dl = &auth_2_sk_1_dls;
  664. } else if (strcmp(sk_digest_str, auth_2_sk_2_str) == 0) {
  665. dl = &auth_2_sk_2_dls;
  666. }
  667. }
  668. done:
  669. return dl;
  670. }
  671. static void
  672. setup_cert_mocks(void)
  673. {
  674. MOCK(list_authority_ids_with_downloads, cert_dl_status_auth_ids_mock);
  675. MOCK(id_only_download_status_for_authority_id,
  676. cert_dl_status_def_for_auth_mock);
  677. MOCK(list_sk_digests_for_authority_id,
  678. cert_dl_status_sks_for_auth_id_mock);
  679. MOCK(download_status_for_authority_id_and_sk,
  680. cert_dl_status_fp_sk_mock);
  681. reset_mocked_dl_statuses();
  682. }
  683. static void
  684. clear_cert_mocks(void)
  685. {
  686. UNMOCK(list_authority_ids_with_downloads);
  687. UNMOCK(id_only_download_status_for_authority_id);
  688. UNMOCK(list_sk_digests_for_authority_id);
  689. UNMOCK(download_status_for_authority_id_and_sk);
  690. }
  691. static smartlist_t *
  692. descbr_get_digests_mock(void)
  693. {
  694. char digest[DIGEST_LEN], *tmp;
  695. int len;
  696. smartlist_t *list = NULL;
  697. if (!disable_descbr) {
  698. /* Just pretend we have only the two hard-coded digests listed above */
  699. list = smartlist_new();
  700. len = base16_decode(digest, DIGEST_LEN,
  701. descbr_digest_1_str, strlen(descbr_digest_1_str));
  702. tt_int_op(len, OP_EQ, DIGEST_LEN);
  703. tmp = tor_malloc(DIGEST_LEN);
  704. memcpy(tmp, digest, DIGEST_LEN);
  705. smartlist_add(list, tmp);
  706. len = base16_decode(digest, DIGEST_LEN,
  707. descbr_digest_2_str, strlen(descbr_digest_2_str));
  708. tt_int_op(len, OP_EQ, DIGEST_LEN);
  709. tmp = tor_malloc(DIGEST_LEN);
  710. memcpy(tmp, digest, DIGEST_LEN);
  711. smartlist_add(list, tmp);
  712. }
  713. done:
  714. return list;
  715. }
  716. static download_status_t *
  717. descbr_get_dl_by_digest_mock(const char *digest)
  718. {
  719. download_status_t *dl = NULL;
  720. char digest_str[HEX_DIGEST_LEN+1];
  721. if (!disable_descbr) {
  722. tt_ptr_op(digest, OP_NE, NULL);
  723. base16_encode(digest_str, HEX_DIGEST_LEN + 1,
  724. digest, DIGEST_LEN);
  725. digest_str[HEX_DIGEST_LEN] = '\0';
  726. if (strcmp(digest_str, descbr_digest_1_str) == 0) {
  727. dl = &descbr_digest_1_dl;
  728. } else if (strcmp(digest_str, descbr_digest_2_str) == 0) {
  729. dl = &descbr_digest_2_dl;
  730. }
  731. }
  732. done:
  733. return dl;
  734. }
  735. static void
  736. setup_desc_mocks(void)
  737. {
  738. MOCK(router_get_descriptor_digests,
  739. descbr_get_digests_mock);
  740. MOCK(router_get_dl_status_by_descriptor_digest,
  741. descbr_get_dl_by_digest_mock);
  742. reset_mocked_dl_statuses();
  743. }
  744. static void
  745. clear_desc_mocks(void)
  746. {
  747. UNMOCK(router_get_descriptor_digests);
  748. UNMOCK(router_get_dl_status_by_descriptor_digest);
  749. }
  750. static void
  751. setup_bridge_mocks(void)
  752. {
  753. disable_descbr = 0;
  754. MOCK(list_bridge_identities,
  755. descbr_get_digests_mock);
  756. MOCK(get_bridge_dl_status_by_id,
  757. descbr_get_dl_by_digest_mock);
  758. reset_mocked_dl_statuses();
  759. }
  760. static void
  761. clear_bridge_mocks(void)
  762. {
  763. UNMOCK(list_bridge_identities);
  764. UNMOCK(get_bridge_dl_status_by_id);
  765. disable_descbr = 0;
  766. }
  767. static void
  768. test_download_status_consensus(void *arg)
  769. {
  770. /* We just need one of these to pass, it doesn't matter what's in it */
  771. control_connection_t dummy;
  772. /* Get results out */
  773. char *answer = NULL;
  774. const char *errmsg = NULL;
  775. (void)arg;
  776. /* Check that the unknown prefix case works; no mocks needed yet */
  777. getinfo_helper_downloads(&dummy, "downloads/foo", &answer, &errmsg);
  778. tt_ptr_op(answer, OP_EQ, NULL);
  779. tt_str_op(errmsg, OP_EQ, "Unknown download status query");
  780. setup_ns_mocks();
  781. /*
  782. * Check returning serialized dlstatuses, and implicitly also test
  783. * download_status_to_string().
  784. */
  785. /* Case 1 default/FLAV_NS*/
  786. memcpy(&(ns_dl_status[FLAV_NS]), &dls_sample_1,
  787. sizeof(download_status_t));
  788. getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns",
  789. &answer, &errmsg);
  790. tt_ptr_op(answer, OP_NE, NULL);
  791. tt_ptr_op(errmsg, OP_EQ, NULL);
  792. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  793. tor_free(answer);
  794. errmsg = NULL;
  795. /* Case 2 default/FLAV_MICRODESC */
  796. memcpy(&(ns_dl_status[FLAV_MICRODESC]), &dls_sample_2,
  797. sizeof(download_status_t));
  798. getinfo_helper_downloads(&dummy, "downloads/networkstatus/microdesc",
  799. &answer, &errmsg);
  800. tt_ptr_op(answer, OP_NE, NULL);
  801. tt_ptr_op(errmsg, OP_EQ, NULL);
  802. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  803. tor_free(answer);
  804. errmsg = NULL;
  805. /* Case 3 bootstrap/FLAV_NS */
  806. memcpy(&(ns_dl_status_bootstrap[FLAV_NS]), &dls_sample_3,
  807. sizeof(download_status_t));
  808. getinfo_helper_downloads(&dummy, "downloads/networkstatus/ns/bootstrap",
  809. &answer, &errmsg);
  810. tt_ptr_op(answer, OP_NE, NULL);
  811. tt_ptr_op(errmsg, OP_EQ, NULL);
  812. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  813. tor_free(answer);
  814. errmsg = NULL;
  815. /* Case 4 bootstrap/FLAV_MICRODESC */
  816. memcpy(&(ns_dl_status_bootstrap[FLAV_MICRODESC]), &dls_sample_4,
  817. sizeof(download_status_t));
  818. getinfo_helper_downloads(&dummy,
  819. "downloads/networkstatus/microdesc/bootstrap",
  820. &answer, &errmsg);
  821. tt_ptr_op(answer, OP_NE, NULL);
  822. tt_ptr_op(errmsg, OP_EQ, NULL);
  823. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  824. tor_free(answer);
  825. errmsg = NULL;
  826. /* Case 5 running/FLAV_NS */
  827. memcpy(&(ns_dl_status_running[FLAV_NS]), &dls_sample_5,
  828. sizeof(download_status_t));
  829. getinfo_helper_downloads(&dummy,
  830. "downloads/networkstatus/ns/running",
  831. &answer, &errmsg);
  832. tt_ptr_op(answer, OP_NE, NULL);
  833. tt_ptr_op(errmsg, OP_EQ, NULL);
  834. tt_str_op(answer, OP_EQ, dls_sample_5_str);
  835. tor_free(answer);
  836. errmsg = NULL;
  837. /* Case 6 running/FLAV_MICRODESC */
  838. memcpy(&(ns_dl_status_running[FLAV_MICRODESC]), &dls_sample_6,
  839. sizeof(download_status_t));
  840. getinfo_helper_downloads(&dummy,
  841. "downloads/networkstatus/microdesc/running",
  842. &answer, &errmsg);
  843. tt_ptr_op(answer, OP_NE, NULL);
  844. tt_ptr_op(errmsg, OP_EQ, NULL);
  845. tt_str_op(answer, OP_EQ, dls_sample_6_str);
  846. tor_free(answer);
  847. errmsg = NULL;
  848. /* Now check the error case */
  849. getinfo_helper_downloads(&dummy, "downloads/networkstatus/foo",
  850. &answer, &errmsg);
  851. tt_ptr_op(answer, OP_EQ, NULL);
  852. tt_ptr_op(errmsg, OP_NE, NULL);
  853. tt_str_op(errmsg, OP_EQ, "Unknown flavor");
  854. errmsg = NULL;
  855. done:
  856. clear_ns_mocks();
  857. tor_free(answer);
  858. return;
  859. }
  860. static void
  861. test_download_status_cert(void *arg)
  862. {
  863. /* We just need one of these to pass, it doesn't matter what's in it */
  864. control_connection_t dummy;
  865. /* Get results out */
  866. char *question = NULL;
  867. char *answer = NULL;
  868. const char *errmsg = NULL;
  869. (void)arg;
  870. setup_cert_mocks();
  871. /*
  872. * Check returning serialized dlstatuses and digest lists, and implicitly
  873. * also test download_status_to_string() and digest_list_to_string().
  874. */
  875. /* Case 1 - list of authority identity fingerprints */
  876. getinfo_helper_downloads(&dummy,
  877. "downloads/cert/fps",
  878. &answer, &errmsg);
  879. tt_ptr_op(answer, OP_NE, NULL);
  880. tt_ptr_op(errmsg, OP_EQ, NULL);
  881. tt_str_op(answer, OP_EQ, auth_id_digest_expected_list);
  882. tor_free(answer);
  883. errmsg = NULL;
  884. /* Case 2 - download status for default cert for 1st auth id */
  885. memcpy(&auth_def_cert_download_status_1, &dls_sample_1,
  886. sizeof(download_status_t));
  887. tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_1_str);
  888. tt_ptr_op(question, OP_NE, NULL);
  889. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  890. tt_ptr_op(answer, OP_NE, NULL);
  891. tt_ptr_op(errmsg, OP_EQ, NULL);
  892. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  893. tor_free(question);
  894. tor_free(answer);
  895. errmsg = NULL;
  896. /* Case 3 - download status for default cert for 2nd auth id */
  897. memcpy(&auth_def_cert_download_status_2, &dls_sample_2,
  898. sizeof(download_status_t));
  899. tor_asprintf(&question, "downloads/cert/fp/%s", auth_id_digest_2_str);
  900. tt_ptr_op(question, OP_NE, NULL);
  901. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  902. tt_ptr_op(answer, OP_NE, NULL);
  903. tt_ptr_op(errmsg, OP_EQ, NULL);
  904. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  905. tor_free(question);
  906. tor_free(answer);
  907. errmsg = NULL;
  908. /* Case 4 - list of signing key digests for 1st auth id */
  909. tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_1_str);
  910. tt_ptr_op(question, OP_NE, NULL);
  911. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  912. tt_ptr_op(answer, OP_NE, NULL);
  913. tt_ptr_op(errmsg, OP_EQ, NULL);
  914. tt_str_op(answer, OP_EQ, auth_1_sk_digest_expected_list);
  915. tor_free(question);
  916. tor_free(answer);
  917. errmsg = NULL;
  918. /* Case 5 - list of signing key digests for 2nd auth id */
  919. tor_asprintf(&question, "downloads/cert/fp/%s/sks", auth_id_digest_2_str);
  920. tt_ptr_op(question, OP_NE, NULL);
  921. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  922. tt_ptr_op(answer, OP_NE, NULL);
  923. tt_ptr_op(errmsg, OP_EQ, NULL);
  924. tt_str_op(answer, OP_EQ, auth_2_sk_digest_expected_list);
  925. tor_free(question);
  926. tor_free(answer);
  927. errmsg = NULL;
  928. /* Case 6 - download status for 1st auth id, 1st sk */
  929. memcpy(&auth_1_sk_1_dls, &dls_sample_3,
  930. sizeof(download_status_t));
  931. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  932. auth_id_digest_1_str, auth_1_sk_1_str);
  933. tt_ptr_op(question, OP_NE, NULL);
  934. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  935. tt_ptr_op(answer, OP_NE, NULL);
  936. tt_ptr_op(errmsg, OP_EQ, NULL);
  937. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  938. tor_free(question);
  939. tor_free(answer);
  940. errmsg = NULL;
  941. /* Case 7 - download status for 1st auth id, 2nd sk */
  942. memcpy(&auth_1_sk_2_dls, &dls_sample_4,
  943. sizeof(download_status_t));
  944. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  945. auth_id_digest_1_str, auth_1_sk_2_str);
  946. tt_ptr_op(question, OP_NE, NULL);
  947. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  948. tt_ptr_op(answer, OP_NE, NULL);
  949. tt_ptr_op(errmsg, OP_EQ, NULL);
  950. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  951. tor_free(question);
  952. tor_free(answer);
  953. errmsg = NULL;
  954. /* Case 8 - download status for 2nd auth id, 1st sk */
  955. memcpy(&auth_2_sk_1_dls, &dls_sample_5,
  956. sizeof(download_status_t));
  957. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  958. auth_id_digest_2_str, auth_2_sk_1_str);
  959. tt_ptr_op(question, OP_NE, NULL);
  960. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  961. tt_ptr_op(answer, OP_NE, NULL);
  962. tt_ptr_op(errmsg, OP_EQ, NULL);
  963. tt_str_op(answer, OP_EQ, dls_sample_5_str);
  964. tor_free(question);
  965. tor_free(answer);
  966. errmsg = NULL;
  967. /* Case 9 - download status for 2nd auth id, 2nd sk */
  968. memcpy(&auth_2_sk_2_dls, &dls_sample_6,
  969. sizeof(download_status_t));
  970. tor_asprintf(&question, "downloads/cert/fp/%s/%s",
  971. auth_id_digest_2_str, auth_2_sk_2_str);
  972. tt_ptr_op(question, OP_NE, NULL);
  973. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  974. tt_ptr_op(answer, OP_NE, NULL);
  975. tt_ptr_op(errmsg, OP_EQ, NULL);
  976. tt_str_op(answer, OP_EQ, dls_sample_6_str);
  977. tor_free(question);
  978. tor_free(answer);
  979. errmsg = NULL;
  980. /* Now check the error cases */
  981. /* Case 1 - query is garbage after downloads/cert/ part */
  982. getinfo_helper_downloads(&dummy, "downloads/cert/blahdeblah",
  983. &answer, &errmsg);
  984. tt_ptr_op(answer, OP_EQ, NULL);
  985. tt_ptr_op(errmsg, OP_NE, NULL);
  986. tt_str_op(errmsg, OP_EQ, "Unknown certificate download status query");
  987. errmsg = NULL;
  988. /*
  989. * Case 2 - looks like downloads/cert/fp/<fp>, but <fp> isn't even
  990. * the right length for a digest.
  991. */
  992. getinfo_helper_downloads(&dummy, "downloads/cert/fp/2B1D36D32B2942406",
  993. &answer, &errmsg);
  994. tt_ptr_op(answer, OP_EQ, NULL);
  995. tt_ptr_op(errmsg, OP_NE, NULL);
  996. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  997. errmsg = NULL;
  998. /*
  999. * Case 3 - looks like downloads/cert/fp/<fp>, and <fp> is digest-sized,
  1000. * but not parseable as one.
  1001. */
  1002. getinfo_helper_downloads(&dummy,
  1003. "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1",
  1004. &answer, &errmsg);
  1005. tt_ptr_op(answer, OP_EQ, NULL);
  1006. tt_ptr_op(errmsg, OP_NE, NULL);
  1007. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1008. errmsg = NULL;
  1009. /*
  1010. * Case 4 - downloads/cert/fp/<fp>, and <fp> is not a known authority
  1011. * identity digest
  1012. */
  1013. getinfo_helper_downloads(&dummy,
  1014. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61",
  1015. &answer, &errmsg);
  1016. tt_ptr_op(answer, OP_EQ, NULL);
  1017. tt_ptr_op(errmsg, OP_NE, NULL);
  1018. tt_str_op(errmsg, OP_EQ,
  1019. "Failed to get download status for this authority identity digest");
  1020. errmsg = NULL;
  1021. /*
  1022. * Case 5 - looks like downloads/cert/fp/<fp>/<anything>, but <fp> doesn't
  1023. * parse as a sensible digest.
  1024. */
  1025. getinfo_helper_downloads(&dummy,
  1026. "downloads/cert/fp/82F52AF55D250115FE44D3GC81D49643241D56A1/blah",
  1027. &answer, &errmsg);
  1028. tt_ptr_op(answer, OP_EQ, NULL);
  1029. tt_ptr_op(errmsg, OP_NE, NULL);
  1030. tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest");
  1031. errmsg = NULL;
  1032. /*
  1033. * Case 6 - looks like downloads/cert/fp/<fp>/<anything>, but <fp> doesn't
  1034. * parse as a sensible digest.
  1035. */
  1036. getinfo_helper_downloads(&dummy,
  1037. "downloads/cert/fp/82F52AF55D25/blah",
  1038. &answer, &errmsg);
  1039. tt_ptr_op(answer, OP_EQ, NULL);
  1040. tt_ptr_op(errmsg, OP_NE, NULL);
  1041. tt_str_op(errmsg, OP_EQ, "That didn't look like an identity digest");
  1042. errmsg = NULL;
  1043. /*
  1044. * Case 7 - downloads/cert/fp/<fp>/sks, and <fp> is not a known authority
  1045. * digest.
  1046. */
  1047. getinfo_helper_downloads(&dummy,
  1048. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/sks",
  1049. &answer, &errmsg);
  1050. tt_ptr_op(answer, OP_EQ, NULL);
  1051. tt_ptr_op(errmsg, OP_NE, NULL);
  1052. tt_str_op(errmsg, OP_EQ,
  1053. "Failed to get list of signing key digests for this authority "
  1054. "identity digest");
  1055. errmsg = NULL;
  1056. /*
  1057. * Case 8 - looks like downloads/cert/fp/<fp>/<sk>, but <sk> doesn't
  1058. * parse as a signing key digest.
  1059. */
  1060. getinfo_helper_downloads(&dummy,
  1061. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/"
  1062. "82F52AF55D250115FE44D3GC81D49643241D56A1",
  1063. &answer, &errmsg);
  1064. tt_ptr_op(answer, OP_EQ, NULL);
  1065. tt_ptr_op(errmsg, OP_NE, NULL);
  1066. tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest");
  1067. errmsg = NULL;
  1068. /*
  1069. * Case 9 - looks like downloads/cert/fp/<fp>/<sk>, but <sk> doesn't
  1070. * parse as a signing key digest.
  1071. */
  1072. getinfo_helper_downloads(&dummy,
  1073. "downloads/cert/fp/AC4F23B5745BDD2A77997B85B1FD85D05C2E0F61/"
  1074. "82F52AF55D250115FE44D",
  1075. &answer, &errmsg);
  1076. tt_ptr_op(answer, OP_EQ, NULL);
  1077. tt_ptr_op(errmsg, OP_NE, NULL);
  1078. tt_str_op(errmsg, OP_EQ, "That didn't look like a signing key digest");
  1079. errmsg = NULL;
  1080. /*
  1081. * Case 10 - downloads/cert/fp/<fp>/<sk>, but <fp> isn't a known
  1082. * authority identity digest.
  1083. */
  1084. getinfo_helper_downloads(&dummy,
  1085. "downloads/cert/fp/C6B05DF332F74DB9A13498EE3BBC7AA2F69FCB45/"
  1086. "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D",
  1087. &answer, &errmsg);
  1088. tt_ptr_op(answer, OP_EQ, NULL);
  1089. tt_ptr_op(errmsg, OP_NE, NULL);
  1090. tt_str_op(errmsg, OP_EQ,
  1091. "Failed to get download status for this identity/"
  1092. "signing key digest pair");
  1093. errmsg = NULL;
  1094. /*
  1095. * Case 11 - downloads/cert/fp/<fp>/<sk>, but <sk> isn't a known
  1096. * signing key digest.
  1097. */
  1098. getinfo_helper_downloads(&dummy,
  1099. "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/"
  1100. "3A214FC21AE25B012C2ECCB5F4EC8A3602D0545D",
  1101. &answer, &errmsg);
  1102. tt_ptr_op(answer, OP_EQ, NULL);
  1103. tt_ptr_op(errmsg, OP_NE, NULL);
  1104. tt_str_op(errmsg, OP_EQ,
  1105. "Failed to get download status for this identity/"
  1106. "signing key digest pair");
  1107. errmsg = NULL;
  1108. /*
  1109. * Case 12 - downloads/cert/fp/<fp>/<sk>, but <sk> is on the list for
  1110. * a different authority identity digest.
  1111. */
  1112. getinfo_helper_downloads(&dummy,
  1113. "downloads/cert/fp/63CDD326DFEF0CA020BDD3FEB45A3286FE13A061/"
  1114. "9451B8F1B10952384EB58B5F230C0BB701626C9B",
  1115. &answer, &errmsg);
  1116. tt_ptr_op(answer, OP_EQ, NULL);
  1117. tt_ptr_op(errmsg, OP_NE, NULL);
  1118. tt_str_op(errmsg, OP_EQ,
  1119. "Failed to get download status for this identity/"
  1120. "signing key digest pair");
  1121. errmsg = NULL;
  1122. done:
  1123. clear_cert_mocks();
  1124. tor_free(answer);
  1125. return;
  1126. }
  1127. static void
  1128. test_download_status_desc(void *arg)
  1129. {
  1130. /* We just need one of these to pass, it doesn't matter what's in it */
  1131. control_connection_t dummy;
  1132. /* Get results out */
  1133. char *question = NULL;
  1134. char *answer = NULL;
  1135. const char *errmsg = NULL;
  1136. (void)arg;
  1137. setup_desc_mocks();
  1138. /*
  1139. * Check returning serialized dlstatuses and digest lists, and implicitly
  1140. * also test download_status_to_string() and digest_list_to_string().
  1141. */
  1142. /* Case 1 - list of router descriptor digests */
  1143. getinfo_helper_downloads(&dummy,
  1144. "downloads/desc/descs",
  1145. &answer, &errmsg);
  1146. tt_ptr_op(answer, OP_NE, NULL);
  1147. tt_ptr_op(errmsg, OP_EQ, NULL);
  1148. tt_str_op(answer, OP_EQ, descbr_expected_list);
  1149. tor_free(answer);
  1150. errmsg = NULL;
  1151. /* Case 2 - get download status for router descriptor 1 */
  1152. memcpy(&descbr_digest_1_dl, &dls_sample_1,
  1153. sizeof(download_status_t));
  1154. tor_asprintf(&question, "downloads/desc/%s", descbr_digest_1_str);
  1155. tt_ptr_op(question, OP_NE, NULL);
  1156. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1157. tt_ptr_op(answer, OP_NE, NULL);
  1158. tt_ptr_op(errmsg, OP_EQ, NULL);
  1159. tt_str_op(answer, OP_EQ, dls_sample_1_str);
  1160. tor_free(question);
  1161. tor_free(answer);
  1162. errmsg = NULL;
  1163. /* Case 3 - get download status for router descriptor 1 */
  1164. memcpy(&descbr_digest_2_dl, &dls_sample_2,
  1165. sizeof(download_status_t));
  1166. tor_asprintf(&question, "downloads/desc/%s", descbr_digest_2_str);
  1167. tt_ptr_op(question, OP_NE, NULL);
  1168. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1169. tt_ptr_op(answer, OP_NE, NULL);
  1170. tt_ptr_op(errmsg, OP_EQ, NULL);
  1171. tt_str_op(answer, OP_EQ, dls_sample_2_str);
  1172. tor_free(question);
  1173. tor_free(answer);
  1174. errmsg = NULL;
  1175. /* Now check the error cases */
  1176. /* Case 1 - non-digest-length garbage after downloads/desc */
  1177. getinfo_helper_downloads(&dummy, "downloads/desc/blahdeblah",
  1178. &answer, &errmsg);
  1179. tt_ptr_op(answer, OP_EQ, NULL);
  1180. tt_ptr_op(errmsg, OP_NE, NULL);
  1181. tt_str_op(errmsg, OP_EQ, "Unknown router descriptor download status query");
  1182. errmsg = NULL;
  1183. /* Case 2 - nonparseable digest-shaped thing */
  1184. getinfo_helper_downloads(
  1185. &dummy,
  1186. "downloads/desc/774EC52FD9A5B80A6FACZE536616E8022E3470AG",
  1187. &answer, &errmsg);
  1188. tt_ptr_op(answer, OP_EQ, NULL);
  1189. tt_ptr_op(errmsg, OP_NE, NULL);
  1190. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1191. errmsg = NULL;
  1192. /* Case 3 - digest we have no descriptor for */
  1193. getinfo_helper_downloads(
  1194. &dummy,
  1195. "downloads/desc/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A",
  1196. &answer, &errmsg);
  1197. tt_ptr_op(answer, OP_EQ, NULL);
  1198. tt_ptr_op(errmsg, OP_NE, NULL);
  1199. tt_str_op(errmsg, OP_EQ, "No such descriptor digest found");
  1200. errmsg = NULL;
  1201. /* Case 4 - microdescs only */
  1202. disable_descbr = 1;
  1203. getinfo_helper_downloads(&dummy,
  1204. "downloads/desc/descs",
  1205. &answer, &errmsg);
  1206. tt_ptr_op(answer, OP_EQ, NULL);
  1207. tt_ptr_op(errmsg, OP_NE, NULL);
  1208. tt_str_op(errmsg, OP_EQ,
  1209. "We don't seem to have a networkstatus-flavored consensus");
  1210. errmsg = NULL;
  1211. disable_descbr = 0;
  1212. done:
  1213. clear_desc_mocks();
  1214. tor_free(answer);
  1215. return;
  1216. }
  1217. static void
  1218. test_download_status_bridge(void *arg)
  1219. {
  1220. /* We just need one of these to pass, it doesn't matter what's in it */
  1221. control_connection_t dummy;
  1222. /* Get results out */
  1223. char *question = NULL;
  1224. char *answer = NULL;
  1225. const char *errmsg = NULL;
  1226. (void)arg;
  1227. setup_bridge_mocks();
  1228. /*
  1229. * Check returning serialized dlstatuses and digest lists, and implicitly
  1230. * also test download_status_to_string() and digest_list_to_string().
  1231. */
  1232. /* Case 1 - list of bridge identity digests */
  1233. getinfo_helper_downloads(&dummy,
  1234. "downloads/bridge/bridges",
  1235. &answer, &errmsg);
  1236. tt_ptr_op(answer, OP_NE, NULL);
  1237. tt_ptr_op(errmsg, OP_EQ, NULL);
  1238. tt_str_op(answer, OP_EQ, descbr_expected_list);
  1239. tor_free(answer);
  1240. errmsg = NULL;
  1241. /* Case 2 - get download status for bridge descriptor 1 */
  1242. memcpy(&descbr_digest_1_dl, &dls_sample_3,
  1243. sizeof(download_status_t));
  1244. tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_1_str);
  1245. tt_ptr_op(question, OP_NE, NULL);
  1246. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1247. tt_ptr_op(answer, OP_NE, NULL);
  1248. tt_ptr_op(errmsg, OP_EQ, NULL);
  1249. tt_str_op(answer, OP_EQ, dls_sample_3_str);
  1250. tor_free(question);
  1251. tor_free(answer);
  1252. errmsg = NULL;
  1253. /* Case 3 - get download status for router descriptor 1 */
  1254. memcpy(&descbr_digest_2_dl, &dls_sample_4,
  1255. sizeof(download_status_t));
  1256. tor_asprintf(&question, "downloads/bridge/%s", descbr_digest_2_str);
  1257. tt_ptr_op(question, OP_NE, NULL);
  1258. getinfo_helper_downloads(&dummy, question, &answer, &errmsg);
  1259. tt_ptr_op(answer, OP_NE, NULL);
  1260. tt_ptr_op(errmsg, OP_EQ, NULL);
  1261. tt_str_op(answer, OP_EQ, dls_sample_4_str);
  1262. tor_free(question);
  1263. tor_free(answer);
  1264. errmsg = NULL;
  1265. /* Now check the error cases */
  1266. /* Case 1 - non-digest-length garbage after downloads/bridge */
  1267. getinfo_helper_downloads(&dummy, "downloads/bridge/blahdeblah",
  1268. &answer, &errmsg);
  1269. tt_ptr_op(answer, OP_EQ, NULL);
  1270. tt_ptr_op(errmsg, OP_NE, NULL);
  1271. tt_str_op(errmsg, OP_EQ, "Unknown bridge descriptor download status query");
  1272. errmsg = NULL;
  1273. /* Case 2 - nonparseable digest-shaped thing */
  1274. getinfo_helper_downloads(
  1275. &dummy,
  1276. "downloads/bridge/774EC52FD9A5B80A6FACZE536616E8022E3470AG",
  1277. &answer, &errmsg);
  1278. tt_ptr_op(answer, OP_EQ, NULL);
  1279. tt_ptr_op(errmsg, OP_NE, NULL);
  1280. tt_str_op(errmsg, OP_EQ, "That didn't look like a digest");
  1281. errmsg = NULL;
  1282. /* Case 3 - digest we have no descriptor for */
  1283. getinfo_helper_downloads(
  1284. &dummy,
  1285. "downloads/bridge/B05B46135B0B2C04EBE1DD6A6AE4B12D7CD2226A",
  1286. &answer, &errmsg);
  1287. tt_ptr_op(answer, OP_EQ, NULL);
  1288. tt_ptr_op(errmsg, OP_NE, NULL);
  1289. tt_str_op(errmsg, OP_EQ, "No such bridge identity digest found");
  1290. errmsg = NULL;
  1291. /* Case 4 - bridges disabled */
  1292. disable_descbr = 1;
  1293. getinfo_helper_downloads(&dummy,
  1294. "downloads/bridge/bridges",
  1295. &answer, &errmsg);
  1296. tt_ptr_op(answer, OP_EQ, NULL);
  1297. tt_ptr_op(errmsg, OP_NE, NULL);
  1298. tt_str_op(errmsg, OP_EQ, "We don't seem to be using bridges");
  1299. errmsg = NULL;
  1300. disable_descbr = 0;
  1301. done:
  1302. clear_bridge_mocks();
  1303. tor_free(answer);
  1304. return;
  1305. }
  1306. /** Set timeval to a mock date and time. This is necessary
  1307. * to make tor_gettimeofday() mockable. */
  1308. static void
  1309. mock_tor_gettimeofday(struct timeval *timeval)
  1310. {
  1311. timeval->tv_sec = 1523405073;
  1312. timeval->tv_usec = 271645;
  1313. }
  1314. static void
  1315. test_current_time(void *arg)
  1316. {
  1317. /* We just need one of these to pass, it doesn't matter what's in it */
  1318. control_connection_t dummy;
  1319. /* Get results out */
  1320. char *answer = NULL;
  1321. const char *errmsg = NULL;
  1322. (void)arg;
  1323. /* We need these for storing the (mock) time. */
  1324. MOCK(tor_gettimeofday, mock_tor_gettimeofday);
  1325. struct timeval now;
  1326. tor_gettimeofday(&now);
  1327. char timebuf[ISO_TIME_LEN+1];
  1328. /* Case 1 - local time */
  1329. format_local_iso_time_nospace(timebuf, (time_t)now.tv_sec);
  1330. getinfo_helper_current_time(&dummy,
  1331. "current-time/local",
  1332. &answer, &errmsg);
  1333. tt_ptr_op(answer, OP_NE, NULL);
  1334. tt_ptr_op(errmsg, OP_EQ, NULL);
  1335. tt_str_op(answer, OP_EQ, timebuf);
  1336. tor_free(answer);
  1337. errmsg = NULL;
  1338. /* Case 2 - UTC time */
  1339. format_iso_time_nospace(timebuf, (time_t)now.tv_sec);
  1340. getinfo_helper_current_time(&dummy,
  1341. "current-time/utc",
  1342. &answer, &errmsg);
  1343. tt_ptr_op(answer, OP_NE, NULL);
  1344. tt_ptr_op(errmsg, OP_EQ, NULL);
  1345. tt_str_op(answer, OP_EQ, timebuf);
  1346. tor_free(answer);
  1347. errmsg = NULL;
  1348. done:
  1349. UNMOCK(tor_gettimeofday);
  1350. tor_free(answer);
  1351. return;
  1352. }
  1353. static size_t n_nodelist_get_list = 0;
  1354. static smartlist_t *nodes = NULL;
  1355. static smartlist_t *
  1356. mock_nodelist_get_list(void)
  1357. {
  1358. n_nodelist_get_list++;
  1359. tor_assert(nodes);
  1360. return nodes;
  1361. }
  1362. static void
  1363. test_getinfo_md_all(void *arg)
  1364. {
  1365. char *answer = NULL;
  1366. const char *errmsg = NULL;
  1367. int retval = 0;
  1368. (void)arg;
  1369. node_t *node1 = tor_malloc(sizeof(node_t));
  1370. memset(node1, 0, sizeof(node_t));
  1371. node1->md = tor_malloc(sizeof(microdesc_t));
  1372. memset(node1->md, 0, sizeof(microdesc_t));
  1373. node1->md->body = tor_strdup("md1\n");
  1374. node1->md->bodylen = 4;
  1375. node_t *node2 = tor_malloc(sizeof(node_t));
  1376. memset(node2, 0, sizeof(node_t));
  1377. node2->md = tor_malloc(sizeof(microdesc_t));
  1378. memset(node2->md, 0, sizeof(microdesc_t));
  1379. node2->md->body = tor_strdup("md2\n");
  1380. node2->md->bodylen = 4;
  1381. MOCK(nodelist_get_list, mock_nodelist_get_list);
  1382. nodes = smartlist_new();
  1383. retval = getinfo_helper_dir(NULL, "md/all", &answer, &errmsg);
  1384. tt_int_op(n_nodelist_get_list, OP_EQ, 1);
  1385. tt_int_op(retval, OP_EQ, 0);
  1386. tt_assert(answer != NULL);
  1387. tt_assert(errmsg == NULL);
  1388. tt_str_op(answer, OP_EQ, "");
  1389. tor_free(answer);
  1390. smartlist_add(nodes, node1);
  1391. smartlist_add(nodes, node2);
  1392. retval = getinfo_helper_dir(NULL, "md/all", &answer, &errmsg);
  1393. tt_int_op(n_nodelist_get_list, OP_EQ, 2);
  1394. tt_int_op(retval, OP_EQ, 0);
  1395. tt_assert(answer != NULL);
  1396. tt_assert(errmsg == NULL);
  1397. tt_str_op(answer, OP_EQ, "md1\nmd2\n");
  1398. done:
  1399. UNMOCK(nodelist_get_list);
  1400. tor_free(node1->md->body);
  1401. tor_free(node1->md);
  1402. tor_free(node1);
  1403. tor_free(node2->md->body);
  1404. tor_free(node2->md);
  1405. tor_free(node2);
  1406. tor_free(answer);
  1407. smartlist_free(nodes);
  1408. return;
  1409. }
  1410. struct testcase_t controller_tests[] = {
  1411. { "add_onion_helper_keyarg_v2", test_add_onion_helper_keyarg_v2, 0,
  1412. NULL, NULL },
  1413. { "add_onion_helper_keyarg_v3", test_add_onion_helper_keyarg_v3, 0,
  1414. NULL, NULL },
  1415. { "getinfo_helper_onion", test_getinfo_helper_onion, 0, NULL, NULL },
  1416. { "rend_service_parse_port_config", test_rend_service_parse_port_config, 0,
  1417. NULL, NULL },
  1418. { "add_onion_helper_clientauth", test_add_onion_helper_clientauth, 0, NULL,
  1419. NULL },
  1420. { "download_status_consensus", test_download_status_consensus, 0, NULL,
  1421. NULL },
  1422. { "download_status_cert", test_download_status_cert, 0, NULL,
  1423. NULL },
  1424. { "download_status_desc", test_download_status_desc, 0, NULL, NULL },
  1425. { "download_status_bridge", test_download_status_bridge, 0, NULL, NULL },
  1426. { "current_time", test_current_time, 0, NULL, NULL },
  1427. { "getinfo_md_all", test_getinfo_md_all, 0, NULL, NULL },
  1428. END_OF_TESTCASES
  1429. };