diff --git a/crates/primitives/src/blob.rs b/crates/primitives/src/blob.rs index 61207a80..d4229021 100644 --- a/crates/primitives/src/blob.rs +++ b/crates/primitives/src/blob.rs @@ -193,3 +193,99 @@ impl BlobData { Err(anyhow::anyhow!("No data found")) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_is_empty() { + let blob_data = BlobData::default(); + assert!(blob_data.is_empty()); + } + + #[test] + fn test_reassemble_bytes() { + let blob_data = BlobData::default(); + let mut output = vec![0u8; 128]; + let encoded_byte = [0x00, 0x00, 0x00, 0x00]; + let output_pos = blob_data.reassemble_bytes(127, &encoded_byte, &mut output); + assert_eq!(output_pos, 126); + assert_eq!(output, vec![0u8; 128]); + } + + #[test] + fn test_cannot_fill_empty_calldata() { + let mut blob_data = BlobData { calldata: Some(Bytes::new()), ..Default::default() }; + let blobs = vec![Blob::with_last_byte(1u8)]; + assert_eq!(blob_data.fill(&blobs, 0), Ok(())); + } + + #[test] + fn test_fill_oob_index() { + let mut blob_data = BlobData::default(); + let blobs = vec![Blob::with_last_byte(1u8)]; + assert_eq!(blob_data.fill(&blobs, 1), Err(BlobDecodingError::InvalidLength)); + } + + #[test] + #[ignore] + fn test_fill_empty_blob() { + let mut blob_data = BlobData::default(); + let blobs = vec![Blob::ZERO]; + assert_eq!(blob_data.fill(&blobs, 0), Err(BlobDecodingError::MissingData)); + } + + #[test] + fn test_fill_blob() { + let mut blob_data = BlobData::default(); + let blobs = vec![Blob::with_last_byte(1u8)]; + assert_eq!(blob_data.fill(&blobs, 0), Ok(())); + let expected = Bytes::from([&[0u8; 131071][..], &[1u8]].concat()); + assert_eq!(blob_data.data, Some(expected)); + } + + #[test] + fn test_not_empty() { + let mut blob_data = + BlobData { data: Some(Bytes::from(vec![1u8; 32])), ..Default::default() }; + assert!(!blob_data.is_empty()); + blob_data.data = None; + blob_data.calldata = Some(Bytes::from(vec![1u8; 32])); + assert!(!blob_data.is_empty()); + } + + #[test] + fn test_inner() { + let blob_data = BlobData { data: Some(Bytes::from(vec![1u8; 32])), ..Default::default() }; + assert_eq!(blob_data.inner().unwrap(), Bytes::from(vec![1u8; 32])); + let blob_data = + BlobData { calldata: Some(Bytes::from(vec![1u8; 32])), ..Default::default() }; + assert_eq!(blob_data.inner().unwrap(), Bytes::from(vec![1u8; 32])); + let blob_data = BlobData::default(); + assert!(blob_data.inner().is_err()); + } + + #[test] + fn test_blob_data_decode_missing_data() { + let blob_data = BlobData::default(); + assert_eq!(blob_data.decode(), Err(BlobDecodingError::MissingData)); + } + + #[test] + fn test_blob_data_decode_invalid_encoding_version() { + let blob_data = BlobData { data: Some(Bytes::from(vec![1u8; 32])), ..Default::default() }; + assert_eq!(blob_data.decode(), Err(BlobDecodingError::InvalidEncodingVersion)); + } + + #[test] + fn test_blob_data_decode_invalid_length() { + let mut data = vec![0u8; 32]; + data[VERSIONED_HASH_VERSION_KZG as usize] = BLOB_ENCODING_VERSION; + data[2] = 0xFF; + data[3] = 0xFF; + data[4] = 0xFF; + let blob_data = BlobData { data: Some(Bytes::from(data)), ..Default::default() }; + assert_eq!(blob_data.decode(), Err(BlobDecodingError::InvalidLength)); + } +}