mirror of
https://github.com/dogecoin/dogecoin.git
synced 2026-02-19 03:38:44 +00:00
Throughout the code, we use mockable time in places where we want to test things that are subject to timing constraints, but don't want to wait for great amounts of time when we use the regtest network to ensure nothing gets broken. Mockable time is a system time override that is only enabled on chains that have the fMineBlocksOnDemand parameter set (currently: regtest). Currently, only time expressed in seconds is able to be mocked, but we have a couple of places where time is evaluated in microseconds, one of them being the time between sending out addr messages. This introduces a mockable time in microseconds and refactors the time evaluation for addr messages to be mocked, so that we can more reliably (and faster) test that. Other protocol features may want to use this too, but currently the sending of addr messages is the only place we test. Bitcoin Core nowadays has a much better time system that we inherit in future versions, but for the current scope I found this not worth the effort of backporting, as these would impact a much larger part of the code base. Inspired by: 1a8f0d5a from Amiti Uttarwar
83 lines
1.9 KiB
C++
83 lines
1.9 KiB
C++
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-2016 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#if defined(HAVE_CONFIG_H)
|
|
#include "config/bitcoin-config.h"
|
|
#endif
|
|
|
|
#include "utiltime.h"
|
|
|
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
|
#include <boost/thread.hpp>
|
|
|
|
using namespace std;
|
|
|
|
static int64_t nMockTime = 0; //!< For unit testing
|
|
|
|
int64_t GetTime()
|
|
{
|
|
if (nMockTime) return nMockTime;
|
|
|
|
time_t now = time(NULL);
|
|
assert(now > 0);
|
|
return now;
|
|
}
|
|
|
|
int64_t GetMockableTimeMicros()
|
|
{
|
|
if (nMockTime) return nMockTime * 1000000;
|
|
return GetTimeMicros();
|
|
}
|
|
|
|
void SetMockTime(int64_t nMockTimeIn)
|
|
{
|
|
nMockTime = nMockTimeIn;
|
|
}
|
|
|
|
int64_t GetTimeMillis()
|
|
{
|
|
int64_t now = (boost::posix_time::microsec_clock::universal_time() -
|
|
boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_milliseconds();
|
|
assert(now > 0);
|
|
return now;
|
|
}
|
|
|
|
int64_t GetTimeMicros()
|
|
{
|
|
int64_t now = (boost::posix_time::microsec_clock::universal_time() -
|
|
boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_microseconds();
|
|
assert(now > 0);
|
|
return now;
|
|
}
|
|
|
|
int64_t GetSystemTimeInSeconds()
|
|
{
|
|
return GetTimeMicros()/1000000;
|
|
}
|
|
|
|
/** Return a time useful for the debug log */
|
|
int64_t GetLogTimeMicros()
|
|
{
|
|
if (nMockTime) return nMockTime*1000000;
|
|
|
|
return GetTimeMicros();
|
|
}
|
|
|
|
void MilliSleep(int64_t n)
|
|
{
|
|
boost::this_thread::sleep_for(boost::chrono::milliseconds(n));
|
|
}
|
|
|
|
std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime)
|
|
{
|
|
static std::locale classic(std::locale::classic());
|
|
// std::locale takes ownership of the pointer
|
|
std::locale loc(classic, new boost::posix_time::time_facet(pszFormat));
|
|
std::stringstream ss;
|
|
ss.imbue(loc);
|
|
ss << boost::posix_time::from_time_t(nTime);
|
|
return ss.str();
|
|
}
|