fuzz: add steady clock mocking to FuzzedSock

This commit is contained in:
Antoine Poinsot 2025-01-22 11:37:02 -05:00
parent 6fe1c35c05
commit 39b7e2b590
2 changed files with 21 additions and 1 deletions

View file

@ -113,8 +113,10 @@ template CAddress::SerParams ConsumeDeserializationParams(FuzzedDataProvider&) n
FuzzedSock::FuzzedSock(FuzzedDataProvider& fuzzed_data_provider)
: Sock{fuzzed_data_provider.ConsumeIntegralInRange<SOCKET>(INVALID_SOCKET - 1, INVALID_SOCKET)},
m_fuzzed_data_provider{fuzzed_data_provider},
m_selectable{fuzzed_data_provider.ConsumeBool()}
m_selectable{fuzzed_data_provider.ConsumeBool()},
m_time{MockableSteadyClock::INITIAL_MOCK_TIME}
{
ElapseTime(std::chrono::seconds(0)); // start mocking the steady clock.
}
FuzzedSock::~FuzzedSock()
@ -126,6 +128,12 @@ FuzzedSock::~FuzzedSock()
m_socket = INVALID_SOCKET;
}
void FuzzedSock::ElapseTime(std::chrono::milliseconds duration) const
{
m_time += duration;
MockableSteadyClock::SetMockTime(m_time);
}
FuzzedSock& FuzzedSock::operator=(Sock&& other)
{
assert(false && "Move of Sock into FuzzedSock not allowed.");
@ -388,6 +396,7 @@ bool FuzzedSock::Wait(std::chrono::milliseconds timeout, Event requested, Event*
// FuzzedDataProvider runs out of data.
*occurred = m_fuzzed_data_provider.ConsumeBool() ? 0 : requested;
}
ElapseTime(timeout);
return true;
}
@ -400,6 +409,7 @@ bool FuzzedSock::WaitMany(std::chrono::milliseconds timeout, EventsPerSock& even
// FuzzedDataProvider runs out of data.
events.occurred = m_fuzzed_data_provider.ConsumeBool() ? 0 : events.requested;
}
ElapseTime(timeout);
return true;
}

View file

@ -157,6 +157,16 @@ class FuzzedSock : public Sock
*/
const bool m_selectable;
/**
* Used to mock the steady clock in methods waiting for a given duration.
*/
mutable std::chrono::milliseconds m_time;
/**
* Set the value of the mocked steady clock such as that many ms have passed.
*/
void ElapseTime(std::chrono::milliseconds duration) const;
public:
explicit FuzzedSock(FuzzedDataProvider& fuzzed_data_provider);