3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
34using namespace simulation;
35using ::testing::Return;
36using ::testing::ReturnRef;
37using ::testing::StrictMock;
38using tracegen::DataCopyTraceBuilder;
39using tracegen::ExecutionTraceBuilder;
40using tracegen::TestTraceContainer;
46class DataCopyConstrainingBuilderTest :
public ::testing::Test {
48 DataCopyConstrainingBuilderTest() { EXPECT_CALL(context, get_memory).WillRepeatedly(ReturnRef(mem)); }
52 RangeCheck
range_check = RangeCheck(range_check_event_emitter);
55 GreaterThan
gt = GreaterThan(mock_field_gt, range_check, gt_event_emitter);
57 DataCopy
copy_data = DataCopy(execution_id_manager, gt, event_emitter);
64 const std::vector<FF>
data = { 1, 2, 3, 4, 5, 6, 7, 8 };
67class NestedCdConstrainingBuilderTest :
public DataCopyConstrainingBuilderTest {
69 NestedCdConstrainingBuilderTest()
72 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
true));
73 EXPECT_CALL(context, get_parent_id).WillRepeatedly(Return(1));
74 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(2));
75 EXPECT_CALL(context, get_parent_cd_size).WillRepeatedly(Return(
data.size()));
76 EXPECT_CALL(context, get_parent_cd_addr).WillRepeatedly(Return(0));
80TEST_F(NestedCdConstrainingBuilderTest, CdZeroCopy)
82 uint32_t copy_size = 0;
85 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(::testing::Return(std::vector<FF>{}));
89 tracegen::DataCopyTraceBuilder
builder;
95 check_relation<data_copy>(
trace);
103TEST_F(NestedCdConstrainingBuilderTest, SimpleNestedCdCopy)
105 uint32_t copy_size =
static_cast<uint32_t
>(
data.size());
108 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(Return(
data));
118 check_relation<data_copy>(
trace);
126TEST_F(NestedCdConstrainingBuilderTest, NestedCdCopyPadded)
130 std::vector<FF> result_cd =
data;
131 ASSERT_LT(result_cd.size(), 10);
132 result_cd.resize(10, 0);
133 uint32_t copy_size =
static_cast<uint32_t
>(result_cd.size());
135 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(Return(result_cd));
145 check_relation<data_copy>(
trace);
153TEST_F(NestedCdConstrainingBuilderTest, NestedCdCopyPartial)
161 EXPECT_CALL(context, get_calldata(
offset, size)).WillOnce(Return(result_cd));
171 check_relation<data_copy>(
trace);
179TEST_F(NestedCdConstrainingBuilderTest, OutofRangeError)
193 check_relation<data_copy>(
trace);
201class EnqueuedCdConstrainingBuilderTest :
public DataCopyConstrainingBuilderTest {
203 EnqueuedCdConstrainingBuilderTest()
206 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
false));
207 EXPECT_CALL(context, get_parent_id).WillRepeatedly(Return(0));
208 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(1));
209 EXPECT_CALL(context, get_parent_cd_size).WillRepeatedly(Return(
data.size()));
210 EXPECT_CALL(context, get_parent_cd_addr).WillRepeatedly(Return(0));
213 tracegen::CalldataTraceBuilder calldata_builder;
214 CalldataEvent cd_event = {
216 .calldata_size =
static_cast<uint32_t
>(
data.size()),
219 calldata_builder.process_retrieval({ cd_event },
trace);
223TEST_F(EnqueuedCdConstrainingBuilderTest, CdZeroCopy)
225 uint32_t copy_size = 0;
228 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(::testing::Return(std::vector<FF>{}));
232 tracegen::DataCopyTraceBuilder
builder;
238 check_relation<data_copy>(
trace);
239 check_all_interactions<DataCopyTraceBuilder>(
trace);
242TEST_F(EnqueuedCdConstrainingBuilderTest, SimpleEnqueuedCdCopy)
244 auto copy_size =
static_cast<uint32_t
>(
data.size());
247 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(Return(
data));
257 check_relation<data_copy>(
trace);
258 check_all_interactions<DataCopyTraceBuilder>(
trace);
261TEST_F(EnqueuedCdConstrainingBuilderTest, EnqueuedCallCdCopyPadding)
264 std::vector<FF> result_cd =
data;
265 ASSERT_LT(result_cd.size(), 10);
266 result_cd.resize(10, 0);
267 auto copy_size =
static_cast<uint32_t
>(result_cd.size());
269 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(Return(result_cd));
279 check_relation<data_copy>(
trace);
280 check_all_interactions<DataCopyTraceBuilder>(
trace);
283TEST_F(EnqueuedCdConstrainingBuilderTest, EnqueuedCallCdCopyPartial)
291 EXPECT_CALL(context, get_calldata(
offset, size)).WillOnce(Return(result_cd));
301 check_relation<data_copy>(
trace);
302 check_all_interactions<DataCopyTraceBuilder>(
trace);
305class EnqueuedEmptyCdConstrainingBuilderTest :
public DataCopyConstrainingBuilderTest {
307 EnqueuedEmptyCdConstrainingBuilderTest()
310 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
false));
311 EXPECT_CALL(context, get_parent_id).WillRepeatedly(Return(0));
312 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(1));
313 EXPECT_CALL(context, get_parent_cd_size).WillRepeatedly(Return(0));
314 EXPECT_CALL(context, get_parent_cd_addr).WillRepeatedly(Return(0));
317 tracegen::CalldataTraceBuilder calldata_builder;
318 CalldataEvent cd_event = {
323 calldata_builder.process_retrieval({ cd_event },
trace);
327TEST_F(EnqueuedEmptyCdConstrainingBuilderTest, CdZeroCopy)
329 uint32_t copy_size = 0;
332 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(::testing::Return(std::vector<FF>{}));
336 tracegen::DataCopyTraceBuilder
builder;
342 check_relation<data_copy>(
trace);
343 check_all_interactions<DataCopyTraceBuilder>(
trace);
346TEST_F(EnqueuedEmptyCdConstrainingBuilderTest, SimpleEnqueuedCdCopy)
348 uint32_t copy_size = 4;
351 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(Return(std::vector<FF>{ 0, 0, 0, 0 }));
361 check_relation<data_copy>(
trace);
362 check_all_interactions<DataCopyTraceBuilder>(
trace);
365TEST_F(EnqueuedEmptyCdConstrainingBuilderTest, EnqueuedCallCdCopyPadding)
368 std::vector<FF> result_cd = {};
369 result_cd.resize(10, 0);
370 auto copy_size =
static_cast<uint32_t
>(result_cd.size());
372 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(Return(result_cd));
382 check_relation<data_copy>(
trace);
383 check_all_interactions<DataCopyTraceBuilder>(
trace);
390TEST(DataCopyWithExecutionPerm, CdCopy)
395 uint32_t copy_size = 4;
398 uint32_t parent_context_id = 99;
400 const std::vector<FF>
data = { 8, 7, 6, 5, 4, 3, 2, 1 };
410 StrictMock<MockContext>
context;
411 EXPECT_CALL(context, get_memory).WillRepeatedly(ReturnRef(
mem));
412 EXPECT_CALL(context, get_parent_cd_size).WillRepeatedly(Return(
data.size()));
413 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
true));
414 EXPECT_CALL(context, get_parent_cd_addr).WillRepeatedly(Return(
parent_cd_addr));
415 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size))
416 .WillRepeatedly(::testing::Invoke([&
data,
cd_offset, copy_size]() {
420 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(
context_id));
421 EXPECT_CALL(context, get_parent_id).WillRepeatedly(Return(parent_context_id));
428 TestTraceContainer
trace({
430 { C::precomputed_first_row, 1 },
431 { C::execution_sel, 1 },
433 { C::execution_parent_id, parent_context_id },
434 { C::execution_sel_exec_dispatch_calldata_copy, 1 },
435 { C::execution_register_0_, copy_size },
438 { C::execution_sel_opcode_error, 0 },
440 { C::execution_parent_calldata_size,
static_cast<uint32_t
>(
data.size()) },
449 check_relation<data_copy>(
trace);
455class NestedRdConstrainingBuilderTest :
public DataCopyConstrainingBuilderTest {
457 NestedRdConstrainingBuilderTest()
460 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
true));
461 EXPECT_CALL(context, get_last_child_id).WillRepeatedly(Return(2));
462 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(2));
463 EXPECT_CALL(context, get_last_rd_size).WillRepeatedly(Return(
data.size()));
464 EXPECT_CALL(context, get_last_rd_addr).WillRepeatedly(Return(0));
468TEST_F(NestedRdConstrainingBuilderTest, RdZeroCopy)
470 uint32_t copy_size = 0;
471 uint32_t rd_offset = 0;
473 EXPECT_CALL(context, get_returndata(rd_offset, copy_size)).WillOnce(::testing::Return(std::vector<FF>{}));
477 tracegen::DataCopyTraceBuilder
builder;
483 check_relation<data_copy>(
trace);
484 check_all_interactions<DataCopyTraceBuilder>(
trace);
487TEST(DataCopyWithExecutionPerm, RdCopy)
491 uint32_t rd_offset = 3;
492 uint32_t copy_size = 4;
497 const std::vector<FF>
data = { 1, 2, 3, 4, 5, 6, 7, 8 };
504 StrictMock<MockContext>
context;
505 EXPECT_CALL(context, get_memory).WillRepeatedly(ReturnRef(
mem));
506 EXPECT_CALL(context, get_last_rd_size).WillRepeatedly(Return(
data.size()));
507 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
true));
508 EXPECT_CALL(context, get_last_rd_addr).WillRepeatedly(Return(
child_rd_addr));
509 EXPECT_CALL(context, get_returndata(rd_offset, copy_size))
510 .WillRepeatedly(::testing::Invoke([&
data, rd_offset, copy_size]() {
512 return std::vector<FF>(
data.begin() + rd_offset,
data.begin() + rd_offset + copy_size);
514 EXPECT_CALL(context, get_last_child_id).WillRepeatedly(Return(
child_context_id));
515 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(
context_id));
522 TestTraceContainer
trace({
524 { C::precomputed_first_row, 1 },
525 { C::execution_sel, 1 },
528 { C::execution_sel_exec_dispatch_returndata_copy, 1 },
529 { C::execution_register_0_, copy_size },
530 { C::execution_register_1_, rd_offset },
532 { C::execution_sel_opcode_error, 0 },
534 { C::execution_last_child_returndata_size,
static_cast<uint32_t
>(
data.size()) },
543 check_relation<data_copy>(
trace);
549TEST(DataCopyWithExecutionPerm, ErrorPropagation)
553 uint32_t rd_offset = 10;
554 uint32_t copy_size = 4;
560 uint32_t child_data_size = 10;
563 StrictMock<MockContext>
context;
564 EXPECT_CALL(context, get_memory).WillRepeatedly(ReturnRef(
mem));
565 EXPECT_CALL(context, get_last_rd_size).WillRepeatedly(Return(child_data_size));
566 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
true));
567 EXPECT_CALL(context, get_last_rd_addr).WillRepeatedly(Return(
child_rd_addr));
568 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(
context_id));
569 EXPECT_CALL(context, get_last_child_id).WillRepeatedly(Return(
child_context_id));
579 TestTraceContainer
trace({
581 { C::precomputed_first_row, 1 },
582 { C::execution_sel, 1 },
585 { C::execution_sel_exec_dispatch_returndata_copy, 1 },
586 { C::execution_register_0_, copy_size },
587 { C::execution_register_1_, rd_offset },
588 { C::execution_rop_2_, big_dst_addr },
589 { C::execution_sel_opcode_error, 1 },
591 { C::execution_last_child_returndata_size, child_data_size },
596 "Error during CD/RD copy");
601 check_relation<data_copy>(
trace);
#define AVM_HIGHEST_MEM_ADDRESS
void cd_copy(ContextInterface &context, const uint32_t cd_copy_size, const uint32_t cd_offset, const MemoryAddress dst_addr) override
Writes calldata into dst_addr. There is slight difference in how enqueued and nested contexts,...
void rd_copy(ContextInterface &context, const uint32_t rd_copy_size, const uint32_t rd_offset, const MemoryAddress dst_addr) override
Copies returndata from the last executed context to the dst_addr.
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::GreaterThanEvent >::Container &events, TraceContainer &trace)
GreaterThanTraceBuilder gt_builder
EventEmitter< GreaterThanEvent > gt_event_emitter
ExecutionIdManager execution_id_manager
EventEmitter< RangeCheckEvent > range_check_event_emitter
const std::vector< FF > data
StrictMock< MockFieldGreaterThan > mock_field_gt
EventEmitter< DataCopyEvent > event_emitter
StrictMock< MockContext > context
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST_F(AvmRecursiveTests, GoblinRecursion)
A test of the Goblinized AVM recursive verifier.
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
lookup_settings< lookup_data_copy_check_dst_addr_in_range_settings_ > lookup_data_copy_check_dst_addr_in_range_settings
permutation_settings< perm_execution_dispatch_to_cd_copy_settings_ > perm_execution_dispatch_to_cd_copy_settings
lookup_settings< lookup_data_copy_max_read_index_gt_settings_ > lookup_data_copy_max_read_index_gt_settings
lookup_settings< lookup_data_copy_check_src_addr_in_range_settings_ > lookup_data_copy_check_src_addr_in_range_settings
lookup_settings< lookup_data_copy_offset_gt_max_read_index_settings_ > lookup_data_copy_offset_gt_max_read_index_settings
permutation_settings< perm_execution_dispatch_to_rd_copy_settings_ > perm_execution_dispatch_to_rd_copy_settings
uint32_t child_context_id