test_controller.c 42 KB

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