forest/test_utils/
mod.rs

1// Copyright 2019-2025 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3
4use std::str::FromStr;
5
6use crate::{
7    blocks::{Ticket, VRFProof},
8    eth::EVMMethod,
9    message::SignedMessage,
10    shim::{
11        address::Address,
12        crypto::{SECP_SIG_LEN, Signature, SignatureType},
13        message::{Message, Message_v3},
14    },
15};
16use base64::{Engine, prelude::BASE64_STANDARD};
17
18/// Returns a Ticket to be used for testing
19pub fn construct_ticket() -> Ticket {
20    let vrf_result = VRFProof::new(BASE64_STANDARD.decode("lmRJLzDpuVA7cUELHTguK9SFf+IVOaySG8t/0IbVeHHm3VwxzSNhi1JStix7REw6Apu6rcJQV1aBBkd39gQGxP8Abzj8YXH+RdSD5RV50OJHi35f3ixR0uhkY6+G08vV").unwrap());
21    Ticket::new(vrf_result)
22}
23
24/// Returns a tuple of unsigned and signed messages used for testing
25pub fn construct_messages() -> (Message, SignedMessage) {
26    let bls_messages: Message = Message_v3 {
27        to: Address::new_id(1).into(),
28        from: Address::new_id(2).into(),
29        ..Message_v3::default()
30    }
31    .into();
32
33    let secp_messages =
34        SignedMessage::new_unchecked(bls_messages.clone(), Signature::new_secp256k1(vec![0]));
35    (bls_messages, secp_messages)
36}
37
38/// Returns a tuple of unsigned and BLS-signed messages used for testing
39pub fn construct_bls_messages() -> (Message, SignedMessage) {
40    let message: Message = Message_v3 {
41        to: Address::new_id(1).into(),
42        from: Address::new_id(2).into(),
43        ..Message_v3::default()
44    }
45    .into();
46
47    let bls_message = SignedMessage::new_unchecked(message.clone(), Signature::new_bls(vec![0]));
48    (message, bls_message)
49}
50
51/// Returns a tuple of unsigned and signed messages used for testing the Ethereum mapping
52pub fn construct_eth_messages(sequence: u64) -> (Message, SignedMessage) {
53    let mut eth_message: Message = Message_v3 {
54        to: Address::from_str("t410foy6ucbmuujaequ3zsdo6nsubyogp6vtk23t4odq")
55            .unwrap()
56            .into(),
57        from: Address::from_str("t410fse4uvumo6ko46igb6lshg3peztqs3h6755vommy")
58            .unwrap()
59            .into(),
60        ..Message_v3::default()
61    }
62    .into();
63    eth_message.method_num = EVMMethod::InvokeContract as u64;
64    eth_message.sequence = sequence;
65
66    let secp_message = SignedMessage::new_unchecked(
67        eth_message.clone(),
68        Signature::new(SignatureType::Delegated, vec![0; SECP_SIG_LEN]),
69    );
70
71    (eth_message, secp_message)
72}
73
74// Serialize macro used for testing
75#[macro_export]
76macro_rules! to_string_with {
77    ($obj:expr, $serializer:path) => {{
78        let mut writer = Vec::new();
79        $serializer($obj, &mut serde_json::ser::Serializer::new(&mut writer)).unwrap();
80        String::from_utf8(writer).unwrap()
81    }};
82}
83
84// Deserialize macro used for testing
85#[macro_export]
86macro_rules! from_str_with {
87    ($str:expr, $deserializer:path) => {
88        $deserializer(&mut serde_json::de::Deserializer::from_str($str)).unwrap()
89    };
90}