diff --git a/contrib/teamcity/build-configurations.sh b/contrib/teamcity/build-configurations.sh --- a/contrib/teamcity/build-configurations.sh +++ b/contrib/teamcity/build-configurations.sh @@ -114,7 +114,7 @@ TEST_RUNNER_FLAGS="${TEST_RUNNER_FLAGS} --extended" fi ./test/functional/test_runner.py -J=junit_results_default.xml ${TEST_RUNNER_FLAGS} - ./test/functional/test_runner.py -J=junit_results_next_upgrade.xml --with-gravitonactivation ${TEST_RUNNER_FLAGS} + ./test/functional/test_runner.py -J=junit_results_next_upgrade.xml --with-nextupgrade ${TEST_RUNNER_FLAGS} # Build secp256k1 and run the java tests. export TOPLEVEL="${TOPLEVEL}"/src/secp256k1 diff --git a/src/consensus/activation.cpp b/src/consensus/activation.cpp --- a/src/consensus/activation.cpp +++ b/src/consensus/activation.cpp @@ -65,6 +65,8 @@ return false; } - return pindexPrev->GetMedianTimePast() >= - gArgs.GetArg("-phononactivationtime", params.phononActivationTime); + return (!gArgs.IsArgSet("-phononactivationtime") && + gArgs.GetBoolArg("-activatenextupgrade", false)) || + (pindexPrev->GetMedianTimePast() >= + gArgs.GetArg("-phononactivationtime", params.phononActivationTime)); } diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -990,6 +990,7 @@ gArgs.AddArg("-parkdeepreorg", "", false, OptionsCategory::HIDDEN); gArgs.AddArg("-replayprotectionactivationtime", "", false, OptionsCategory::HIDDEN); + gArgs.AddArg("-activatenextupgrade", "", false, OptionsCategory::HIDDEN); // TODO remove after the Nov 2019 upgrade gArgs.AddArg("-gravitonactivationtime", "", false, OptionsCategory::HIDDEN); diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -162,7 +162,7 @@ COMMAND "test_bitcoin" "--" - "-gravitonactivationtime=1573819200" + "-activatenextupgrade=1" ) endif() diff --git a/src/test/activation_tests.cpp b/src/test/activation_tests.cpp --- a/src/test/activation_tests.cpp +++ b/src/test/activation_tests.cpp @@ -50,29 +50,48 @@ } BOOST_AUTO_TEST_CASE(isphononenabled) { - CBlockIndex prev; + if (!gArgs.GetBoolArg("-activatenextupgrade", false)) { + CBlockIndex prev; - const Consensus::Params ¶ms = Params().GetConsensus(); - const auto activation = - gArgs.GetArg("-phononactivationtime", params.phononActivationTime); - SetMockTime(activation - 1000000); + const Consensus::Params ¶ms = Params().GetConsensus(); + const auto activation = + gArgs.GetArg("-phononactivationtime", params.phononActivationTime); + SetMockTime(activation - 1000000); - BOOST_CHECK(!IsPhononEnabled(params, nullptr)); + BOOST_CHECK(!IsPhononEnabled(params, nullptr)); - std::array blocks; - for (size_t i = 1; i < blocks.size(); ++i) { - blocks[i].pprev = &blocks[i - 1]; - } - BOOST_CHECK(!IsPhononEnabled(params, &blocks.back())); + std::array blocks; + for (size_t i = 1; i < blocks.size(); ++i) { + blocks[i].pprev = &blocks[i - 1]; + } + BOOST_CHECK(!IsPhononEnabled(params, &blocks.back())); - SetMTP(blocks, activation - 1); - BOOST_CHECK(!IsPhononEnabled(params, &blocks.back())); + // If -phononactivationtime is set on cli, clear it temporarily + gArgs.ClearArg("-phononactivationtime"); - SetMTP(blocks, activation); - BOOST_CHECK(IsPhononEnabled(params, &blocks.back())); + gArgs.ForceSetBoolArg("-activatenextupgrade", true); + BOOST_CHECK(!IsPhononEnabled(params, nullptr)); + BOOST_CHECK(IsPhononEnabled(params, &blocks.back())); - SetMTP(blocks, activation + 1); - BOOST_CHECK(IsPhononEnabled(params, &blocks.back())); + gArgs.ForceSetBoolArg("-activatenextupgrade", false); + BOOST_CHECK(!IsPhononEnabled(params, &blocks.back())); + + // -phononactivationtime has precedence over -activatenextupgrade + gArgs.ForceSetBoolArg("-activatenextupgrade", true); + gArgs.ForceSetArg("-phononactivationtime", std::to_string(activation)); + BOOST_CHECK(!IsPhononEnabled(params, &blocks.back())); + + gArgs.ForceSetBoolArg("-activatenextupgrade", false); + + SetMTP(blocks, activation - 1); + BOOST_CHECK(!IsPhononEnabled(params, &blocks.back())); + + SetMTP(blocks, activation); + BOOST_CHECK(IsPhononEnabled(params, &blocks.back())); + + SetMTP(blocks, activation + 1); + BOOST_CHECK(IsPhononEnabled(params, &blocks.back())); + } } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/test/test_bitcoin_main.cpp b/src/test/test_bitcoin_main.cpp --- a/src/test/test_bitcoin_main.cpp +++ b/src/test/test_bitcoin_main.cpp @@ -29,6 +29,7 @@ } std::set testArgs = { + "-activatenextupgrade", "-gravitonactivationtime", "-phononactivationtime", }; diff --git a/src/util/system.h b/src/util/system.h --- a/src/util/system.h +++ b/src/util/system.h @@ -251,6 +251,9 @@ // been set. Also called directly in testing. void ForceSetArg(const std::string &strArg, const std::string &strValue); + // Forces a boolean arg setting, used only in testing. + void ForceSetBoolArg(const std::string &strArg, bool fValue); + // Forces a multi arg setting, used only in testing void ForceSetMultiArg(const std::string &strArg, const std::string &strValue); diff --git a/src/util/system.cpp b/src/util/system.cpp --- a/src/util/system.cpp +++ b/src/util/system.cpp @@ -597,6 +597,14 @@ m_override_args[strArg] = {strValue}; } +void ArgsManager::ForceSetBoolArg(const std::string &strArg, bool fValue) { + if (fValue) { + return ForceSetArg(strArg, std::string("1")); + } else { + return ForceSetArg(strArg, std::string("0")); + } +} + /** * This function is only used for testing purpose so * so we should not worry about element uniqueness and diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py --- a/test/functional/test_framework/test_framework.py +++ b/test/functional/test_framework/test_framework.py @@ -103,8 +103,8 @@ help="Attach a python debugger if test fails") parser.add_argument("--usecli", dest="usecli", default=False, action="store_true", help="use bitcoin-cli instead of RPC for all commands") - parser.add_argument("--with-gravitonactivation", dest="gravitonactivation", default=False, action="store_true", - help="Activate graviton update on timestamp {}".format(TIMESTAMP_IN_THE_PAST)) + parser.add_argument("--with-nextupgrade", dest="nextupgrade", default=False, action="store_true", + help="Activate the next upgrade") self.add_options(parser) self.options = parser.parse_args() @@ -294,9 +294,8 @@ extra_args=extra_args[i], use_cli=self.options.usecli, )) - if self.options.gravitonactivation: - self.nodes[i].extend_default_args( - ["-gravitonactivationtime={}".format(TIMESTAMP_IN_THE_PAST)]) + if self.options.nextupgrade: + self.nodes[i].extend_default_args(["-activatenextupgrade=1"]) def start_node(self, i, *args, **kwargs): """Start a bitcoind""" @@ -455,9 +454,9 @@ if i > 0: self.nodes[i].extend_default_args( ["-connect=127.0.0.1:" + str(p2p_port(0))]) - if self.options.gravitonactivation: + if self.options.nextupgrade: self.nodes[i].extend_default_args( - ["-gravitonactivationtime={}".format(TIMESTAMP_IN_THE_PAST)]) + ["-activatenextupgrade=1"]) self.start_node(i) # Wait for RPC connections to be ready