aboutsummaryrefslogtreecommitdiff
path: root/src/test/fuzz/p2p_transport_serialization.cpp
diff options
context:
space:
mode:
authorDhruv Mehta <856960+dhruv@users.noreply.github.com>2021-05-23 08:10:25 -0700
committerDhruv Mehta <856960+dhruv@users.noreply.github.com>2021-05-25 08:08:34 -0700
commit654472a461bc9d1603c46dcb7a5b2dc87a44045a (patch)
tree9f764382d46ccb2a843b3af25a94ea2e905779d6 /src/test/fuzz/p2p_transport_serialization.cpp
parentbe4171679b8eab8205e04ff86140329bd67878a0 (diff)
downloadbitcoin-654472a461bc9d1603c46dcb7a5b2dc87a44045a.tar.xz
[fuzz] Add serialization to deserialization test
Before commit: 306853 REDUCE cov: 798 ft: 5820 corp: 150/375Kb lim: 68333 exec/s: 1382 rss: 461Mb L: 254/63171 MS: 1 EraseBytes- 1453105 REDUCE cov: 798 ft: 5820 corp: 150/369Kb lim: 79613 exec/s: 1467 rss: 461Mb L: 6027/60873 MS: 1 EraseBytes- After commit: 303389 NEW cov: 1202 ft: 8382 corp: 157/382Kb lim: 68189 exec/s: 1451 rss: 447Mb L: 1386/65459 MS: 1 CopyPart- 1428759 REDUCE cov: 1202 ft: 8512 corp: 169/389Kb lim: 78749 exec/s: 1528 rss: 463Mb L: 1627/60488 MS: 1 EraseBytes-
Diffstat (limited to 'src/test/fuzz/p2p_transport_serialization.cpp')
-rw-r--r--src/test/fuzz/p2p_transport_serialization.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/test/fuzz/p2p_transport_serialization.cpp b/src/test/fuzz/p2p_transport_serialization.cpp
new file mode 100644
index 0000000000..2618a2a398
--- /dev/null
+++ b/src/test/fuzz/p2p_transport_serialization.cpp
@@ -0,0 +1,49 @@
+// Copyright (c) 2019-2020 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <chainparams.h>
+#include <net.h>
+#include <netmessagemaker.h>
+#include <protocol.h>
+#include <test/fuzz/fuzz.h>
+
+#include <cassert>
+#include <cstdint>
+#include <limits>
+#include <optional>
+#include <vector>
+
+void initialize_p2p_transport_serialization()
+{
+ SelectParams(CBaseChainParams::REGTEST);
+}
+
+FUZZ_TARGET_INIT(p2p_transport_serialization, initialize_p2p_transport_serialization)
+{
+ // Construct deserializer, with a dummy NodeId
+ V1TransportDeserializer deserializer{Params(), (NodeId)0, SER_NETWORK, INIT_PROTO_VERSION};
+ V1TransportSerializer serializer{};
+ Span<const uint8_t> msg_bytes{buffer};
+ while (msg_bytes.size() > 0) {
+ const int handled = deserializer.Read(msg_bytes);
+ if (handled < 0) {
+ break;
+ }
+ if (deserializer.Complete()) {
+ const std::chrono::microseconds m_time{std::numeric_limits<int64_t>::max()};
+ uint32_t out_err_raw_size{0};
+ std::optional<CNetMessage> result{deserializer.GetMessage(m_time, out_err_raw_size)};
+ if (result) {
+ assert(result->m_command.size() <= CMessageHeader::COMMAND_SIZE);
+ assert(result->m_raw_message_size <= buffer.size());
+ assert(result->m_raw_message_size == CMessageHeader::HEADER_SIZE + result->m_message_size);
+ assert(result->m_time == m_time);
+
+ std::vector<unsigned char> header;
+ auto msg = CNetMsgMaker{result->m_recv.GetVersion()}.Make(result->m_command, MakeUCharSpan(result->m_recv));
+ serializer.prepareForTransport(msg, header);
+ }
+ }
+ }
+}