mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Tests for encoder from storage bug.
This commit is contained in:
		
							parent
							
								
									68d4a85575
								
							
						
					
					
						commit
						3039456f48
					
				| @ -510,6 +510,108 @@ BOOST_AUTO_TEST_CASE(structs2) | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(bool_arrays) | ||||
| { | ||||
| 	string sourceCode = R"( | ||||
| 		contract C { | ||||
| 			bool[] x; | ||||
| 			bool[4] y; | ||||
| 			event E(bool[], bool[4]); | ||||
| 			function f() public returns (bool[] memory, bool[4] memory) { | ||||
| 				x.length = 4; | ||||
| 				x[0] = true; | ||||
| 				x[1] = false; | ||||
| 				x[2] = true; | ||||
| 				x[3] = false; | ||||
| 				y[0] = true; | ||||
| 				y[1] = false; | ||||
| 				y[2] = true; | ||||
| 				y[3] = false; | ||||
| 				emit E(x, y); | ||||
| 				return (x, y); // this copies to memory first
 | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 
 | ||||
| 	BOTH_ENCODERS( | ||||
| 		compileAndRun(sourceCode, 0, "C"); | ||||
| 		bytes encoded = encodeArgs( | ||||
| 			0xa0, 1, 0, 1, 0, | ||||
| 			4, 1, 0, 1, 0 | ||||
| 		); | ||||
| 		ABI_CHECK(callContractFunction("f()"), encoded); | ||||
| 		REQUIRE_LOG_DATA(encoded); | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(bytes3_arrays) | ||||
| { | ||||
| 	string sourceCode = R"( | ||||
| 		contract C { | ||||
| 			bytes3[] x; | ||||
| 			bytes3[4] y; | ||||
| 			event E(bytes3[], bytes3[4]); | ||||
| 			function f() public returns (bytes3[] memory, bytes3[4] memory) { | ||||
| 				x.length = 4; | ||||
| 				x[0] = 0x010203; | ||||
| 				x[1] = 0x00; | ||||
| 				x[2] = 0x040506; | ||||
| 				x[3] = 0x00; | ||||
| 				y[0] = 0x00; | ||||
| 				y[1] = 0x010203; | ||||
| 				y[2] = 0x00; | ||||
| 				y[3] = 0x040506; | ||||
| 				emit E(x, y); | ||||
| 				return (x, y); // this copies to memory first
 | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 
 | ||||
| 	BOTH_ENCODERS( | ||||
| 		compileAndRun(sourceCode, 0, "C"); | ||||
| 		bytes encoded = encodeArgs( | ||||
| 			0xa0, 0, "\x01\x02\x03", 0, "\x04\x05\x06", | ||||
| 			4, "\x01\x02\x03", 0, "\x04\x05\x06", 0 | ||||
| 		); | ||||
| 		ABI_CHECK(callContractFunction("f()"), encoded); | ||||
| 		REQUIRE_LOG_DATA(encoded); | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(packed_structs) | ||||
| { | ||||
| 	string sourceCode = R"( | ||||
| 		contract C { | ||||
| 			struct S { bool a; int8 b; function() external g; bytes3 d; int8 e; } | ||||
| 			S s; | ||||
| 			event E(S); | ||||
| 			function store() public { | ||||
| 				s.a = false; | ||||
| 				s.b = -5; | ||||
| 				s.g = this.g; | ||||
| 				s.d = 0x010203; | ||||
| 				s.e = -3; | ||||
| 			} | ||||
| 			function f() public returns (S memory) { | ||||
| 				emit E(s); | ||||
| 				return s; // this copies to memory first
 | ||||
| 			} | ||||
| 			function g() public pure {} | ||||
| 		} | ||||
| 	)"; | ||||
| 
 | ||||
| 	NEW_ENCODER( | ||||
| 		compileAndRun(sourceCode, 0, "C"); | ||||
| 		ABI_CHECK(callContractFunction("store()"), bytes{}); | ||||
| 		bytes fun = m_contractAddress.asBytes() + fromHex("0xe2179b8e"); | ||||
| 		bytes encoded = encodeArgs( | ||||
| 			0, u256(-5), asString(fun), "\x01\x02\x03", u256(-3) | ||||
| 		); | ||||
| 		ABI_CHECK(callContractFunction("f()"), encoded); | ||||
| 		REQUIRE_LOG_DATA(encoded); | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_SUITE_END() | ||||
| 
 | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user