test_controller.c 48 KB

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