Skip to content

Commit d48915e

Browse files
committed
test(ledger/block): add tests for deserializing genesis bytes with test_targets enabled
1 parent 822a6d9 commit d48915e

File tree

5 files changed

+108
-13
lines changed

5 files changed

+108
-13
lines changed

console/network/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,9 @@ pub trait Network:
298298
fn INCLUSION_UPGRADE_HEIGHT() -> Result<u32>;
299299

300300
/// Returns the genesis block bytes.
301+
///
302+
/// Note, that this always returns the bytes of the production genesis block.
303+
/// As a result, this may not match the bytes of the genesis block with the `test_targets` feature enabled.
301304
fn genesis_bytes() -> &'static [u8];
302305

303306
/// Returns the restrictions list as a JSON-compatible string.

ledger/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ test-helpers = [
8484
]
8585
test_targets = [
8686
"snarkvm-console/test_targets",
87+
"snarkvm-ledger-block/test_targets",
8788
]
8889
timer = [ "aleo-std/timer" ]
8990

ledger/block/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ wasm = [
3636
]
3737
test = [ "snarkvm-synthesizer-process/test" ]
3838
test-helpers = [ ]
39+
test_targets = [ "snarkvm-console/test_targets" ]
3940

4041
[dependencies.snarkvm-console]
4142
workspace = true

ledger/block/src/bytes.rs

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,7 @@ impl<N: Network> ToBytes for Block<N> {
152152
#[cfg(test)]
153153
mod tests {
154154
use super::*;
155-
use console::network::MainnetV0;
156-
157-
type CurrentNetwork = MainnetV0;
155+
use console::network::{MainnetV0, TestnetV0};
158156

159157
#[test]
160158
fn test_bytes() -> Result<()> {
@@ -170,28 +168,58 @@ mod tests {
170168
}
171169

172170
#[test]
173-
fn test_genesis_bytes() -> Result<()> {
171+
fn test_genesis_bytes_mainnet_unchecked() -> Result<()> {
174172
// Load the genesis block.
175-
let genesis_block = Block::<CurrentNetwork>::read_le(CurrentNetwork::genesis_bytes()).unwrap();
173+
let genesis_block = Block::<MainnetV0>::read_le_unchecked(MainnetV0::genesis_bytes()).unwrap();
176174

177175
// Check the byte representation.
178176
let expected_bytes = genesis_block.to_bytes_le()?;
179-
assert_eq!(genesis_block, Block::read_le(&expected_bytes[..])?);
180177
assert_eq!(genesis_block, Block::read_le_unchecked(&expected_bytes[..])?);
181178

182179
Ok(())
183180
}
184181

185182
#[test]
186-
fn test_bincode() -> Result<()> {
183+
fn test_genesis_bytes_testnet_unchecked() -> Result<()> {
187184
// Load the genesis block.
188-
let genesis_block = Block::<CurrentNetwork>::read_le(CurrentNetwork::genesis_bytes()).unwrap();
185+
let genesis_block = Block::<TestnetV0>::read_le_unchecked(TestnetV0::genesis_bytes()).unwrap();
189186

190-
let bincode_data = bincode::serialize(&genesis_block)?;
191-
let block = bincode::deserialize(&bincode_data)?;
187+
// Check the byte representation.
188+
let expected_bytes = genesis_block.to_bytes_le()?;
189+
assert_eq!(genesis_block, Block::read_le_unchecked(&expected_bytes[..])?);
192190

193-
assert_eq!(genesis_block, block);
191+
Ok(())
192+
}
193+
194+
#[test]
195+
fn test_genesis_bytes_mainnet() -> Result<()> {
196+
// Load the genesis block.
197+
let genesis_block = Block::<MainnetV0>::read_le(MainnetV0::genesis_bytes()).unwrap();
198+
199+
// Check the byte representation.
200+
let expected_bytes = genesis_block.to_bytes_le()?;
201+
assert_eq!(genesis_block, Block::read_le(&expected_bytes[..])?);
202+
assert_eq!(genesis_block, Block::read_le_unchecked(&expected_bytes[..])?);
194203

195204
Ok(())
196205
}
206+
207+
// When `test_targets` is enabled, the gensis bytes do not match the expected coinbase target.
208+
// (except for Mainnet which ignores this feature)
209+
#[cfg(not(feature = "test_targets"))]
210+
mod production {
211+
use super::*;
212+
#[test]
213+
fn test_genesis_bytes_testnet() -> Result<()> {
214+
// Load the genesis block.
215+
let genesis_block = Block::<TestnetV0>::read_le(TestnetV0::genesis_bytes()).unwrap();
216+
217+
// Check the byte representation.
218+
let expected_bytes = genesis_block.to_bytes_le()?;
219+
assert_eq!(genesis_block, Block::read_le(&expected_bytes[..])?);
220+
assert_eq!(genesis_block, Block::read_le_unchecked(&expected_bytes[..])?);
221+
222+
Ok(())
223+
}
224+
}
197225
}

ledger/block/src/serialize.rs

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,47 @@ mod tests {
125125
}
126126

127127
#[test]
128-
fn test_genesis_bincode() -> Result<()> {
128+
fn test_genesis_bincode_unchecked_mainnet() -> Result<()> {
129+
let genesis_block = Block::<MainnetV0>::read_le_unchecked(MainnetV0::genesis_bytes()).unwrap();
130+
131+
// Serialize
132+
let expected_bytes = genesis_block.to_bytes_le()?;
133+
let expected_bytes_with_size_encoding = bincode::serialize(&genesis_block)?;
134+
assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
135+
136+
// Deserialize
137+
assert_eq!(genesis_block, Block::read_le_unchecked(&expected_bytes[..])?);
138+
assert_eq!(
139+
genesis_block,
140+
snarkvm_utilities::bytes::unchecked_deserialize(&expected_bytes_with_size_encoding[..])?
141+
);
142+
143+
Ok(())
144+
}
145+
146+
#[test]
147+
fn test_genesis_bincode_unchecked_testnet() -> Result<()> {
148+
let genesis_block = Block::<TestnetV0>::read_le_unchecked(TestnetV0::genesis_bytes()).unwrap();
149+
150+
// Serialize
151+
let expected_bytes = genesis_block.to_bytes_le()?;
152+
let expected_bytes_with_size_encoding = bincode::serialize(&genesis_block)?;
153+
assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
154+
155+
// Deserialize
156+
assert_eq!(genesis_block, Block::read_le_unchecked(&expected_bytes[..])?);
157+
assert_eq!(
158+
genesis_block,
159+
snarkvm_utilities::bytes::unchecked_deserialize(&expected_bytes_with_size_encoding[..])?
160+
);
161+
162+
Ok(())
163+
}
164+
165+
#[test]
166+
fn test_genesis_bincode_mainnet() -> Result<()> {
129167
// Load the genesis block.
130-
let genesis_block = Block::<CurrentNetwork>::read_le(CurrentNetwork::genesis_bytes()).unwrap();
168+
let genesis_block = Block::<MainnetV0>::read_le(MainnetV0::genesis_bytes()).unwrap();
131169

132170
// Serialize
133171
let expected_bytes = genesis_block.to_bytes_le()?;
@@ -140,4 +178,28 @@ mod tests {
140178

141179
Ok(())
142180
}
181+
182+
// When `test_targets` is enabled, the gensis bytes do not match the expected coinbase target.
183+
// (except for Mainnet which ignores this feature)
184+
#[cfg(not(feature = "test_targets"))]
185+
mod production {
186+
use super::*;
187+
188+
#[test]
189+
fn test_genesis_bincode_testnet() -> Result<()> {
190+
// Load the genesis block.
191+
let genesis_block = Block::<TestnetV0>::read_le(TestnetV0::genesis_bytes()).unwrap();
192+
193+
// Serialize
194+
let expected_bytes = genesis_block.to_bytes_le()?;
195+
let expected_bytes_with_size_encoding = bincode::serialize(&genesis_block)?;
196+
assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
197+
198+
// Deserialize
199+
assert_eq!(genesis_block, Block::read_le(&expected_bytes[..])?);
200+
assert_eq!(genesis_block, bincode::deserialize(&expected_bytes_with_size_encoding[..])?);
201+
202+
Ok(())
203+
}
204+
}
143205
}

0 commit comments

Comments
 (0)