diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -330,7 +330,12 @@ LOCK(cs_main); RPCTypeCheck(request.params, {UniValue::VNUM}); - SetMockTime(request.params[0].get_int64()); + int64_t mockTime = request.params[0].get_int64(); + if (mockTime < 0) { + throw JSONRPCError(RPC_INVALID_PARAMETER, + "Timestamp must be 0 or greater"); + } + SetMockTime(mockTime); return NullUniValue; } diff --git a/src/util/time.cpp b/src/util/time.cpp --- a/src/util/time.cpp +++ b/src/util/time.cpp @@ -44,6 +44,7 @@ template std::chrono::microseconds GetTime(); void SetMockTime(int64_t nMockTimeIn) { + assert(nMockTimeIn >= 0); nMockTime.store(nMockTimeIn, std::memory_order_relaxed); } diff --git a/test/functional/abc-rpc-mocktime.py b/test/functional/abc-rpc-mocktime.py new file mode 100755 --- /dev/null +++ b/test/functional/abc-rpc-mocktime.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +# Copyright (c) 2020 The Bitcoin developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +""" +Test RPCs related to mock time. +""" + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import assert_raises_rpc_error + + +class MocktimeTest(BitcoinTestFramework): + def set_test_params(self): + self.num_nodes = 1 + self.setup_clean_chain = True + + def run_test(self): + self.nodes[0].setmocktime(9223372036854775807) + self.nodes[0].setmocktime(0) + assert_raises_rpc_error(-8, "Timestamp must be 0 or greater", + self.nodes[0].setmocktime, -1) + assert_raises_rpc_error(-8, "Timestamp must be 0 or greater", + self.nodes[0].setmocktime, -9223372036854775808) + + +if __name__ == '__main__': + MocktimeTest().main()