Skip to content

Commit 6ac4778

Browse files
starknet_os_flow_tests: implement virtual OS output validation. (#11468)
1 parent ab45b45 commit 6ac4778

File tree

3 files changed

+72
-8
lines changed

3 files changed

+72
-8
lines changed

crates/starknet_os_flow_tests/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ pub(crate) mod test_manager;
66
pub(crate) mod tests;
77
pub(crate) mod utils;
88
pub(crate) mod virtual_os_test;
9+
pub(crate) mod virtual_os_test_manager;

crates/starknet_os_flow_tests/src/virtual_os_test.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ use blockifier_test_utils::cairo_versions::{CairoVersion, RunnableCairo1};
22
use blockifier_test_utils::calldata::create_calldata;
33
use blockifier_test_utils::contracts::FeatureContract;
44
use rstest::rstest;
5+
use starknet_api::core::EthAddress;
6+
use starknet_api::transaction::{L2ToL1Payload, MessageToL1};
57
use starknet_api::{calldata, invoke_tx_args};
6-
use starknet_os::runner::run_virtual_os;
78
use starknet_types_core::felt::Felt;
89

910
use crate::test_manager::TestBuilder;
10-
use crate::tests::NON_TRIVIAL_RESOURCE_BOUNDS;
1111

1212
#[rstest]
1313
#[tokio::test]
@@ -18,12 +18,19 @@ async fn test_basic_happy_flow() {
1818
TestBuilder::create_standard_virtual([(test_contract, calldata![Felt::ONE, Felt::TWO])])
1919
.await;
2020

21-
let calldata = create_calldata(contract_address, "test_storage_read", &[Felt::ONE]);
22-
test_builder.add_funded_account_invoke(
23-
invoke_tx_args! { calldata, resource_bounds: *NON_TRIVIAL_RESOURCE_BOUNDS },
21+
let to_address = Felt::from(85);
22+
let payload = vec![Felt::from(12), Felt::from(34)];
23+
let calldata = create_calldata(
24+
contract_address,
25+
"test_send_message_to_l1",
26+
&[to_address, Felt::from(payload.len()), payload[0], payload[1]],
2427
);
28+
test_builder.add_funded_account_invoke(invoke_tx_args! { calldata });
29+
test_builder.messages_to_l1.push(MessageToL1 {
30+
from_address: contract_address,
31+
to_address: EthAddress::try_from(to_address).unwrap(),
32+
payload: L2ToL1Payload(payload),
33+
});
2534

26-
let test_runner = test_builder.build().await;
27-
// TODO(Yoni): add running and verification logic to test_manager.rs.
28-
run_virtual_os(test_runner.os_hints).unwrap();
35+
test_builder.build().await.run_virtual_and_validate();
2936
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
use starknet_os::io::virtual_os_output::{VirtualOsOutput, VirtualOsRunnerOutput};
2+
use starknet_os::runner::run_virtual_os;
3+
use starknet_types_core::felt::Felt;
4+
5+
use crate::initial_state::FlowTestState;
6+
use crate::test_manager::TestRunner;
7+
8+
/// The output of running the virtual OS for testing.
9+
pub(crate) struct VirtualOsTestOutput {
10+
/// The raw runner output from the virtual OS.
11+
pub(crate) runner_output: VirtualOsRunnerOutput,
12+
/// The expected values computed from the OS hints.
13+
pub(crate) expected_virtual_os_output: VirtualOsOutput,
14+
// TODO(Yoni): consider adding more data for sanity checks, such as the expected state diff.
15+
}
16+
17+
impl VirtualOsTestOutput {
18+
/// Validates the runner output against the expected values.
19+
pub(crate) fn validate(&self) {
20+
let virtual_os_output = VirtualOsOutput::from_raw_output(&self.runner_output.raw_output)
21+
.expect("Parsing virtual OS output should not fail.");
22+
23+
assert_eq!(virtual_os_output, self.expected_virtual_os_output);
24+
}
25+
}
26+
27+
impl<S: FlowTestState> TestRunner<S> {
28+
/// Runs the virtual OS and returns the test output.
29+
pub(crate) fn run_virtual(self) -> VirtualOsTestOutput {
30+
// Create expected values before running the virtual OS (os_hints is consumed).
31+
let first_block = self.os_hints.os_input.os_block_inputs.first().unwrap();
32+
// The virtual os does support state diff encryption.
33+
let public_keys = None;
34+
let config_hash =
35+
self.os_hints.os_hints_config.chain_info.compute_os_config_hash(public_keys).unwrap();
36+
37+
let expected_virtual_os_output = VirtualOsOutput {
38+
version: Felt::ZERO,
39+
base_block_number: first_block.block_info.block_number,
40+
base_block_hash: first_block.new_block_hash.0,
41+
starknet_os_config_hash: config_hash,
42+
messages_to_l1: self.messages_to_l1,
43+
};
44+
45+
// Run the virtual OS.
46+
let runner_output =
47+
run_virtual_os(self.os_hints).expect("Running virtual OS should not fail.");
48+
49+
VirtualOsTestOutput { runner_output, expected_virtual_os_output }
50+
}
51+
52+
/// Runs the virtual OS and validates the output against expected values.
53+
pub(crate) fn run_virtual_and_validate(self) {
54+
self.run_virtual().validate();
55+
}
56+
}

0 commit comments

Comments
 (0)