4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
18using ::testing::ElementsAre;
19using ::testing::ReturnRef;
20using ::testing::SizeIs;
21using ::testing::StrictMock;
27TEST(DebugLogSimulationTest, Basic)
29 StrictMock<MockMemory>
memory;
30 std::vector<std::string> log_messages;
31 DebugLogger debug_logger(
32 DebugLogLevel::INFO, 9, [&log_messages](
const std::string& message) { log_messages.push_back(message); });
41 MemoryValue::from<FF>(
'H'),
42 MemoryValue::from<FF>(
'e'),
43 MemoryValue::from<FF>(
'l'),
44 MemoryValue::from<FF>(
'l'),
45 MemoryValue::from<FF>(
'o'),
47 uint16_t message_size = message_data.size();
50 uint32_t fields_size = fields_data.size();
54 MemoryValue fields_size_value = MemoryValue::from<uint32_t>(fields_size);
56 EXPECT_CALL(memory,
get(level_offset)).WillOnce(ReturnRef(level));
57 EXPECT_CALL(memory,
get(fields_size_offset)).WillOnce(ReturnRef(fields_size_value));
58 for (uint32_t i = 0; i < message_size; ++i) {
59 EXPECT_CALL(memory,
get(message_offset + i)).WillOnce(ReturnRef(message_data[i]));
62 for (uint32_t i = 0; i < fields_size; ++i) {
63 EXPECT_CALL(memory,
get(fields_offset + i)).WillOnce(ReturnRef(fields_data[i]));
66 debug_logger.debug_log(
67 memory,
contract_address, level_offset, message_offset, message_size, fields_offset, fields_size_offset);
69 EXPECT_THAT(log_messages, ElementsAre(
"DEBUGLOG(fatal): Hello: [0x2a, 0x7b]"));
70 EXPECT_THAT(debug_logger.dump_logs(), ElementsAre(DebugLog{
contract_address,
"fatal",
"Hello", { 42, 123 } }));
73TEST(DebugLogSimulationTest, MaxMemoryReadsExceeded)
75 StrictMock<MockMemory>
memory;
76 std::vector<std::string> log_messages;
77 DebugLogger debug_logger(
78 DebugLogLevel::INFO, 8, [&log_messages](
const std::string& message) { log_messages.push_back(message); });
85 uint16_t message_size = 5;
86 uint32_t fields_size = 2;
90 MemoryValue fields_size_value = MemoryValue::from<uint32_t>(fields_size);
92 EXPECT_CALL(memory,
get(level_offset)).WillOnce(ReturnRef(level));
93 EXPECT_CALL(memory,
get(fields_size_offset)).WillOnce(ReturnRef(fields_size_value));
96 debug_logger.debug_log(
97 memory,
contract_address, level_offset, message_offset, message_size, fields_offset, fields_size_offset),
100 EXPECT_THAT(log_messages, SizeIs(0));
101 EXPECT_THAT(debug_logger.dump_logs(), SizeIs(0));
104TEST(DebugLogSimulationTest, InvalidLevel)
106 StrictMock<MockMemory>
memory;
107 std::vector<std::string> log_messages;
108 DebugLogger debug_logger(
109 DebugLogLevel::INFO, 9, [&log_messages](
const std::string& message) { log_messages.push_back(message); });
118 MemoryValue::from<FF>(
'H'),
119 MemoryValue::from<FF>(
'e'),
120 MemoryValue::from<FF>(
'l'),
121 MemoryValue::from<FF>(
'l'),
122 MemoryValue::from<FF>(
'o'),
124 uint16_t message_size = message_data.size();
127 uint32_t fields_size = fields_data.size();
129 MemoryValue level = MemoryValue::from<uint8_t>(
static_cast<uint8_t
>(42));
131 MemoryValue fields_size_value = MemoryValue::from<uint32_t>(fields_size);
133 EXPECT_CALL(memory,
get(level_offset)).WillOnce(ReturnRef(level));
134 EXPECT_CALL(memory,
get(fields_size_offset)).WillOnce(ReturnRef(fields_size_value));
135 for (uint32_t i = 0; i < message_size; ++i) {
136 EXPECT_CALL(memory,
get(message_offset + i)).WillOnce(ReturnRef(message_data[i]));
139 for (uint32_t i = 0; i < fields_size; ++i) {
140 EXPECT_CALL(memory,
get(fields_offset + i)).WillOnce(ReturnRef(fields_data[i]));
144 debug_logger.debug_log(
145 memory,
contract_address, level_offset, message_offset, message_size, fields_offset, fields_size_offset),
148 EXPECT_THAT(log_messages, SizeIs(0));
149 EXPECT_THAT(debug_logger.dump_logs(), SizeIs(0));
152TEST(DebugLogSimulationTest, LogLevel)
154 StrictMock<MockMemory>
memory;
155 std::vector<std::string> log_messages;
156 DebugLogger debug_logger(
157 DebugLogLevel::INFO, 9, [&log_messages](
const std::string& message) { log_messages.push_back(message); });
166 MemoryValue::from<FF>(
'A'),
168 uint16_t message_size = message_data.size();
171 uint32_t fields_size = fields_data.size();
175 MemoryValue fields_size_value = MemoryValue::from<uint32_t>(fields_size);
177 EXPECT_CALL(memory,
get(level_offset)).WillOnce(ReturnRef(level));
178 EXPECT_CALL(memory,
get(fields_size_offset)).WillOnce(ReturnRef(fields_size_value));
179 for (uint32_t i = 0; i < message_size; ++i) {
180 EXPECT_CALL(memory,
get(message_offset + i)).WillOnce(ReturnRef(message_data[i]));
183 for (uint32_t i = 0; i < fields_size; ++i) {
184 EXPECT_CALL(memory,
get(fields_offset + i)).WillOnce(ReturnRef(fields_data[i]));
187 debug_logger.debug_log(
188 memory,
contract_address, level_offset, message_offset, message_size, fields_offset, fields_size_offset);
191 EXPECT_THAT(log_messages, SizeIs(0));
193 EXPECT_THAT(debug_logger.dump_logs(), ElementsAre(DebugLog{
contract_address,
"verbose",
"A", { 42 } }));
AztecAddress contract_address
TEST(EmitUnencryptedLogTest, Basic)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept