4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
28using ::testing::Return;
29using ::testing::SizeIs;
30using ::testing::StrictMock;
37class MockContractInstanceManager :
public ContractInstanceManagerInterface {
42class BytecodeManagerTest :
public ::testing::Test {
63TEST_F(BytecodeManagerTest, RetrievalAndDeduplication)
91 EXPECT_CALL(
contract_db, get_contract_class(instance1.current_contract_class_id))
93 EXPECT_CALL(
contract_db, get_bytecode_commitment(instance1.current_contract_class_id))
97 EXPECT_CALL(
poseidon2,
hash(_)).WillOnce(Return(bytecode_commitment));
99 TreeStates tree_states = {};
100 EXPECT_CALL(
merkle_db, get_tree_state()).WillOnce(Return(tree_states));
103 BytecodeId result1 = tx_bytecode_manager.get_bytecode(address1);
104 EXPECT_EQ(result1, bytecode_commitment);
109 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
110 EXPECT_EQ(retrieval_events_dump[0].
address, address1);
111 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, bytecode_commitment);
112 EXPECT_FALSE(retrieval_events_dump[0].instance_not_found_error);
113 EXPECT_FALSE(retrieval_events_dump[0].limit_error);
116 EXPECT_THAT(hashing_events_dump, SizeIs(1));
117 EXPECT_EQ(hashing_events_dump[0].bytecode_id, bytecode_commitment);
120 EXPECT_THAT(decomposition_events_dump, SizeIs(1));
121 EXPECT_EQ(decomposition_events_dump[0].bytecode_id, bytecode_commitment);
125 EXPECT_CALL(retrieved_bytecodes_tree_check, get_snapshot()).Times(2);
128 EXPECT_CALL(retrieved_bytecodes_tree_check, contains(instance1.current_contract_class_id)).WillOnce(Return(
true));
129 EXPECT_CALL(retrieved_bytecodes_tree_check, size()).WillOnce(Return(1));
130 EXPECT_CALL(retrieved_bytecodes_tree_check, insert(instance1.current_contract_class_id));
132 EXPECT_CALL(
contract_db, get_contract_class(instance1.current_contract_class_id))
137 EXPECT_CALL(
merkle_db, get_tree_state()).WillOnce(Return(tree_states));
140 BytecodeId result2 = tx_bytecode_manager.get_bytecode(address1);
141 EXPECT_EQ(result2, bytecode_commitment);
145 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
146 EXPECT_EQ(retrieval_events_dump[0].
address, address1);
147 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, bytecode_commitment);
149 EXPECT_THAT(hashing_events_dump, SizeIs(0));
151 EXPECT_THAT(decomposition_events_dump, SizeIs(0));
156 instance2.current_contract_class_id = instance1.current_contract_class_id + 1;
159 EXPECT_CALL(retrieved_bytecodes_tree_check, get_snapshot()).Times(2);
162 EXPECT_CALL(retrieved_bytecodes_tree_check, contains(instance2.current_contract_class_id)).WillOnce(Return(
true));
163 EXPECT_CALL(retrieved_bytecodes_tree_check, size()).WillOnce(Return(1));
164 EXPECT_CALL(retrieved_bytecodes_tree_check, insert(instance2.current_contract_class_id));
166 EXPECT_CALL(
contract_db, get_contract_class(instance2.current_contract_class_id))
168 EXPECT_CALL(
contract_db, get_bytecode_commitment(instance2.current_contract_class_id))
171 EXPECT_CALL(
merkle_db, get_tree_state()).WillOnce(Return(tree_states));
174 BytecodeId result3 = tx_bytecode_manager.get_bytecode(address2);
175 EXPECT_EQ(result3, bytecode_commitment);
179 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
180 EXPECT_EQ(retrieval_events_dump[0].
address, address2);
181 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, bytecode_commitment);
183 EXPECT_THAT(hashing_events_dump, SizeIs(0));
185 EXPECT_THAT(decomposition_events_dump, SizeIs(0));
188TEST_F(BytecodeManagerTest, TooManyBytecodes)
195 retrieved_bytecodes_tree_check,
204 EXPECT_CALL(retrieved_bytecodes_tree_check, get_snapshot());
205 EXPECT_CALL(
merkle_db, get_tree_state());
210 EXPECT_CALL(retrieved_bytecodes_tree_check, contains(instance1.current_contract_class_id)).WillOnce(Return(
false));
215 "Can't retrieve more than " +
219 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
220 EXPECT_EQ(retrieval_events_dump[0].
address, address1);
221 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, 0);
222 EXPECT_FALSE(retrieval_events_dump[0].instance_not_found_error);
223 EXPECT_TRUE(retrieval_events_dump[0].limit_error);
227TEST_F(BytecodeManagerTest, ContractAddressNullifierNotFoundError)
229 StrictMock<MockUpdateCheck> update_check;
230 StrictMock<MockFieldGreaterThan>
field_gt;
231 ProtocolContracts protocol_contracts = {};
232 EventEmitter<ContractInstanceRetrievalEvent> contract_retrieval_events;
234 ContractInstanceManager real_contract_instance_manager(
241 real_contract_instance_manager,
242 retrieved_bytecodes_tree_check,
251 EXPECT_CALL(retrieved_bytecodes_tree_check, get_snapshot());
252 EXPECT_CALL(
merkle_db, get_tree_state()).Times(2);
254 .WillOnce(Return(
false));
260 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
262 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, 0);
263 EXPECT_TRUE(retrieval_events_dump[0].instance_not_found_error);
264 EXPECT_FALSE(retrieval_events_dump[0].limit_error);
266 auto contract_retrieval_events_dump = contract_retrieval_events.dump_events();
267 EXPECT_THAT(contract_retrieval_events_dump, SizeIs(1));
269 EXPECT_FALSE(contract_retrieval_events_dump[0].
exists);
270 EXPECT_FALSE(contract_retrieval_events_dump[0].is_protocol_contract);
271 EXPECT_EQ(contract_retrieval_events_dump[0].deployment_nullifier,
address);
272 EXPECT_EQ(contract_retrieval_events_dump[0].contract_instance, ContractInstance{});
FieldGreaterThan field_gt
std::shared_ptr< Napi::ThreadSafeFunction > instance
#define MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS
#define MAX_PROTOCOL_CONTRACTS
#define CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS
BytecodeHasher bytecode_hasher
EventEmitter< BytecodeHashingEvent > hashing_events
EventEmitter< BytecodeDecompositionEvent > decomposition_events
StrictMock< MockHighLevelMerkleDB > merkle_db
EventEmitter< InstructionFetchingEvent > instruction_fetching_events
EventEmitter< BytecodeRetrievalEvent > retrieval_events
StrictMock< MockClassIdDerivation > class_id_derivation
StrictMock< MockRetrievedBytecodesTreeCheck > retrieved_bytecodes_tree_check
StrictMock< MockContractDB > contract_db
StrictMock< MockContractInstanceManager > contract_instance_manager
AztecAddress contract_address
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
void hash(State &state) noexcept
ContractClass random_contract_class(size_t bytecode_size)
ContractInstance random_contract_instance()
std::string field_to_string(const FF &ff)
TEST_F(IPATest, ChallengesAreZero)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
static field random_element(numeric::RNG *engine=nullptr) noexcept