test_controller.c 51 KB

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