2019-10-11 23:51:17 +03:00
|
|
|
/*
|
|
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
|
|
*
|
|
|
|
* This software may be used and distributed according to the terms of the
|
|
|
|
* GNU General Public License found in the LICENSE file in the root
|
|
|
|
* directory of this source tree.
|
|
|
|
*/
|
2018-07-24 09:39:57 +03:00
|
|
|
|
|
|
|
#![deny(warnings)]
|
|
|
|
|
2018-08-06 20:31:41 +03:00
|
|
|
use fixtures::*;
|
2018-07-24 09:39:57 +03:00
|
|
|
|
|
|
|
// An extra level of nesting is required to avoid clashes between crate and module names.
|
|
|
|
mod test {
|
|
|
|
macro_rules! test_verify {
|
|
|
|
($repo:ident) => {
|
|
|
|
mod $repo {
|
|
|
|
use std::collections::HashSet;
|
|
|
|
|
2019-09-14 06:16:08 +03:00
|
|
|
use fbinit::FacebookInit;
|
2018-07-24 09:39:57 +03:00
|
|
|
use futures::{Future, Stream};
|
|
|
|
|
2018-08-02 22:25:23 +03:00
|
|
|
use blobrepo_utils::{BonsaiMFVerify, BonsaiMFVerifyResult};
|
2018-11-30 21:11:37 +03:00
|
|
|
use context::CoreContext;
|
2018-07-24 09:39:57 +03:00
|
|
|
|
2019-05-29 01:11:33 +03:00
|
|
|
use crate::$repo;
|
2018-07-24 09:39:57 +03:00
|
|
|
|
2019-09-14 06:16:08 +03:00
|
|
|
#[fbinit::test]
|
|
|
|
fn test(fb: FacebookInit) {
|
|
|
|
async_unit::tokio_unit_test(move || {
|
|
|
|
let ctx = CoreContext::test_mock(fb);
|
2018-07-24 09:39:57 +03:00
|
|
|
|
2019-09-14 06:16:08 +03:00
|
|
|
let repo = $repo::getrepo(fb);
|
2019-03-26 20:38:17 +03:00
|
|
|
let heads = repo.get_heads_maybe_stale(ctx.clone()).collect();
|
2018-07-24 09:39:57 +03:00
|
|
|
|
2018-08-02 22:25:23 +03:00
|
|
|
let verify = BonsaiMFVerify {
|
2018-12-04 22:28:47 +03:00
|
|
|
ctx: ctx.clone(),
|
2020-01-17 20:42:46 +03:00
|
|
|
logger: ctx.logger().clone(),
|
2018-07-24 09:39:57 +03:00
|
|
|
repo,
|
|
|
|
follow_limit: 1024,
|
|
|
|
ignores: HashSet::new(),
|
2018-07-30 07:07:52 +03:00
|
|
|
broken_merges_before: None,
|
2018-07-24 09:39:57 +03:00
|
|
|
debug_bonsai_diff: false,
|
|
|
|
};
|
2018-11-12 14:36:22 +03:00
|
|
|
|
|
|
|
let results = heads
|
|
|
|
.map_err(|err| panic!("cannot get the heads {}", err))
|
|
|
|
.and_then(|heads| verify.verify(heads).collect());
|
|
|
|
tokio::spawn(
|
|
|
|
results
|
2018-12-04 22:28:47 +03:00
|
|
|
.and_then(move |results| {
|
2019-03-26 20:38:17 +03:00
|
|
|
let diffs = results.into_iter().filter_map(
|
|
|
|
move |(res, meta)| match res {
|
2018-11-12 14:36:22 +03:00
|
|
|
BonsaiMFVerifyResult::Invalid(difference) => {
|
|
|
|
let cs_id = meta.changeset_id;
|
2019-03-26 20:38:17 +03:00
|
|
|
Some(
|
|
|
|
difference
|
|
|
|
.changes(ctx.clone())
|
|
|
|
.collect()
|
|
|
|
.map(move |changes| (cs_id, changes)),
|
|
|
|
)
|
2018-11-12 14:36:22 +03:00
|
|
|
}
|
|
|
|
_ => None,
|
2019-03-26 20:38:17 +03:00
|
|
|
},
|
|
|
|
);
|
2018-11-12 14:36:22 +03:00
|
|
|
|
|
|
|
futures::future::join_all(diffs)
|
|
|
|
})
|
|
|
|
.map(|diffs| {
|
|
|
|
let mut failed = false;
|
|
|
|
let mut desc = Vec::new();
|
|
|
|
for (changeset_id, changes) in diffs {
|
|
|
|
failed = true;
|
|
|
|
desc.push(format!(
|
|
|
|
"*** Inconsistent roundtrip for {}",
|
|
|
|
changeset_id,
|
|
|
|
));
|
|
|
|
for changed_entry in changes {
|
2019-03-26 20:38:17 +03:00
|
|
|
desc.push(format!(
|
|
|
|
" - Changed entry: {:?}",
|
|
|
|
changed_entry
|
|
|
|
));
|
2018-11-12 14:36:22 +03:00
|
|
|
}
|
|
|
|
desc.push("".to_string());
|
|
|
|
}
|
|
|
|
let desc = desc.join("\n");
|
|
|
|
if failed {
|
2019-03-26 20:38:17 +03:00
|
|
|
panic!(
|
|
|
|
"Inconsistencies detected, roundtrip test failed\n\n{}",
|
|
|
|
desc
|
|
|
|
);
|
2018-11-12 14:36:22 +03:00
|
|
|
}
|
|
|
|
})
|
|
|
|
.map_err(|err| {
|
|
|
|
panic!("verify error {}", err);
|
2019-03-26 20:38:17 +03:00
|
|
|
}),
|
2018-11-12 14:36:22 +03:00
|
|
|
);
|
2018-07-24 09:39:57 +03:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
2019-03-26 20:38:17 +03:00
|
|
|
};
|
2018-07-24 09:39:57 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
test_verify!(branch_even);
|
|
|
|
test_verify!(branch_uneven);
|
|
|
|
test_verify!(branch_wide);
|
|
|
|
test_verify!(linear);
|
|
|
|
test_verify!(merge_even);
|
|
|
|
test_verify!(merge_uneven);
|
|
|
|
test_verify!(unshared_merge_even);
|
|
|
|
test_verify!(unshared_merge_uneven);
|
|
|
|
}
|