@@ -35,14 +35,18 @@ use crate::special_contracts::{
3535 DEPLOYABLE_FOR_RESOURCE_MEASUREMENT_CONTRACT_CASM ,
3636 DEPLOYABLE_FOR_RESOURCE_MEASUREMENT_CONTRACT_SIERRA ,
3737} ;
38- use crate :: test_manager:: { TestBuilder , TestBuilderConfig , FUNDED_ACCOUNT_ADDRESS } ;
38+ use crate :: test_manager:: {
39+ EventPredicateExpectation ,
40+ TestBuilder ,
41+ TestBuilderConfig ,
42+ FUNDED_ACCOUNT_ADDRESS ,
43+ } ;
3944use crate :: tests:: NON_TRIVIAL_RESOURCE_BOUNDS ;
4045
4146// TODO(Dori): Delete this, or at least reduce it to a minimal set of unmeasurable syscalls.
42- const UNMEASURABLE_SYSCALLS : [ Selector ; 32 ] = [
47+ const UNMEASURABLE_SYSCALLS : [ Selector ; 31 ] = [
4348 Selector :: DelegateCall ,
4449 Selector :: DelegateL1Handler ,
45- Selector :: EmitEvent ,
4650 Selector :: GetBlockHash ,
4751 Selector :: GetBlockNumber ,
4852 Selector :: GetBlockTimestamp ,
@@ -191,7 +195,19 @@ async fn test_os_resources_regression() {
191195 & test_builder. chain_id ( ) ,
192196 )
193197 . unwrap ( ) ;
194- test_builder. add_invoke_tx ( tx, None , None ) ;
198+ test_builder. add_invoke_tx (
199+ tx,
200+ None ,
201+ // Expect one event from the emit-event syscall measurement.
202+ Some ( vec ! [ EventPredicateExpectation {
203+ description: "emit event syscall" . to_string( ) ,
204+ predicate: Box :: new( move |event| {
205+ event. from_address == os_resources_contract_address
206+ && event. content. keys[ 0 ] . 0 == Felt :: from( 5 )
207+ && event. content. data. 0 [ 0 ] == Felt :: from( 7 )
208+ } ) ,
209+ } ] ) ,
210+ ) ;
195211
196212 // Run test. Grab the execution info from the runner (for later) before consuming it.
197213 let test_runner = test_builder. build ( ) . await ;
@@ -212,9 +228,25 @@ async fn test_os_resources_regression() {
212228 let test_output = test_runner. run ( ) ;
213229 test_output. perform_default_validations ( ) ;
214230
215- // Extract syscall resources consumed per syscall.
216231 let mut inner_calls_iter = inner_calls. into_iter ( ) ;
217- let syscall_traces = test_output. runner_output . txs_trace . last ( ) . unwrap ( ) . get_syscalls ( ) ;
232+
233+ // Extract syscall resources consumed per syscall.
234+ // There should be two events emitted: the first is the syscall we are measuring, and the second
235+ // is the last syscall in the tx, emitted from the fee transfer. Pop the second event.
236+ let mut syscall_traces =
237+ test_output. runner_output . txs_trace . last ( ) . unwrap ( ) . get_syscalls ( ) . clone ( ) ;
238+ assert ! ( !UNMEASURABLE_SYSCALLS . contains( & Selector :: EmitEvent ) ) ;
239+ assert_eq ! (
240+ syscall_traces
241+ . iter( )
242+ . filter( |syscall_trace| syscall_trace. get_selector( ) == Selector :: EmitEvent )
243+ . count( ) ,
244+ 2
245+ ) ;
246+ assert_eq ! ( syscall_traces. pop( ) . unwrap( ) . get_selector( ) , Selector :: EmitEvent ) ;
247+
248+ // Measure each syscall overhead. If the syscall incurs an inner call, subtract the inner call
249+ // overhead.
218250 let mut syscalls_iter = syscall_traces
219251 . iter ( )
220252 . filter ( |syscall_trace| !UNMEASURABLE_SYSCALLS . contains ( & syscall_trace. get_selector ( ) ) ) ;
@@ -223,18 +255,19 @@ async fn test_os_resources_regression() {
223255 let mut maybe_deduct_inner =
224256 |total : ExecutionResources , selector : Selector | -> ExecutionResources {
225257 // We assume no inner calls have nested inner calls (all inner calls are leaves).
226- if selector. is_calling_syscall ( ) {
258+ ( if selector. is_calling_syscall ( ) {
227259 // TODO(Dori): Take opcodes (like blake) into account, instead of using the
228260 // vm_resources field.
229261 // TODO(Dori): Consider supporting memory-hole counting in the OsLogger. Until then,
230262 // we cannot subtract inner calls with positive memory-hole counts from the
231263 // OsLogger resources.
232264 let mut to_deduct = inner_calls_iter. next ( ) . unwrap ( ) . resources . vm_resources ;
233265 to_deduct. n_memory_holes = 0 ;
234- ( & total - & to_deduct) . filter_unused_builtins ( )
266+ & total - & to_deduct
235267 } else {
236268 total
237- }
269+ } )
270+ . filter_unused_builtins ( )
238271 } ;
239272 while let Some ( syscall_trace) = syscalls_iter. next ( ) {
240273 let selector = syscall_trace. get_selector ( ) ;
0 commit comments