From 5eadf3cde330b0af0304ac3b4dd1e3beb2c481a4 Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Tue, 20 Aug 2019 00:48:21 +0200 Subject: [PATCH] Testcase for reading block from file --- Cargo.toml | 1 + src/network/stream_reader.rs | 51 +++++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0343fca9e0..26870cee84 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ version = "=0.3.2" [dev-dependencies] +tempfile = "3.1.0" serde_derive = "=1.0.98" serde_json = "1" serde_test = "1" diff --git a/src/network/stream_reader.rs b/src/network/stream_reader.rs index d7eaf08afe..ceddc1e8ec 100644 --- a/src/network/stream_reader.rs +++ b/src/network/stream_reader.rs @@ -21,8 +21,7 @@ //! use std::fmt; -use std::io; -use std::io::BufRead; +use std::io::{self, BufRead}; use consensus::{encode, Decodable}; @@ -82,11 +81,13 @@ impl StreamReader { } #[cfg(test)] -mod test { +extern crate tempfile; +#[cfg(test)] +mod test { use std::thread; use std::time::Duration; - use std::io::{self, BufReader, Write}; + use std::io::{self, BufReader, Write, Seek, SeekFrom}; use std::net::{TcpListener, TcpStream, Shutdown}; use std::thread::JoinHandle; @@ -312,4 +313,46 @@ mod test { // Waiting TCP server thread to terminate handle.join().unwrap(); } + + #[test] + fn read_block_from_file_test() { + use super::tempfile::tempfile; + use std::io::{self, Write}; + use consensus::serialize; + use hex::decode as hex_decode; + use Block; + + let normal_data = hex_decode("010000004ddccd549d28f385ab457e98d1b11ce80bfea2c5ab93015ade4973e400000000bf4473e53794beae34e64fccc471dace6ae544180816f89591894e0f417a914cd74d6e49ffff001d323b3a7b0201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d026e04ffffffff0100f2052a0100000043410446ef0102d1ec5240f0d061a4246c1bdef63fc3dbab7733052fbbf0ecd8f41fc26bf049ebb4f9527f374280259e7cfa99c48b0e3f39c51347a19a5819651503a5ac00000000010000000321f75f3139a013f50f315b23b0c9a2b6eac31e2bec98e5891c924664889942260000000049483045022100cb2c6b346a978ab8c61b18b5e9397755cbd17d6eb2fe0083ef32e067fa6c785a02206ce44e613f31d9a6b0517e46f3db1576e9812cc98d159bfdaf759a5014081b5c01ffffffff79cda0945903627c3da1f85fc95d0b8ee3e76ae0cfdc9a65d09744b1f8fc85430000000049483045022047957cdd957cfd0becd642f6b84d82f49b6cb4c51a91f49246908af7c3cfdf4a022100e96b46621f1bffcf5ea5982f88cef651e9354f5791602369bf5a82a6cd61a62501fffffffffe09f5fe3ffbf5ee97a54eb5e5069e9da6b4856ee86fc52938c2f979b0f38e82000000004847304402204165be9a4cbab8049e1af9723b96199bfd3e85f44c6b4c0177e3962686b26073022028f638da23fc003760861ad481ead4099312c60030d4cb57820ce4d33812a5ce01ffffffff01009d966b01000000434104ea1feff861b51fe3f5f8a3b12d0f4712db80e919548a80839fc47c6a21e66d957e9c5d8cd108c7a2d2324bad71f9904ac0ae7336507d785b17a2c115e427a32fac00000000").unwrap(); + let cutoff_data = hex_decode("010000004ddccd549d28f385ab457e98d1b11ce80bfea2c5ab93015ade4973e400000000bf4473e53794beae34e64fccc471dace6ae544180816f89591894e0f417a914cd74d6e49ffff001d323b3a7b0201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0804ffff001d026e04ffffffff0100f2052a0100000043410446ef0102d1ec5240f0d061a4246c1bdef63fc3dbab7733052fbbf0ecd8f41fc26bf049ebb4f9527f374280259e7cfa99c48b0e3f39c51347a19a5819651503a5ac00000000010000000321f75f3139a013f50f315b23b0c9a2b6eac31e2bec98e5891c924664889942260000000049483045022100cb2c6b346a978ab8c61b18b5e9397755cbd17d6eb2fe0083ef32e067fa6c785a02206ce44e613f31d9a6b0517e46f3db1576e9812cc98d159bfdaf759a5014081b5c01ffffffff79cda0945903627c3da1f85fc95d0b8ee3e76ae0cfdc9a65d09744b1f8fc85430000000049483045022047957cdd957cfd0becd642f6b84d82f49b6cb4c51a91f49246908af7c3cfdf4a022100e96b46621f1bffcf5ea5982f88cef651e9354f5791602369bf5a82a6cd61a62501fffffffffe09f5fe3ffbf5ee97a54eb5e5069e9da6b4856ee86fc52938c2f979b0f38e82000000004847304402204165be9a4cbab8049e1af9723b96199bfd3e85f44c6b4c0177e3962686b26073022028f638da23fc003760861ad481ead4099312c60030d4cb57820ce4d33812a5ce01ffffffff01009d966b01000000434104ea1feff861b51fe3f5f8a3b12d0f4712db80e919548a80839fc47c6a21e66d957e9c5d8cd108c7a2d2324bad71f9904ac0ae7336507d785b17a2c115e427a32fac").unwrap(); + let prevhash = hex_decode("4ddccd549d28f385ab457e98d1b11ce80bfea2c5ab93015ade4973e400000000").unwrap(); + let merkle = hex_decode("bf4473e53794beae34e64fccc471dace6ae544180816f89591894e0f417a914c").unwrap(); + + let mut normal_file = tempfile().unwrap(); + let mut cutoff_file = tempfile().unwrap(); + normal_file.write_all(&normal_data).unwrap(); + cutoff_file.write_all(&cutoff_data).unwrap(); + normal_file.seek(SeekFrom::Start(0)).unwrap(); + cutoff_file.seek(SeekFrom::Start(0)).unwrap(); + + let stream = io::BufReader::new(normal_file); + let mut reader = StreamReader::new(Box::new(stream), None); + let normal_block = reader.read_next::(); + + let stream = io::BufReader::new(cutoff_file); + let mut reader = StreamReader::new(Box::new(stream), None); + let cutoff_block = reader.read_next::(); + + assert!(normal_block.is_ok()); + assert!(cutoff_block.is_err()); + let block = normal_block.unwrap(); + assert_eq!(block.header.version, 1); + assert_eq!(serialize(&block.header.prev_blockhash), prevhash); + assert_eq!(serialize(&block.header.merkle_root), merkle); + assert_eq!(block.header.time, 1231965655); + assert_eq!(block.header.bits, 486604799); + assert_eq!(block.header.nonce, 2067413810); + + // should be also ok for a non-witness block as commitment is optional in that case + assert!(block.check_witness_commitment()); + } }