pub(crate) use self::{
core::MIN_LEVEL_WHEN_FULL,
network_knowledge::{
peer::UnnamedPeer, section_keys::SectionKeyShare, SectionAuthorityProvider,
},
};
pub use self::{
dkg::SectionAuthUtils,
error::{Error, Result},
network_knowledge::{
node_state::{FIRST_SECTION_MAX_AGE, FIRST_SECTION_MIN_AGE, MIN_ADULT_AGE, MIN_AGE},
peer::Peer,
},
routing_api::{
config::Config,
event::{Elders, Event, MessageReceived, NodeElderChange},
event_stream::EventStream,
Routing,
},
};
pub use qp2p::{Config as NetworkConfig, SendStream};
pub use xor_name::{Prefix, XorName, XOR_NAME_LEN};
#[cfg(any(test, feature = "test-utils"))]
pub use test_utils::*;
#[cfg(test)]
pub(crate) use dkg::test_utils::section_signed;
#[cfg(test)]
pub(crate) use network_knowledge::test_utils::gen_section_authority_provider;
pub mod log_markers;
mod core;
mod dkg;
mod ed25519;
mod error;
mod messages;
mod network_knowledge;
mod node;
mod relocation;
mod routing_api;
pub(crate) fn recommended_section_size() -> usize {
2 * crate::elder_count()
}
#[inline]
pub(crate) const fn supermajority(group_size: usize) -> usize {
1 + group_size * 2 / 3
}
#[cfg(any(test, feature = "test-utils"))]
mod test_utils {
use crate::dbs::UsedSpace;
use rand::{distributions::Alphanumeric, thread_rng, Rng};
use std::path::{Path, PathBuf};
use tempfile::tempdir;
const TEST_MAX_CAPACITY: u64 = 1024 * 1024;
pub fn create_test_used_space_and_root_storage() -> eyre::Result<(UsedSpace, PathBuf)> {
let used_space = UsedSpace::new(TEST_MAX_CAPACITY);
let random_filename: String = thread_rng().sample_iter(&Alphanumeric).take(15).collect();
let root_dir = tempdir().map_err(|e| eyre::eyre!(e.to_string()))?;
let storage_dir = Path::new(root_dir.path()).join(random_filename);
Ok((used_space, storage_dir))
}
}
#[cfg(test)]
mod tests {
use super::supermajority;
use proptest::prelude::*;
#[test]
fn supermajority_of_small_group() {
assert_eq!(supermajority(0), 1);
assert_eq!(supermajority(1), 1);
assert_eq!(supermajority(2), 2);
assert_eq!(supermajority(3), 3);
assert_eq!(supermajority(4), 3);
assert_eq!(supermajority(5), 4);
assert_eq!(supermajority(6), 5);
assert_eq!(supermajority(7), 5);
assert_eq!(supermajority(8), 6);
assert_eq!(supermajority(9), 7);
}
proptest! {
#[test]
fn proptest_supermajority(a in 0usize..10000) {
let n = 3 * a;
assert_eq!(supermajority(n), 2 * a + 1);
assert_eq!(supermajority(n + 1), 2 * a + 1);
assert_eq!(supermajority(n + 2), 2 * a + 2);
}
}
}