Skip to content

Commit 34d5eac

Browse files
authored
Merge pull request #653 from evoskuil/master
Add comprehensive electrum handshake and block_header tests.
2 parents 466e1ef + e99fc9a commit 34d5eac

27 files changed

Lines changed: 1088 additions & 302 deletions

Makefile.am

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ src_libbitcoin_server_la_SOURCES = \
4343
src/settings.cpp \
4444
src/parsers/bitcoind_query.cpp \
4545
src/parsers/bitcoind_target.cpp \
46+
src/parsers/electrum_version.cpp \
4647
src/parsers/native_query.cpp \
4748
src/parsers/native_target.cpp \
4849
src/protocols/protocol_bitcoind_rest.cpp \
@@ -71,11 +72,18 @@ test_libbitcoin_server_test_SOURCES = \
7172
test/settings.cpp \
7273
test/test.cpp \
7374
test/test.hpp \
74-
test/endpoints/electrum.cpp \
7575
test/parsers/bitcoind_query.cpp \
7676
test/parsers/bitcoind_target.cpp \
77+
test/parsers/electrum_version.cpp \
7778
test/parsers/native_query.cpp \
78-
test/parsers/native_target.cpp
79+
test/parsers/native_target.cpp \
80+
test/protocols/blocks.cpp \
81+
test/protocols/blocks.hpp \
82+
test/protocols/electrum/electrum.cpp \
83+
test/protocols/electrum/electrum.hpp \
84+
test/protocols/electrum/electrum_block_header.cpp \
85+
test/protocols/electrum/electrum_server.cpp \
86+
test/protocols/electrum/electrum_server_version.cpp
7987

8088
endif WITH_TESTS
8189

builds/cmake/CMakeLists.txt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ add_library( ${CANONICAL_LIB_NAME}
242242
"../../src/settings.cpp"
243243
"../../src/parsers/bitcoind_query.cpp"
244244
"../../src/parsers/bitcoind_target.cpp"
245+
"../../src/parsers/electrum_version.cpp"
245246
"../../src/parsers/native_query.cpp"
246247
"../../src/parsers/native_target.cpp"
247248
"../../src/protocols/protocol_bitcoind_rest.cpp"
@@ -296,15 +297,22 @@ if (with-tests)
296297
"../../test/test.hpp"
297298
"../../test/endpoints/README.md"
298299
"../../test/endpoints/conftest.py"
299-
"../../test/endpoints/electrum.cpp"
300300
"../../test/endpoints/test_bitcoind_rpc.py"
301301
"../../test/endpoints/test_electrum.py"
302302
"../../test/endpoints/test_native.py"
303303
"../../test/endpoints/utils.py"
304304
"../../test/parsers/bitcoind_query.cpp"
305305
"../../test/parsers/bitcoind_target.cpp"
306+
"../../test/parsers/electrum_version.cpp"
306307
"../../test/parsers/native_query.cpp"
307-
"../../test/parsers/native_target.cpp" )
308+
"../../test/parsers/native_target.cpp"
309+
"../../test/protocols/blocks.cpp"
310+
"../../test/protocols/blocks.hpp"
311+
"../../test/protocols/electrum/electrum.cpp"
312+
"../../test/protocols/electrum/electrum.hpp"
313+
"../../test/protocols/electrum/electrum_block_header.cpp"
314+
"../../test/protocols/electrum/electrum_server.cpp"
315+
"../../test/protocols/electrum/electrum_server_version.cpp" )
308316
309317
add_test( NAME libbitcoin-server-test COMMAND libbitcoin-server-test
310318
--run_test=*

builds/msvc/vs2022/libbitcoin-server-test/libbitcoin-server-test.vcxproj

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,20 +119,31 @@
119119
</ImportGroup>
120120
<ItemGroup>
121121
<ClCompile Include="..\..\..\..\test\configuration.cpp" />
122-
<ClCompile Include="..\..\..\..\test\endpoints\electrum.cpp" />
123122
<ClCompile Include="..\..\..\..\test\error.cpp" />
124123
<ClCompile Include="..\..\..\..\test\estimator.cpp" />
125124
<ClCompile Include="..\..\..\..\test\main.cpp" />
126125
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_query.cpp" />
127126
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_target.cpp" />
127+
<ClCompile Include="..\..\..\..\test\parsers\electrum_version.cpp" />
128128
<ClCompile Include="..\..\..\..\test\parsers\native_query.cpp" />
129129
<ClCompile Include="..\..\..\..\test\parsers\native_target.cpp" />
130+
<ClCompile Include="..\..\..\..\test\protocols\blocks.cpp">
131+
<ObjectFileName>$(IntDir)test_protocols_blocks.obj</ObjectFileName>
132+
</ClCompile>
133+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum.cpp">
134+
<ObjectFileName>$(IntDir)test_protocols_electrum_electrum.obj</ObjectFileName>
135+
</ClCompile>
136+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_block_header.cpp" />
137+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_server.cpp" />
138+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_server_version.cpp" />
130139
<ClCompile Include="..\..\..\..\test\settings.cpp" />
131140
<ClCompile Include="..\..\..\..\test\test.cpp">
132141
<ObjectFileName>$(IntDir)test_test.obj</ObjectFileName>
133142
</ClCompile>
134143
</ItemGroup>
135144
<ItemGroup>
145+
<ClInclude Include="..\..\..\..\test\protocols\blocks.hpp" />
146+
<ClInclude Include="..\..\..\..\test\protocols\electrum\electrum.hpp" />
136147
<ClInclude Include="..\..\..\..\test\test.hpp" />
137148
</ItemGroup>
138149
<ItemGroup>

builds/msvc/vs2022/libbitcoin-server-test/libbitcoin-server-test.vcxproj.filters

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@
1616
<Filter Include="src\parsers">
1717
<UniqueIdentifier>{66A0E586-2E3A-448F-0000-000000000002}</UniqueIdentifier>
1818
</Filter>
19+
<Filter Include="src\protocols">
20+
<UniqueIdentifier>{66A0E586-2E3A-448F-0000-000000000003}</UniqueIdentifier>
21+
</Filter>
22+
<Filter Include="src\protocols\electrum">
23+
<UniqueIdentifier>{66A0E586-2E3A-448F-0000-000000000004}</UniqueIdentifier>
24+
</Filter>
1925
</ItemGroup>
2026
<ItemGroup>
2127
<ClCompile Include="..\..\..\..\test\configuration.cpp">
2228
<Filter>src</Filter>
2329
</ClCompile>
24-
<ClCompile Include="..\..\..\..\test\endpoints\electrum.cpp">
25-
<Filter>src\endpoints</Filter>
26-
</ClCompile>
2730
<ClCompile Include="..\..\..\..\test\error.cpp">
2831
<Filter>src</Filter>
2932
</ClCompile>
@@ -39,12 +42,30 @@
3942
<ClCompile Include="..\..\..\..\test\parsers\bitcoind_target.cpp">
4043
<Filter>src\parsers</Filter>
4144
</ClCompile>
45+
<ClCompile Include="..\..\..\..\test\parsers\electrum_version.cpp">
46+
<Filter>src\parsers</Filter>
47+
</ClCompile>
4248
<ClCompile Include="..\..\..\..\test\parsers\native_query.cpp">
4349
<Filter>src\parsers</Filter>
4450
</ClCompile>
4551
<ClCompile Include="..\..\..\..\test\parsers\native_target.cpp">
4652
<Filter>src\parsers</Filter>
4753
</ClCompile>
54+
<ClCompile Include="..\..\..\..\test\protocols\blocks.cpp">
55+
<Filter>src\protocols</Filter>
56+
</ClCompile>
57+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum.cpp">
58+
<Filter>src\protocols\electrum</Filter>
59+
</ClCompile>
60+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_block_header.cpp">
61+
<Filter>src\protocols\electrum</Filter>
62+
</ClCompile>
63+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_server.cpp">
64+
<Filter>src\protocols\electrum</Filter>
65+
</ClCompile>
66+
<ClCompile Include="..\..\..\..\test\protocols\electrum\electrum_server_version.cpp">
67+
<Filter>src\protocols\electrum</Filter>
68+
</ClCompile>
4869
<ClCompile Include="..\..\..\..\test\settings.cpp">
4970
<Filter>src</Filter>
5071
</ClCompile>
@@ -53,6 +74,12 @@
5374
</ClCompile>
5475
</ItemGroup>
5576
<ItemGroup>
77+
<ClInclude Include="..\..\..\..\test\protocols\blocks.hpp">
78+
<Filter>src\protocols</Filter>
79+
</ClInclude>
80+
<ClInclude Include="..\..\..\..\test\protocols\electrum\electrum.hpp">
81+
<Filter>src\protocols\electrum</Filter>
82+
</ClInclude>
5683
<ClInclude Include="..\..\..\..\test\test.hpp">
5784
<Filter>src</Filter>
5885
</ClInclude>

builds/msvc/vs2022/libbitcoin-server/libbitcoin-server.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
<ClCompile Include="..\..\..\..\src\parser.cpp" />
128128
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_query.cpp" />
129129
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_target.cpp" />
130+
<ClCompile Include="..\..\..\..\src\parsers\electrum_version.cpp" />
130131
<ClCompile Include="..\..\..\..\src\parsers\native_query.cpp" />
131132
<ClCompile Include="..\..\..\..\src\parsers\native_target.cpp" />
132133
<ClCompile Include="..\..\..\..\src\protocols\protocol_bitcoind_rest.cpp" />

builds/msvc/vs2022/libbitcoin-server/libbitcoin-server.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@
6969
<ClCompile Include="..\..\..\..\src\parsers\bitcoind_target.cpp">
7070
<Filter>src\parsers</Filter>
7171
</ClCompile>
72+
<ClCompile Include="..\..\..\..\src\parsers\electrum_version.cpp">
73+
<Filter>src\parsers</Filter>
74+
</ClCompile>
7275
<ClCompile Include="..\..\..\..\src\parsers\native_query.cpp">
7376
<Filter>src\parsers</Filter>
7477
</ClCompile>

include/bitcoin/server/channels/channel_electrum.hpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,13 @@ class BCS_API channel_electrum
3939
public:
4040
typedef std::shared_ptr<channel_electrum> ptr;
4141
using interface_t = interface::electrum;
42-
using options_t = typename network::channel_rpc<interface_t>::options_t;
42+
using options_t = settings::electrum_server;
4343

4444
inline channel_electrum(const network::logger& log,
4545
const network::socket::ptr& socket, uint64_t identifier,
4646
const node::configuration& config, const options_t& options) NOEXCEPT
4747
: server::channel(log, socket, identifier, config),
48+
options_(options),
4849
network::channel_rpc<interface::electrum>(log, socket, identifier,
4950
config.network, options),
5051
network::tracker<channel_electrum>(log)
@@ -64,19 +65,27 @@ class BCS_API channel_electrum
6465
return name_;
6566
}
6667

67-
inline void set_version(electrum_version version) NOEXCEPT
68+
inline void set_version(electrum::version version) NOEXCEPT
6869
{
6970
version_ = version;
7071
}
7172

72-
inline electrum_version version() const NOEXCEPT
73+
inline electrum::version version() const NOEXCEPT
7374
{
7475
return version_;
7576
}
7677

78+
inline const options_t& options() const NOEXCEPT
79+
{
80+
return options_;
81+
}
82+
7783
private:
84+
// This is thread safe.
85+
const options_t& options_;
86+
7887
// These are protected by strand.
79-
electrum_version version_{ electrum_version::v0_0 };
88+
electrum::version version_{ electrum::version::v0_0 };
8089
std::string name_{};
8190
};
8291

include/bitcoin/server/interfaces/types.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ using object_t = network::rpc::object_t;
4646
using array_t = network::rpc::array_t;
4747
using value_t = network::rpc::value_t;
4848
using null_t = network::rpc::null_t;
49+
using code_t = network::rpc::code_t;
4950

5051
namespace empty { constexpr auto array = network::rpc::empty::array; };
5152
namespace empty { constexpr auto object = network::rpc::empty::object; };

include/bitcoin/server/parsers/electrum_version.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
#ifndef LIBBITCOIN_SERVER_PARSERS_ELECTRUM_VERSION_HPP
2020
#define LIBBITCOIN_SERVER_PARSERS_ELECTRUM_VERSION_HPP
2121

22+
#include <unordered_map>
2223
#include <bitcoin/server/define.hpp>
2324

2425
namespace libbitcoin {
2526
namespace server {
27+
namespace electrum {
2628

27-
enum class electrum_version
29+
enum class version
2830
{
2931
/// Invalid version.
3032
v0_0,
@@ -66,6 +68,10 @@ enum class electrum_version
6668
v1_6
6769
};
6870

71+
std::string_view version_to_string(version value) NOEXCEPT;
72+
version version_from_string(const std::string_view& value) NOEXCEPT;
73+
74+
} // namespace electrum
6975
} // namespace server
7076
} // namespace libbitcoin
7177

include/bitcoin/server/protocols/protocol_electrum.hpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class BCS_API protocol_electrum
4242
const network::channel::ptr& channel,
4343
const options_t& options) NOEXCEPT
4444
: protocol_rpc<channel_electrum>(session, channel, options),
45+
options_(options),
4546
channel_(std::dynamic_pointer_cast<channel_t>(channel)),
4647
network::tracker<protocol_electrum>(session->log)
4748
{
@@ -127,12 +128,20 @@ class BCS_API protocol_electrum
127128
void blockchain_block_headers(size_t starting, size_t quantity,
128129
size_t waypoint, bool multiplicity) NOEXCEPT;
129130

130-
inline bool is_version(electrum_version version) const NOEXCEPT
131+
inline bool is_version(electrum::version version) const NOEXCEPT
131132
{
132133
return channel_->version() >= version;
133134
}
134135

136+
inline const options_t& options() const NOEXCEPT
137+
{
138+
return options_;
139+
}
140+
135141
private:
142+
// This is thread safe.
143+
const options_t& options_;
144+
136145
// This is mostly thread safe, and used in a thread safe manner.
137146
const channel_t::ptr channel_;
138147
};

0 commit comments

Comments
 (0)