use blvm_consensus::serialization::varint::decode_varint;
use blvm_consensus::serialization::{deserialize_block_header, deserialize_transaction};
use blvm_consensus::*;
#[test]
fn test_varint_truncated_data() {
assert!(decode_varint(&[]).is_err());
assert!(decode_varint(&[0xfd]).is_err());
assert!(decode_varint(&[0xfd, 0]).is_err());
assert!(decode_varint(&[0xfe]).is_err());
assert!(decode_varint(&[0xfe, 0, 0, 0]).is_err());
assert!(decode_varint(&[0xff]).is_err());
assert!(decode_varint(&[0xff, 0, 0, 0, 0, 0, 0, 0]).is_err());
}
#[test]
fn test_transaction_truncated_data() {
assert!(deserialize_transaction(&[]).is_err());
assert!(deserialize_transaction(&[0, 0, 0]).is_err());
assert!(deserialize_transaction(&[0, 0, 0, 0]).is_err());
assert!(deserialize_transaction(&[0, 0, 0, 0, 0xfd]).is_err());
assert!(deserialize_transaction(&[0, 0, 0, 0, 0xfd, 0]).is_err());
assert!(deserialize_transaction(&[0, 0, 0, 0, 1]).is_err());
let mut data = vec![0, 0, 0, 0, 1]; data.extend_from_slice(&[0; 31]); assert!(deserialize_transaction(&data).is_err());
}
#[test]
fn test_transaction_invalid_length_fields() {
let mut data = vec![0, 0, 0, 0]; data.push(1); data.extend_from_slice(&[0; 32]); data.extend_from_slice(&[0, 0, 0, 0]); data.push(0xff); data.extend_from_slice(&[255, 255, 255, 255, 255, 255, 255, 255]); assert!(deserialize_transaction(&data).is_err());
let mut data = vec![0, 0, 0, 0]; data.push(1); data.extend_from_slice(&[0; 32]); data.extend_from_slice(&[0, 0, 0, 0]); data.push(0); data.extend_from_slice(&[0, 0, 0, 0]); data.push(1); data.extend_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0]); data.push(0); data.extend_from_slice(&[0, 0, 0, 0]);
let result = deserialize_transaction(&data);
assert!(result.is_ok());
}
#[test]
fn test_block_header_truncated_data() {
assert!(deserialize_block_header(&[]).is_err());
assert!(deserialize_block_header(&[0; 40]).is_err());
assert!(deserialize_block_header(&[0; 79]).is_err());
assert!(deserialize_block_header(&[0; 80]).is_ok());
}
#[test]
fn test_transaction_negative_input_count() {
let mut data = vec![0, 0, 0, 0]; data.push(0xff); data.extend_from_slice(&[255, 255, 255, 255, 255, 255, 255, 255]);
let result = deserialize_transaction(&data);
assert!(result.is_err());
}
#[test]
fn test_transaction_negative_output_count() {
let mut data = vec![0, 0, 0, 0]; data.push(0); data.push(0xff); data.extend_from_slice(&[255, 255, 255, 255, 255, 255, 255, 255]);
let result = deserialize_transaction(&data);
assert!(result.is_err());
}
#[test]
fn test_transaction_malformed_prevout_hash() {
let mut data = vec![0, 0, 0, 0]; data.push(1); data.extend_from_slice(&[0xff; 32]); data.extend_from_slice(&[0, 0, 0, 0]); data.push(0); data.extend_from_slice(&[0, 0, 0, 0]); data.push(1); data.extend_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0]); data.push(0); data.extend_from_slice(&[0, 0, 0, 0]);
assert!(deserialize_transaction(&data).is_ok());
}
#[test]
fn test_transaction_malformed_script_length() {
let mut data = vec![0, 0, 0, 0]; data.push(1); data.extend_from_slice(&[0; 32]); data.extend_from_slice(&[0, 0, 0, 0]); data.push(0xfd); data.push(252); data.push(0);
assert!(deserialize_transaction(&data).is_err());
}
#[test]
fn test_block_header_malformed_timestamp() {
let mut header = vec![0; 80];
header[68] = 0xff;
header[69] = 0xff;
header[70] = 0xff;
header[71] = 0xff;
assert!(deserialize_block_header(&header).is_ok());
}
#[test]
fn test_transaction_empty_after_version() {
let data = vec![0, 0, 0, 0];
assert!(deserialize_transaction(&data).is_err());
}
#[test]
#[ignore = "deserialize_transaction currently accepts truncated output value; parser strictness TBD"]
fn test_transaction_incomplete_output() {
let mut data = vec![0, 0, 0, 0]; data.push(0); data.push(1); data.extend_from_slice(&[0, 0, 0, 0, 0, 0, 0]);
assert!(deserialize_transaction(&data).is_err());
}
#[test]
fn test_transaction_incomplete_lock_time() {
let mut data = vec![0, 0, 0, 0]; data.push(0); data.push(0); data.extend_from_slice(&[0, 0, 0]);
assert!(deserialize_transaction(&data).is_err());
}