Coverage Report

Created: 2025-06-06 15:08

/root/bitcoin/src/test/fuzz/i2p.cpp
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5
#include <common/args.h>
6
#include <i2p.h>
7
#include <netaddress.h>
8
#include <netbase.h>
9
#include <test/fuzz/FuzzedDataProvider.h>
10
#include <test/fuzz/fuzz.h>
11
#include <test/fuzz/util.h>
12
#include <test/fuzz/util/net.h>
13
#include <test/util/setup_common.h>
14
#include <util/fs_helpers.h>
15
#include <util/threadinterrupt.h>
16
17
void initialize_i2p()
18
0
{
19
0
    static const auto testing_setup = MakeNoLogFileContext<>();
20
0
}
21
22
FUZZ_TARGET(i2p, .init = initialize_i2p)
23
0
{
24
0
    SeedRandomStateForTest(SeedRand::ZEROS);
25
0
    FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
26
27
0
    SetMockTime(ConsumeTime(fuzzed_data_provider));
28
29
    // Mock CreateSock() to create FuzzedSock.
30
0
    auto CreateSockOrig = CreateSock;
31
0
    CreateSock = [&fuzzed_data_provider](int, int, int) {
32
0
        return std::make_unique<FuzzedSock>(fuzzed_data_provider);
33
0
    };
34
35
0
    const fs::path private_key_path = gArgs.GetDataDirNet() / "fuzzed_i2p_private_key";
36
0
    const CService addr{in6_addr(IN6ADDR_LOOPBACK_INIT), 7656};
37
0
    const Proxy sam_proxy{addr, /*tor_stream_isolation=*/false};
38
0
    CThreadInterrupt interrupt;
39
40
0
    i2p::sam::Session session{private_key_path, sam_proxy, &interrupt};
41
0
    i2p::Connection conn;
42
43
0
    if (session.Listen(conn)) {
44
0
        if (session.Accept(conn)) {
45
0
            try {
46
0
                (void)conn.sock->RecvUntilTerminator('\n', 10ms, interrupt, i2p::sam::MAX_MSG_SIZE);
47
0
            } catch (const std::runtime_error&) {
48
0
            }
49
0
        }
50
0
    }
51
52
0
    bool proxy_error;
53
54
0
    if (session.Connect(CService{}, conn, proxy_error)) {
55
0
        try {
56
0
            conn.sock->SendComplete("verack\n", 10ms, interrupt);
57
0
        } catch (const std::runtime_error&) {
58
0
        }
59
0
    }
60
61
0
    fs::remove_all(private_key_path);
62
63
0
    CreateSock = CreateSockOrig;
64
0
}