Skip to content

Commit 6e62960

Browse files
committed
crc: add unit test for BurnChain factory methods and nakamoto cycle boundaries, #5970
1 parent b87f8ff commit 6e62960

File tree

1 file changed

+130
-0
lines changed

1 file changed

+130
-0
lines changed

stackslib/src/burnchains/burnchain.rs

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1773,3 +1773,133 @@ impl Burnchain {
17731773
Ok(block_header)
17741774
}
17751775
}
1776+
1777+
#[cfg(test)]
1778+
mod tests {
1779+
use super::*;
1780+
use crate::burnchains::*;
1781+
use regex::Regex;
1782+
1783+
#[test]
1784+
fn test_creation_by_new_for_bitcoin_mainnet() {
1785+
let burn_chain = Burnchain::new("workdir/path", "bitcoin", "mainnet");
1786+
assert!(burn_chain.is_ok());
1787+
1788+
let burn_chain = burn_chain.unwrap();
1789+
let first_block_hash = BurnchainHeaderHash::from_hex(BITCOIN_MAINNET_FIRST_BLOCK_HASH).unwrap();
1790+
assert_eq!(PEER_VERSION_MAINNET, burn_chain.peer_version);
1791+
assert_eq!(BITCOIN_NETWORK_ID_MAINNET, burn_chain.network_id);
1792+
assert_eq!(BITCOIN_MAINNET_NAME, burn_chain.network_name);
1793+
assert_eq!("workdir/path", burn_chain.working_dir);
1794+
assert_eq!(24, burn_chain.consensus_hash_lifetime);
1795+
assert_eq!(7, burn_chain.stable_confirmations);
1796+
assert_eq!(BITCOIN_MAINNET_FIRST_BLOCK_HEIGHT, burn_chain.first_block_height);
1797+
assert_eq!(first_block_hash, burn_chain.first_block_hash);
1798+
assert_eq!(BITCOIN_MAINNET_FIRST_BLOCK_TIMESTAMP, burn_chain.first_block_timestamp);
1799+
assert_eq!(PoxConstants::mainnet_default(), burn_chain.pox_constants);
1800+
assert_eq!(BITCOIN_MAINNET_INITIAL_REWARD_START_BLOCK, burn_chain.initial_reward_start_block);
1801+
}
1802+
1803+
#[test]
1804+
fn test_creation_by_new_for_bitcoin_testnet() {
1805+
let burn_chain = Burnchain::new("workdir/path", "bitcoin", "testnet");
1806+
assert!(burn_chain.is_ok());
1807+
1808+
let burn_chain = burn_chain.unwrap();
1809+
let first_block_hash = BurnchainHeaderHash::from_hex(BITCOIN_TESTNET_FIRST_BLOCK_HASH).unwrap();
1810+
assert_eq!(PEER_VERSION_TESTNET, burn_chain.peer_version);
1811+
assert_eq!(BITCOIN_NETWORK_ID_TESTNET, burn_chain.network_id);
1812+
assert_eq!(BITCOIN_TESTNET_NAME, burn_chain.network_name);
1813+
assert_eq!("workdir/path", burn_chain.working_dir);
1814+
assert_eq!(24, burn_chain.consensus_hash_lifetime);
1815+
assert_eq!(7, burn_chain.stable_confirmations);
1816+
assert_eq!(BITCOIN_TESTNET_FIRST_BLOCK_HEIGHT, burn_chain.first_block_height);
1817+
assert_eq!(first_block_hash, burn_chain.first_block_hash);
1818+
assert_eq!(BITCOIN_TESTNET_FIRST_BLOCK_TIMESTAMP, burn_chain.first_block_timestamp);
1819+
assert_eq!(PoxConstants::testnet_default(), burn_chain.pox_constants);
1820+
assert_eq!(1_990_000, burn_chain.initial_reward_start_block);
1821+
}
1822+
1823+
#[test]
1824+
fn test_creation_by_new_for_bitcoin_regtest() {
1825+
let burn_chain = Burnchain::new("workdir/path", "bitcoin", "regtest");
1826+
assert!(burn_chain.is_ok());
1827+
1828+
let burn_chain = burn_chain.unwrap();
1829+
let first_block_hash = BurnchainHeaderHash::from_hex(BITCOIN_REGTEST_FIRST_BLOCK_HASH).unwrap();
1830+
assert_eq!(PEER_VERSION_TESTNET, burn_chain.peer_version);
1831+
assert_eq!(BITCOIN_NETWORK_ID_REGTEST, burn_chain.network_id);
1832+
assert_eq!(BITCOIN_REGTEST_NAME, burn_chain.network_name);
1833+
assert_eq!("workdir/path", burn_chain.working_dir);
1834+
assert_eq!(24, burn_chain.consensus_hash_lifetime);
1835+
assert_eq!(1, burn_chain.stable_confirmations);
1836+
assert_eq!(BITCOIN_REGTEST_FIRST_BLOCK_HEIGHT, burn_chain.first_block_height);
1837+
assert_eq!(first_block_hash, burn_chain.first_block_hash);
1838+
assert_eq!(BITCOIN_REGTEST_FIRST_BLOCK_TIMESTAMP, burn_chain.first_block_timestamp);
1839+
assert_eq!(PoxConstants::regtest_default(), burn_chain.pox_constants);
1840+
assert_eq!(BITCOIN_REGTEST_FIRST_BLOCK_HEIGHT, burn_chain.initial_reward_start_block);
1841+
}
1842+
1843+
#[test]
1844+
fn test_creation_by_new_failure() {
1845+
//case: wrong chain name
1846+
let burn_chain = Burnchain::new("workdir/path", "wrong_chain_name", "regtest");
1847+
assert!(burn_chain.is_err());
1848+
assert!(matches!(burn_chain.unwrap_err(), burnchain_error::UnsupportedBurnchain));
1849+
1850+
//case: wrong network name
1851+
let burn_chain = Burnchain::new("workdir/path", "bitcoin", "wrong_net_name");
1852+
assert!(burn_chain.is_err());
1853+
assert!(matches!(burn_chain.unwrap_err(), burnchain_error::UnsupportedBurnchain));
1854+
1855+
//case: wrong chain name + wrong network name
1856+
let burn_chain = Burnchain::new("workdir/path", "wrong_chain_name", "wrong_net_name");
1857+
assert!(burn_chain.is_err());
1858+
assert!(matches!(burn_chain.unwrap_err(), burnchain_error::UnsupportedBurnchain));
1859+
}
1860+
1861+
#[test]
1862+
fn test_creation_by_default_unittest() {
1863+
let first_block_height = 0;
1864+
let first_block_hash = BurnchainHeaderHash([0u8; 32]);
1865+
let burn_chain = Burnchain::default_unittest(first_block_height, &first_block_hash);
1866+
1867+
let workdir_re = Regex::new(r"^/tmp/stacks-node-tests/unit-tests-[0-9a-f]{32}$").unwrap();
1868+
1869+
assert_eq!(PEER_VERSION_MAINNET, burn_chain.peer_version);
1870+
assert_eq!(BITCOIN_NETWORK_ID_MAINNET, burn_chain.network_id);
1871+
assert_eq!(BITCOIN_MAINNET_NAME, burn_chain.network_name);
1872+
assert!(workdir_re.is_match(&burn_chain.working_dir));
1873+
assert_eq!(24, burn_chain.consensus_hash_lifetime);
1874+
assert_eq!(7, burn_chain.stable_confirmations);
1875+
assert_eq!(first_block_height, burn_chain.first_block_height);
1876+
assert_eq!(first_block_hash, burn_chain.first_block_hash);
1877+
assert_eq!(BITCOIN_MAINNET_FIRST_BLOCK_TIMESTAMP, burn_chain.first_block_timestamp);
1878+
assert_eq!(PoxConstants::mainnet_default(), burn_chain.pox_constants);
1879+
assert_eq!(first_block_height, burn_chain.initial_reward_start_block);
1880+
}
1881+
1882+
#[test]
1883+
fn test_nakamoto_reward_cycle_boundaries() {
1884+
let first_block_height = 0;
1885+
let first_block_hash = BurnchainHeaderHash([0u8; 32]);
1886+
let burn_chain = Burnchain::default_unittest(first_block_height, &first_block_hash);
1887+
1888+
//making obvious the reward cycle length used
1889+
assert_eq!(2100, burn_chain.pox_constants.reward_cycle_length);
1890+
1891+
//Reward Cycle: 0
1892+
let rc = 0;
1893+
let rc_first_block = burn_chain.nakamoto_first_block_of_cycle(rc);
1894+
let rc_last_block = burn_chain.nakamoto_last_block_of_cycle(rc);
1895+
assert_eq!(0, rc_first_block);
1896+
assert_eq!(2099, rc_last_block);
1897+
1898+
//Reward Cycle: 1
1899+
let rc = 1;
1900+
let rc_first_block = burn_chain.nakamoto_first_block_of_cycle(rc);
1901+
let rc_last_block = burn_chain.nakamoto_last_block_of_cycle(rc);
1902+
assert_eq!(2100, rc_first_block);
1903+
assert_eq!(4199, rc_last_block);
1904+
}
1905+
}

0 commit comments

Comments
 (0)