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_TRUE(retrieval_events_dump[0].is_new_class);
113 EXPECT_FALSE(retrieval_events_dump[0].error.has_value());
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);
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);
148 EXPECT_FALSE(retrieval_events_dump[0].is_new_class);
150 EXPECT_THAT(hashing_events_dump, SizeIs(0));
152 EXPECT_THAT(decomposition_events_dump, SizeIs(0));
157 instance2.current_contract_class_id = instance1.current_contract_class_id + 1;
167 EXPECT_CALL(
contract_db, get_contract_class(instance2.current_contract_class_id))
169 EXPECT_CALL(
contract_db, get_bytecode_commitment(instance2.current_contract_class_id))
172 EXPECT_CALL(
merkle_db, get_tree_state()).WillOnce(Return(tree_states));
175 BytecodeId result3 = tx_bytecode_manager.get_bytecode(address2);
176 EXPECT_EQ(result3, bytecode_commitment);
180 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
181 EXPECT_EQ(retrieval_events_dump[0].
address, address2);
182 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, bytecode_commitment);
183 EXPECT_FALSE(retrieval_events_dump[0].is_new_class);
185 EXPECT_THAT(hashing_events_dump, SizeIs(0));
187 EXPECT_THAT(decomposition_events_dump, SizeIs(0));
190TEST_F(BytecodeManagerTest, TooManyBytecodes)
207 EXPECT_CALL(
merkle_db, get_tree_state());
217 "Can't retrieve more than " +
221 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
222 EXPECT_EQ(retrieval_events_dump[0].
address, address1);
223 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, 0);
228TEST_F(BytecodeManagerTest, ContractAddressNullifierNotFoundError)
231 StrictMock<MockFieldGreaterThan>
field_gt;
232 ProtocolContracts protocol_contracts = {};
233 EventEmitter<ContractInstanceRetrievalEvent> contract_retrieval_events;
235 ContractInstanceManager real_contract_instance_manager(
242 real_contract_instance_manager,
253 EXPECT_CALL(
merkle_db, get_tree_state()).Times(2);
255 .WillOnce(Return(
false));
261 EXPECT_THAT(retrieval_events_dump, SizeIs(1));
263 EXPECT_EQ(retrieval_events_dump[0].bytecode_id, 0);
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{});
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
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
FieldGreaterThan field_gt
RetrievedBytecodesTreeCheck retrieved_bytecodes_tree_check
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< MockContractDB > contract_db
StrictMock< MockContractInstanceManager > contract_instance_manager
Native Poseidon2 hash function implementation.
StrictMock< MockUpdateCheck > update_check
AVM range check gadget for witness generation.
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