Skip to content

Commit 3fada02

Browse files
committed
Unit tests for DATA*
1 parent d7eb5d5 commit 3fada02

File tree

2 files changed

+187
-0
lines changed

2 files changed

+187
-0
lines changed

test/unittests/eof_validation_test.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,3 +1247,30 @@ TEST(eof_validation, too_many_code_sections)
12471247
"00000000000000000000000000000000000000000000000000000000000000000000";
12481248
EXPECT_EQ(validate_eof(code), EOFValidationError::too_many_code_sections);
12491249
}
1250+
1251+
TEST(eof_validation, dataloadn)
1252+
{
1253+
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 030020 00 00000001 b800005000"
1254+
"0000000000000000111111111111111122222222222222223333333333333333"),
1255+
EOFValidationError::success);
1256+
1257+
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 030040 00 00000001 b800015000"
1258+
"0000000000000000111111111111111122222222222222223333333333333333"
1259+
"0000000000000000111111111111111122222222222222223333333333333333"),
1260+
EOFValidationError::success);
1261+
1262+
1263+
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 030020 00 00000001 b800015000"
1264+
"0000000000000000111111111111111122222222222222223333333333333333"),
1265+
EOFValidationError::invalid_dataloadn_index);
1266+
1267+
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 030020 00 00000001 b8ffff5000"
1268+
"0000000000000000111111111111111122222222222222223333333333333333"),
1269+
EOFValidationError::invalid_dataloadn_index);
1270+
1271+
EXPECT_EQ(validate_eof("EF0001 010004 0200010005 03005f 00 00000001 b800025000"
1272+
"0000000000000000111111111111111122222222222222223333333333333333"
1273+
"0000000000000000111111111111111122222222222222223333333333333333"
1274+
"00000000000000001111111111111111222222222222222233333333333333"),
1275+
EOFValidationError::invalid_dataloadn_index);
1276+
}

test/unittests/evm_eof_test.cpp

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,3 +149,163 @@ TEST_P(evm, eof_data_only_contract)
149149
execute(code + bytes(256, 0x01));
150150
EXPECT_STATUS(EVMC_INVALID_INSTRUCTION);
151151
}
152+
153+
TEST_P(evm, eof1_dataload)
154+
{
155+
// Data instructions are not implemented in Advanced.
156+
if (is_advanced())
157+
return;
158+
159+
rev = EVMC_CANCUN;
160+
const auto data = bytes(8, 0x0) + bytes(8, 0x11) + bytes(8, 0x22) + bytes(8, 0x33) +
161+
bytes(8, 0xaa) + bytes(8, 0xbb) + bytes(8, 0xcc) + bytes(8, 0xdd);
162+
const auto code = eof1_bytecode(calldataload(0) + OP_DATALOAD + ret_top(), 2, data);
163+
164+
execute(code, "00"_hex);
165+
EXPECT_STATUS(EVMC_SUCCESS);
166+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
167+
"0000000000000000111111111111111122222222222222223333333333333333"_hex);
168+
169+
execute(code, "0000000000000000000000000000000000000000000000000000000000000001"_hex);
170+
EXPECT_STATUS(EVMC_SUCCESS);
171+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
172+
"00000000000000111111111111111122222222222222223333333333333333aa"_hex);
173+
174+
execute(code, "0000000000000000000000000000000000000000000000000000000000000020"_hex);
175+
EXPECT_STATUS(EVMC_SUCCESS);
176+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
177+
"aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccdddddddddddddddd"_hex);
178+
179+
execute(code, "0000000000000000000000000000000000000000000000000000000000000021"_hex);
180+
EXPECT_STATUS(EVMC_INVALID_MEMORY_ACCESS);
181+
182+
execute(code, "0000000000000000000000000000000000000000000000000000000000000040"_hex);
183+
EXPECT_STATUS(EVMC_INVALID_MEMORY_ACCESS);
184+
185+
execute(code, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"_hex);
186+
EXPECT_STATUS(EVMC_INVALID_MEMORY_ACCESS);
187+
}
188+
189+
TEST_P(evm, eof1_dataloadn)
190+
{
191+
// Data instructions are not implemented in Advanced.
192+
if (is_advanced())
193+
return;
194+
195+
rev = EVMC_CANCUN;
196+
const auto data = bytes(8, 0x0) + bytes(8, 0x11) + bytes(8, 0x22) + bytes(8, 0x33) +
197+
bytes(8, 0xaa) + bytes(8, 0xbb) + bytes(8, 0xcc) + bytes(8, 0xdd) +
198+
bytes(8, 0xee);
199+
200+
auto code = eof1_bytecode(bytecode(OP_DATALOADN) + Opcode(0) + Opcode(0) + ret_top(), 2, data);
201+
execute(code);
202+
EXPECT_STATUS(EVMC_SUCCESS);
203+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
204+
"0000000000000000111111111111111122222222222222223333333333333333"_hex);
205+
206+
code = eof1_bytecode(bytecode(OP_DATALOADN) + Opcode(0) + Opcode(1) + ret_top(), 2, data);
207+
execute(code);
208+
EXPECT_STATUS(EVMC_SUCCESS);
209+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
210+
"aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccdddddddddddddddd"_hex);
211+
}
212+
213+
TEST_P(evm, eof1_datasize)
214+
{
215+
// Data instructions are not implemented in Advanced.
216+
if (is_advanced())
217+
return;
218+
219+
rev = EVMC_CANCUN;
220+
221+
// no data section
222+
auto code = eof1_bytecode(bytecode(OP_DATASIZE) + ret_top(), 2);
223+
execute(code);
224+
EXPECT_STATUS(EVMC_SUCCESS);
225+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
226+
"0000000000000000000000000000000000000000000000000000000000000000"_hex);
227+
228+
bytes data = {0x0};
229+
code = eof1_bytecode(bytecode(OP_DATASIZE) + ret_top(), 2, data);
230+
execute(code);
231+
EXPECT_STATUS(EVMC_SUCCESS);
232+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
233+
"0000000000000000000000000000000000000000000000000000000000000001"_hex);
234+
235+
data = bytes(32, 0x0);
236+
code = eof1_bytecode(bytecode(OP_DATASIZE) + ret_top(), 2, data);
237+
execute(code);
238+
EXPECT_STATUS(EVMC_SUCCESS);
239+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
240+
"0000000000000000000000000000000000000000000000000000000000000020"_hex);
241+
242+
data = bytes(64, 0x0);
243+
code = eof1_bytecode(bytecode(OP_DATASIZE) + ret_top(), 2, data);
244+
execute(code);
245+
EXPECT_STATUS(EVMC_SUCCESS);
246+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
247+
"0000000000000000000000000000000000000000000000000000000000000040"_hex);
248+
249+
data = bytes(80, 0x0);
250+
code = eof1_bytecode(bytecode(OP_DATASIZE) + ret_top(), 2, data);
251+
execute(code);
252+
EXPECT_STATUS(EVMC_SUCCESS);
253+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
254+
"0000000000000000000000000000000000000000000000000000000000000050"_hex);
255+
}
256+
257+
TEST_P(evm, eof1_datacopy)
258+
{
259+
// Data instructions are not implemented in Advanced.
260+
if (is_advanced())
261+
return;
262+
263+
rev = EVMC_CANCUN;
264+
const auto data = bytes(8, 0x0) + bytes(8, 0x11) + bytes(8, 0x22) + bytes(8, 0x33) +
265+
bytes(8, 0xaa) + bytes(8, 0xbb) + bytes(8, 0xcc) + bytes(8, 0xdd);
266+
267+
auto code =
268+
eof1_bytecode(bytecode(1) + 0 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top(), 3, data);
269+
execute(code);
270+
EXPECT_STATUS(EVMC_SUCCESS);
271+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
272+
"0000000000000000000000000000000000000000000000000000000000000000"_hex);
273+
274+
code = eof1_bytecode(bytecode(1) + 8 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top(), 3, data);
275+
execute(code);
276+
EXPECT_STATUS(EVMC_SUCCESS);
277+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
278+
"1100000000000000000000000000000000000000000000000000000000000000"_hex);
279+
280+
code = eof1_bytecode(bytecode(1) + 63 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top(), 3, data);
281+
execute(code);
282+
EXPECT_STATUS(EVMC_SUCCESS);
283+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
284+
"dd00000000000000000000000000000000000000000000000000000000000000"_hex);
285+
286+
code = eof1_bytecode(bytecode(0) + 64 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top(), 3, data);
287+
execute(code);
288+
EXPECT_STATUS(EVMC_SUCCESS);
289+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
290+
"0000000000000000000000000000000000000000000000000000000000000000"_hex);
291+
292+
code = eof1_bytecode(bytecode(16) + 8 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top(), 3, data);
293+
execute(code);
294+
EXPECT_STATUS(EVMC_SUCCESS);
295+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
296+
"1111111111111111222222222222222200000000000000000000000000000000"_hex);
297+
298+
code = eof1_bytecode(bytecode(32) + 8 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top(), 3, data);
299+
execute(code);
300+
EXPECT_STATUS(EVMC_SUCCESS);
301+
EXPECT_EQ(bytes_view(result.output_data, result.output_size),
302+
"111111111111111122222222222222223333333333333333aaaaaaaaaaaaaaaa"_hex);
303+
304+
code = eof1_bytecode(bytecode(8) + 63 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top(), 3, data);
305+
execute(code);
306+
EXPECT_STATUS(EVMC_INVALID_MEMORY_ACCESS);
307+
308+
code = eof1_bytecode(bytecode(0) + 65 + 0 + OP_DATACOPY + 0 + OP_MLOAD + ret_top(), 3, data);
309+
execute(code);
310+
EXPECT_STATUS(EVMC_INVALID_MEMORY_ACCESS);
311+
}

0 commit comments

Comments
 (0)