3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
19using ::testing::ElementsAre;
20using ::testing::Return;
21using ::testing::ReturnRef;
22using ::testing::StrictMock;
27 memory_values.reserve(fields.size());
28 for (
const FF&
field : fields) {
29 memory_values.push_back(MemoryValue::from<FF>(
field));
34TEST(EmitPublicLogTest, Basic)
36 StrictMock<MockMemory>
memory;
37 StrictMock<MockContext>
context;
45 const std::vector<FF> log_fields = { log_offset, log_offset + 1 };
46 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
47 uint64_t end_log_address = 28;
48 TrackedSideEffects side_effect_states = { .public_logs = {} };
49 TrackedSideEffects side_effect_states_after = { .public_logs = PublicLogs{ { { log_fields,
address } } } };
55 .WillOnce(Return(
false));
56 EXPECT_CALL(greater_than,
gt(end_log_address + 1,
AVM_MEMORY_SIZE)).WillOnce(Return(
false));
58 EXPECT_CALL(context, get_side_effect_tracker()).WillRepeatedly(ReturnRef(
side_effect_tracker));
60 .WillOnce(ReturnRef(side_effect_states))
61 .WillOnce(ReturnRef(side_effect_states_after));
70 EXPECT_CALL(memory, get_space_id()).WillOnce(Return(57));
71 EXPECT_CALL(context, get_is_static()).WillOnce(Return(
false));
73 emit_public_log.emit_public_log(memory, context,
address, log_offset, log_size);
75 EmitPublicLogWriteEvent expect_event = {
79 .log_address = log_offset,
81 .prev_num_public_log_fields = side_effect_states.get_num_public_log_fields(),
82 .next_num_public_log_fields = side_effect_states_after.get_num_public_log_fields(),
84 .values = to_memory_values(log_fields),
85 .error_memory_out_of_bounds =
false,
86 .error_too_many_log_fields =
false,
87 .error_tag_mismatch =
false,
90 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
93TEST(EmitPublicLogTest, NegativeMemoryOutOfBounds)
95 StrictMock<MockMemory>
memory;
96 StrictMock<MockContext>
context;
104 const std::vector<FF> log_fields = { log_offset, log_offset + 1 };
105 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
106 uint64_t end_log_address =
static_cast<uint64_t
>(log_offset) + log_size - 1;
107 TrackedSideEffects side_effect_states = { .public_logs = {} };
109 const TrackedSideEffects& side_effect_states_after = side_effect_states;
114 EXPECT_CALL(greater_than,
117 .WillOnce(Return(
false));
118 EXPECT_CALL(greater_than,
gt(end_log_address + 1,
AVM_MEMORY_SIZE)).WillOnce(Return(
true));
120 EXPECT_CALL(context, get_side_effect_tracker()).WillRepeatedly(ReturnRef(
side_effect_tracker));
122 .WillOnce(ReturnRef(side_effect_states))
123 .WillOnce(ReturnRef(side_effect_states_after));
125 EXPECT_CALL(memory, get_space_id()).WillOnce(Return(57));
126 EXPECT_CALL(context, get_is_static()).WillOnce(Return(
false));
128 EXPECT_THROW(emit_public_log.emit_public_log(memory, context,
address, log_offset, log_size),
129 EmitPublicLogException);
131 EmitPublicLogWriteEvent expect_event = {
135 .log_address = log_offset,
136 .log_size = log_size,
137 .prev_num_public_log_fields = side_effect_states.get_num_public_log_fields(),
138 .next_num_public_log_fields = side_effect_states_after.get_num_public_log_fields(),
141 .error_memory_out_of_bounds =
true,
142 .error_too_many_log_fields =
false,
143 .error_tag_mismatch =
false,
146 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
149TEST(EmitPublicLogTest, NegativeTooManyLogs)
151 StrictMock<MockMemory>
memory;
152 StrictMock<MockContext>
context;
160 const std::vector<FF> log_fields = { log_offset, log_offset + 1 };
161 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
162 uint64_t end_log_address = 28;
164 TrackedSideEffects side_effect_states = {
167 .contract_address = 0xdeadbeef } } }
170 const TrackedSideEffects& side_effect_states_after = side_effect_states;
175 EXPECT_CALL(greater_than,
178 .WillOnce(Return(
true));
179 EXPECT_CALL(greater_than,
gt(end_log_address + 1,
AVM_MEMORY_SIZE)).WillOnce(Return(
false));
183 .WillOnce(ReturnRef(side_effect_states))
184 .WillOnce(ReturnRef(side_effect_states_after));
192 EXPECT_CALL(memory, get_space_id()).WillOnce(Return(57));
193 EXPECT_CALL(context, get_is_static()).WillOnce(Return(
false));
195 EXPECT_THROW(emit_public_log.emit_public_log(memory, context,
address, log_offset, log_size),
196 EmitPublicLogException);
198 EmitPublicLogWriteEvent expect_event = {
202 .log_address = log_offset,
203 .log_size = log_size,
204 .prev_num_public_log_fields = side_effect_states.get_num_public_log_fields(),
205 .next_num_public_log_fields = side_effect_states_after.get_num_public_log_fields(),
207 .values = to_memory_values(log_fields),
208 .error_memory_out_of_bounds =
false,
209 .error_too_many_log_fields =
true,
210 .error_tag_mismatch =
false,
213 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
216TEST(EmitPublicLogTest, NegativeTagMismatch)
218 StrictMock<MockMemory>
memory;
219 StrictMock<MockContext>
context;
227 uint32_t log_size = 2;
228 uint64_t end_log_address = 28;
229 TrackedSideEffects side_effect_states = { .public_logs = {} };
231 const TrackedSideEffects& side_effect_states_after = side_effect_states;
236 EXPECT_CALL(greater_than,
239 .WillOnce(Return(
false));
240 EXPECT_CALL(greater_than,
gt(end_log_address + 1,
AVM_MEMORY_SIZE)).WillOnce(Return(
false));
244 .WillOnce(ReturnRef(side_effect_states))
245 .WillOnce(ReturnRef(side_effect_states_after));
253 EXPECT_CALL(memory, get_space_id()).WillOnce(Return(57));
254 EXPECT_CALL(context, get_is_static()).WillOnce(Return(
false));
256 EXPECT_THROW(emit_public_log.emit_public_log(memory, context,
address, log_offset, log_size),
257 EmitPublicLogException);
259 EmitPublicLogWriteEvent expect_event = {
263 .log_address = log_offset,
264 .log_size = log_size,
265 .prev_num_public_log_fields = side_effect_states.get_num_public_log_fields(),
266 .next_num_public_log_fields = side_effect_states_after.get_num_public_log_fields(),
268 .values = { MemoryValue::from<uint32_t>(log_offset), MemoryValue::from<uint32_t>(log_offset + 1) },
269 .error_memory_out_of_bounds =
false,
270 .error_too_many_log_fields =
false,
271 .error_tag_mismatch =
true,
274 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
277TEST(EmitPublicLogTest, NegativeStatic)
279 StrictMock<MockMemory>
memory;
280 StrictMock<MockContext>
context;
288 const std::vector<FF> log_fields = { log_offset, log_offset + 1 };
289 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
290 uint64_t end_log_address = 28;
291 TrackedSideEffects side_effect_states = { .public_logs = {} };
293 const TrackedSideEffects& side_effect_states_after = side_effect_states;
298 EXPECT_CALL(greater_than,
301 .WillOnce(Return(
false));
302 EXPECT_CALL(greater_than,
gt(end_log_address + 1,
AVM_MEMORY_SIZE)).WillOnce(Return(
false));
306 .WillOnce(ReturnRef(side_effect_states))
307 .WillOnce(ReturnRef(side_effect_states_after));
315 EXPECT_CALL(memory, get_space_id()).WillOnce(Return(57));
316 EXPECT_CALL(context, get_is_static()).WillOnce(Return(
true));
318 EXPECT_THROW(emit_public_log.emit_public_log(memory, context,
address, log_offset, log_size),
319 EmitPublicLogException);
321 EmitPublicLogWriteEvent expect_event = {
325 .log_address = log_offset,
326 .log_size = log_size,
327 .prev_num_public_log_fields = side_effect_states.get_num_public_log_fields(),
328 .next_num_public_log_fields = side_effect_states_after.get_num_public_log_fields(),
330 .values = to_memory_values(log_fields),
331 .error_memory_out_of_bounds =
false,
332 .error_too_many_log_fields =
false,
333 .error_tag_mismatch =
false,
336 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
339TEST(EmitPublicLogTest, CheckpointListener)
341 StrictMock<MockMemory>
memory;
342 StrictMock<MockContext>
context;
348 emit_public_log.on_checkpoint_created();
349 emit_public_log.on_checkpoint_committed();
350 emit_public_log.on_checkpoint_reverted();
#define FLAT_PUBLIC_LOGS_PAYLOAD_LENGTH
#define FLAT_PUBLIC_LOGS_HEADER_LENGTH
#define PUBLIC_LOG_HEADER_LENGTH
#define AVM_HIGHEST_MEM_ADDRESS
ExecutionIdManager execution_id_manager
EventEmitter< DataCopyEvent > event_emitter
StrictMock< MockContext > context
AVM range check gadget for witness generation.
std::vector< FF > random_fields(size_t n)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
SideEffectTracker side_effect_tracker