Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
debug_log.test.cpp
Go to the documentation of this file.
2
3#include <cstdint>
4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
6
17
18using ::testing::ElementsAre;
19using ::testing::ReturnRef;
20using ::testing::SizeIs;
21using ::testing::StrictMock;
22
23namespace bb::avm2::simulation {
24
25namespace {
26
27TEST(DebugLogSimulationTest, Basic)
28{
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); });
33
35 MemoryAddress level_offset = 50;
36 MemoryAddress message_offset = 100;
37 MemoryAddress fields_offset = 200;
38 MemoryAddress fields_size_offset = 300;
39
40 std::array<MemoryValue, 5> message_data = {
41 MemoryValue::from<FF>('H'), // 'H'
42 MemoryValue::from<FF>('e'), // 'e'
43 MemoryValue::from<FF>('l'), // 'l'
44 MemoryValue::from<FF>('l'), // 'l'
45 MemoryValue::from<FF>('o'), // 'o'
46 };
47 uint16_t message_size = message_data.size();
48
49 std::array<MemoryValue, 2> fields_data = { MemoryValue::from<FF>(42), MemoryValue::from<FF>(123) };
50 uint32_t fields_size = fields_data.size();
51
52 MemoryValue level = MemoryValue::from<uint8_t>(static_cast<uint8_t>(DebugLogLevel::FATAL));
53
54 MemoryValue fields_size_value = MemoryValue::from<uint32_t>(fields_size);
55
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]));
60 }
61
62 for (uint32_t i = 0; i < fields_size; ++i) {
63 EXPECT_CALL(memory, get(fields_offset + i)).WillOnce(ReturnRef(fields_data[i]));
64 }
65
66 debug_logger.debug_log(
67 memory, contract_address, level_offset, message_offset, message_size, fields_offset, fields_size_offset);
68
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 } }));
71}
72
73TEST(DebugLogSimulationTest, MaxMemoryReadsExceeded)
74{
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); });
79
81 MemoryAddress level_offset = 50;
82 MemoryAddress message_offset = 100;
83 MemoryAddress fields_offset = 200;
84 MemoryAddress fields_size_offset = 300;
85 uint16_t message_size = 5;
86 uint32_t fields_size = 2;
87
88 MemoryValue level = MemoryValue::from<uint8_t>(static_cast<uint8_t>(DebugLogLevel::FATAL));
89
90 MemoryValue fields_size_value = MemoryValue::from<uint32_t>(fields_size);
91
92 EXPECT_CALL(memory, get(level_offset)).WillOnce(ReturnRef(level));
93 EXPECT_CALL(memory, get(fields_size_offset)).WillOnce(ReturnRef(fields_size_value));
94
95 EXPECT_THROW(
96 debug_logger.debug_log(
97 memory, contract_address, level_offset, message_offset, message_size, fields_offset, fields_size_offset),
98 std::runtime_error);
99
100 EXPECT_THAT(log_messages, SizeIs(0));
101 EXPECT_THAT(debug_logger.dump_logs(), SizeIs(0));
102}
103
104TEST(DebugLogSimulationTest, InvalidLevel)
105{
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); });
110
112 MemoryAddress level_offset = 50;
113 MemoryAddress message_offset = 100;
114 MemoryAddress fields_offset = 200;
115 MemoryAddress fields_size_offset = 300;
116
117 std::array<MemoryValue, 5> message_data = {
118 MemoryValue::from<FF>('H'), // 'H'
119 MemoryValue::from<FF>('e'), // 'e'
120 MemoryValue::from<FF>('l'), // 'l'
121 MemoryValue::from<FF>('l'), // 'l'
122 MemoryValue::from<FF>('o'), // 'o'
123 };
124 uint16_t message_size = message_data.size();
125
126 std::array<MemoryValue, 2> fields_data = { MemoryValue::from<FF>(42), MemoryValue::from<FF>(123) };
127 uint32_t fields_size = fields_data.size();
128
129 MemoryValue level = MemoryValue::from<uint8_t>(static_cast<uint8_t>(42));
130
131 MemoryValue fields_size_value = MemoryValue::from<uint32_t>(fields_size);
132
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]));
137 }
138
139 for (uint32_t i = 0; i < fields_size; ++i) {
140 EXPECT_CALL(memory, get(fields_offset + i)).WillOnce(ReturnRef(fields_data[i]));
141 }
142
143 EXPECT_THROW(
144 debug_logger.debug_log(
145 memory, contract_address, level_offset, message_offset, message_size, fields_offset, fields_size_offset),
146 std::runtime_error);
147
148 EXPECT_THAT(log_messages, SizeIs(0));
149 EXPECT_THAT(debug_logger.dump_logs(), SizeIs(0));
150}
151
152TEST(DebugLogSimulationTest, LogLevel)
153{
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); });
158
160 MemoryAddress level_offset = 50;
161 MemoryAddress message_offset = 100;
162 MemoryAddress fields_offset = 200;
163 MemoryAddress fields_size_offset = 300;
164
165 std::array<MemoryValue, 1> message_data = {
166 MemoryValue::from<FF>('A'), // 'A'
167 };
168 uint16_t message_size = message_data.size();
169
170 std::array<MemoryValue, 1> fields_data = { MemoryValue::from<FF>(42) };
171 uint32_t fields_size = fields_data.size();
172
173 MemoryValue level = MemoryValue::from<uint8_t>(static_cast<uint8_t>(DebugLogLevel::VERBOSE));
174
175 MemoryValue fields_size_value = MemoryValue::from<uint32_t>(fields_size);
176
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]));
181 }
182
183 for (uint32_t i = 0; i < fields_size; ++i) {
184 EXPECT_CALL(memory, get(fields_offset + i)).WillOnce(ReturnRef(fields_data[i]));
185 }
186
187 debug_logger.debug_log(
188 memory, contract_address, level_offset, message_offset, message_size, fields_offset, fields_size_offset);
189
190 // Not logged to stdout
191 EXPECT_THAT(log_messages, SizeIs(0));
192 // But recorded in the debug logs vector
193 EXPECT_THAT(debug_logger.dump_logs(), ElementsAre(DebugLog{ contract_address, "verbose", "A", { 42 } }));
194}
195
196} // namespace
197
198} // namespace bb::avm2::simulation
TEST(EmitUnencryptedLogTest, Basic)
TaggedValue MemoryValue
uint32_t MemoryAddress
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
MemoryStore memory