GuardMgr: Tests for note_external_{success,failure}.

This commit is contained in:
Nick Mathewson 2022-04-05 10:01:30 -04:00
parent 3ba9b47000
commit 3b32e635cd
1 changed files with 57 additions and 0 deletions

View File

@ -1316,4 +1316,61 @@ mod test {
assert_eq!(guard.id().as_ref().rsa.as_bytes()[0] % 4, 0);
});
}
#[test]
fn external_status() {
use tor_linkspec::ChanTarget;
test_with_all_runtimes!(|rt| async move {
let (guardmgr, _statemgr, netdir) = init(rt);
let data_usage = GuardUsage::default();
let dir_usage = GuardUsageBuilder::new()
.kind(GuardUsageKind::OneHopDirectory)
.build()
.unwrap();
guardmgr.update_network(&netdir);
{
// Override this parameter, so that we can get deterministic results below.
let mut inner = guardmgr.inner.lock().unwrap();
inner.params.dir_parallelism = 1;
}
let (guard, mon, _usable) = guardmgr
.select_guard(data_usage.clone(), Some(&netdir))
.unwrap();
mon.succeeded();
// Record that this guard gave us a bad directory object.
guardmgr.note_external_failure(
guard.ed_identity(),
guard.rsa_identity(),
ExternalActivity::DirCache,
);
// We ask for another guard, for data usage. We should get the same
// one as last time, since the director failure doesn't mean this
// guard is useless as a primary guard.
let (g2, mon, _usable) = guardmgr.select_guard(data_usage, Some(&netdir)).unwrap();
assert_eq!(g2.ed_identity(), guard.ed_identity());
mon.succeeded();
// But if we ask for a guard for directory usage, we should get a
// different one, since the last guard we gave out failed.
let (g3, mon, _usable) = guardmgr
.select_guard(dir_usage.clone(), Some(&netdir))
.unwrap();
assert_ne!(g3.ed_identity(), guard.ed_identity());
mon.succeeded();
// Now record a success for for directory usage.
guardmgr.note_external_success(
guard.ed_identity(),
guard.rsa_identity(),
ExternalActivity::DirCache,
);
// Now that the guard is working as a cache, asking for it should get us the same guard.
let (g4, _mon, _usable) = guardmgr.select_guard(dir_usage, Some(&netdir)).unwrap();
assert_eq!(g4.ed_identity(), guard.ed_identity());
});
}
}