aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/GasMeter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsolidity/GasMeter.cpp')
-rw-r--r--libsolidity/GasMeter.cpp235
1 files changed, 0 insertions, 235 deletions
diff --git a/libsolidity/GasMeter.cpp b/libsolidity/GasMeter.cpp
deleted file mode 100644
index 5f442654..00000000
--- a/libsolidity/GasMeter.cpp
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- This file is part of cpp-ethereum.
-
- cpp-ethereum 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.
-
- cpp-ethereum 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 cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
-*/
-/**
- * @author Christian <c@ethdev.com>
- * @date 2015
- * Unit tests for the gas estimator.
- */
-
-#include <test/libsolidity/solidityExecutionFramework.h>
-#include <libevmasm/GasMeter.h>
-#include <libevmasm/KnownState.h>
-#include <libevmasm/PathGasMeter.h>
-#include <libsolidity/AST.h>
-#include <libsolidity/GasEstimator.h>
-#include <libsolidity/SourceReferenceFormatter.h>
-
-using namespace std;
-using namespace dev::eth;
-using namespace dev::solidity;
-
-namespace dev
-{
-namespace solidity
-{
-namespace test
-{
-
-class GasMeterTestFramework: public ExecutionFramework
-{
-public:
- GasMeterTestFramework() { }
- void compile(string const& _sourceCode)
- {
- m_compiler.setSource(_sourceCode);
- ETH_TEST_REQUIRE_NO_THROW(m_compiler.compile(), "Compiling contract failed");
-
- AssemblyItems const* items = m_compiler.getRuntimeAssemblyItems("");
- ASTNode const& sourceUnit = m_compiler.getAST();
- BOOST_REQUIRE(items != nullptr);
- m_gasCosts = GasEstimator::breakToStatementLevel(
- GasEstimator::structuralEstimation(*items, vector<ASTNode const*>({&sourceUnit})),
- {&sourceUnit}
- );
- }
-
- void testCreationTimeGas(string const& _sourceCode)
- {
- compileAndRun(_sourceCode);
- auto state = make_shared<KnownState>();
- PathGasMeter meter(*m_compiler.getAssemblyItems());
- GasMeter::GasConsumption gas = meter.estimateMax(0, state);
- u256 bytecodeSize(m_compiler.getRuntimeBytecode().size());
- gas += bytecodeSize * c_createDataGas;
- BOOST_REQUIRE(!gas.isInfinite);
- BOOST_CHECK(gas.value == m_gasUsed);
- }
-
- /// Compares the gas computed by PathGasMeter for the given signature (but unknown arguments)
- /// against the actual gas usage computed by the VM on the given set of argument variants.
- void testRunTimeGas(string const& _sig, vector<bytes> _argumentVariants)
- {
- u256 gasUsed = 0;
- FixedHash<4> hash(dev::sha3(_sig));
- for (bytes const& arguments: _argumentVariants)
- {
- sendMessage(hash.asBytes() + arguments, false, 0);
- gasUsed = max(gasUsed, m_gasUsed);
- }
-
- GasMeter::GasConsumption gas = GasEstimator::functionalEstimation(
- *m_compiler.getRuntimeAssemblyItems(),
- _sig
- );
- BOOST_REQUIRE(!gas.isInfinite);
- BOOST_CHECK(gas.value == m_gasUsed);
- }
-
-protected:
- map<ASTNode const*, eth::GasMeter::GasConsumption> m_gasCosts;
-};
-
-BOOST_FIXTURE_TEST_SUITE(GasMeterTests, GasMeterTestFramework)
-
-BOOST_AUTO_TEST_CASE(non_overlapping_filtered_costs)
-{
- char const* sourceCode = R"(
- contract test {
- bytes x;
- function f(uint a) returns (uint b) {
- x.length = a;
- for (; a < 200; ++a) {
- x[a] = 9;
- b = a * a;
- }
- return f(a - 1);
- }
- }
- )";
- compile(sourceCode);
- for (auto first = m_gasCosts.cbegin(); first != m_gasCosts.cend(); ++first)
- {
- auto second = first;
- for (++second; second != m_gasCosts.cend(); ++second)
- if (first->first->getLocation().intersects(second->first->getLocation()))
- {
- BOOST_CHECK_MESSAGE(false, "Source locations should not overlap!");
- SourceReferenceFormatter::printSourceLocation(cout, first->first->getLocation(), m_compiler.getScanner());
- SourceReferenceFormatter::printSourceLocation(cout, second->first->getLocation(), m_compiler.getScanner());
- }
- }
-}
-
-BOOST_AUTO_TEST_CASE(simple_contract)
-{
- // Tests a simple "deploy contract" code without constructor. The actual contract is not relevant.
- char const* sourceCode = R"(
- contract test {
- bytes32 public shaValue;
- function f(uint a) {
- shaValue = sha3(a);
- }
- }
- )";
- testCreationTimeGas(sourceCode);
-}
-
-BOOST_AUTO_TEST_CASE(store_sha3)
-{
- char const* sourceCode = R"(
- contract test {
- bytes32 public shaValue;
- function test(uint a) {
- shaValue = sha3(a);
- }
- }
- )";
- testCreationTimeGas(sourceCode);
-}
-
-BOOST_AUTO_TEST_CASE(updating_store)
-{
- char const* sourceCode = R"(
- contract test {
- uint data;
- uint data2;
- function test() {
- data = 1;
- data = 2;
- data2 = 0;
- }
- }
- )";
- testCreationTimeGas(sourceCode);
-}
-
-BOOST_AUTO_TEST_CASE(branches)
-{
- char const* sourceCode = R"(
- contract test {
- uint data;
- uint data2;
- function f(uint x) {
- if (x > 7)
- data2 = 1;
- else
- data = 1;
- }
- }
- )";
- testCreationTimeGas(sourceCode);
- testRunTimeGas("f(uint256)", vector<bytes>{encodeArgs(2), encodeArgs(8)});
-}
-
-BOOST_AUTO_TEST_CASE(function_calls)
-{
- char const* sourceCode = R"(
- contract test {
- uint data;
- uint data2;
- function f(uint x) {
- if (x > 7)
- data2 = g(x**8) + 1;
- else
- data = 1;
- }
- function g(uint x) internal returns (uint) {
- return data2;
- }
- }
- )";
- testCreationTimeGas(sourceCode);
- testRunTimeGas("f(uint256)", vector<bytes>{encodeArgs(2), encodeArgs(8)});
-}
-
-BOOST_AUTO_TEST_CASE(multiple_external_functions)
-{
- char const* sourceCode = R"(
- contract test {
- uint data;
- uint data2;
- function f(uint x) {
- if (x > 7)
- data2 = g(x**8) + 1;
- else
- data = 1;
- }
- function g(uint x) returns (uint) {
- return data2;
- }
- }
- )";
- testCreationTimeGas(sourceCode);
- testRunTimeGas("f(uint256)", vector<bytes>{encodeArgs(2), encodeArgs(8)});
- testRunTimeGas("g(uint256)", vector<bytes>{encodeArgs(2)});
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-}
-}
-}