1 /* Copyright (c) 2010-2017, The Tor Project, Inc. */
2 /* See LICENSE for licensing information */
10 #include "networkstatus.h"
11 #include "routerlist.h"
12 #include "routerparse.h"
24 static const char test_md1
[] =
26 "-----BEGIN RSA PUBLIC KEY-----\n"
27 "MIGJAoGBAMjlHH/daN43cSVRaHBwgUfnszzAhg98EvivJ9Qxfv51mvQUxPjQ07es\n"
28 "gV/3n8fyh3Kqr/ehi9jxkdgSRfSnmF7giaHL1SLZ29kA7KtST+pBvmTpDtHa3ykX\n"
29 "Xorc7hJvIyTZoc1HU+5XSynj3gsBE5IGK1ZRzrNS688LnuZMVp1tAgMBAAE=\n"
30 "-----END RSA PUBLIC KEY-----\n";
32 static const char test_md2
[] =
34 "-----BEGIN RSA PUBLIC KEY-----\n"
35 "MIGJAoGBAMIixIowh2DyPmDNMDwBX2DHcYcqdcH1zdIQJZkyV6c6rQHnvbcaDoSg\n"
36 "jgFSLJKpnGmh71FVRqep+yVB0zI1JY43kuEnXry2HbZCD9UDo3d3n7t015X5S7ON\n"
37 "bSSYtQGPwOr6Epf96IF6DoQxy4iDnPUAlejuhAG51s1y6/rZQ3zxAgMBAAE=\n"
38 "-----END RSA PUBLIC KEY-----\n";
40 static const char test_md3
[] =
41 "@last-listed 2009-06-22\n"
43 "-----BEGIN RSA PUBLIC KEY-----\n"
44 "MIGJAoGBAMH3340d4ENNGrqx7UxT+lB7x6DNUKOdPEOn4teceE11xlMyZ9TPv41c\n"
45 "qj2fRZzfxlc88G/tmiaHshmdtEpklZ740OFqaaJVj4LjPMKFNE+J7Xc1142BE9Ci\n"
46 "KgsbjGYe2RY261aADRWLetJ8T9QDMm+JngL4288hc8pq1uB/3TAbAgMBAAE=\n"
47 "-----END RSA PUBLIC KEY-----\n"
48 "p accept 1-700,800-1000\n"
49 "family nodeX nodeY nodeZ\n";
52 test_md_cache(void *data
)
54 or_options_t
*options
= NULL
;
55 microdesc_cache_t
*mc
= NULL
;
56 smartlist_t
*added
= NULL
, *wanted
= NULL
;
57 microdesc_t
*md1
, *md2
, *md3
;
58 char d1
[DIGEST256_LEN
], d2
[DIGEST256_LEN
], d3
[DIGEST256_LEN
];
59 const char *test_md3_noannotation
= strchr(test_md3
, '\n')+1;
60 time_t time1
, time2
, time3
;
61 char *fn
= NULL
, *s
= NULL
;
64 options
= get_options_mutable();
68 time2
= time(NULL
) - 2*24*60*60;
69 time3
= time(NULL
) - 15*24*60*60;
71 /* Possibly, turn this into a test setup/cleanup pair */
72 tor_free(options
->DataDirectory
);
73 options
->DataDirectory
= tor_strdup(get_fname("md_datadir_test"));
75 tt_int_op(0, OP_EQ
, mkdir(options
->DataDirectory
));
77 tt_int_op(0, OP_EQ
, mkdir(options
->DataDirectory
, 0700));
80 tt_assert(!strcmpstart(test_md3_noannotation
, "onion-key"));
82 crypto_digest256(d1
, test_md1
, strlen(test_md1
), DIGEST_SHA256
);
83 crypto_digest256(d2
, test_md2
, strlen(test_md1
), DIGEST_SHA256
);
84 crypto_digest256(d3
, test_md3_noannotation
, strlen(test_md3_noannotation
),
87 mc
= get_microdesc_cache();
89 added
= microdescs_add_to_cache(mc
, test_md1
, NULL
, SAVED_NOWHERE
, 0,
91 tt_int_op(1, OP_EQ
, smartlist_len(added
));
92 md1
= smartlist_get(added
, 0);
93 smartlist_free(added
);
96 wanted
= smartlist_new();
97 added
= microdescs_add_to_cache(mc
, test_md2
, NULL
, SAVED_NOWHERE
, 0,
99 /* Should fail, since we didn't list test_md2's digest in wanted */
100 tt_int_op(0, OP_EQ
, smartlist_len(added
));
101 smartlist_free(added
);
104 smartlist_add(wanted
, tor_memdup(d2
, DIGEST256_LEN
));
105 smartlist_add(wanted
, tor_memdup(d3
, DIGEST256_LEN
));
106 added
= microdescs_add_to_cache(mc
, test_md2
, NULL
, SAVED_NOWHERE
, 0,
108 /* Now it can work. md2 should have been added */
109 tt_int_op(1, OP_EQ
, smartlist_len(added
));
110 md2
= smartlist_get(added
, 0);
111 /* And it should have gotten removed from 'wanted' */
112 tt_int_op(smartlist_len(wanted
), OP_EQ
, 1);
113 tt_mem_op(smartlist_get(wanted
, 0), OP_EQ
, d3
, DIGEST256_LEN
);
114 smartlist_free(added
);
117 added
= microdescs_add_to_cache(mc
, test_md3
, NULL
,
118 SAVED_NOWHERE
, 0, -1, NULL
);
119 /* Must fail, since SAVED_NOWHERE precludes annotations */
120 tt_int_op(0, OP_EQ
, smartlist_len(added
));
121 smartlist_free(added
);
124 added
= microdescs_add_to_cache(mc
, test_md3_noannotation
, NULL
,
125 SAVED_NOWHERE
, 0, time3
, NULL
);
126 /* Now it can work */
127 tt_int_op(1, OP_EQ
, smartlist_len(added
));
128 md3
= smartlist_get(added
, 0);
129 smartlist_free(added
);
132 /* Okay. We added 1...3. Let's poke them to see how they look, and make
133 * sure they're really in the journal. */
134 tt_ptr_op(md1
, OP_EQ
, microdesc_cache_lookup_by_digest256(mc
, d1
));
135 tt_ptr_op(md2
, OP_EQ
, microdesc_cache_lookup_by_digest256(mc
, d2
));
136 tt_ptr_op(md3
, OP_EQ
, microdesc_cache_lookup_by_digest256(mc
, d3
));
138 tt_int_op(md1
->last_listed
, OP_EQ
, time1
);
139 tt_int_op(md2
->last_listed
, OP_EQ
, time2
);
140 tt_int_op(md3
->last_listed
, OP_EQ
, time3
);
142 tt_int_op(md1
->saved_location
, OP_EQ
, SAVED_IN_JOURNAL
);
143 tt_int_op(md2
->saved_location
, OP_EQ
, SAVED_IN_JOURNAL
);
144 tt_int_op(md3
->saved_location
, OP_EQ
, SAVED_IN_JOURNAL
);
146 tt_int_op(md1
->bodylen
, OP_EQ
, strlen(test_md1
));
147 tt_int_op(md2
->bodylen
, OP_EQ
, strlen(test_md2
));
148 tt_int_op(md3
->bodylen
, OP_EQ
, strlen(test_md3_noannotation
));
149 tt_mem_op(md1
->body
, OP_EQ
, test_md1
, strlen(test_md1
));
150 tt_mem_op(md2
->body
, OP_EQ
, test_md2
, strlen(test_md2
));
151 tt_mem_op(md3
->body
, OP_EQ
, test_md3_noannotation
,
152 strlen(test_md3_noannotation
));
154 tor_asprintf(&fn
, "%s"PATH_SEPARATOR
"cached-microdescs.new",
155 options
->DataDirectory
);
156 s
= read_file_to_str(fn
, RFTS_BIN
, NULL
);
158 tt_mem_op(md1
->body
, OP_EQ
, s
+ md1
->off
, md1
->bodylen
);
159 tt_mem_op(md2
->body
, OP_EQ
, s
+ md2
->off
, md2
->bodylen
);
160 tt_mem_op(md3
->body
, OP_EQ
, s
+ md3
->off
, md3
->bodylen
);
162 tt_ptr_op(md1
->family
, OP_EQ
, NULL
);
163 tt_ptr_op(md3
->family
, OP_NE
, NULL
);
164 tt_int_op(smartlist_len(md3
->family
), OP_EQ
, 3);
165 tt_str_op(smartlist_get(md3
->family
, 0), OP_EQ
, "nodeX");
167 /* Now rebuild the cache! */
168 tt_int_op(microdesc_cache_rebuild(mc
, 1), OP_EQ
, 0);
170 tt_int_op(md1
->saved_location
, OP_EQ
, SAVED_IN_CACHE
);
171 tt_int_op(md2
->saved_location
, OP_EQ
, SAVED_IN_CACHE
);
172 tt_int_op(md3
->saved_location
, OP_EQ
, SAVED_IN_CACHE
);
174 /* The journal should be empty now */
176 s
= read_file_to_str(fn
, RFTS_BIN
, NULL
);
177 tt_str_op(s
, OP_EQ
, "");
181 /* read the cache. */
182 tor_asprintf(&fn
, "%s"PATH_SEPARATOR
"cached-microdescs",
183 options
->DataDirectory
);
184 s
= read_file_to_str(fn
, RFTS_BIN
, NULL
);
185 tt_mem_op(md1
->body
, OP_EQ
, s
+ md1
->off
, strlen(test_md1
));
186 tt_mem_op(md2
->body
, OP_EQ
, s
+ md2
->off
, strlen(test_md2
));
187 tt_mem_op(md3
->body
, OP_EQ
, s
+ md3
->off
, strlen(test_md3_noannotation
));
189 /* Okay, now we are going to forget about the cache entirely, and reload it
191 microdesc_free_all();
192 mc
= get_microdesc_cache();
193 md1
= microdesc_cache_lookup_by_digest256(mc
, d1
);
194 md2
= microdesc_cache_lookup_by_digest256(mc
, d2
);
195 md3
= microdesc_cache_lookup_by_digest256(mc
, d3
);
199 tt_mem_op(md1
->body
, OP_EQ
, s
+ md1
->off
, strlen(test_md1
));
200 tt_mem_op(md2
->body
, OP_EQ
, s
+ md2
->off
, strlen(test_md2
));
201 tt_mem_op(md3
->body
, OP_EQ
, s
+ md3
->off
, strlen(test_md3_noannotation
));
203 tt_int_op(md1
->last_listed
, OP_EQ
, time1
);
204 tt_int_op(md2
->last_listed
, OP_EQ
, time2
);
205 tt_int_op(md3
->last_listed
, OP_EQ
, time3
);
207 /* Okay, now we are going to clear out everything older than a week old.
208 * In practice, that means md3 */
209 microdesc_cache_clean(mc
, time(NULL
)-7*24*60*60, 1/*force*/);
210 tt_ptr_op(md1
, OP_EQ
, microdesc_cache_lookup_by_digest256(mc
, d1
));
211 tt_ptr_op(md2
, OP_EQ
, microdesc_cache_lookup_by_digest256(mc
, d2
));
212 tt_ptr_op(NULL
, OP_EQ
, microdesc_cache_lookup_by_digest256(mc
, d3
));
213 md3
= NULL
; /* it's history now! */
215 /* rebuild again, make sure it stays gone. */
216 tt_int_op(microdesc_cache_rebuild(mc
, 1), OP_EQ
, 0);
217 tt_ptr_op(md1
, OP_EQ
, microdesc_cache_lookup_by_digest256(mc
, d1
));
218 tt_ptr_op(md2
, OP_EQ
, microdesc_cache_lookup_by_digest256(mc
, d2
));
219 tt_ptr_op(NULL
, OP_EQ
, microdesc_cache_lookup_by_digest256(mc
, d3
));
221 /* Re-add md3, and make sure we can rebuild the cache. */
222 added
= microdescs_add_to_cache(mc
, test_md3_noannotation
, NULL
,
223 SAVED_NOWHERE
, 0, time3
, NULL
);
224 tt_int_op(1, OP_EQ
, smartlist_len(added
));
225 md3
= smartlist_get(added
, 0);
226 smartlist_free(added
);
228 tt_int_op(md1
->saved_location
, OP_EQ
, SAVED_IN_CACHE
);
229 tt_int_op(md2
->saved_location
, OP_EQ
, SAVED_IN_CACHE
);
230 tt_int_op(md3
->saved_location
, OP_EQ
, SAVED_IN_JOURNAL
);
232 tt_int_op(microdesc_cache_rebuild(mc
, 1), OP_EQ
, 0);
233 tt_int_op(md3
->saved_location
, OP_EQ
, SAVED_IN_CACHE
);
237 tor_free(options
->DataDirectory
);
238 microdesc_free_all();
240 smartlist_free(added
);
242 SMARTLIST_FOREACH(wanted
, char *, cp
, tor_free(cp
));
243 smartlist_free(wanted
);
248 static const char truncated_md
[] =
249 "@last-listed 2013-08-08 19:02:59\n"
251 "-----BEGIN RSA PUBLIC KEY-----\n"
252 "MIGJAoGBAM91vLFNaM+gGhnRIdz2Cm/Kl7Xz0cOobIdVzhS3cKUJfk867hCuTipS\n"
253 "NveLBzNopvgXKruAAzEj3cACxk6Q8lv5UWOGCD1UolkgsWSE62RBjap44g+oc9J1\n"
254 "RI9968xOTZw0VaBQg9giEILNXl0djoikQ+5tQRUvLDDa67gpa5Q1AgMBAAE=\n"
255 "-----END RSA PUBLIC KEY-----\n"
259 test_md_cache_broken(void *data
)
261 or_options_t
*options
;
263 microdesc_cache_t
*mc
= NULL
;
267 options
= get_options_mutable();
269 tor_free(options
->DataDirectory
);
270 options
->DataDirectory
= tor_strdup(get_fname("md_datadir_test2"));
273 tt_int_op(0, OP_EQ
, mkdir(options
->DataDirectory
));
275 tt_int_op(0, OP_EQ
, mkdir(options
->DataDirectory
, 0700));
278 tor_asprintf(&fn
, "%s"PATH_SEPARATOR
"cached-microdescs",
279 options
->DataDirectory
);
281 write_str_to_file(fn
, truncated_md
, 1);
283 mc
= get_microdesc_cache();
288 tor_free(options
->DataDirectory
);
290 microdesc_free_all();
293 /* Generated by chutney. */
294 static const char test_ri
[] =
295 "router test005r 127.0.0.1 5005 0 7005\n"
296 "platform Tor 0.2.5.4-alpha-dev on Linux\n"
297 "protocols Link 1 2 Circuit 1\n"
298 "published 2014-05-06 22:57:55\n"
299 "fingerprint 09DE 3BA2 48C2 1C3F 3760 6CD3 8460 43A6 D5EC F59E\n"
301 "bandwidth 1073741824 1073741824 0\n"
302 "extra-info-digest 361F9428F9FA4DD854C03DDBCC159D0D9FA996C9\n"
304 "-----BEGIN RSA PUBLIC KEY-----\n"
305 "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n"
306 "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n"
307 "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n"
308 "-----END RSA PUBLIC KEY-----\n"
310 "-----BEGIN RSA PUBLIC KEY-----\n"
311 "MIGJAoGBANbGUC4802Ke6C3nOVxN0U0HhIRrs32cQFEL4v+UUMJPgjbistHBvOax\n"
312 "CWVR/sMXM2kKJeGThJ9ZUs2p9dDG4WHPUXgkMqzTTEeeFa7pQKU0brgbmLaJq0Pi\n"
313 "mxmqC5RkTHa5bQvq6QlSFprAEoovV27cWqBM9jVdV9hyc//6kwPzAgMBAAE=\n"
314 "-----END RSA PUBLIC KEY-----\n"
315 "hidden-service-dir\n"
316 "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n"
323 "reject *:4661-4666\n"
324 "reject *:6346-6429\n"
326 "reject *:6881-6999\n"
329 "-----BEGIN SIGNATURE-----\n"
330 "ImzX5PF2vRCrG1YzGToyjoxYhgh1vtHEDjmP+tIS/iil1DSnHZNpHSuHp0L1jE9S\n"
331 "yZyrtKaqpBE/aecAM3j4CWCn/ipnAAQkHcyRLin1bYvqBtRzyopVCRlUhF+uWrLq\n"
332 "t0xkIE39ss/EwmQr7iIgkdVH4oRIMsjYnFFJBG26nYY=\n"
333 "-----END SIGNATURE-----\n";
335 static const char test_ri2
[] =
336 "router test001a 127.0.0.1 5001 0 7001\n"
338 "-----BEGIN ED25519 CERT-----\n"
339 "AQQABf/FAf5iDuKCZP2VxnAaQWdklilAh6kaEeFX4z8261Yx2T1/AQAgBADCp8vO\n"
340 "B8K1F9g2DzwuwvVCnPFLSK1qknVqPpNucHLH9DY7fuIYogBAdz4zHv1qC7RKaMNG\n"
341 "Jux/tMO2tzPcm62Ky5PjClMQplKUOnZNQ+RIpA3wYCIfUDy/cQnY7XWgNQ0=\n"
342 "-----END ED25519 CERT-----\n"
343 "platform Tor 0.2.6.0-alpha-dev on Darwin\n"
344 "protocols Link 1 2 Circuit 1\n"
345 "published 2014-10-08 12:58:04\n"
346 "fingerprint B7E2 7F10 4213 C36F 13E7 E982 9182 845E 4959 97A0\n"
348 "bandwidth 1073741824 1073741824 0\n"
349 "extra-info-digest 568F27331B6D8C73E7024F1EF5D097B90DFC7CDB\n"
350 "caches-extra-info\n"
352 "-----BEGIN RSA PUBLIC KEY-----\n"
353 "MIGJAoGBAL2R8EfubUcahxha4u02P4VAR0llQIMwFAmrHPjzcK7apcQgDOf2ovOA\n"
354 "+YQnJFxlpBmCoCZC6ssCi+9G0mqo650lFuTMP5I90BdtjotfzESfTykHLiChyvhd\n"
355 "l0dlqclb2SU/GKem/fLRXH16aNi72CdSUu/1slKs/70ILi34QixRAgMBAAE=\n"
356 "-----END RSA PUBLIC KEY-----\n"
358 "-----BEGIN RSA PUBLIC KEY-----\n"
359 "MIGJAoGBAN8+78KUVlgHXdMMkYJxcwh1Zv2y+Gb5eWUyltUaQRajhrT9ij2T5JZs\n"
360 "M0g85xTcuM3jNVVpV79+33hiTohdC6UZ+Bk4USQ7WBFzRbVFSXoVKLBJFkCOIexg\n"
361 "SMGNd5WEDtHWrXl58mizmPFu1eG6ZxHzt7RuLSol5cwBvawXPNkFAgMBAAE=\n"
362 "-----END RSA PUBLIC KEY-----\n"
363 "onion-key-crosscert\n"
364 "-----BEGIN CROSSCERT-----\n"
365 "ETFDzU49bvNfoZnKK1j6JeBP2gDirgj6bBCgWpUYs663OO9ypbZRO0JwWANssKl6\n"
366 "oaq9vKTsKGRsaNnqnz/JGMhehymakjjNtqg7crWwsahe8+7Pw9GKmW+YjFtcOkUf\n"
367 "KfOn2bmKBa1FoJb4yW3oXzHcdlLSRuCciKqPn+Hky5o=\n"
368 "-----END CROSSCERT-----\n"
369 "ntor-onion-key-crosscert 0\n"
370 "-----BEGIN ED25519 CERT-----\n"
371 "AQoABf2dAcKny84HwrUX2DYPPC7C9UKc8UtIrWqSdWo+k25wcsf0AFohutG+xI06\n"
372 "Ef21c5Zl1j8Hw6DzHDjYyJevXLFuOneaL3zcH2Ldn4sjrG3kc5UuVvRfTvV120UO\n"
374 "-----END ED25519 CERT-----\n"
375 "hidden-service-dir\n"
376 "contact auth1@test.test\n"
377 "ntor-onion-key hbxdRnfVUJJY7+KcT4E3Rs7/zuClbN3hJrjSBiEGMgI=\n"
379 "router-sig-ed25519 5aQXyTif7PExIuL2di37UvktmJECKnils2OWz2vDi"
380 "hFxi+5TTAAPxYkS5clhc/Pjvw34itfjGmTKFic/8httAQ\n"
382 "-----BEGIN SIGNATURE-----\n"
383 "BaUB+aFPQbb3BwtdzKsKqV3+6cRlSqJF5bI3UTmwRoJk+Z5Pz+W5NWokNI0xArHM\n"
384 "T4T5FZCCP9350jXsUCIvzyIyktU6aVRCGFt76rFlo1OETpN8GWkMnQU0w18cxvgS\n"
385 "cf34GXHv61XReJF3AlzNHFpbrPOYmowmhrTULKyMqow=\n"
386 "-----END SIGNATURE-----\n";
388 static const char test_md_8
[] =
390 "-----BEGIN RSA PUBLIC KEY-----\n"
391 "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n"
392 "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n"
393 "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n"
394 "-----END RSA PUBLIC KEY-----\n"
395 "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n";
397 static const char test_md_16
[] =
399 "-----BEGIN RSA PUBLIC KEY-----\n"
400 "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n"
401 "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n"
402 "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n"
403 "-----END RSA PUBLIC KEY-----\n"
404 "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n"
405 "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n";
407 static const char test_md_18
[] =
409 "-----BEGIN RSA PUBLIC KEY-----\n"
410 "MIGJAoGBANBJz8Vldl12aFeSMPLiA4nOetLDN0oxU8bB1SDhO7Uu2zdWYVYAF5J0\n"
411 "st7WvrVy/jA9v/fsezNAPskBanecHRSkdMTpkcgRPMHE7CTGEwIy1Yp1X4bPgDlC\n"
412 "VCnbs5Pcts5HnWEYNK7qHDAUn+IlmjOO+pTUY8uyq+GQVz6H9wFlAgMBAAE=\n"
413 "-----END RSA PUBLIC KEY-----\n"
414 "ntor-onion-key Gg73xH7+kTfT6bi1uNVx9gwQdQas9pROIfmc4NpAdC4=\n"
415 "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n"
416 "id rsa1024 Cd47okjCHD83YGzThGBDptXs9Z4\n";
418 static const char test_md2_18
[] =
420 "-----BEGIN RSA PUBLIC KEY-----\n"
421 "MIGJAoGBAL2R8EfubUcahxha4u02P4VAR0llQIMwFAmrHPjzcK7apcQgDOf2ovOA\n"
422 "+YQnJFxlpBmCoCZC6ssCi+9G0mqo650lFuTMP5I90BdtjotfzESfTykHLiChyvhd\n"
423 "l0dlqclb2SU/GKem/fLRXH16aNi72CdSUu/1slKs/70ILi34QixRAgMBAAE=\n"
424 "-----END RSA PUBLIC KEY-----\n"
425 "ntor-onion-key hbxdRnfVUJJY7+KcT4E3Rs7/zuClbN3hJrjSBiEGMgI=\n"
426 "id rsa1024 t+J/EEITw28T5+mCkYKEXklZl6A\n";
428 static const char test_md2_21
[] =
430 "-----BEGIN RSA PUBLIC KEY-----\n"
431 "MIGJAoGBAL2R8EfubUcahxha4u02P4VAR0llQIMwFAmrHPjzcK7apcQgDOf2ovOA\n"
432 "+YQnJFxlpBmCoCZC6ssCi+9G0mqo650lFuTMP5I90BdtjotfzESfTykHLiChyvhd\n"
433 "l0dlqclb2SU/GKem/fLRXH16aNi72CdSUu/1slKs/70ILi34QixRAgMBAAE=\n"
434 "-----END RSA PUBLIC KEY-----\n"
435 "ntor-onion-key hbxdRnfVUJJY7+KcT4E3Rs7/zuClbN3hJrjSBiEGMgI=\n"
436 "id ed25519 wqfLzgfCtRfYNg88LsL1QpzxS0itapJ1aj6TbnByx/Q\n";
439 test_md_generate(void *arg
)
442 microdesc_t
*md
= NULL
;
445 ri
= router_parse_entry_from_string(test_ri
, NULL
, 0, 0, NULL
, NULL
);
447 md
= dirvote_create_microdescriptor(ri
, 8);
448 tt_str_op(md
->body
, OP_EQ
, test_md_8
);
450 /* XXXX test family lines. */
451 /* XXXX test method 14 for A lines. */
452 /* XXXX test method 15 for P6 lines. */
456 md
= dirvote_create_microdescriptor(ri
, 16);
457 tt_str_op(md
->body
, OP_EQ
, test_md_16
);
461 md
= dirvote_create_microdescriptor(ri
, 18);
462 tt_str_op(md
->body
, OP_EQ
, test_md_18
);
466 md
= dirvote_create_microdescriptor(ri
, 21);
467 tt_str_op(md
->body
, OP_EQ
, test_md_18
);
470 ri
= router_parse_entry_from_string(test_ri2
, NULL
, 0, 0, NULL
, NULL
);
474 md
= dirvote_create_microdescriptor(ri
, 18);
475 tt_str_op(md
->body
, OP_EQ
, test_md2_18
);
479 md
= dirvote_create_microdescriptor(ri
, 21);
480 tt_str_op(md
->body
, OP_EQ
, test_md2_21
);
481 tt_assert(ed25519_pubkey_eq(md
->ed25519_identity_pkey
,
482 &ri
->cache_info
.signing_key_cert
->signing_key
));
489 #ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS
490 DISABLE_GCC_WARNING(overlength
-strings
)
491 /* We allow huge string constants in the unit tests, but not in the code
494 /* Taken at random from my ~/.tor/cached-microdescs file and then
496 static const char MD_PARSE_TEST_DATA
[] =
499 "-----BEGIN RSA PUBLIC KEY-----\n"
500 "MIGJAoGBANsKd1GRfOuSR1MkcwKqs6SVy4Gi/JXplt/bHDkIGm6Q96TeJ5uyVgUL\n"
501 "DBr/ij6+JqgVFeriuiMzHKREytzjdaTuKsKBFFpLwb+Ppcjr5nMIH/AR6/aHO8hW\n"
502 "T3B9lx5T6Kl7CqZ4yqXxYRHzn50EPTIZuz0y9se4J4gi9mLmL+pHAgMBAAE=\n"
503 "-----END RSA PUBLIC KEY-----\n"
504 "p accept 20-23,43,53,79-81,88,110,143,194,220,443,464,531,543-544\n"
505 "id rsa1024 GEo59/iR1GWSIWZDzXTd5QxtqnU\n"
506 /* Bad 0: I've messed with the onion-key in the second one. */
508 "-----BEGIN RSA PUBLIC KEY-----\n"
509 "MIGJAoGBAMr4o/pflVwscx11vC1AKEADlKEqnhpvCIjAEzNEenMhvGQHRlA0EXLC\n"
510 "7G7O5bhnCwEHqK8Pvg8cuX/fD8v08TF1EVPhwPa0UI6ab8KnPP2F!!!!!!b92DG7EQIk3q\n"
511 "d68Uxp7E9/t3v1WWZjzDqvEe0par6ul+DKW6HMlTGebFo5Q4e8R1AgMBAAE=\n"
512 "-----END RSA PUBLIC KEY-----\n"
513 "ntor-onion-key 761Dmm27via7lXygNHM3l+oJLrYU2Nye0Uz4pkpipyY=\n"
515 "id rsa1024 3Y4fwXhtgkdGDZ5ef5mtb6TJRQQ\n"
518 "-----BEGIN RSA PUBLIC KEY-----\n"
519 "MIGJAoGBANsMSjVi3EX8ZHfm/dvPF6KdVR66k1tVul7Jp+dDbDajBYNhgKRzVCxy\n"
520 "Yac1CBuQjOqK89tKap9PQBnhF087eDrfaZDqYTLwB2W2sBJncVej15WEPXPRBifo\n"
521 "iFZ8337kgczkaY+IOfSuhtbOUyDOoDpRJheIKBNq0ZiTqtLbbadVAgMBAAE=\n"
522 "-----END RSA PUBLIC KEY-----\n"
523 "ntor-onion-key ncfiHJjSgdDEW/gc6q6/7idac7j+x7ejQrRm6i75pGA=\n"
524 "p accept 443,6660-6669,6697,7000-7001\n"
525 "id rsa1024 XXuLzw3mfBELEq3veXoNhdehwD4\n"
528 "-----BEGIN RSA PUBLIC KEY-----\n"
529 "MIGJAoGBANQfBlrHrh9F/CAOytrNFgi0ikWMW/HZxuoszF9X+AQ+MudR8bcxxOGl\n"
530 "1RFwb74s8E3uuzrCkNFvSw9Ar1L02F2DOX0gLsxEGuYC4Ave9NUteGqSqDyEJQUJ\n"
531 "KlfxCPn2qC9nvNT7wR/Dg2WRvAEKnJmkpb57N3+WSAOPLjKOFEz3AgMBAAE=\n"
532 "-----END RSA PUBLIC KEY-----\n"
533 "ntor-onion-key AppBt6CSeb1kKid/36ototmFA24ddfW5JpjWPLuoJgs=\n"
534 "id rsa1024 6y60AEI9a1PUUlRPO0YQT9WzrjI\n"
535 /* Bad 1: Here I've messed with the ntor key */
537 "-----BEGIN RSA PUBLIC KEY-----\n"
538 "MIGJAoGBAPjy2HacU3jDNO5nTOFGSwNa0qKCNn4yhtrDVcAJ5alIQeBWZZGJLZ0q\n"
539 "Cqylw1vYqxu8E09g+QXXFbAgBv1U9TICaATxrIJhIJzc8TJPhqJemp1kq0DvHLDx\n"
540 "mxwlkNnCD/P5NS+JYB3EjOlU9EnSKUWNU61+Co344m2JqhEau40vAgMBAAE=\n"
541 "-----END RSA PUBLIC KEY-----\n"
542 "ntor-onion-key 4i2Fp9JHTUr1uQs0pxD5j5spl4/RG56S2P0gQxU=\n"
543 "id rsa1024 nMRmNEGysA0NmlALVaUmI7D5jLU\n"
544 /* Good 3: I've added a weird token in this one. This shouldn't prevent
547 "-----BEGIN RSA PUBLIC KEY-----\n"
548 "MIGJAoGBAKmosxudyNA/yJNz3S890VqV/ebylzoD11Sc0b/d5tyNNaNZjcYy5vRD\n"
549 "kwyxFRMbP2TLZQ1zRfNwY7IDnYjU2SbW0pxuM6M8WRtsmx/YOE3kHMVAFJNrTUqU\n"
550 "6D1zB3IiRDS5q5+NoRxwqo+hYUck60O3WTwEoqb+l3lvXeu7z9rFAgMBAAE=\n"
551 "-----END RSA PUBLIC KEY-----\n"
552 "flux-capacitor 1.21 GW\n"
553 "ntor-onion-key MWBoEkl+RlBiGX44XKIvTSqbznTNZStOmUYtcYRQQyY=\n"
554 "id rsa1024 R+A5O9qRvRac4FT3C4L2QnFyxsc\n"
555 /* Good 4: Here I've made the 'id rsa' token odd. It should still parse
558 "-----BEGIN RSA PUBLIC KEY-----\n"
559 "MIGJAoGBAOh+WMkdNe/Pkjb8UjQyfLOlFgpuVFrxAIGnJsmWWx0yBE97DQxGyh2n\n"
560 "h8G5OJZHRarJQyCIf7vpZQAi0oP0OkGGaCaDQsM+D8TnqhnU++RWGnMqY/cXxPrL\n"
561 "MEq+n6aGiLmzkO7ah8yorZpoREk4GqLUIN89/tHHGOhJL3c4CPGjAgMBAAE=\n"
562 "-----END RSA PUBLIC KEY-----\n"
563 "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n"
564 "id rsa1234 jlqAKFD2E7uMKv+8TmKSeo7NBho\n"
565 /* Good 5: Extra id type. */
567 "-----BEGIN RSA PUBLIC KEY-----\n"
568 "MIGJAoGBAMdgPPc5uaw4y/q+SUTN/I8Y+Gvdx9kKgWV4dmDGJ0mxsVZmo1v6+v3F\n"
569 "12M2f9m99G3WB8F8now29C+9XyEv8MBHj1lHRdUFHSQes3YTFvDNlgj+FjLqO5TJ\n"
570 "adOOmfu4DCUUtUEDyQKbNVL4EkMTXY73omTVsjcH3xxFjTx5wixhAgMBAAE=\n"
571 "-----END RSA PUBLIC KEY-----\n"
572 "ntor-onion-key AAVnWZcnDbxasdZwKqb4fL6O9sZV+XsRNHTpNd1YMz8=\n"
573 "id rsa1024 72EfBL11QuwX2vU8y+p9ExGfGEg\n"
574 "id expolding hedgehog 0+A5O9qRvRac4FT3C4L2QnFyxsc\n"
575 /* Good 6: I've given this a bogus policy. It should parse. */
577 "-----BEGIN RSA PUBLIC KEY-----\n"
578 "MIGJAoGBALNuufwhPMF8BooxYMNvhYJMPqUB8hQDt8wGmPKphJcD1sVD1i4gAZM2\n"
579 "HIo+zUBlljDrRWL5NzVzd1yxUJAiQxvXS5dRRFY3B70M7wTVpXw53xe0/BM5t1AX\n"
580 "n0MFk7Jl6XIKMlzRalZvmMvE/odtyWXkP4Nd1MyZ1QcIwrQ2iwyrAgMBAAE=\n"
581 "-----END RSA PUBLIC KEY-----\n"
583 "ntor-onion-key 2/nMJ+L4dd/2GpMyTYjz3zC59MvQy4MIzJZhdzKHekg=\n"
584 "id rsa1024 FHyh10glEMA6MCmBb5R9Y+X/MhQ\n"
585 /* Good 7: I've given this one another sort of odd policy. Should parse. */
587 "-----BEGIN RSA PUBLIC KEY-----\n"
588 "MIGJAoGBAKcd3FmQ8iAADghyvX8eca0ePqtJ2w1IDdUdTlf5Y/8+OMdp//sD01yC\n"
589 "YmiX45LK5ge1O3AzcakYCO6fb3pyIqvXdvm24OjyYZELQ40cmKSLjdhcSf4Fr/N9\n"
590 "uR/CkknR9cEePu1wZ5WBIGmGdXI6s7t3LB+e7XFyBYAx6wMGlnX7AgMBAAE=\n"
591 "-----END RSA PUBLIC KEY-----\n"
592 "p accept frogs-mice\n"
593 "ntor-onion-key AMxvhaQ1Qg7jBJFoyHuPRgETvLbFmJ194hExV24FuAI=\n"
594 "family $D8CFEA0D996F5D1473D2063C041B7910DB23981E\n"
595 "id rsa1024 d0VVZC/cHh1P3y4MMbfKlQHFycc\n"
596 /* Good 8: This one has the ntor-onion-key without terminating =. That's
599 "-----BEGIN RSA PUBLIC KEY-----\n"
600 "MIGJAoGBAL438YfjrJE2SPqkkXeQwICygu8KNO54Juj6sjqk5hgsiazIWMOBgbaX\n"
601 "LIRqPNGaiSq01xSqwjwCBCfwZYT/nSdDBqj1h9aoR8rnjxZjyQ+m3rWpdDqeCDMx\n"
602 "I3NgZ5w4bNX4poRb42lrV6NmQiFdjzpqszVbv5Lpn2CSKu32CwKVAgMBAAE=\n"
603 "-----END RSA PUBLIC KEY-----\n"
604 "ntor-onion-key UKL6Dnj2KwYsFlkCvOkXVatxvOPB4MaxqwPQQgZMTwI\n"
605 "id rsa1024 FPIXc6k++JnKCtSKWUxaR6oXEKs\n"
606 /* Good 9: Another totally normal one.*/
608 "-----BEGIN RSA PUBLIC KEY-----\n"
609 "MIGJAoGBANNGIKRd8PFNXkJ2JPV1ohDMFNbJwKbwybeieaQFjtU9KWedHCbr+QD4\n"
610 "B6zNY5ysguNjHNnlq2f6D09+uhnfDBON8tAz0mPQH/6JqnOXm+EiUn+8bN0E8Nke\n"
611 "/i3GEgDeaxJJMNQcpsJvmmSmKFOlYy9Fy7ejAjTGqtAnqOte7BnTAgMBAAE=\n"
612 "-----END RSA PUBLIC KEY-----\n"
613 "ntor-onion-key gUsq3e5iYgsQQvyxINtLzBpHxmIt5rtuFlEbKfI4gFk=\n"
614 "id rsa1024 jv+LdatDzsMfEW6pLBeL/5uzwCc\n"
615 /* Bad 2: RSA key has bad exponent of 3. */
617 "-----BEGIN RSA PUBLIC KEY-----\n"
618 "MIGHAoGBAMMTWtvPxYnUNJ5Y7B+XENcpxzPoGstrdiUszCBS+/42xvluLJ+JDSdR\n"
619 "qJaMD6ax8vKAeLS5C6O17MNdG2VldlPRbtgl41MXsOoUqEJ+nY9e3WG9Snjp47xC\n"
620 "zmWIfeduXSavIsb3a43/MLIz/9qO0TkgAAiuQr79JlwKhLdzCqTLAgED\n"
621 "-----END RSA PUBLIC KEY-----\n"
622 "ntor-onion-key NkRB4wTUFogiVp5jYmjGORe2ffb/y5Kk8Itw8jdzMjA=\n"
623 "p reject 25,119,135-139,445,563,1214,4661-4666,6346-6429,6699,6881-6999\n"
624 "id rsa1024 fKvYjP7TAjCC1FzYee5bYAwYkoDg\n"
625 /* Bad 3: Bogus annotation */
626 "@last-listed with strange aeons\n"
628 "-----BEGIN RSA PUBLIC KEY-----\n"
629 "MIGJAoGBALcRBFNCZtpd2TFJysU77/fJMFzKisRQEBOtDGtTZ2Bg4aEGosssa0Id\n"
630 "YtUagRLYle08QVGvGB+EHBI5qf6Ah2yPH7k5QiN2a3Sq+nyh85dXKPazBGBBbM+C\n"
631 "DOfDauV02CAnADNMLJEf1voY3oBVvYyIsmHxn5i1R19ZYIiR8NX5AgMBAAE=\n"
632 "-----END RSA PUBLIC KEY-----\n"
633 "ntor-onion-key m4xcFXMWMjCvZDXq8FT3XmS0EHYseGOeu+fV+6FYDlk=\n"
634 "p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464,531,543-544\n"
635 "id rsa1024 SSbfNE9vmaiwRKH+eqNAkiKQhds\n"
636 /* Good 10: Normal, with added ipv6 address and added other address */
638 "-----BEGIN RSA PUBLIC KEY-----\n"
639 "MIGJAoGBAM7uUtq5F6h63QNYIvC+4NcWaD0DjtnrOORZMkdpJhinXUOwce3cD5Dj\n"
640 "sgdN1wJpWpTQMXJ2DssfSgmOVXETP7qJuZyRprxalQhaEATMDNJA/66Ml1jSO9mZ\n"
641 "+8Xb7m/4q778lNtkSbsvMaYD2Dq6k2QQ3kMhr9z8oUtX0XA23+pfAgMBAAE=\n"
642 "-----END RSA PUBLIC KEY-----\n"
643 "a [::1:2:3:4]:9090\n"
645 "ntor-onion-key k2yFqTU2vzMCQDEiE/j9UcEHxKrXMLpB3IL0or09sik=\n"
646 "id rsa1024 2A8wYpHxnkKJ92orocvIQBzeHlE\n"
649 #ifdef HAVE_CFLAG_WOVERLENGTH_STRINGS
650 ENABLE_GCC_WARNING(overlength
-strings
)
653 /** More tests for parsing different kinds of microdescriptors, and getting
654 * invalid digests trackd from them. */
656 test_md_parse(void *arg
)
659 char *mem_op_hex_tmp
= NULL
;
660 smartlist_t
*invalid
= smartlist_new();
662 smartlist_t
*mds
= microdescs_parse_from_string(MD_PARSE_TEST_DATA
,
663 NULL
, 1, SAVED_NOWHERE
,
665 tt_int_op(smartlist_len(mds
), OP_EQ
, 11);
666 tt_int_op(smartlist_len(invalid
), OP_EQ
, 4);
668 test_memeq_hex(smartlist_get(invalid
,0),
669 "5d76bf1c6614e885614a1e0ad074e1ab"
670 "4ea14655ebeefb1736a71b5ed8a15a51");
671 test_memeq_hex(smartlist_get(invalid
,1),
672 "2fde0ee3343669c2444cd9d53cbd39c6"
673 "a7d1fc0513513e840ca7f6e68864b36c");
674 test_memeq_hex(smartlist_get(invalid
,2),
675 "20d1576c5ab11bbcff0dedb1db4a3cfc"
676 "c8bc8dd839d8cbfef92d00a1a7d7b294");
677 test_memeq_hex(smartlist_get(invalid
,3),
678 "074770f394c73dbde7b44412e9692add"
679 "691a478d4727f9804b77646c95420a96");
681 /* Spot-check the valid ones. */
682 const microdesc_t
*md
= smartlist_get(mds
, 5);
683 test_memeq_hex(md
->digest
,
684 "54bb6d733ddeb375d2456c79ae103961"
685 "da0cae29620375ac4cf13d54da4d92b3");
686 tt_int_op(md
->last_listed
, OP_EQ
, 0);
687 tt_int_op(md
->saved_location
, OP_EQ
, SAVED_NOWHERE
);
688 tt_int_op(md
->no_save
, OP_EQ
, 0);
689 tt_uint_op(md
->held_in_map
, OP_EQ
, 0);
690 tt_uint_op(md
->held_by_nodes
, OP_EQ
, 0);
691 tt_assert(md
->onion_curve25519_pkey
);
693 md
= smartlist_get(mds
, 6);
694 test_memeq_hex(md
->digest
,
695 "53f740bd222ab37f19f604b1d3759aa6"
696 "5eff1fbce9ac254bd0fa50d4af9b1bae");
697 tt_assert(! md
->exit_policy
);
699 md
= smartlist_get(mds
, 8);
700 test_memeq_hex(md
->digest
,
701 "a0a155562d8093d8fd0feb7b93b7226e"
702 "17f056c2142aab7a4ea8c5867a0376d5");
703 tt_assert(md
->onion_curve25519_pkey
);
705 md
= smartlist_get(mds
, 10);
706 test_memeq_hex(md
->digest
,
707 "409ebd87d23925a2732bd467a92813c9"
708 "21ca378fcb9ca193d354c51550b6d5e9");
709 tt_assert(tor_addr_family(&md
->ipv6_addr
) == AF_INET6
);
710 tt_int_op(md
->ipv6_orport
, OP_EQ
, 9090);
713 SMARTLIST_FOREACH(mds
, microdesc_t
*, mdsc
, microdesc_free(mdsc
));
715 SMARTLIST_FOREACH(invalid
, char *, cp
, tor_free(cp
));
716 smartlist_free(invalid
);
717 tor_free(mem_op_hex_tmp
);
720 static int mock_rgsbd_called
= 0;
721 static routerstatus_t
*mock_rgsbd_val_a
= NULL
;
722 static routerstatus_t
*mock_rgsbd_val_b
= NULL
;
723 static routerstatus_t
*
724 mock_router_get_status_by_digest(networkstatus_t
*c
, const char *d
)
729 if (fast_memeq(d
, "\x5d\x76", 2)) {
730 memcpy(mock_rgsbd_val_a
->descriptor_digest
, d
, 32);
731 return mock_rgsbd_val_a
;
732 } else if (fast_memeq(d
, "\x20\xd1", 2)) {
733 memcpy(mock_rgsbd_val_b
->descriptor_digest
, d
, 32);
734 return mock_rgsbd_val_b
;
740 static networkstatus_t
*mock_ns_val
= NULL
;
741 static networkstatus_t
*
742 mock_ns_get_by_flavor(consensus_flavor_t f
)
749 test_md_reject_cache(void *arg
)
752 microdesc_cache_t
*mc
= NULL
;
753 smartlist_t
*added
= NULL
, *wanted
= smartlist_new();
754 or_options_t
*options
= get_options_mutable();
755 char buf
[DIGEST256_LEN
];
757 tor_free(options
->DataDirectory
);
758 options
->DataDirectory
= tor_strdup(get_fname("md_datadir_test_rej"));
759 mock_rgsbd_val_a
= tor_malloc_zero(sizeof(routerstatus_t
));
760 mock_rgsbd_val_b
= tor_malloc_zero(sizeof(routerstatus_t
));
761 mock_ns_val
= tor_malloc_zero(sizeof(networkstatus_t
));
763 mock_ns_val
->valid_after
= time(NULL
) - 86400;
764 mock_ns_val
->valid_until
= time(NULL
) + 86400;
765 mock_ns_val
->flavor
= FLAV_MICRODESC
;
768 tt_int_op(0, OP_EQ
, mkdir(options
->DataDirectory
));
770 tt_int_op(0, OP_EQ
, mkdir(options
->DataDirectory
, 0700));
773 MOCK(router_get_mutable_consensus_status_by_descriptor_digest
,
774 mock_router_get_status_by_digest
);
775 MOCK(networkstatus_get_latest_consensus_by_flavor
, mock_ns_get_by_flavor
);
777 mc
= get_microdesc_cache();
780 tt_int_op(sizeof(buf),OP_EQ,base16_decode(buf,sizeof(buf), \
782 smartlist_add(wanted, tor_memdup(buf, DIGEST256_LEN)); \
786 ADD("5d76bf1c6614e885614a1e0ad074e1ab4ea14655ebeefb1736a71b5ed8a15a51");
788 ADD("20d1576c5ab11bbcff0dedb1db4a3cfcc8bc8dd839d8cbfef92d00a1a7d7b294");
790 ADD("53f740bd222ab37f19f604b1d3759aa65eff1fbce9ac254bd0fa50d4af9b1bae");
792 ADD("a0a155562d8093d8fd0feb7b93b7226e17f056c2142aab7a4ea8c5867a0376d5");
794 added
= microdescs_add_to_cache(mc
, MD_PARSE_TEST_DATA
, NULL
,
795 SAVED_NOWHERE
, 0, time(NULL
), wanted
);
797 tt_int_op(smartlist_len(added
), OP_EQ
, 2);
798 tt_int_op(mock_rgsbd_called
, OP_EQ
, 2);
799 tt_int_op(mock_rgsbd_val_a
->dl_status
.n_download_failures
, OP_EQ
, 255);
800 tt_int_op(mock_rgsbd_val_b
->dl_status
.n_download_failures
, OP_EQ
, 255);
803 UNMOCK(networkstatus_get_latest_consensus_by_flavor
);
804 UNMOCK(router_get_mutable_consensus_status_by_descriptor_digest
);
805 tor_free(options
->DataDirectory
);
806 microdesc_free_all();
807 smartlist_free(added
);
808 SMARTLIST_FOREACH(wanted
, char *, cp
, tor_free(cp
));
809 smartlist_free(wanted
);
810 tor_free(mock_rgsbd_val_a
);
811 tor_free(mock_rgsbd_val_b
);
812 tor_free(mock_ns_val
);
816 test_md_corrupt_desc(void *arg
)
819 smartlist_t
*sl
= NULL
;
822 sl
= microdescs_add_to_cache(get_microdesc_cache(),
823 "@last-listed 2015-06-22 10:00:00\n"
825 NULL
, SAVED_IN_JOURNAL
, 0, time(NULL
), NULL
);
826 tt_int_op(smartlist_len(sl
), OP_EQ
, 0);
829 sl
= microdescs_add_to_cache(get_microdesc_cache(),
830 "@last-listed 2015-06-22 10:00:00\n"
832 NULL
, SAVED_IN_JOURNAL
, 0, time(NULL
), NULL
);
833 tt_int_op(smartlist_len(sl
), OP_EQ
, 0);
836 tor_asprintf(&cp
, "%s\n%s", test_md1
, "@foobar\nonion-wobble\n");
838 sl
= microdescs_add_to_cache(get_microdesc_cache(),
840 SAVED_IN_JOURNAL
, 0, time(NULL
), NULL
);
841 tt_int_op(smartlist_len(sl
), OP_EQ
, 0);
848 struct testcase_t microdesc_tests
[] = {
849 { "cache", test_md_cache
, TT_FORK
, NULL
, NULL
},
850 { "broken_cache", test_md_cache_broken
, TT_FORK
, NULL
, NULL
},
851 { "generate", test_md_generate
, 0, NULL
, NULL
},
852 { "parse", test_md_parse
, 0, NULL
, NULL
},
853 { "reject_cache", test_md_reject_cache
, TT_FORK
, NULL
, NULL
},
854 { "corrupt_desc", test_md_corrupt_desc
, TT_FORK
, NULL
, NULL
},