From a16461249feb564b3ea581e8056fead8152999d0 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 8 Aug 2018 20:25:04 +0100 Subject: Add tests for the assembler object --- test/libevmasm/Assembler.cpp | 151 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 test/libevmasm/Assembler.cpp (limited to 'test/libevmasm/Assembler.cpp') diff --git a/test/libevmasm/Assembler.cpp b/test/libevmasm/Assembler.cpp new file mode 100644 index 00000000..d79115a0 --- /dev/null +++ b/test/libevmasm/Assembler.cpp @@ -0,0 +1,151 @@ +/* + This file is part of solidity. + + solidity is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + solidity is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with solidity. If not, see . +*/ +/** + * @author Alex Beregszaszi + * @date 2018 + * Tests for the assembler. + */ + +#include +#include + +#include + +#include +#include +#include + +using namespace std; +using namespace dev::eth; + +namespace dev +{ +namespace solidity +{ +namespace test +{ + +namespace +{ + void checkCompilation(Assembly const& _asm) + { + LinkerObject output = _asm.assemble(); + BOOST_CHECK(output.bytecode.size() > 0); + BOOST_CHECK(output.toHex().length() > 0); + } +} + +BOOST_AUTO_TEST_SUITE(Assembler) + +BOOST_AUTO_TEST_CASE(all_assembly_items) +{ + Assembly _asm; + _asm.setSourceLocation(SourceLocation(1, 3, make_shared("root.asm"))); + + Assembly _subAsm; + _subAsm.setSourceLocation(SourceLocation(6, 8, make_shared("sub.asm"))); + _subAsm.append(Instruction::INVALID); + shared_ptr _subAsmPtr = make_shared(_subAsm); + + // Tag + auto tag = _asm.newTag(); + _asm.append(tag); + // Operation + _asm.append(u256(1)); + _asm.append(u256(2)); + // Push + _asm.append(Instruction::KECCAK256); + // PushProgramSize + _asm.appendProgramSize(); + // PushLibraryAddress + _asm.appendLibraryAddress("someLibrary"); + // PushTag + Operation + _asm.appendJump(tag); + // PushString + _asm.append("Unused feature for pushing string"); + // PushData + _asm.append(bytes{0x1, 0x2, 0x3, 0x4}); + // PushSubSize + auto sub = _asm.appendSubroutine(_subAsmPtr); + // PushSub + _asm.pushSubroutineOffset(size_t(sub.data())); + // PushDeployTimeAddress + _asm.append(PushDeployTimeAddress); + // Operation + _asm.append(Instruction::STOP); + _asm.appendAuxiliaryDataToEnd(bytes{0x42, 0x66}); + _asm.appendAuxiliaryDataToEnd(bytes{0xee, 0xaa}); + + checkCompilation(_asm); + BOOST_CHECK_EQUAL( + _asm.assemble().toHex(), + "5b6001600220606773__someLibrary___________________________" + "6000567f556e75736564206665617475726520666f722070757368696e" + "6720737472696e605f6001605e7300000000000000000000000000000000000000000000" + "fe010203044266eeaa" + ); + BOOST_CHECK_EQUAL( + _asm.assemblyString(), + " /* \"root.asm\":1:3 */\n" + "tag_1:\n" + " keccak256(0x2, 0x1)\n" + " bytecodeSize\n" + " linkerSymbol(\"bf005014d9d0f534b8fcb268bd84c491a2380f4acd260d1ccfe9cd8201f7e994\")\n" + " jump(tag_1)\n" + " data_027497964124140851e8a9992ba16b5c1aaf9730b78d6036c8d65e3bb5ea4c8f\n" + " data_a6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b\n" + " dataSize(sub_0)\n" + " dataOffset(sub_0)\n" + " deployTimeAddress()\n" + " stop\n" + "stop\n" + "data_a6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b 01020304\n" + "\n" + "sub_0: assembly {\n" + " /* \"sub.asm\":6:8 */\n" + " invalid\n" + "}\n" + "\n" + "auxdata: 0x4266eeaa\n" + ); + BOOST_CHECK_EQUAL( + dev::jsonCompactPrint(_asm.assemblyJSON()), + "{\".auxdata\":\"4266eeaa\",\".code\":[{\"begin\":1,\"end\":3,\"name\":\"tag\",\"value\":\"1\"}," + "{\"begin\":1,\"end\":3,\"name\":\"JUMPDEST\"}," + "{\"begin\":1,\"end\":3,\"name\":\"PUSH\",\"value\":\"1\"}," + "{\"begin\":1,\"end\":3,\"name\":\"PUSH\",\"value\":\"2\"}," + "{\"begin\":1,\"end\":3,\"name\":\"KECCAK256\"}," + "{\"begin\":1,\"end\":3,\"name\":\"PUSHSIZE\"}," + "{\"begin\":1,\"end\":3,\"name\":\"PUSHLIB\",\"value\":\"someLibrary\"}," + "{\"begin\":1,\"end\":3,\"name\":\"PUSH [tag]\",\"value\":\"1\"}," + "{\"begin\":1,\"end\":3,\"name\":\"JUMP\"}," + "{\"begin\":1,\"end\":3,\"name\":\"PUSH tag\",\"value\":\"Unused feature for pushing string\"}," + "{\"begin\":1,\"end\":3,\"name\":\"PUSH data\",\"value\":\"A6885B3731702DA62E8E4A8F584AC46A7F6822F4E2BA50FBA902F67B1588D23B\"}," + "{\"begin\":1,\"end\":3,\"name\":\"PUSH #[$]\",\"value\":\"0000000000000000000000000000000000000000000000000000000000000000\"}," + "{\"begin\":1,\"end\":3,\"name\":\"PUSH [$]\",\"value\":\"0000000000000000000000000000000000000000000000000000000000000000\"}," + "{\"begin\":1,\"end\":3,\"name\":\"PUSHDEPLOYADDRESS\"}," + "{\"begin\":1,\"end\":3,\"name\":\"STOP\"}]," + "\".data\":{\"0\":{\".code\":[{\"begin\":6,\"end\":8,\"name\":\"INVALID\"}]}," + "\"A6885B3731702DA62E8E4A8F584AC46A7F6822F4E2BA50FBA902F67B1588D23B\":\"01020304\"}}" + ); +} + +BOOST_AUTO_TEST_SUITE_END() + +} +} +} // end namespaces -- cgit v1.2.3 From 79ba5b61b38b2a77acf108861a1525b7cb619aaa Mon Sep 17 00:00:00 2001 From: Christian Parpart Date: Thu, 9 Aug 2018 10:14:47 +0200 Subject: Fixes compilation under MSVC. --- test/libevmasm/Assembler.cpp | 49 ++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 24 deletions(-) (limited to 'test/libevmasm/Assembler.cpp') diff --git a/test/libevmasm/Assembler.cpp b/test/libevmasm/Assembler.cpp index d79115a0..8992430e 100644 --- a/test/libevmasm/Assembler.cpp +++ b/test/libevmasm/Assembler.cpp @@ -41,9 +41,9 @@ namespace test namespace { - void checkCompilation(Assembly const& _asm) + void checkCompilation(::dev::eth::Assembly const& _assembly) { - LinkerObject output = _asm.assemble(); + LinkerObject output = _assembly.assemble(); BOOST_CHECK(output.bytecode.size() > 0); BOOST_CHECK(output.toHex().length() > 0); } @@ -53,8 +53,8 @@ BOOST_AUTO_TEST_SUITE(Assembler) BOOST_AUTO_TEST_CASE(all_assembly_items) { - Assembly _asm; - _asm.setSourceLocation(SourceLocation(1, 3, make_shared("root.asm"))); + Assembly _assembly; + _assembly.setSourceLocation(SourceLocation(1, 3, make_shared("root.asm"))); Assembly _subAsm; _subAsm.setSourceLocation(SourceLocation(6, 8, make_shared("sub.asm"))); @@ -62,44 +62,45 @@ BOOST_AUTO_TEST_CASE(all_assembly_items) shared_ptr _subAsmPtr = make_shared(_subAsm); // Tag - auto tag = _asm.newTag(); - _asm.append(tag); + auto tag = _assembly.newTag(); + _assembly.append(tag); // Operation - _asm.append(u256(1)); - _asm.append(u256(2)); + _assembly.append(u256(1)); + _assembly.append(u256(2)); // Push - _asm.append(Instruction::KECCAK256); + _assembly.append(Instruction::KECCAK256); // PushProgramSize - _asm.appendProgramSize(); + _assembly.appendProgramSize(); // PushLibraryAddress - _asm.appendLibraryAddress("someLibrary"); + _assembly.appendLibraryAddress("someLibrary"); // PushTag + Operation - _asm.appendJump(tag); + _assembly.appendJump(tag); // PushString - _asm.append("Unused feature for pushing string"); + _assembly.append("Unused feature for pushing string"); // PushData - _asm.append(bytes{0x1, 0x2, 0x3, 0x4}); + _assembly.append(bytes{0x1, 0x2, 0x3, 0x4}); // PushSubSize - auto sub = _asm.appendSubroutine(_subAsmPtr); + auto sub = _assembly.appendSubroutine(_subAsmPtr); // PushSub - _asm.pushSubroutineOffset(size_t(sub.data())); + _assembly.pushSubroutineOffset(size_t(sub.data())); // PushDeployTimeAddress - _asm.append(PushDeployTimeAddress); + _assembly.append(PushDeployTimeAddress); // Operation - _asm.append(Instruction::STOP); - _asm.appendAuxiliaryDataToEnd(bytes{0x42, 0x66}); - _asm.appendAuxiliaryDataToEnd(bytes{0xee, 0xaa}); + _assembly.append(Instruction::STOP); + _assembly.appendAuxiliaryDataToEnd(bytes{0x42, 0x66}); + _assembly.appendAuxiliaryDataToEnd(bytes{0xee, 0xaa}); + + checkCompilation(_assembly); - checkCompilation(_asm); BOOST_CHECK_EQUAL( - _asm.assemble().toHex(), + _assembly.assemble().toHex(), "5b6001600220606773__someLibrary___________________________" "6000567f556e75736564206665617475726520666f722070757368696e" "6720737472696e605f6001605e7300000000000000000000000000000000000000000000" "fe010203044266eeaa" ); BOOST_CHECK_EQUAL( - _asm.assemblyString(), + _assembly.assemblyString(), " /* \"root.asm\":1:3 */\n" "tag_1:\n" " keccak256(0x2, 0x1)\n" @@ -123,7 +124,7 @@ BOOST_AUTO_TEST_CASE(all_assembly_items) "auxdata: 0x4266eeaa\n" ); BOOST_CHECK_EQUAL( - dev::jsonCompactPrint(_asm.assemblyJSON()), + dev::jsonCompactPrint(_assembly.assemblyJSON()), "{\".auxdata\":\"4266eeaa\",\".code\":[{\"begin\":1,\"end\":3,\"name\":\"tag\",\"value\":\"1\"}," "{\"begin\":1,\"end\":3,\"name\":\"JUMPDEST\"}," "{\"begin\":1,\"end\":3,\"name\":\"PUSH\",\"value\":\"1\"}," -- cgit v1.2.3 From 17cac588d053429ff74c53fd82648da7c8c55db9 Mon Sep 17 00:00:00 2001 From: Leonardo Alt Date: Tue, 14 Aug 2018 11:41:40 +0200 Subject: Replace safety stop by invalid --- test/libevmasm/Assembler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/libevmasm/Assembler.cpp') diff --git a/test/libevmasm/Assembler.cpp b/test/libevmasm/Assembler.cpp index 8992430e..bc652f56 100644 --- a/test/libevmasm/Assembler.cpp +++ b/test/libevmasm/Assembler.cpp @@ -96,7 +96,7 @@ BOOST_AUTO_TEST_CASE(all_assembly_items) _assembly.assemble().toHex(), "5b6001600220606773__someLibrary___________________________" "6000567f556e75736564206665617475726520666f722070757368696e" - "6720737472696e605f6001605e7300000000000000000000000000000000000000000000" + "6720737472696e605f6001605e73000000000000000000000000000000000000000000fe" "fe010203044266eeaa" ); BOOST_CHECK_EQUAL( -- cgit v1.2.3 From 6daeb39ecc7ffd0e834e63f6495442c4211c5c1c Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 4 Oct 2018 14:55:02 +0200 Subject: Use hash for library placeholders. --- test/libevmasm/Assembler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/libevmasm/Assembler.cpp') diff --git a/test/libevmasm/Assembler.cpp b/test/libevmasm/Assembler.cpp index bc652f56..38ed9732 100644 --- a/test/libevmasm/Assembler.cpp +++ b/test/libevmasm/Assembler.cpp @@ -94,7 +94,7 @@ BOOST_AUTO_TEST_CASE(all_assembly_items) BOOST_CHECK_EQUAL( _assembly.assemble().toHex(), - "5b6001600220606773__someLibrary___________________________" + "5b6001600220606773__bf005014d9d0f534b8fcb268bd84c491a238__" "6000567f556e75736564206665617475726520666f722070757368696e" "6720737472696e605f6001605e73000000000000000000000000000000000000000000fe" "fe010203044266eeaa" -- cgit v1.2.3 From 26c693aa920ec1ea41ef7994a3dc8bb45b78f866 Mon Sep 17 00:00:00 2001 From: chriseth Date: Mon, 8 Oct 2018 15:08:12 +0200 Subject: Change library placeholder to `__$$__`. --- test/libevmasm/Assembler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/libevmasm/Assembler.cpp') diff --git a/test/libevmasm/Assembler.cpp b/test/libevmasm/Assembler.cpp index 38ed9732..1c041596 100644 --- a/test/libevmasm/Assembler.cpp +++ b/test/libevmasm/Assembler.cpp @@ -94,7 +94,7 @@ BOOST_AUTO_TEST_CASE(all_assembly_items) BOOST_CHECK_EQUAL( _assembly.assemble().toHex(), - "5b6001600220606773__bf005014d9d0f534b8fcb268bd84c491a238__" + "5b6001600220606773__$bf005014d9d0f534b8fcb268bd84c491a2$__" "6000567f556e75736564206665617475726520666f722070757368696e" "6720737472696e605f6001605e73000000000000000000000000000000000000000000fe" "fe010203044266eeaa" -- cgit v1.2.3