test_controller.c 50 KB

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