test_controller.c 41 KB

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