test_controller.c 41 KB

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