4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
16using ::testing::Return;
21class GasTrackerTest :
public ::testing::Test {
26 ON_CALL(context, get_gas_used()).WillByDefault(Return(Gas{ 0, 0 }));
27 ON_CALL(context, get_gas_limit()).WillByDefault(Return(Gas{ 1000, 500 }));
37TEST_F(GasTrackerTest, BaseGasConsumption)
44 EXPECT_CALL(
context, get_gas_used);
45 EXPECT_CALL(
context, get_gas_limit);
46 EXPECT_CALL(
context, set_gas_used(Gas{ l2_gas_used, 0 }));
48 EXPECT_CALL(greater_than,
gt(l2_gas_used, 1000));
49 EXPECT_CALL(greater_than,
gt(0, 500));
51 tracker.consume_gas();
56 .dynamic_gas_factor = Gas{ 0, 0 },
57 .total_gas_used_l2 = l2_gas_used,
58 .total_gas_used_da = 0,
64TEST_F(GasTrackerTest, AddressingGasConsumption)
73 EXPECT_CALL(context, get_gas_used);
74 EXPECT_CALL(context, get_gas_limit);
75 EXPECT_CALL(context, set_gas_used(Gas{ l2_gas_used, 0 }));
77 EXPECT_CALL(greater_than,
gt(l2_gas_used, 1000));
78 EXPECT_CALL(greater_than,
gt(0, 500));
80 tracker.consume_gas();
85 .dynamic_gas_factor = Gas{ 0, 0 },
86 .total_gas_used_l2 = l2_gas_used,
87 .total_gas_used_da = 0,
93TEST_F(GasTrackerTest, OutOfGasBase)
99 EXPECT_CALL(context, get_gas_used).WillOnce(Return(Gas{ 999, 450 }));
100 EXPECT_CALL(context, get_gas_limit).WillOnce(Return(Gas{ 1000, 500 }));
104 EXPECT_CALL(greater_than,
gt(999 + opcode_l2_gas, 1000)).WillOnce(Return(
true));
105 EXPECT_CALL(greater_than,
gt(450, 500)).WillOnce(Return(
false));
112 .dynamic_gas_factor = Gas{ 0, 0 },
113 .total_gas_used_l2 = 999 + opcode_l2_gas,
114 .total_gas_used_da = 450,
120TEST_F(GasTrackerTest, DynamicGasConsumption)
125 EXPECT_CALL(context, get_gas_used);
126 EXPECT_CALL(context, get_gas_limit);
129 EXPECT_CALL(context, set_gas_used(Gas{ l2_base_gas + l2_dyn_computation, 0 }));
131 EXPECT_CALL(greater_than,
gt(l2_base_gas + l2_dyn_computation, 1000));
132 EXPECT_CALL(greater_than,
gt(0, 500));
134 tracker.consume_gas(Gas{ 10, 0 });
139 .dynamic_gas_factor = Gas{ 10, 0 },
140 .total_gas_used_l2 = l2_base_gas + l2_dyn_computation,
141 .total_gas_used_da = 0,
147TEST_F(GasTrackerTest, OutOfGasDynamicPhase)
152 uint32_t l2_gas_limit = 1000;
154 EXPECT_CALL(context, get_gas_used).WillOnce(Return(Gas{ l2_gas_used_start, 0 }));
155 EXPECT_CALL(context, get_gas_limit).WillOnce(Return(Gas{ l2_gas_limit, 500 }));
159 EXPECT_CALL(greater_than,
gt(l2_base_gas + l2_dyn_computation + l2_gas_used_start, l2_gas_limit))
160 .WillOnce(Return(
true));
161 EXPECT_CALL(greater_than,
gt(0, 500)).WillOnce(Return(
false));
169 .dynamic_gas_factor = Gas{ 100, 0 },
170 .total_gas_used_l2 = l2_base_gas + l2_dyn_computation + l2_gas_used_start,
171 .total_gas_used_da = 0,
177TEST_F(GasTrackerTest, OutOfGasBothPhases)
185 uint32_t l2_gas_limit = 1000;
186 uint32_t l2_gas_used_start = l2_gas_limit - 1;
187 EXPECT_CALL(context, get_gas_used).WillOnce(Return(Gas{ l2_gas_used_start, 0 }));
188 EXPECT_CALL(context, get_gas_limit).WillOnce(Return(Gas{ l2_gas_limit, 500 }));
192 EXPECT_CALL(greater_than,
gt(l2_base_gas + l2_dyn_computation + l2_gas_used_start, l2_gas_limit))
193 .WillOnce(Return(
true));
194 EXPECT_CALL(greater_than,
gt(0, 500)).WillOnce(Return(
false));
202 .dynamic_gas_factor = Gas{ 100, 0 },
203 .total_gas_used_l2 = l2_base_gas + l2_dyn_computation + l2_gas_used_start,
204 .total_gas_used_da = 0,
210TEST_F(GasTrackerTest, OutOfGasBasePhaseWithOverflow)
214 constexpr uint32_t uint32_max = std::numeric_limits<uint32_t>::max();
215 constexpr uint32_t gas_limit = uint32_max;
216 constexpr uint32_t prev_gas_used = uint32_max;
220 EXPECT_CALL(context, get_gas_used).WillOnce(Return(Gas{ prev_gas_used, 0 }));
221 EXPECT_CALL(context, get_gas_limit).WillOnce(Return(Gas{ gas_limit, gas_limit }));
224 EXPECT_CALL(greater_than,
225 gt(
static_cast<uint64_t
>(prev_gas_used) +
static_cast<uint64_t
>(l2_opcode_gas), gas_limit))
226 .WillOnce(Return(
true));
227 EXPECT_CALL(greater_than,
gt(0, gas_limit)).WillOnce(Return(
false));
234 .dynamic_gas_factor = Gas{ 0, 0 },
235 .total_gas_used_l2 =
static_cast<uint64_t
>(prev_gas_used) +
static_cast<uint64_t
>(l2_opcode_gas),
236 .total_gas_used_da = 0,
242TEST_F(GasTrackerTest, OutOfGasDynamicPhaseWithOverflow)
246 constexpr uint32_t uint32_max = std::numeric_limits<uint32_t>::max();
247 uint32_t gas_limit = uint32_max;
249 uint32_t gas_factor = uint32_max;
253 EXPECT_CALL(context, get_gas_used).WillOnce(Return(Gas{ prev_gas_used, 0 }));
254 EXPECT_CALL(context, get_gas_limit).WillOnce(Return(Gas{ gas_limit, gas_limit }));
260 gt(
static_cast<uint64_t
>(prev_gas_used) +
static_cast<uint64_t
>(l2_base_opcode_gas) + l2_dyn_computation,
261 static_cast<uint64_t
>(gas_limit)))
262 .WillOnce(Return(
true));
263 EXPECT_CALL(greater_than,
gt(0, gas_limit)).WillOnce(Return(
false));
270 .dynamic_gas_factor = Gas{ gas_factor, 0 },
271 .total_gas_used_l2 = prev_gas_used + l2_base_opcode_gas + l2_dyn_computation,
272 .total_gas_used_da = 0,
278TEST_F(GasTrackerTest, GasLimitForCall)
282 Gas gas_left = Gas{ 500, 200 };
283 Gas allocated_gas = Gas{ 100, 150 };
285 EXPECT_CALL(context, gas_left()).WillOnce(Return(gas_left));
287 EXPECT_CALL(greater_than,
gt(gas_left.l2Gas, allocated_gas.l2Gas)).WillOnce(Return(
true));
288 EXPECT_CALL(greater_than,
gt(gas_left.daGas, allocated_gas.daGas)).WillOnce(Return(
true));
289 EXPECT_EQ(tracker.compute_gas_limit_for_call(allocated_gas), allocated_gas);
292TEST_F(GasTrackerTest, GasLimitForCallClamping)
296 Gas gas_left = Gas{ 500, 200 };
297 Gas allocated_gas = Gas{ 1000, 100 };
298 Gas clamped_gas = Gas{ 500, 100 };
300 EXPECT_CALL(context, gas_left()).WillOnce(Return(gas_left));
302 EXPECT_CALL(greater_than,
gt(gas_left.l2Gas, allocated_gas.l2Gas)).WillOnce(Return(
false));
303 EXPECT_CALL(greater_than,
gt(gas_left.daGas, allocated_gas.daGas)).WillOnce(Return(
true));
304 EXPECT_EQ(tracker.compute_gas_limit_for_call(allocated_gas), clamped_gas);
#define AVM_CALLDATACOPY_DYN_L2_GAS
#define AVM_SET_BASE_L2_GAS
#define AVM_CALLDATACOPY_BASE_L2_GAS
StrictMock< MockContext > context
InstructionInfoDB instruction_info_db
testing::StrictMock< MockGreaterThan > greater_than
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
uint32_t compute_addressing_gas(uint16_t indirect_flag)
TEST_F(IPATest, ChallengesAreZero)
Instruction
Enumeration of VM instructions that can be executed.