4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
27using ::testing::Return;
28using ::testing::SizeIs;
29using ::testing::StrictMock;
36class MockContractInstanceManager :
public ContractInstanceManagerInterface {
41class BytecodeManagerTest :
public ::testing::Test {
61TEST_F(BytecodeManagerTest, RetrievalAndDeduplication)
88 EXPECT_CALL(
contract_db, get_contract_class(instance1.current_class_id))
92 EXPECT_CALL(
poseidon2,
hash(_)).WillOnce(Return(klass.public_bytecode_commitment));
94 TreeStates tree_states = {};
95 EXPECT_CALL(
merkle_db, get_tree_state()).WillOnce(Return(tree_states));
98 BytecodeId result1 = tx_bytecode_manager.get_bytecode(address1);
99 EXPECT_EQ(result1, klass.public_bytecode_commitment);
104 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
105 EXPECT_EQ(retrieval_events_dump[0].address, address1);
106 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, klass.public_bytecode_commitment);
107 EXPECT_FALSE(retrieval_events_dump[0].instance_not_found_error);
108 EXPECT_FALSE(retrieval_events_dump[0].limit_error);
111 EXPECT_THAT(hashing_events_dump, SizeIs(1));
112 EXPECT_EQ(hashing_events_dump[0].bytecode_id, klass.public_bytecode_commitment);
115 EXPECT_THAT(decomposition_events_dump, SizeIs(1));
116 EXPECT_EQ(decomposition_events_dump[0].bytecode_id, klass.public_bytecode_commitment);
120 EXPECT_CALL(retrieved_bytecodes_tree_check, get_snapshot()).Times(2);
123 EXPECT_CALL(retrieved_bytecodes_tree_check, contains(instance1.current_class_id)).WillOnce(Return(
true));
124 EXPECT_CALL(retrieved_bytecodes_tree_check, size()).WillOnce(Return(1));
125 EXPECT_CALL(retrieved_bytecodes_tree_check, insert(instance1.current_class_id));
127 EXPECT_CALL(
contract_db, get_contract_class(instance1.current_class_id))
130 EXPECT_CALL(
merkle_db, get_tree_state()).WillOnce(Return(tree_states));
133 BytecodeId result2 = tx_bytecode_manager.get_bytecode(address1);
134 EXPECT_EQ(result2, klass.public_bytecode_commitment);
138 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
139 EXPECT_EQ(retrieval_events_dump[0].address, address1);
140 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, klass.public_bytecode_commitment);
142 EXPECT_THAT(hashing_events_dump, SizeIs(0));
144 EXPECT_THAT(decomposition_events_dump, SizeIs(0));
149 instance2.current_class_id = instance1.current_class_id + 1;
152 EXPECT_CALL(retrieved_bytecodes_tree_check, get_snapshot()).Times(2);
155 EXPECT_CALL(retrieved_bytecodes_tree_check, contains(instance2.current_class_id)).WillOnce(Return(
true));
156 EXPECT_CALL(retrieved_bytecodes_tree_check, size()).WillOnce(Return(1));
157 EXPECT_CALL(retrieved_bytecodes_tree_check, insert(instance2.current_class_id));
159 EXPECT_CALL(
contract_db, get_contract_class(instance2.current_class_id))
162 EXPECT_CALL(
merkle_db, get_tree_state()).WillOnce(Return(tree_states));
165 BytecodeId result3 = tx_bytecode_manager.get_bytecode(address2);
166 EXPECT_EQ(result3, klass.public_bytecode_commitment);
170 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
171 EXPECT_EQ(retrieval_events_dump[0].address, address2);
172 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, klass.public_bytecode_commitment);
174 EXPECT_THAT(hashing_events_dump, SizeIs(0));
176 EXPECT_THAT(decomposition_events_dump, SizeIs(0));
179TEST_F(BytecodeManagerTest, TooManyBytecodes)
186 retrieved_bytecodes_tree_check,
195 EXPECT_CALL(retrieved_bytecodes_tree_check, get_snapshot());
196 EXPECT_CALL(
merkle_db, get_tree_state());
201 EXPECT_CALL(retrieved_bytecodes_tree_check, contains(instance1.current_class_id)).WillOnce(Return(
false));
206 "Can't retrieve more than " +
210 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
211 EXPECT_EQ(retrieval_events_dump[0].address, address1);
212 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, 0);
213 EXPECT_FALSE(retrieval_events_dump[0].instance_not_found_error);
214 EXPECT_TRUE(retrieval_events_dump[0].limit_error);
218TEST_F(BytecodeManagerTest, ContractAddressNullifierNotFoundError)
220 StrictMock<MockUpdateCheck> update_check;
221 StrictMock<MockFieldGreaterThan>
field_gt;
222 ProtocolContracts protocol_contracts = {};
223 EventEmitter<ContractInstanceRetrievalEvent> contract_retrieval_events;
225 ContractInstanceManager real_contract_instance_manager(
232 real_contract_instance_manager,
233 retrieved_bytecodes_tree_check,
240 EXPECT_CALL(
contract_db, get_contract_instance(address)).WillOnce(Return(instance));
242 EXPECT_CALL(retrieved_bytecodes_tree_check, get_snapshot());
243 EXPECT_CALL(
merkle_db, get_tree_state()).Times(2);
245 .WillOnce(Return(
false));
251 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
252 EXPECT_EQ(retrieval_events_dump[0].address, address);
253 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, 0);
254 EXPECT_TRUE(retrieval_events_dump[0].instance_not_found_error);
255 EXPECT_FALSE(retrieval_events_dump[0].limit_error);
257 auto contract_retrieval_events_dump = contract_retrieval_events.dump_events();
258 EXPECT_THAT(contract_retrieval_events_dump, SizeIs(1));
259 EXPECT_EQ(contract_retrieval_events_dump[0].address, address);
260 EXPECT_FALSE(contract_retrieval_events_dump[0].
exists);
261 EXPECT_FALSE(contract_retrieval_events_dump[0].is_protocol_contract);
262 EXPECT_EQ(contract_retrieval_events_dump[0].deployment_nullifier, address);
263 EXPECT_EQ(contract_retrieval_events_dump[0].contract_instance, ContractInstance{});
#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< 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)
FieldGreaterThan field_gt