@@ -57,6 +57,53 @@ std::optional<service_node> node_for_destination(network_destination destination
5757 return std::nullopt ;
5858}
5959
60+ std::shared_ptr<TestServer> create_test_server (uint16_t port) {
61+ oxen::quic::opt::inbound_alpns server_alpns{" oxenstorage" };
62+ auto server_key_pair = session::ed25519::ed25519_key_pair (to_span (fmt::format (" {:032}" , port)));
63+ auto server_x25519_pubkey = session::curve25519::to_curve25519_pubkey (
64+ {server_key_pair.first .data (), server_key_pair.first .size ()});
65+ auto server_x25519_seckey = session::curve25519::to_curve25519_seckey (
66+ {server_key_pair.second .data (), server_key_pair.second .size ()});
67+ auto creds =
68+ oxen::quic::GNUTLSCreds::make_from_ed_seckey (to_string_view (server_key_pair.second ));
69+ oxen::quic::Address server_local{port};
70+ session::onionreq::HopEncryption decryptor{
71+ x25519_seckey::from_bytes (to_span (server_x25519_seckey)),
72+ x25519_pubkey::from_bytes (to_span (server_x25519_pubkey)),
73+ true };
74+
75+ auto server_cb = [&](oxen::quic::message m) {
76+ nlohmann::json response{{" hf" , {1 , 0 , 0 }}, {" t" , 1234567890 }, {" version" , {2 , 8 , 0 }}};
77+ m.respond (response.dump (), false );
78+ };
79+
80+ auto onion_cb = [&](oxen::quic::message m) {
81+ nlohmann::json response{{" hf" , {2 , 0 , 0 }}, {" t" , 1234567890 }, {" version" , {2 , 8 , 0 }}};
82+ m.respond (response.dump (), false );
83+ };
84+
85+ oxen::quic::stream_constructor_callback server_constructor =
86+ [&](oxen::quic::Connection& c, oxen::quic::Endpoint& e, std::optional<int64_t >) {
87+ auto s = e.loop .make_shared <oxen::quic::BTRequestStream>(c, e);
88+ s->register_handler (" info" , server_cb);
89+ s->register_handler (" onion_req" , onion_cb);
90+ return s;
91+ };
92+
93+ auto loop = std::make_shared<oxen::quic::Loop>();
94+ auto endpoint = oxen::quic::Endpoint::endpoint (*loop, server_local, server_alpns);
95+ endpoint->listen (creds, server_constructor);
96+
97+ auto node = service_node{
98+ to_string_view (server_key_pair.first ),
99+ {2 , 8 , 0 },
100+ INVALID_SWARM_ID,
101+ " 127.0.0.1" s,
102+ endpoint->local ().port ()};
103+
104+ return std::make_shared<TestServer>(loop, endpoint, node);
105+ }
106+
60107} // namespace
61108
62109namespace session ::network {
@@ -193,61 +240,13 @@ class TestNetwork : public Network {
193240 std::optional<std::string>) {});
194241 }
195242
196- std::shared_ptr<TestServer> create_test_node (uint16_t port) {
197- oxen::quic::opt::inbound_alpns server_alpns{" oxenstorage" };
198- auto server_key_pair =
199- session::ed25519::ed25519_key_pair (to_span (fmt::format (" {:032}" , port)));
200- auto server_x25519_pubkey = session::curve25519::to_curve25519_pubkey (
201- {server_key_pair.first .data (), server_key_pair.first .size ()});
202- auto server_x25519_seckey = session::curve25519::to_curve25519_seckey (
203- {server_key_pair.second .data (), server_key_pair.second .size ()});
204- auto creds = oxen::quic::GNUTLSCreds::make_from_ed_seckey (
205- to_string_view (server_key_pair.second ));
206- oxen::quic::Address server_local{port};
207- session::onionreq::HopEncryption decryptor{
208- x25519_seckey::from_bytes (to_span (server_x25519_seckey)),
209- x25519_pubkey::from_bytes (to_span (server_x25519_pubkey)),
210- true };
211-
212- auto server_cb = [&](oxen::quic::message m) {
213- nlohmann::json response{{" hf" , {1 , 0 , 0 }}, {" t" , 1234567890 }, {" version" , {2 , 8 , 0 }}};
214- m.respond (response.dump (), false );
215- };
216-
217- auto onion_cb = [&](oxen::quic::message m) {
218- nlohmann::json response{{" hf" , {2 , 0 , 0 }}, {" t" , 1234567890 }, {" version" , {2 , 8 , 0 }}};
219- m.respond (response.dump (), false );
220- };
221-
222- oxen::quic::stream_constructor_callback server_constructor =
223- [&](oxen::quic::Connection& c, oxen::quic::Endpoint& e, std::optional<int64_t >) {
224- auto s = e.loop .make_shared <oxen::quic::BTRequestStream>(c, e);
225- s->register_handler (" info" , server_cb);
226- s->register_handler (" onion_req" , onion_cb);
227- return s;
228- };
229-
230- auto loop = std::make_shared<oxen::quic::Loop>();
231- auto endpoint = oxen::quic::Endpoint::endpoint (*loop, server_local, server_alpns);
232- endpoint->listen (creds, server_constructor);
233-
234- auto node = service_node{
235- to_string_view (server_key_pair.first ),
236- {2 , 8 , 0 },
237- INVALID_SWARM_ID,
238- " 127.0.0.1" s,
239- endpoint->local ().port ()};
240-
241- return std::make_shared<TestServer>(loop, endpoint, node);
242- }
243-
244243 std::pair<std::vector<std::shared_ptr<TestServer>>, onion_path> create_test_path () {
245244 std::vector<std::shared_ptr<TestServer>> path_servers;
246245 std::vector<service_node> path_nodes;
247246 path_nodes.reserve (3 );
248247
249248 for (auto i = 0 ; i < 3 ; ++i) {
250- path_servers.emplace_back (create_test_node (static_cast <uint16_t >(1000 + i)));
249+ path_servers.emplace_back (create_test_server (static_cast <uint16_t >(1000 + i)));
251250 path_nodes.emplace_back (path_servers[i]->node );
252251 }
253252
@@ -1073,19 +1072,15 @@ TEST_CASE("Network", "[network][build_path]") {
10731072
10741073TEST_CASE (" Network" , " [network][find_valid_path]" ) {
10751074 auto ed_pk = " 4cb76fdc6d32278e3f83dbf608360ecc6b65727934b85d2fb86862ff98c46ab7" _hexbytes;
1075+ auto test_server = create_test_server (500 );
10761076 auto target = test_node (ed_pk, 1 );
1077- auto test_service_node = service_node{
1078- " decaf007f26d3d6f9b845ad031ffdf6d04638c25bb10b8fffbbe99135303c4b9" _hexbytes,
1079- {2 , 8 , 0 },
1080- INVALID_SWARM_ID,
1081- " 144.76.164.202" ,
1082- uint16_t {35400 }};
1083- auto network = TestNetwork (std::nullopt , true , false , false );
10841077 auto info = request_info::make (target, std::nullopt , std::nullopt , 0ms);
1078+
1079+ auto network = TestNetwork (std::nullopt , true , false , false );
10851080 auto invalid_path = onion_path{
10861081 " Test" ,
1087- {test_service_node , nullptr , nullptr , nullptr },
1088- {test_service_node },
1082+ {test_server-> node , nullptr , nullptr , nullptr },
1083+ {test_server-> node },
10891084 uint8_t {0 }};
10901085
10911086 // It returns nothing when given no path options
@@ -1099,7 +1094,7 @@ TEST_CASE("Network", "[network][find_valid_path]") {
10991094
11001095 network.establish_connection (
11011096 " Test" ,
1102- test_service_node ,
1097+ test_server-> node ,
11031098 3s,
11041099 [&prom](connection_info conn_info, std::optional<std::string> error) {
11051100 prom.set_value ({std::move (conn_info), error});
@@ -1111,11 +1106,11 @@ TEST_CASE("Network", "[network][find_valid_path]") {
11111106 auto valid_path = onion_path{
11121107 " Test" ,
11131108 std::move (result.first ),
1114- std::vector<service_node>{test_service_node },
1109+ std::vector<service_node>{test_server-> node },
11151110 uint8_t {0 }};
11161111
11171112 // It excludes paths which include the IP of the target
1118- auto shared_ip_info = request_info::make (test_service_node , std::nullopt , std::nullopt , 0ms);
1113+ auto shared_ip_info = request_info::make (test_server-> node , std::nullopt , std::nullopt , 0ms);
11191114 CHECK_FALSE (network.find_valid_path (shared_ip_info, {valid_path}).has_value ());
11201115
11211116 // It returns a path when there is a valid one
@@ -1130,7 +1125,7 @@ TEST_CASE("Network", "[network][find_valid_path]") {
11301125TEST_CASE (" Network" , " [network][build_path_if_needed]" ) {
11311126 auto ed_pk = " 4cb76fdc6d32278e3f83dbf608360ecc6b65727934b85d2fb86862ff98c46ab7" _hexbytes;
11321127 auto target = test_node (ed_pk, 0 );
1133- ;
1128+
11341129 std::optional<TestNetwork> network;
11351130 auto invalid_path = onion_path{
11361131 " Test" , connection_info{target, nullptr , nullptr , nullptr }, {target}, uint8_t {0 }};
@@ -1226,8 +1221,8 @@ TEST_CASE("Network", "[network][build_path_if_needed]") {
12261221}
12271222
12281223TEST_CASE (" Network" , " [network][establish_connection]" ) {
1224+ auto test_server = create_test_server (500 );
12291225 auto network = TestNetwork (std::nullopt , true , true , false );
1230- auto test_server = network.create_test_node (500 );
12311226 std::promise<std::pair<connection_info, std::optional<std::string>>> prom;
12321227
12331228 network.establish_connection (
@@ -1253,7 +1248,7 @@ TEST_CASE("Network", "[network][check_request_queue_timeouts]") {
12531248 // Test that it doesn't start checking for timeouts when the request doesn't have
12541249 // a build paths timeout
12551250 network.emplace (std::nullopt , true , true , false );
1256- test_server.emplace (network-> create_test_node (501 ));
1251+ test_server.emplace (create_test_server (501 ));
12571252 network->send_onion_request (
12581253 (*test_server)->node ,
12591254 to_vector (" {\" method\" :\" info\" ,\" params\" :{}}" ),
@@ -1270,7 +1265,7 @@ TEST_CASE("Network", "[network][check_request_queue_timeouts]") {
12701265 // Test that it does start checking for timeouts when the request has a
12711266 // paths build timeout
12721267 network.emplace (std::nullopt , true , true , false );
1273- test_server.emplace (network-> create_test_node (502 ));
1268+ test_server.emplace (create_test_server (502 ));
12741269 network->ignore_calls_to (" build_path" );
12751270 network->send_onion_request (
12761271 (*test_server)->node ,
@@ -1288,7 +1283,7 @@ TEST_CASE("Network", "[network][check_request_queue_timeouts]") {
12881283 // Test that it fails the request with a timeout if it has a build path timeout
12891284 // and the path build takes too long
12901285 network.emplace (std::nullopt , true , true , false );
1291- test_server.emplace (network-> create_test_node (503 ));
1286+ test_server.emplace (create_test_server (503 ));
12921287 network->ignore_calls_to (" build_path" );
12931288 network->send_onion_request (
12941289 (*test_server)->node ,
@@ -1312,8 +1307,8 @@ TEST_CASE("Network", "[network][check_request_queue_timeouts]") {
13121307}
13131308
13141309TEST_CASE (" Network" , " [network][send_request]" ) {
1310+ auto test_server = create_test_server (500 );
13151311 auto network = TestNetwork (std::nullopt , true , true , false );
1316- auto test_server = network.create_test_node (500 );
13171312 std::promise<Result> prom;
13181313
13191314 network.establish_connection (
@@ -1365,8 +1360,8 @@ TEST_CASE("Network", "[network][send_request]") {
13651360}
13661361
13671362TEST_CASE (" Network" , " [network][send_onion_request]" ) {
1363+ auto test_server = create_test_server (500 );
13681364 auto network = TestNetwork (std::nullopt , true , true , false );
1369- auto test_server = network.create_test_node (500 );
13701365 auto [test_path_servers, test_path] = network.create_test_path ();
13711366 network.handle_onion_requests_as_plaintext = true ;
13721367 network.set_paths (PathType::standard, {test_path});
@@ -1407,8 +1402,8 @@ TEST_CASE("Network", "[network][send_onion_request]") {
14071402}
14081403
14091404TEST_CASE (" Network" , " [network][c][network_send_onion_request]" ) {
1405+ auto test_server_cpp = create_test_server (500 );
14101406 auto test_network = std::make_unique<TestNetwork>(std::nullopt , true , true , false );
1411- auto test_server_cpp = test_network->create_test_node (500 );
14121407 std::optional<std::pair<std::vector<std::shared_ptr<TestServer>>, onion_path>> test_path_data;
14131408 test_path_data.emplace (test_network->create_test_path ());
14141409 test_network->handle_onion_requests_as_plaintext = true ;
0 commit comments