Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Commit

Permalink
votes_above_limit test
Browse files Browse the repository at this point in the history
  • Loading branch information
tdimitrov committed May 23, 2022
1 parent 46a6599 commit 48294e6
Showing 1 changed file with 85 additions and 34 deletions.
119 changes: 85 additions & 34 deletions node/core/provisioner/src/disputes/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,10 +113,8 @@ fn partitioning_happy_case() {
(4, CandidateHash(Hash::random()), DisputeStatus::ConcludedFor(0));
input.push(concluded_unknown_onchain.clone());

// partition
let result = partition_recent_disputes(input, &onchain);

// check results
assert_eq!(result.cant_conclude_onchain.len(), 1);
assert_eq!(
result.cant_conclude_onchain.get(0).unwrap(),
Expand Down Expand Up @@ -420,85 +418,85 @@ fn normal_flow() {
const DISPUTES_PER_BATCH: usize = 10;
const ACCEPTABLE_RUNTIME_VOTES_QUERIES_COUNT: usize = 1;

let mut disputes = TestDisputes::new(VALIDATOR_COUNT);
let mut input = TestDisputes::new(VALIDATOR_COUNT);

// active which can conclude onchain
let (third_idx, third_votes) =
disputes.add_active_disputes_which_can_conclude_onchain(DISPUTES_PER_BATCH);
input.add_active_disputes_which_can_conclude_onchain(DISPUTES_PER_BATCH);

// active which can't conclude onchain
let (first_idx, first_votes) =
disputes.add_active_disputes_which_cant_conclude_onchain(DISPUTES_PER_BATCH);
input.add_active_disputes_which_cant_conclude_onchain(DISPUTES_PER_BATCH);

//concluded disputes unknown onchain
let (fifth_idx, fifth_votes) =
disputes.add_concluded_disputes_unknown_onchain(DISPUTES_PER_BATCH);
input.add_concluded_disputes_unknown_onchain(DISPUTES_PER_BATCH);

// concluded disputes known onchain
let (fourth_idx, _) = disputes.add_concluded_disputes_known_onchain(DISPUTES_PER_BATCH);
let (fourth_idx, _) = input.add_concluded_disputes_known_onchain(DISPUTES_PER_BATCH);

// active disputes unknown onchain
let (second_idx, second_votes) =
disputes.add_active_disputes_unknown_onchain(DISPUTES_PER_BATCH);
input.add_active_disputes_unknown_onchain(DISPUTES_PER_BATCH);

let metrics = metrics::Metrics::new_dummy();
let mut vote_queries: usize = 0;
test_harness(
|r| mock_overseer(r, &mut disputes, &mut vote_queries),
|r| mock_overseer(r, &mut input, &mut vote_queries),
|mut tx: TestSubsystemSender| async move {
let lf = leaf();
let disputes = select_disputes(&mut tx, &metrics, &lf).await.unwrap();
let result = select_disputes(&mut tx, &metrics, &lf).await.unwrap();

assert!(!disputes.is_empty());
assert!(!result.is_empty());

if cfg!(feature = "staging-client") {
assert_eq!(disputes.len(), 4 * DISPUTES_PER_BATCH);
assert_eq!(result.len(), 4 * DISPUTES_PER_BATCH);
for i in 0..DISPUTES_PER_BATCH {
assert_eq!(disputes.get(i).unwrap().session, first_idx);
assert_eq!(result.get(i).unwrap().session, first_idx);
}
for i in DISPUTES_PER_BATCH..2 * DISPUTES_PER_BATCH {
assert_eq!(disputes.get(i).unwrap().session, second_idx);
assert_eq!(result.get(i).unwrap().session, second_idx);
}
for i in 2 * DISPUTES_PER_BATCH..3 * DISPUTES_PER_BATCH {
assert_eq!(disputes.get(i).unwrap().session, third_idx);
assert_eq!(result.get(i).unwrap().session, third_idx);
}
for i in 3 * DISPUTES_PER_BATCH..4 * DISPUTES_PER_BATCH {
assert_eq!(disputes.get(i).unwrap().session, fifth_idx);
assert_eq!(result.get(i).unwrap().session, fifth_idx);
}

assert_eq!(
disputes[0..DISPUTES_PER_BATCH]
result[0..DISPUTES_PER_BATCH]
.iter()
.map(|d| d.statements.len())
.fold(0, |acc, v| acc + v),
first_votes
);
assert_eq!(
disputes[DISPUTES_PER_BATCH..2 * DISPUTES_PER_BATCH]
result[DISPUTES_PER_BATCH..2 * DISPUTES_PER_BATCH]
.iter()
.map(|d| d.statements.len())
.fold(0, |acc, v| acc + v),
second_votes
);
assert_eq!(
disputes[2 * DISPUTES_PER_BATCH..3 * DISPUTES_PER_BATCH]
result[2 * DISPUTES_PER_BATCH..3 * DISPUTES_PER_BATCH]
.iter()
.map(|d| d.statements.len())
.fold(0, |acc, v| acc + v),
third_votes
);
assert_eq!(
disputes[3 * DISPUTES_PER_BATCH..4 * DISPUTES_PER_BATCH]
result[3 * DISPUTES_PER_BATCH..4 * DISPUTES_PER_BATCH]
.iter()
.map(|d| d.statements.len())
.fold(0, |acc, v| acc + v),
fifth_votes
);
} else {
assert_eq!(disputes.len(), 5 * DISPUTES_PER_BATCH);
assert_eq!(result.len(), 5 * DISPUTES_PER_BATCH);
for i in 0..3 * DISPUTES_PER_BATCH {
assert_ne!(disputes.get(i).unwrap().session, fourth_idx);
assert_ne!(disputes.get(i).unwrap().session, fifth_idx);
assert_ne!(result.get(i).unwrap().session, fourth_idx);
assert_ne!(result.get(i).unwrap().session, fifth_idx);
}
}
},
Expand All @@ -513,34 +511,35 @@ fn many_batches() {
// Around 4_000 disputes are generated. `BATCH_SIZE` is 1_100.
const ACCEPTABLE_RUNTIME_VOTES_QUERIES_COUNT: usize = 4;

let mut disputes = TestDisputes::new(VALIDATOR_COUNT);
let mut input = TestDisputes::new(VALIDATOR_COUNT);

// active which can conclude onchain
disputes.add_active_disputes_which_can_conclude_onchain(DISPUTES_PER_PARTITION);
input.add_active_disputes_which_can_conclude_onchain(DISPUTES_PER_PARTITION);

// active which can't conclude onchain
disputes.add_active_disputes_which_cant_conclude_onchain(DISPUTES_PER_PARTITION);
input.add_active_disputes_which_cant_conclude_onchain(DISPUTES_PER_PARTITION);

//concluded disputes unknown onchain
disputes.add_concluded_disputes_unknown_onchain(DISPUTES_PER_PARTITION);
input.add_concluded_disputes_unknown_onchain(DISPUTES_PER_PARTITION);

// concluded disputes known onchain
disputes.add_concluded_disputes_known_onchain(DISPUTES_PER_PARTITION);
input.add_concluded_disputes_known_onchain(DISPUTES_PER_PARTITION);

// active disputes unknown onchain
disputes.add_active_disputes_unknown_onchain(DISPUTES_PER_PARTITION);
input.add_active_disputes_unknown_onchain(DISPUTES_PER_PARTITION);

let metrics = metrics::Metrics::new_dummy();
let mut vote_queries: usize = 0;
test_harness(
|r| mock_overseer(r, &mut disputes, &mut vote_queries),
|r| mock_overseer(r, &mut input, &mut vote_queries),
|mut tx: TestSubsystemSender| async move {
let lf = leaf();
let disputes = select_disputes(&mut tx, &metrics, &lf).await.unwrap();
let result = select_disputes(&mut tx, &metrics, &lf).await.unwrap();

assert!(!disputes.is_empty());
assert!(!result.is_empty());

let vote_count = disputes.iter().map(|d| d.statements.len()).fold(0, |acc, v| acc + v);
let vote_count =
result.iter().map(|d| d.statements.len()).fold(0, |acc, v| acc + v);

assert!(
MAX_DISPUTE_VOTES_FORWARDED_TO_RUNTIME - VALIDATOR_COUNT <= vote_count &&
Expand All @@ -560,4 +559,56 @@ fn many_batches() {
}

#[test]
fn votes_above_limit() {}
fn votes_above_limit() {
const VALIDATOR_COUNT: usize = 100;
const DISPUTES_PER_PARTITION: usize = 5_000;
const ACCEPTABLE_RUNTIME_VOTES_QUERIES_COUNT: usize = 4;

let mut input = TestDisputes::new(VALIDATOR_COUNT);

// active which can conclude onchain
let (_, second_votes) =
input.add_active_disputes_which_can_conclude_onchain(DISPUTES_PER_PARTITION);

// active which can't conclude onchain
let (_, first_votes) =
input.add_active_disputes_which_cant_conclude_onchain(DISPUTES_PER_PARTITION);

//concluded disputes unknown onchain
let (_, third_votes) = input.add_concluded_disputes_unknown_onchain(DISPUTES_PER_PARTITION);

assert!(
first_votes + second_votes + third_votes > 3 * MAX_DISPUTE_VOTES_FORWARDED_TO_RUNTIME,
"Total relevant votes generated: {}",
first_votes + second_votes + third_votes
);

let metrics = metrics::Metrics::new_dummy();
let mut vote_queries: usize = 0;
test_harness(
|r| mock_overseer(r, &mut input, &mut vote_queries),
|mut tx: TestSubsystemSender| async move {
let lf = leaf();
let result = select_disputes(&mut tx, &metrics, &lf).await.unwrap();

assert!(!result.is_empty());

let vote_count =
result.iter().map(|d| d.statements.len()).fold(0, |acc, v| acc + v);

assert!(
MAX_DISPUTE_VOTES_FORWARDED_TO_RUNTIME - VALIDATOR_COUNT <= vote_count &&
vote_count <= MAX_DISPUTE_VOTES_FORWARDED_TO_RUNTIME,
"vote_count: {}",
vote_count
);
},
);

assert!(
vote_queries <= ACCEPTABLE_RUNTIME_VOTES_QUERIES_COUNT,
"vote_queries: {} ACCEPTABLE_RUNTIME_VOTES_QUERIES_COUNT: {}",
vote_queries,
ACCEPTABLE_RUNTIME_VOTES_QUERIES_COUNT
);
}

0 comments on commit 48294e6

Please sign in to comment.