difftreelog
refactor abi tests
in: master
1 file changed
crates/evm-coder/src/abi/test.rsdiffbeforeafterboth1use crate::{2 abi::{AbiRead, AbiWrite},3 types::*,4};56use super::{AbiReader, AbiWriter};7use hex_literal::hex;8use primitive_types::{H160, U256};910fn test_impl<T>(function_identifier: u32, decoded_data: T, encoded_data: &[u8])11where12 T: AbiWrite + AbiRead + std::cmp::PartialEq + std::fmt::Debug,13{14 let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap();15 assert_eq!(call, u32::to_be_bytes(function_identifier));16 let data = <T>::abi_read(&mut decoder).unwrap();17 assert_eq!(data, decoded_data);1819 let mut writer = AbiWriter::new_call(function_identifier);20 decoded_data.abi_write(&mut writer);21 let ed = writer.finish();22 similar_asserts::assert_eq!(encoded_data, ed.as_slice());23}2425macro_rules! test_impl_uint {26 ($type:ident) => {27 test_impl::<$type>(28 0xdeadbeef,29 255 as $type,30 &hex!(31 "32 deadbeef33 00000000000000000000000000000000000000000000000000000000000000ff34 "35 ),36 );37 };38}3940#[test]41fn encode_decode_uint8() {42 test_impl_uint!(uint8);43}4445#[test]46fn encode_decode_uint32() {47 test_impl_uint!(uint32);48}4950#[test]51fn encode_decode_uint64() {52 test_impl_uint!(uint64);53}5455#[test]56fn encode_decode_uint128() {57 test_impl_uint!(uint128);58}5960#[test]61fn encode_decode_bool_true() {62 test_impl::<bool>(63 0xdeadbeef,64 true,65 &hex!(66 "67 deadbeef68 000000000000000000000000000000000000000000000000000000000000000169 "70 ),71 );72}7374#[test]75fn encode_decode_bool_false() {76 test_impl::<bool>(77 0xdeadbeef,78 false,79 &hex!(80 "81 deadbeef82 000000000000000000000000000000000000000000000000000000000000000083 "84 ),85 );86}8788#[test]89fn encode_decode_uint256() {90 test_impl::<uint256>(91 0xdeadbeef,92 U256([255, 0, 0, 0]),93 &hex!(94 "95 deadbeef96 00000000000000000000000000000000000000000000000000000000000000ff97 "98 ),99 );100}101102#[test]103fn encode_decode_string() {104 test_impl::<String>(105 0xdeadbeef,106 "some string".to_string(),107 &hex!(108 "109 deadbeef110 0000000000000000000000000000000000000000000000000000000000000020111 000000000000000000000000000000000000000000000000000000000000000b112 736f6d6520737472696e67000000000000000000000000000000000000000000113 "114 ),115 );116}117118#[test]119fn encode_decode_tuple_string() {120 test_impl::<(String,)>(121 0xdeadbeef,122 ("some string".to_string(),),123 &hex!(124 "125 deadbeef126 0000000000000000000000000000000000000000000000000000000000000020127 0000000000000000000000000000000000000000000000000000000000000020128 000000000000000000000000000000000000000000000000000000000000000b129 736f6d6520737472696e67000000000000000000000000000000000000000000130 "131 ),132 );133}134135#[test]136fn encode_decode_vec_tuple_address_uint256() {137 test_impl::<Vec<(address, uint256)>>(138 0x1ACF2D55,139 vec![140 (141 H160(hex!("2D2FF76104B7BACB2E8F6731D5BFC184EBECDDBC")),142 U256([10, 0, 0, 0]),143 ),144 (145 H160(hex!("AB8E3D9134955566483B11E6825C9223B6737B10")),146 U256([20, 0, 0, 0]),147 ),148 (149 H160(hex!("8C582BDF2953046705FC56F189385255EFC1BE18")),150 U256([30, 0, 0, 0]),151 ),152 ],153 &hex!(154 "155 1ACF2D55156 0000000000000000000000000000000000000000000000000000000000000020 // offset of (address, uint256)[]157 0000000000000000000000000000000000000000000000000000000000000003 // length of (address, uint256)[]158159 0000000000000000000000002D2FF76104B7BACB2E8F6731D5BFC184EBECDDBC // address160 000000000000000000000000000000000000000000000000000000000000000A // uint256161162 000000000000000000000000AB8E3D9134955566483B11E6825C9223B6737B10 // address163 0000000000000000000000000000000000000000000000000000000000000014 // uint256164165 0000000000000000000000008C582BDF2953046705FC56F189385255EFC1BE18 // address166 000000000000000000000000000000000000000000000000000000000000001E // uint256167 "168 )169 );170}171172#[test]173fn encode_decode_vec_tuple_uint8_uint8() {174 test_impl::<Vec<(u8, u8)>>(175 0xdeadbeef,176 vec![(0x0A, 0x0B), (0x0C, 0x0D), (0x0E, 0x0F)],177 &hex!(178 "179 deadbeef180 0000000000000000000000000000000000000000000000000000000000000020181 0000000000000000000000000000000000000000000000000000000000000003182 000000000000000000000000000000000000000000000000000000000000000a183 000000000000000000000000000000000000000000000000000000000000000b184 000000000000000000000000000000000000000000000000000000000000000c185 000000000000000000000000000000000000000000000000000000000000000d186 000000000000000000000000000000000000000000000000000000000000000e187 000000000000000000000000000000000000000000000000000000000000000f188 "189 ),190 );191}192193#[test]194fn encode_decode_vec_tuple_uint256_string() {195 test_impl::<Vec<(uint256, string)>>(196 0xdeadbeef,197 vec![198 (1.into(), "Test URI 0".to_string()),199 (11.into(), "Test URI 1".to_string()),200 (12.into(), "Test URI 2".to_string()),201 ],202 &hex!(203 "204 deadbeef205 0000000000000000000000000000000000000000000000000000000000000020 // offset of (uint256, string)[]206 0000000000000000000000000000000000000000000000000000000000000003 // length of (uint256, string)[]207208 0000000000000000000000000000000000000000000000000000000000000060 // offset of first elem209 00000000000000000000000000000000000000000000000000000000000000e0 // offset of second elem210 0000000000000000000000000000000000000000000000000000000000000160 // offset of third elem211212 0000000000000000000000000000000000000000000000000000000000000001 // first token id? #60213 0000000000000000000000000000000000000000000000000000000000000040 // offset of string214 000000000000000000000000000000000000000000000000000000000000000a // size of string215 5465737420555249203000000000000000000000000000000000000000000000 // string216217 000000000000000000000000000000000000000000000000000000000000000b // second token id? Why ==11? #e0218 0000000000000000000000000000000000000000000000000000000000000040 // offset of string219 000000000000000000000000000000000000000000000000000000000000000a // size of string220 5465737420555249203100000000000000000000000000000000000000000000 // string221222 000000000000000000000000000000000000000000000000000000000000000c // third token id? Why ==12? #160223 0000000000000000000000000000000000000000000000000000000000000040 // offset of string224 000000000000000000000000000000000000000000000000000000000000000a // size of string225 5465737420555249203200000000000000000000000000000000000000000000 // string226 "227 )228 );229}230231#[test]232fn dynamic_after_static() {233 let mut encoder = AbiWriter::new();234 encoder.bool(&true);235 encoder.string("test");236 let encoded = encoder.finish();237238 let mut encoder = AbiWriter::new();239 encoder.bool(&true);240 // Offset to subresult241 encoder.uint32(&(32 * 2));242 // Len of "test"243 encoder.uint32(&4);244 encoder.write_padright(&[b't', b'e', b's', b't']);245 let alternative_encoded = encoder.finish();246247 assert_eq!(encoded, alternative_encoded);248249 let mut decoder = AbiReader::new(&encoded);250 assert!(decoder.bool().unwrap());251 assert_eq!(decoder.string().unwrap(), "test");252}253254#[test]255fn mint_sample() {256 let (call, mut decoder) = AbiReader::new_call(&hex!(257 "258 50bb4e7f259 000000000000000000000000ad2c0954693c2b5404b7e50967d3481bea432374260 0000000000000000000000000000000000000000000000000000000000000001261 0000000000000000000000000000000000000000000000000000000000000060262 0000000000000000000000000000000000000000000000000000000000000008263 5465737420555249000000000000000000000000000000000000000000000000264 "265 ))266 .unwrap();267 assert_eq!(call, u32::to_be_bytes(0x50bb4e7f));268 assert_eq!(269 format!("{:?}", decoder.address().unwrap()),270 "0xad2c0954693c2b5404b7e50967d3481bea432374"271 );272 assert_eq!(decoder.uint32().unwrap(), 1);273 assert_eq!(decoder.string().unwrap(), "Test URI");274}275276#[test]277fn parse_vec_with_dynamic_type() {278 let decoded_data = (279 0x36543006,280 vec![281 (1.into(), "Test URI 0".to_string()),282 (11.into(), "Test URI 1".to_string()),283 (12.into(), "Test URI 2".to_string()),284 ],285 );286287 let encoded_data = &hex!(288 "289 36543006290 00000000000000000000000053744e6da587ba10b32a2554d2efdcd985bc27a3 // address291 0000000000000000000000000000000000000000000000000000000000000040 // offset of (uint256, string)[]292 0000000000000000000000000000000000000000000000000000000000000003 // length of (uint256, string)[]293294 0000000000000000000000000000000000000000000000000000000000000060 // offset of first elem295 00000000000000000000000000000000000000000000000000000000000000e0 // offset of second elem296 0000000000000000000000000000000000000000000000000000000000000160 // offset of third elem297298 0000000000000000000000000000000000000000000000000000000000000001 // first token id? #60299 0000000000000000000000000000000000000000000000000000000000000040 // offset of string300 000000000000000000000000000000000000000000000000000000000000000a // size of string301 5465737420555249203000000000000000000000000000000000000000000000 // string302303 000000000000000000000000000000000000000000000000000000000000000b // second token id? Why ==11? #e0304 0000000000000000000000000000000000000000000000000000000000000040 // offset of string305 000000000000000000000000000000000000000000000000000000000000000a // size of string306 5465737420555249203100000000000000000000000000000000000000000000 // string307308 000000000000000000000000000000000000000000000000000000000000000c // third token id? Why ==12? #160309 0000000000000000000000000000000000000000000000000000000000000040 // offset of string310 000000000000000000000000000000000000000000000000000000000000000a // size of string311 5465737420555249203200000000000000000000000000000000000000000000 // string312 "313 );314315 let (call, mut decoder) = AbiReader::new_call(encoded_data).unwrap();316 assert_eq!(call, u32::to_be_bytes(decoded_data.0));317 let address = decoder.address().unwrap();318 let data = <Vec<(uint256, string)>>::abi_read(&mut decoder).unwrap();319 assert_eq!(data, decoded_data.1);320321 let mut writer = AbiWriter::new_call(decoded_data.0);322 address.abi_write(&mut writer);323 decoded_data.1.abi_write(&mut writer);324 let ed = writer.finish();325 similar_asserts::assert_eq!(encoded_data, ed.as_slice());326}327328#[test]329fn encode_decode_vec_tuple_string_bytes() {330 test_impl::<Vec<(string, bytes)>>(331 0xdeadbeef,332 vec![333 (334 "Test URI 0".to_string(),335 bytes(vec![336 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,337 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,338 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,339 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,340 ]),341 ),342 (343 "Test URI 1".to_string(),344 bytes(vec![345 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,346 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,347 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,348 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,349 ]),350 ),351 ("Test URI 2".to_string(), bytes(vec![0x33, 0x33])),352 ],353 &hex!(354 "355 deadbeef356 0000000000000000000000000000000000000000000000000000000000000020357 0000000000000000000000000000000000000000000000000000000000000003358359 0000000000000000000000000000000000000000000000000000000000000060360 0000000000000000000000000000000000000000000000000000000000000140361 0000000000000000000000000000000000000000000000000000000000000220362363 0000000000000000000000000000000000000000000000000000000000000040364 0000000000000000000000000000000000000000000000000000000000000080365 000000000000000000000000000000000000000000000000000000000000000a366 5465737420555249203000000000000000000000000000000000000000000000367 0000000000000000000000000000000000000000000000000000000000000030368 1111111111111111111111111111111111111111111111111111111111111111369 1111111111111111111111111111111100000000000000000000000000000000370371 0000000000000000000000000000000000000000000000000000000000000040372 0000000000000000000000000000000000000000000000000000000000000080373 000000000000000000000000000000000000000000000000000000000000000a374 5465737420555249203100000000000000000000000000000000000000000000375 000000000000000000000000000000000000000000000000000000000000002f376 2222222222222222222222222222222222222222222222222222222222222222377 2222222222222222222222222222220000000000000000000000000000000000378379 0000000000000000000000000000000000000000000000000000000000000040380 0000000000000000000000000000000000000000000000000000000000000080381 000000000000000000000000000000000000000000000000000000000000000a382 5465737420555249203200000000000000000000000000000000000000000000383 0000000000000000000000000000000000000000000000000000000000000002384 3333000000000000000000000000000000000000000000000000000000000000385 "386 ),387 );388}389390#[test]391// #[ignore = "reason"]392fn encode_decode_tuple0_tuple1_uint8_tuple1_string_bytes_tuple1_uint8_bytes() {393 let int = 0xff;394 let by = bytes(vec![0x11, 0x22, 0x33]);395 let string = "some string".to_string();396397 test_impl::<((u8,), (String, bytes), (u8, bytes))>(398 0xdeadbeef,399 ((int,), (string.clone(), by.clone()), (int, by)),400 &hex!(401 "402 deadbeef403 0000000000000000000000000000000000000000000000000000000000000020404 00000000000000000000000000000000000000000000000000000000000000ff405 0000000000000000000000000000000000000000000000000000000000000060406 0000000000000000000000000000000000000000000000000000000000000120407 0000000000000000000000000000000000000000000000000000000000000040408 0000000000000000000000000000000000000000000000000000000000000080409 000000000000000000000000000000000000000000000000000000000000000b410 736f6d6520737472696e67000000000000000000000000000000000000000000411 0000000000000000000000000000000000000000000000000000000000000003412 1122330000000000000000000000000000000000000000000000000000000000413 00000000000000000000000000000000000000000000000000000000000000ff414 0000000000000000000000000000000000000000000000000000000000000040415 0000000000000000000000000000000000000000000000000000000000000003416 1122330000000000000000000000000000000000000000000000000000000000417 "418 ),419 );420}421422#[test]423fn encode_decode_tuple0_tuple1_uint8_tuple1_uint8_uint8_tuple1_uint8_uint8() {424 test_impl::<((u8,), (u8, u8), (u8, u8))>(425 0xdeadbeef,426 ((43,), (44, 45), (46, 47)),427 &hex!(428 "429 deadbeef430 000000000000000000000000000000000000000000000000000000000000002b431 000000000000000000000000000000000000000000000000000000000000002c432 000000000000000000000000000000000000000000000000000000000000002d433 000000000000000000000000000000000000000000000000000000000000002e434 000000000000000000000000000000000000000000000000000000000000002f435 "436 ),437 );438}439440#[test]441fn encode_decode_tuple0_tuple1_uint8_tuple1_uint8() {442 test_impl::<((u8,), (u8,))>(443 0xdeadbeef,444 ((43,), (44,)),445 &hex!(446 "447 deadbeef448 000000000000000000000000000000000000000000000000000000000000002b449 000000000000000000000000000000000000000000000000000000000000002c450 "451 ),452 );453}454455#[test]456fn encode_decode_tuple0_tuple1_uint8_uint8() {457 test_impl::<((u8, u8),)>(458 0xdeadbeef,459 ((43, 44),),460 &hex!(461 "462 deadbeef463 000000000000000000000000000000000000000000000000000000000000002b464 000000000000000000000000000000000000000000000000000000000000002c465 "466 ),467 );468}469470#[test]471fn encode_decode_tuple_uint8_uint8() {472 test_impl::<(u8, u8)>(473 0xdeadbeef,474 (43, 44),475 &hex!(476 "477 deadbeef478 000000000000000000000000000000000000000000000000000000000000002b479 000000000000000000000000000000000000000000000000000000000000002c480 "481 ),482 );483}484485#[test]486fn encode_decode_tuple0_tuple1_uint8_uint8_tuple1_uint8_uint8_and_uint8() {487 test_impl::<((u8, u8), (u8, u8), u8)>(488 0xdeadbeef,489 ((10, 11), (12, 13), 14),490 &hex!(491 "492 deadbeef493 000000000000000000000000000000000000000000000000000000000000000a494 000000000000000000000000000000000000000000000000000000000000000b495 000000000000000000000000000000000000000000000000000000000000000c496 000000000000000000000000000000000000000000000000000000000000000d497 000000000000000000000000000000000000000000000000000000000000000e498 "499 ),500 );501}502503#[test]504fn encode_decode_tuple0_tuple1_string() {505 test_impl::<((String,),)>(506 0xdeadbeef,507 (("some string".to_string(),),),508 &hex!(509 "510 deadbeef511 0000000000000000000000000000000000000000000000000000000000000020512 0000000000000000000000000000000000000000000000000000000000000020513 0000000000000000000000000000000000000000000000000000000000000020514 000000000000000000000000000000000000000000000000000000000000000b515 736f6d6520737472696e67000000000000000000000000000000000000000000516 "517 ),518 );519}520521#[test]522fn encode_decode_tuple0_tuple1_uint8_string() {523 test_impl::<((u8, String),)>(524 0xdeadbeef,525 ((0xff, "some string".to_string()),),526 &hex!(527 "528 deadbeef529 0000000000000000000000000000000000000000000000000000000000000020530 0000000000000000000000000000000000000000000000000000000000000020531 00000000000000000000000000000000000000000000000000000000000000ff532 0000000000000000000000000000000000000000000000000000000000000040533 000000000000000000000000000000000000000000000000000000000000000b534 736f6d6520737472696e67000000000000000000000000000000000000000000535 "536 ),537 );538}539540#[test]541fn encode_decode_tuple0_tuple1_string_bytes() {542 test_impl::<((String, bytes),)>(543 0xdeadbeef,544 (("some string".to_string(), bytes(vec![1, 2, 3])),),545 &hex!(546 "547 deadbeef548 0000000000000000000000000000000000000000000000000000000000000020549 0000000000000000000000000000000000000000000000000000000000000020550 0000000000000000000000000000000000000000000000000000000000000040551 0000000000000000000000000000000000000000000000000000000000000080552 000000000000000000000000000000000000000000000000000000000000000b553 736f6d6520737472696e67000000000000000000000000000000000000000000554 0000000000000000000000000000000000000000000000000000000000000003555 0102030000000000000000000000000000000000000000000000000000000000556 "557 ),558 );559}560561#[test]562fn encode_decode_tuple0_tuple1_uint8_tuple1_string() {563 test_impl::<((u8,), (String,))>(564 0xdeadbeef,565 ((0xff,), ("some string".to_string(),)),566 &hex!(567 "568 deadbeef569 0000000000000000000000000000000000000000000000000000000000000020570 00000000000000000000000000000000000000000000000000000000000000ff571 0000000000000000000000000000000000000000000000000000000000000040572 0000000000000000000000000000000000000000000000000000000000000020573 000000000000000000000000000000000000000000000000000000000000000b574 736f6d6520737472696e67000000000000000000000000000000000000000000575 "576 ),577 );578}579580#[test]581fn parse_multiple_params() {582 let encoded_data = hex!(583 "584 deadbeef585 000000000000000000000000000000000000000000000000000000000000000a586 000000000000000000000000000000000000000000000000000000000000000b587 "588 );589 let (_, mut decoder) = AbiReader::new_call(&encoded_data).unwrap();590 let p1 = <u8>::abi_read(&mut decoder).unwrap();591 let p2 = <u8>::abi_read(&mut decoder).unwrap();592 assert_eq!(p1, 0x0a);593 assert_eq!(p2, 0x0b);594}