Bitcoin Core Fuzz Coverage Report

Coverage Report

Created: 2026-05-28 15:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/Users/brunogarcia/projects/bitcoin-core-dev/src/util/time.h
Line
Count
Source
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-present The Bitcoin Core developers
3
// Distributed under the MIT software license, see the accompanying
4
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6
#ifndef BITCOIN_UTIL_TIME_H
7
#define BITCOIN_UTIL_TIME_H
8
9
// The `util/time.h` header is designed to be a drop-in replacement for `chrono`.
10
#include <chrono> // IWYU pragma: export
11
#include <cstdint>
12
#include <ctime>
13
#include <optional>
14
#include <string>
15
#include <string_view>
16
17
#ifdef WIN32
18
#include <winsock2.h>
19
#else
20
#include <sys/time.h>
21
#endif
22
23
using namespace std::chrono_literals;
24
25
/// Version of the system clock that is mockable in the context of tests (via
26
/// NodeClockContext or ::SetMockTime), otherwise the system clock.
27
struct NodeClock : public std::chrono::system_clock {
28
    using time_point = std::chrono::time_point<NodeClock>;
29
    /** Return current system time or mocked time, if set */
30
    static time_point now() noexcept;
31
    static std::time_t to_time_t(const time_point&) = delete; // unused
32
    static time_point from_time_t(std::time_t) = delete;      // unused
33
};
34
using NodeSeconds = std::chrono::time_point<NodeClock, std::chrono::seconds>;
35
36
using SteadyClock = std::chrono::steady_clock;
37
using SteadySeconds = std::chrono::time_point<std::chrono::steady_clock, std::chrono::seconds>;
38
using SteadyMilliseconds = std::chrono::time_point<std::chrono::steady_clock, std::chrono::milliseconds>;
39
using SteadyMicroseconds = std::chrono::time_point<std::chrono::steady_clock, std::chrono::microseconds>;
40
41
using SystemClock = std::chrono::system_clock;
42
43
/// Version of SteadyClock that is mockable in the context of tests (via
44
/// SteadyClockContext, or Self::SetMockTime), otherwise the system steady
45
/// clock.
46
struct MockableSteadyClock : public std::chrono::steady_clock {
47
    using time_point = std::chrono::time_point<MockableSteadyClock>;
48
49
    using mock_time_point = std::chrono::time_point<MockableSteadyClock, std::chrono::milliseconds>;
50
    static constexpr mock_time_point::duration INITIAL_MOCK_TIME{1};
51
52
    /** Return current system time or mocked time, if set */
53
    static time_point now() noexcept;
54
    static std::time_t to_time_t(const time_point&) = delete; // unused
55
    static time_point from_time_t(std::time_t) = delete;      // unused
56
57
    /** Set mock time for testing.
58
     * When mocking the steady clock, start at INITIAL_MOCK_TIME and add durations to elapse time as necessary
59
     * for testing.
60
     * To stop mocking, call ClearMockTime().
61
     */
62
    static void SetMockTime(mock_time_point::duration mock_time_in);
63
64
    /** Clear mock time, go back to system steady clock. */
65
    static void ClearMockTime();
66
};
67
68
void UninterruptibleSleep(const std::chrono::microseconds& n);
69
70
/**
71
 * Helper to count the seconds of a duration/time_point.
72
 *
73
 * All durations/time_points should be using std::chrono and calling this should generally
74
 * be avoided in code. Though, it is still preferred to an inline t.count() to
75
 * protect against a reliance on the exact type of t.
76
 *
77
 * This helper is used to convert durations/time_points before passing them over an
78
 * interface that doesn't support std::chrono (e.g. RPC, debug log, or the GUI)
79
 */
80
template <typename Dur1, typename Dur2>
81
constexpr auto Ticks(Dur2 d)
82
265
{
83
265
    return std::chrono::duration_cast<Dur1>(d).count();
84
265
}
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<double, std::__1::ratio<1l, 1000l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<double, std::__1::ratio<1l, 1l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>)
auto Ticks<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>)
Line
Count
Source
82
265
{
83
265
    return std::chrono::duration_cast<Dur1>(d).count();
84
265
}
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>, std::__1::chrono::duration<long, std::__1::ratio<3600l, 1l>>>(std::__1::chrono::duration<long, std::__1::ratio<3600l, 1l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<long, std::__1::ratio<3600l, 1l>>, std::__1::chrono::duration<long, std::__1::ratio<3600l, 1l>>>(std::__1::chrono::duration<long, std::__1::ratio<3600l, 1l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<double, std::__1::ratio<3600l, 1l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<double, std::__1::ratio<1l, 1l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<long, std::__1::ratio<60l, 1l>>, std::__1::chrono::duration<long, std::__1::ratio<60l, 1l>>>(std::__1::chrono::duration<long, std::__1::ratio<60l, 1l>>)
Unexecuted instantiation: auto Ticks<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>>, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>)
85
86
template <typename Duration>
87
constexpr int64_t TicksSeconds(Duration d)
88
0
{
89
0
    return int64_t{Ticks<std::chrono::seconds>(d)};
90
0
}
91
template <typename Duration, typename Timepoint>
92
constexpr auto TicksSinceEpoch(Timepoint t)
93
0
{
94
0
    return Ticks<Duration>(t.time_since_epoch());
95
0
}
Unexecuted instantiation: auto TicksSinceEpoch<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>, std::__1::chrono::time_point<NodeClock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>>>(std::__1::chrono::time_point<NodeClock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>>)
Unexecuted instantiation: auto TicksSinceEpoch<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>, std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>>>(std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>>)
Unexecuted instantiation: auto TicksSinceEpoch<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>, std::__1::chrono::time_point<NodeClock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>>(std::__1::chrono::time_point<NodeClock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>)
Unexecuted instantiation: auto TicksSinceEpoch<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>>, std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>>(std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>)
96
677
constexpr int64_t count_seconds(std::chrono::seconds t) { return t.count(); }
97
0
constexpr int64_t count_milliseconds(std::chrono::milliseconds t) { return t.count(); }
98
0
constexpr int64_t count_microseconds(std::chrono::microseconds t) { return t.count(); }
99
100
using HoursDouble = std::chrono::duration<double, std::chrono::hours::period>;
101
using SecondsDouble = std::chrono::duration<double, std::chrono::seconds::period>;
102
using MillisecondsDouble = std::chrono::duration<double, std::chrono::milliseconds::period>;
103
104
/**
105
 * DEPRECATED
106
 * Use either ClockType::now() or Now<TimePointType>() if a cast is needed.
107
 * ClockType is
108
 * - SteadyClock/std::chrono::steady_clock for steady time
109
 * - SystemClock/std::chrono::system_clock for system time
110
 * - NodeClock                             for mockable system time
111
 */
112
int64_t GetTime();
113
114
/**
115
 * DEPRECATED
116
 * Use SetMockTime with chrono type
117
 *
118
 * @param[in] nMockTimeIn Time in seconds.
119
 */
120
void SetMockTime(int64_t nMockTimeIn);
121
122
/** For testing. Set e.g. with the setmocktime rpc, or -mocktime argument */
123
void SetMockTime(std::chrono::seconds mock_time_in);
124
void SetMockTime(std::chrono::time_point<NodeClock, std::chrono::seconds> mock);
125
126
/** For testing */
127
std::chrono::seconds GetMockTime();
128
129
/**
130
 * Return the current time point cast to the given precision. Only use this
131
 * when an exact precision is needed, otherwise use T::clock::now() directly.
132
 */
133
template <typename T>
134
T Now()
135
72.3k
{
136
72.3k
    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
137
72.3k
}
std::__1::chrono::time_point<NodeClock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>> Now<std::__1::chrono::time_point<NodeClock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>>>()
Line
Count
Source
135
32.8k
{
136
32.8k
    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
137
32.8k
}
std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>> Now<std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>>>()
Line
Count
Source
135
2
{
136
2
    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
137
2
}
Unexecuted instantiation: std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>>> Now<std::__1::chrono::time_point<std::__1::chrono::steady_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>>>>()
Unexecuted instantiation: std::__1::chrono::time_point<NodeClock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>>> Now<std::__1::chrono::time_point<NodeClock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>>>>()
std::__1::chrono::time_point<NodeClock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>> Now<std::__1::chrono::time_point<NodeClock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>>()
Line
Count
Source
135
39.5k
{
136
39.5k
    return std::chrono::time_point_cast<typename T::duration>(T::clock::now());
137
39.5k
}
138
/** DEPRECATED, see GetTime */
139
template <typename T>
140
T GetTime()
141
71.2k
{
142
71.2k
    return Now<std::chrono::time_point<NodeClock, T>>().time_since_epoch();
143
71.2k
}
Unexecuted instantiation: std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>> GetTime<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>>>()
std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>> GetTime<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1l>>>()
Line
Count
Source
141
31.6k
{
142
31.6k
    return Now<std::chrono::time_point<NodeClock, T>>().time_since_epoch();
143
31.6k
}
std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>> GetTime<std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>()
Line
Count
Source
141
39.5k
{
142
39.5k
    return Now<std::chrono::time_point<NodeClock, T>>().time_since_epoch();
143
39.5k
}
144
145
/**
146
 * ISO 8601 formatting is preferred. Use the FormatISO8601{DateTime,Date}
147
 * helper functions if possible.
148
 */
149
std::string FormatISO8601DateTime(int64_t nTime);
150
std::string FormatISO8601Date(int64_t nTime);
151
std::optional<int64_t> ParseISO8601DateTime(std::string_view str);
152
153
/**
154
 * RFC1123 formatting https://www.rfc-editor.org/rfc/rfc1123#section-5.2.14
155
 * Used in HTTP/1.1 responses
156
 */
157
std::string FormatRFC1123DateTime(int64_t nTime);
158
159
/**
160
 * Convert milliseconds to a struct timeval for e.g. select.
161
 */
162
struct timeval MillisToTimeval(int64_t nTimeout);
163
164
/**
165
 * Convert milliseconds to a struct timeval for e.g. select.
166
 */
167
struct timeval MillisToTimeval(std::chrono::milliseconds ms);
168
169
#endif // BITCOIN_UTIL_TIME_H