3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
32using namespace simulation;
33using ::testing::Return;
34using ::testing::ReturnRef;
35using ::testing::StrictMock;
36using tracegen::DataCopyTraceBuilder;
37using tracegen::TestTraceContainer;
43class DataCopyConstrainingBuilderTest :
public ::testing::Test {
45 DataCopyConstrainingBuilderTest() { EXPECT_CALL(context, get_memory).WillRepeatedly(ReturnRef(mem)); }
49 RangeCheck
range_check = RangeCheck(range_check_event_emitter);
52 GreaterThan
gt = GreaterThan(mock_field_gt, range_check, gt_event_emitter);
54 DataCopy
copy_data = DataCopy(execution_id_manager, gt, event_emitter);
61 const std::vector<FF>
data = { 1, 2, 3, 4, 5, 6, 7, 8 };
64class NestedCdConstrainingBuilderTest :
public DataCopyConstrainingBuilderTest {
66 NestedCdConstrainingBuilderTest()
69 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
true));
70 EXPECT_CALL(context, get_parent_id).WillRepeatedly(Return(1));
71 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(2));
72 EXPECT_CALL(context, get_parent_cd_size).WillRepeatedly(Return(
data.size()));
73 EXPECT_CALL(context, get_parent_cd_addr).WillRepeatedly(Return(0));
77TEST_F(NestedCdConstrainingBuilderTest, CdZeroCopy)
79 uint32_t copy_size = 0;
82 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(::testing::Return(std::vector<FF>{}));
86 tracegen::DataCopyTraceBuilder
builder;
92 check_relation<data_copy>(
trace);
100TEST_F(NestedCdConstrainingBuilderTest, SimpleNestedCdCopy)
102 uint32_t copy_size =
static_cast<uint32_t
>(
data.size());
105 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(Return(
data));
115 check_relation<data_copy>(
trace);
123TEST_F(NestedCdConstrainingBuilderTest, NestedCdCopyPadded)
127 std::vector<FF> result_cd =
data;
128 ASSERT_LT(result_cd.size(), 10);
129 result_cd.resize(10, 0);
130 uint32_t copy_size =
static_cast<uint32_t
>(result_cd.size());
132 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(Return(result_cd));
142 check_relation<data_copy>(
trace);
150TEST_F(NestedCdConstrainingBuilderTest, NestedCdCopyPartial)
158 EXPECT_CALL(context, get_calldata(
offset, size)).WillOnce(Return(result_cd));
168 check_relation<data_copy>(
trace);
176TEST_F(NestedCdConstrainingBuilderTest, OutofRangeError)
190 check_relation<data_copy>(
trace);
198class EnqueuedCdConstrainingBuilderTest :
public DataCopyConstrainingBuilderTest {
200 EnqueuedCdConstrainingBuilderTest()
203 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
false));
204 EXPECT_CALL(context, get_parent_id).WillRepeatedly(Return(0));
205 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(1));
206 EXPECT_CALL(context, get_parent_cd_size).WillRepeatedly(Return(
data.size()));
207 EXPECT_CALL(context, get_parent_cd_addr).WillRepeatedly(Return(0));
210 tracegen::CalldataTraceBuilder calldata_builder;
211 CalldataEvent cd_event = {
213 .calldata_length =
static_cast<uint32_t
>(
data.size()),
216 calldata_builder.process_retrieval({ cd_event },
trace);
220TEST_F(EnqueuedCdConstrainingBuilderTest, CdZeroCopy)
222 uint32_t copy_size = 0;
225 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(::testing::Return(std::vector<FF>{}));
229 tracegen::DataCopyTraceBuilder
builder;
235 check_relation<data_copy>(
trace);
243TEST_F(EnqueuedCdConstrainingBuilderTest, SimpleEnqueuedCdCopy)
245 auto copy_size =
static_cast<uint32_t
>(
data.size());
248 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(Return(
data));
258 check_relation<data_copy>(
trace);
267TEST_F(EnqueuedCdConstrainingBuilderTest, EnqueuedCallCdCopyPadding)
270 std::vector<FF> result_cd =
data;
271 ASSERT_LT(result_cd.size(), 10);
272 result_cd.resize(10, 0);
273 auto copy_size =
static_cast<uint32_t
>(result_cd.size());
275 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size)).WillOnce(Return(result_cd));
285 check_relation<data_copy>(
trace);
295TEST_F(EnqueuedCdConstrainingBuilderTest, EnqueuedCallCdCopyPartial)
303 EXPECT_CALL(context, get_calldata(
offset, size)).WillOnce(Return(result_cd));
313 check_relation<data_copy>(
trace);
327TEST(DataCopyWithExecutionPerm, CdCopy)
330 uint32_t context_id = 2;
332 uint32_t copy_size = 4;
335 uint32_t parent_context_id = 99;
337 const std::vector<FF>
data = { 8, 7, 6, 5, 4, 3, 2, 1 };
347 StrictMock<MockContext>
context;
348 EXPECT_CALL(context, get_memory).WillRepeatedly(ReturnRef(
mem));
349 EXPECT_CALL(context, get_parent_cd_size).WillRepeatedly(Return(
data.size()));
350 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
true));
351 EXPECT_CALL(context, get_parent_cd_addr).WillRepeatedly(Return(
parent_cd_addr));
352 EXPECT_CALL(context, get_calldata(
cd_offset, copy_size))
353 .WillRepeatedly(::testing::Invoke([&
data,
cd_offset, copy_size]() {
357 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(context_id));
358 EXPECT_CALL(context, get_parent_id).WillRepeatedly(Return(parent_context_id));
365 TestTraceContainer
trace({
367 { C::precomputed_first_row, 1 },
368 { C::execution_sel, 1 },
369 { C::execution_context_id, context_id },
370 { C::execution_parent_id, parent_context_id },
371 { C::execution_sel_execute_calldata_copy, 1 },
372 { C::execution_register_0_, copy_size },
375 { C::execution_sel_opcode_error, 0 },
377 { C::execution_parent_calldata_size,
static_cast<uint32_t
>(
data.size()) },
386 check_relation<data_copy>(
trace);
392class NestedRdConstrainingBuilderTest :
public DataCopyConstrainingBuilderTest {
394 NestedRdConstrainingBuilderTest()
397 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
true));
398 EXPECT_CALL(context, get_last_child_id).WillRepeatedly(Return(2));
399 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(2));
400 EXPECT_CALL(context, get_last_rd_size).WillRepeatedly(Return(
data.size()));
401 EXPECT_CALL(context, get_last_rd_addr).WillRepeatedly(Return(0));
405TEST_F(NestedRdConstrainingBuilderTest, RdZeroCopy)
407 uint32_t copy_size = 0;
408 uint32_t rd_offset = 0;
410 EXPECT_CALL(context, get_returndata(rd_offset, copy_size)).WillOnce(::testing::Return(std::vector<FF>{}));
414 tracegen::DataCopyTraceBuilder
builder;
420 check_relation<data_copy>(
trace);
428TEST(DataCopyWithExecutionPerm, RdCopy)
431 uint32_t context_id = 2;
432 uint32_t rd_offset = 3;
433 uint32_t copy_size = 4;
438 const std::vector<FF>
data = { 1, 2, 3, 4, 5, 6, 7, 8 };
445 StrictMock<MockContext>
context;
446 EXPECT_CALL(context, get_memory).WillRepeatedly(ReturnRef(
mem));
447 EXPECT_CALL(context, get_last_rd_size).WillRepeatedly(Return(
data.size()));
448 EXPECT_CALL(context, has_parent).WillRepeatedly(Return(
true));
449 EXPECT_CALL(context, get_last_rd_addr).WillRepeatedly(Return(
child_rd_addr));
450 EXPECT_CALL(context, get_returndata(rd_offset, copy_size))
451 .WillRepeatedly(::testing::Invoke([&
data, rd_offset, copy_size]() {
453 return std::vector<FF>(
data.begin() + rd_offset,
data.begin() + rd_offset + copy_size);
455 EXPECT_CALL(context, get_last_child_id).WillRepeatedly(Return(
child_context_id));
456 EXPECT_CALL(context, get_context_id).WillRepeatedly(Return(context_id));
463 TestTraceContainer
trace({
465 { C::precomputed_first_row, 1 },
466 { C::execution_sel, 1 },
467 { C::execution_context_id, context_id },
469 { C::execution_sel_execute_returndata_copy, 1 },
470 { C::execution_register_0_, copy_size },
471 { C::execution_register_1_, rd_offset },
473 { C::execution_sel_opcode_error, 0 },
475 { C::execution_last_child_returndata_size,
static_cast<uint32_t
>(
data.size()) },
484 check_relation<data_copy>(
trace);
490TEST(DataCopyWithExecutionPerm, ErrorPropagation)
493 uint32_t context_id = 2;
494 uint32_t rd_offset = 10;
495 uint32_t copy_size = 4;
501 uint32_t child_data_size = 10;
504 StrictMock<MockContext>
context;
505 EXPECT_CALL(context, get_memory).WillRepeatedly(ReturnRef(
mem));
506 EXPECT_CALL(context, get_last_rd_size).WillRepeatedly(Return(child_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_context_id).WillRepeatedly(Return(context_id));
510 EXPECT_CALL(context, get_last_child_id).WillRepeatedly(Return(
child_context_id));
520 TestTraceContainer
trace({
522 { C::precomputed_first_row, 1 },
523 { C::execution_sel, 1 },
524 { C::execution_context_id, context_id },
526 { C::execution_sel_execute_returndata_copy, 1 },
527 { C::execution_register_0_, copy_size },
528 { C::execution_register_1_, rd_offset },
529 { C::execution_rop_2_, big_dst_addr },
530 { C::execution_sel_opcode_error, 1 },
532 { C::execution_last_child_returndata_size, child_data_size },
537 "Error during CD/RD copy");
542 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.
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_col_read_settings_ > lookup_data_copy_col_read_settings
lookup_settings< lookup_data_copy_check_dst_addr_in_range_settings_ > lookup_data_copy_check_dst_addr_in_range_settings
permutation_settings< perm_data_copy_dispatch_rd_copy_settings_ > perm_data_copy_dispatch_rd_copy_settings
permutation_settings< perm_data_copy_dispatch_cd_copy_settings_ > perm_data_copy_dispatch_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
uint32_t child_context_id