Duke
5 months ago
19 changed files with 200 additions and 373 deletions
@ -1,62 +0,0 @@ |
|||
// Copyright (c) 2017 The Zcash developers
|
|||
// Copyright (c) 2016-2023 The Hush developers
|
|||
// Distributed under the GPLv3 software license, see the accompanying
|
|||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
|||
|
|||
/******************************************************************************
|
|||
* Copyright © 2014-2019 The SuperNET Developers. * |
|||
* * |
|||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * |
|||
* the top-level directory of this distribution for the individual copyright * |
|||
* holder information and the developer policies on copyright and licensing. * |
|||
* * |
|||
* Unless otherwise agreed in a custom licensing agreement, no part of the * |
|||
* SuperNET software, including this file may be copied, modified, propagated * |
|||
* or distributed except according to the terms contained in the LICENSE file * |
|||
* * |
|||
* Removal or modification of this copyright notice is prohibited. * |
|||
* * |
|||
******************************************************************************/ |
|||
|
|||
#include "deprecation.h" |
|||
#include "clientversion.h" |
|||
#include "init.h" |
|||
#include "ui_interface.h" |
|||
#include "util.h" |
|||
#include "chainparams.h" |
|||
|
|||
static const std::string CLIENT_VERSION_STR = FormatVersion(CLIENT_VERSION); |
|||
extern char SMART_CHAIN_SYMBOL[HUSH_SMART_CHAIN_MAXLEN]; |
|||
|
|||
void EnforceNodeDeprecation(int nHeight, bool forceLogging, bool fThread) { |
|||
|
|||
// Do not enforce deprecation in regtest or on testnet
|
|||
std::string networkID = Params().NetworkIDString(); |
|||
std::string msg; |
|||
|
|||
if (networkID != "main" || SMART_CHAIN_SYMBOL[0] != 0 ) return; |
|||
|
|||
int blocksToDeprecation = DEPRECATION_HEIGHT - nHeight; |
|||
if (blocksToDeprecation <= 0) { |
|||
// In order to ensure we only log once per process when deprecation is
|
|||
// disabled (to avoid log spam), we only need to log in two cases:
|
|||
// - The deprecating block just arrived
|
|||
// - This can be triggered more than once if a block chain reorg
|
|||
// occurs, but that's an irregular event that won't cause spam.
|
|||
// - The node is starting
|
|||
if (blocksToDeprecation == 0 || forceLogging) { |
|||
msg = strprintf(_("This version has been deprecated as of block height %d."), |
|||
DEPRECATION_HEIGHT) + " " + |
|||
_("You should upgrade to the latest version of Hush."); |
|||
LogPrintf("*** %s\n", msg); |
|||
uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_ERROR); |
|||
} |
|||
StartShutdown(); |
|||
} else if (blocksToDeprecation == DEPRECATION_WARN_LIMIT || (blocksToDeprecation < DEPRECATION_WARN_LIMIT && forceLogging)) { |
|||
msg = strprintf(_("This version will be deprecated at block height %d, and will automatically shut down."), |
|||
DEPRECATION_HEIGHT) + " " + |
|||
_("You should upgrade to the latest version of Hush."); |
|||
LogPrintf("*** %s\n", msg); |
|||
uiInterface.ThreadSafeMessageBox(msg, "", CClientUIInterface::MSG_WARNING); |
|||
} |
|||
} |
@ -1,41 +0,0 @@ |
|||
// Copyright (c) 2017 The Zcash developers
|
|||
// Copyright (c) 2016-2023 The Hush developers
|
|||
// Distributed under the GPLv3 software license, see the accompanying
|
|||
// file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html
|
|||
|
|||
/******************************************************************************
|
|||
* Copyright © 2014-2019 The SuperNET Developers. * |
|||
* * |
|||
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * |
|||
* the top-level directory of this distribution for the individual copyright * |
|||
* holder information and the developer policies on copyright and licensing. * |
|||
* * |
|||
* Unless otherwise agreed in a custom licensing agreement, no part of the * |
|||
* SuperNET software, including this file may be copied, modified, propagated * |
|||
* or distributed except according to the terms contained in the LICENSE file * |
|||
* * |
|||
* Removal or modification of this copyright notice is prohibited. * |
|||
* * |
|||
******************************************************************************/ |
|||
|
|||
#ifndef ZCASH_DEPRECATION_H |
|||
#define ZCASH_DEPRECATION_H |
|||
|
|||
// Deprecation policy:
|
|||
// * Shut down WEEKS_UNTIL_DEPRECATION weeks' worth of blocks after the estimated release block height.
|
|||
// * A warning is shown during the DEPRECATION_WARN_LIMIT worth of blocks prior to shut down.
|
|||
static const int WEEKS_UNTIL_DEPRECATION = 52; |
|||
static const int DEPRECATION_HEIGHT = 5555555; |
|||
static const int APPROX_RELEASE_HEIGHT = DEPRECATION_HEIGHT - (WEEKS_UNTIL_DEPRECATION * 7 * 24 * 60); |
|||
|
|||
// Number of blocks before deprecation to warn users
|
|||
static const int DEPRECATION_WARN_LIMIT = 60 * 24 * 60; // 2 months
|
|||
|
|||
/**
|
|||
* Checks whether the node is deprecated based on the current block height, and |
|||
* shuts down the node with an error if so (and deprecation is not disabled for |
|||
* the current client version). |
|||
*/ |
|||
void EnforceNodeDeprecation(int nHeight, bool forceLogging=false, bool fThread=true); |
|||
|
|||
#endif // ZCASH_DEPRECATION_H
|
@ -1,153 +0,0 @@ |
|||
// Copyright (c) 2016-2023 The Hush developers
|
|||
// Distributed under the GPLv3 software license, see the accompanying
|
|||
// Released under the GPLv3
|
|||
|
|||
#include <gmock/gmock.h> |
|||
#include <gtest/gtest.h> |
|||
|
|||
#include "chainparams.h" |
|||
#include "clientversion.h" |
|||
#include "deprecation.h" |
|||
#include "init.h" |
|||
#include "ui_interface.h" |
|||
#include "util.h" |
|||
#include "util/strencodings.h" |
|||
|
|||
#include <boost/filesystem/operations.hpp> |
|||
#include <fstream> |
|||
|
|||
using ::testing::StrictMock; |
|||
|
|||
static const std::string CLIENT_VERSION_STR = FormatVersion(CLIENT_VERSION); |
|||
extern std::atomic<bool> fRequestShutdown; |
|||
|
|||
class MockUIInterface { |
|||
public: |
|||
MOCK_METHOD3(ThreadSafeMessageBox, bool(const std::string& message, |
|||
const std::string& caption, |
|||
unsigned int style)); |
|||
}; |
|||
|
|||
static bool ThreadSafeMessageBox(MockUIInterface *mock, |
|||
const std::string& message, |
|||
const std::string& caption, |
|||
unsigned int style) |
|||
{ |
|||
return mock->ThreadSafeMessageBox(message, caption, style); |
|||
} |
|||
|
|||
class DeprecationTest : public ::testing::Test { |
|||
protected: |
|||
virtual void SetUp() { |
|||
uiInterface.ThreadSafeMessageBox.disconnect_all_slots(); |
|||
uiInterface.ThreadSafeMessageBox.connect(boost::bind(ThreadSafeMessageBox, &mock_, _1, _2, _3)); |
|||
SelectParams(CBaseChainParams::MAIN); |
|||
|
|||
} |
|||
|
|||
virtual void TearDown() { |
|||
fRequestShutdown = false; |
|||
mapArgs.clear(); |
|||
} |
|||
|
|||
StrictMock<MockUIInterface> mock_; |
|||
|
|||
static std::vector<std::string> read_lines(boost::filesystem::path filepath) { |
|||
std::vector<std::string> result; |
|||
|
|||
std::ifstream f(filepath.string().c_str()); |
|||
std::string line; |
|||
while (std::getline(f,line)) { |
|||
result.push_back(line); |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
}; |
|||
|
|||
TEST_F(DeprecationTest, NonDeprecatedNodeKeepsRunning) { |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT - 1); |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
} |
|||
|
|||
TEST_F(DeprecationTest, NodeNearDeprecationIsWarned) { |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_WARNING)); |
|||
EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT); |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
} |
|||
|
|||
TEST_F(DeprecationTest, NodeNearDeprecationWarningIsNotDuplicated) { |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT + 1); |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
} |
|||
|
|||
TEST_F(DeprecationTest, NodeNearDeprecationWarningIsRepeatedOnStartup) { |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_WARNING)); |
|||
EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT + 1, true); |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
} |
|||
|
|||
TEST_F(DeprecationTest, DeprecatedNodeShutsDown) { |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_ERROR)); |
|||
EnforceNodeDeprecation(DEPRECATION_HEIGHT); |
|||
EXPECT_TRUE(ShutdownRequested()); |
|||
} |
|||
|
|||
TEST_F(DeprecationTest, DeprecatedNodeErrorIsNotDuplicated) { |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
EnforceNodeDeprecation(DEPRECATION_HEIGHT + 1); |
|||
EXPECT_TRUE(ShutdownRequested()); |
|||
} |
|||
|
|||
TEST_F(DeprecationTest, DeprecatedNodeErrorIsRepeatedOnStartup) { |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_ERROR)); |
|||
EnforceNodeDeprecation(DEPRECATION_HEIGHT + 1, true); |
|||
EXPECT_TRUE(ShutdownRequested()); |
|||
} |
|||
|
|||
TEST_F(DeprecationTest, DeprecatedNodeIgnoredOnRegtest) { |
|||
SelectParams(CBaseChainParams::REGTEST); |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
EnforceNodeDeprecation(DEPRECATION_HEIGHT+1); |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
} |
|||
|
|||
TEST_F(DeprecationTest, DeprecatedNodeIgnoredOnTestnet) { |
|||
SelectParams(CBaseChainParams::TESTNET); |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
EnforceNodeDeprecation(DEPRECATION_HEIGHT+1); |
|||
EXPECT_FALSE(ShutdownRequested()); |
|||
} |
|||
|
|||
TEST_F(DeprecationTest, AlertNotify) { |
|||
boost::filesystem::path temp = GetTempPath() / |
|||
boost::filesystem::unique_path("alertnotify-%%%%.txt"); |
|||
|
|||
mapArgs["-alertnotify"] = std::string("echo %s >> ") + temp.string(); |
|||
|
|||
EXPECT_CALL(mock_, ThreadSafeMessageBox(::testing::_, "", CClientUIInterface::MSG_WARNING)); |
|||
EnforceNodeDeprecation(DEPRECATION_HEIGHT - DEPRECATION_WARN_LIMIT, false, false); |
|||
|
|||
std::vector<std::string> r = read_lines(temp); |
|||
EXPECT_EQ(r.size(), 1u); |
|||
|
|||
// -alertnotify restricts the message to safe characters.
|
|||
auto expectedMsg = strprintf( |
|||
"This version will be deprecated at block height %d, and will automatically shut down. You should upgrade to the latest version of Hush.", |
|||
DEPRECATION_HEIGHT); |
|||
|
|||
// Windows built-in echo semantics are different than posixy shells. Quotes and
|
|||
// whitespace are printed literally.
|
|||
#ifndef WIN32 |
|||
EXPECT_EQ(r[0], expectedMsg); |
|||
#else |
|||
EXPECT_EQ(r[0], strprintf("'%s' ", expectedMsg)); |
|||
#endif |
|||
boost::filesystem::remove(temp); |
|||
} |
Loading…
Reference in new issue