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(EmitUnencryptedLogTest, 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 } } } };
54 EXPECT_CALL(greater_than,
56 .WillOnce(Return(
false));
59 EXPECT_CALL(context, get_side_effect_tracker()).WillRepeatedly(ReturnRef(
side_effect_tracker));
61 .WillOnce(ReturnRef(side_effect_states))
62 .WillOnce(ReturnRef(side_effect_states_after));
71 EXPECT_CALL(memory, get_space_id()).WillOnce(Return(57));
72 EXPECT_CALL(context, get_is_static()).WillOnce(Return(
false));
74 emit_unencrypted_log.emit_unencrypted_log(memory, context,
address, log_offset, log_size);
76 EmitUnencryptedLogWriteEvent expect_event = {
80 .log_address = log_offset,
82 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
83 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
85 .values = to_memory_values(log_fields),
86 .error_memory_out_of_bounds =
false,
87 .error_too_many_log_fields =
false,
88 .error_tag_mismatch =
false,
91 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
94TEST(EmitUnencryptedLogTest, NegativeMemoryOutOfBounds)
96 StrictMock<MockMemory>
memory;
97 StrictMock<MockContext>
context;
105 const std::vector<FF> log_fields = { log_offset, log_offset + 1 };
106 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
107 uint64_t end_log_address =
static_cast<uint64_t
>(log_offset) + log_size - 1;
108 TrackedSideEffects side_effect_states = { .public_logs = {} };
110 const TrackedSideEffects& side_effect_states_after = side_effect_states;
115 EXPECT_CALL(greater_than,
118 .WillOnce(Return(
false));
121 EXPECT_CALL(context, get_side_effect_tracker()).WillRepeatedly(ReturnRef(
side_effect_tracker));
123 .WillOnce(ReturnRef(side_effect_states))
124 .WillOnce(ReturnRef(side_effect_states_after));
126 EXPECT_CALL(memory, get_space_id()).WillOnce(Return(57));
127 EXPECT_CALL(context, get_is_static()).WillOnce(Return(
false));
129 EXPECT_THROW(emit_unencrypted_log.emit_unencrypted_log(memory, context,
address, log_offset, log_size),
130 EmitUnencryptedLogException);
132 EmitUnencryptedLogWriteEvent expect_event = {
136 .log_address = log_offset,
137 .log_size = log_size,
138 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
139 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
142 .error_memory_out_of_bounds =
true,
143 .error_too_many_log_fields =
false,
144 .error_tag_mismatch =
false,
147 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
150TEST(EmitUnencryptedLogTest, NegativeTooManyLogs)
152 StrictMock<MockMemory>
memory;
153 StrictMock<MockContext>
context;
161 const std::vector<FF> log_fields = { log_offset, log_offset + 1 };
162 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
163 uint64_t end_log_address = 28;
165 TrackedSideEffects side_effect_states = {
168 .contract_address = 0xdeadbeef } } }
171 const TrackedSideEffects& side_effect_states_after = side_effect_states;
176 EXPECT_CALL(greater_than,
179 .WillOnce(Return(
true));
184 .WillOnce(ReturnRef(side_effect_states))
185 .WillOnce(ReturnRef(side_effect_states_after));
193 EXPECT_CALL(memory, get_space_id()).WillOnce(Return(57));
194 EXPECT_CALL(context, get_is_static()).WillOnce(Return(
false));
196 EXPECT_THROW(emit_unencrypted_log.emit_unencrypted_log(memory, context,
address, log_offset, log_size),
197 EmitUnencryptedLogException);
199 EmitUnencryptedLogWriteEvent expect_event = {
203 .log_address = log_offset,
204 .log_size = log_size,
205 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
206 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
208 .values = to_memory_values(log_fields),
209 .error_memory_out_of_bounds =
false,
210 .error_too_many_log_fields =
true,
211 .error_tag_mismatch =
false,
214 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
217TEST(EmitUnencryptedLogTest, NegativeTagMismatch)
219 StrictMock<MockMemory>
memory;
220 StrictMock<MockContext>
context;
228 uint32_t log_size = 2;
229 uint64_t end_log_address = 28;
230 TrackedSideEffects side_effect_states = { .public_logs = {} };
232 const TrackedSideEffects& side_effect_states_after = side_effect_states;
237 EXPECT_CALL(greater_than,
240 .WillOnce(Return(
false));
245 .WillOnce(ReturnRef(side_effect_states))
246 .WillOnce(ReturnRef(side_effect_states_after));
254 EXPECT_CALL(memory, get_space_id()).WillOnce(Return(57));
255 EXPECT_CALL(context, get_is_static()).WillOnce(Return(
false));
257 EXPECT_THROW(emit_unencrypted_log.emit_unencrypted_log(memory, context,
address, log_offset, log_size),
258 EmitUnencryptedLogException);
260 EmitUnencryptedLogWriteEvent expect_event = {
264 .log_address = log_offset,
265 .log_size = log_size,
266 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
267 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
269 .values = { MemoryValue::from<uint32_t>(log_offset), MemoryValue::from<uint32_t>(log_offset + 1) },
270 .error_memory_out_of_bounds =
false,
271 .error_too_many_log_fields =
false,
272 .error_tag_mismatch =
true,
275 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
278TEST(EmitUnencryptedLogTest, NegativeStatic)
280 StrictMock<MockMemory>
memory;
281 StrictMock<MockContext>
context;
289 const std::vector<FF> log_fields = { log_offset, log_offset + 1 };
290 uint32_t log_size =
static_cast<uint32_t
>(log_fields.size());
291 uint64_t end_log_address = 28;
292 TrackedSideEffects side_effect_states = { .public_logs = {} };
294 const TrackedSideEffects& side_effect_states_after = side_effect_states;
299 EXPECT_CALL(greater_than,
302 .WillOnce(Return(
false));
307 .WillOnce(ReturnRef(side_effect_states))
308 .WillOnce(ReturnRef(side_effect_states_after));
316 EXPECT_CALL(memory, get_space_id()).WillOnce(Return(57));
317 EXPECT_CALL(context, get_is_static()).WillOnce(Return(
true));
319 EXPECT_THROW(emit_unencrypted_log.emit_unencrypted_log(memory, context,
address, log_offset, log_size),
320 EmitUnencryptedLogException);
322 EmitUnencryptedLogWriteEvent expect_event = {
326 .log_address = log_offset,
327 .log_size = log_size,
328 .prev_num_unencrypted_log_fields = side_effect_states.get_num_unencrypted_log_fields(),
329 .next_num_unencrypted_log_fields = side_effect_states_after.get_num_unencrypted_log_fields(),
331 .values = to_memory_values(log_fields),
332 .error_memory_out_of_bounds =
false,
333 .error_too_many_log_fields =
false,
334 .error_tag_mismatch =
false,
337 EXPECT_THAT(
event_emitter.dump_events(), ElementsAre(expect_event));
340TEST(EmitUnencryptedLogTest, CheckpointListener)
342 StrictMock<MockMemory>
memory;
343 StrictMock<MockContext>
context;
349 emit_unencrypted_log.on_checkpoint_created();
350 emit_unencrypted_log.on_checkpoint_committed();
351 emit_unencrypted_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
std::vector< FF > random_fields(size_t n)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
SideEffectTracker side_effect_tracker