Fix purge_dead_channel tests
This commit is contained in:
		
					parent
					
						
							
								5186b7ff9a
							
						
					
				
			
			
				commit
				
					
						d411cc7c6e
					
				
			
		
					 1 changed files with 35 additions and 79 deletions
				
			
		| 
						 | 
					@ -1091,9 +1091,9 @@ TEST (network, reconnect_cached)
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Tests that channel and channel container removes channels with dead local sockets
 | 
					 * Tests that channel and channel container removes channels with dead local sockets
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
TEST (network, purge_dead_channel_outgoing)
 | 
					TEST (network, purge_dead_channel)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	nano::test::system system{};
 | 
						nano::test::system system;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nano::node_flags flags;
 | 
						nano::node_flags flags;
 | 
				
			||||||
	// Disable non realtime sockets
 | 
						// Disable non realtime sockets
 | 
				
			||||||
| 
						 | 
					@ -1106,36 +1106,14 @@ TEST (network, purge_dead_channel_outgoing)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto & node1 = *system.add_node (flags);
 | 
						auto & node1 = *system.add_node (flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// We expect one incoming and one outgoing connection
 | 
						node1.observers.socket_connected.add ([&] (nano::transport::socket & sock) {
 | 
				
			||||||
	std::shared_ptr<nano::transport::socket> outgoing;
 | 
							system.logger.debug (nano::log::type::test, "Connected: {}", sock);
 | 
				
			||||||
	std::shared_ptr<nano::transport::socket> incoming;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	std::atomic<int> connected_count{ 0 };
 | 
					 | 
				
			||||||
	node1.observers.socket_connected.add ([&] (nano::transport::socket & socket) {
 | 
					 | 
				
			||||||
		connected_count++;
 | 
					 | 
				
			||||||
		outgoing = socket.shared_from_this ();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		std::cout << "connected: " << socket.remote_endpoint () << std::endl;
 | 
					 | 
				
			||||||
	});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	std::atomic<int> accepted_count{ 0 };
 | 
					 | 
				
			||||||
	node1.observers.socket_accepted.add ([&] (nano::transport::socket & socket) {
 | 
					 | 
				
			||||||
		accepted_count++;
 | 
					 | 
				
			||||||
		incoming = socket.shared_from_this ();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		std::cout << "accepted: " << socket.remote_endpoint () << std::endl;
 | 
					 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto & node2 = *system.add_node (flags);
 | 
						auto & node2 = *system.add_node (flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ASSERT_TIMELY_EQ (5s, connected_count, 1);
 | 
					 | 
				
			||||||
	ASSERT_ALWAYS_EQ (1s, connected_count, 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ASSERT_TIMELY_EQ (5s, accepted_count, 1);
 | 
					 | 
				
			||||||
	ASSERT_ALWAYS_EQ (1s, accepted_count, 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ASSERT_EQ (node1.network.size (), 1);
 | 
						ASSERT_EQ (node1.network.size (), 1);
 | 
				
			||||||
	ASSERT_ALWAYS_EQ (1s, node1.network.size (), 1);
 | 
						ASSERT_ALWAYS_EQ (500ms, node1.network.size (), 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Store reference to the only channel
 | 
						// Store reference to the only channel
 | 
				
			||||||
	auto channels = node1.network.list ();
 | 
						auto channels = node1.network.list ();
 | 
				
			||||||
| 
						 | 
					@ -1143,29 +1121,29 @@ TEST (network, purge_dead_channel_outgoing)
 | 
				
			||||||
	auto channel = channels.front ();
 | 
						auto channel = channels.front ();
 | 
				
			||||||
	ASSERT_TRUE (channel);
 | 
						ASSERT_TRUE (channel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto sockets = node1.tcp_listener.sockets ();
 | 
				
			||||||
 | 
						ASSERT_EQ (sockets.size (), 1);
 | 
				
			||||||
 | 
						auto socket = sockets.front ();
 | 
				
			||||||
 | 
						ASSERT_TRUE (socket);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// When socket is dead ensure channel knows about that
 | 
						// When socket is dead ensure channel knows about that
 | 
				
			||||||
	ASSERT_TRUE (channel->alive ());
 | 
						ASSERT_TRUE (channel->alive ());
 | 
				
			||||||
	outgoing->close ();
 | 
						socket->close ();
 | 
				
			||||||
	ASSERT_TIMELY (5s, !channel->alive ());
 | 
						ASSERT_TIMELY (10s, !channel->alive ());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Shortly after that a new channel should be established
 | 
						auto channel_exists = [] (auto & node, auto & channel) {
 | 
				
			||||||
	ASSERT_TIMELY_EQ (5s, connected_count, 2);
 | 
							auto channels = node.network.list ();
 | 
				
			||||||
	ASSERT_ALWAYS_EQ (1s, connected_count, 2);
 | 
							return std::find (channels.begin (), channels.end (), channel) != channels.end ();
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
	// Check that a new channel is healthy
 | 
						ASSERT_TIMELY (5s, !channel_exists (node1, channel));
 | 
				
			||||||
	auto channels2 = node1.network.list ();
 | 
					 | 
				
			||||||
	ASSERT_EQ (channels2.size (), 1);
 | 
					 | 
				
			||||||
	auto channel2 = channels2.front ();
 | 
					 | 
				
			||||||
	ASSERT_TRUE (channel2);
 | 
					 | 
				
			||||||
	ASSERT_TRUE (channel2->alive ());
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Tests that channel and channel container removes channels with dead remote sockets
 | 
					 * Tests that channel and channel container removes channels with dead remote sockets
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
TEST (network, purge_dead_channel_incoming)
 | 
					TEST (network, purge_dead_channel_remote)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	nano::test::system system{};
 | 
						nano::test::system system;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	nano::node_flags flags;
 | 
						nano::node_flags flags;
 | 
				
			||||||
	// Disable non realtime sockets
 | 
						// Disable non realtime sockets
 | 
				
			||||||
| 
						 | 
					@ -1177,37 +1155,15 @@ TEST (network, purge_dead_channel_incoming)
 | 
				
			||||||
	flags.disable_wallet_bootstrap = true;
 | 
						flags.disable_wallet_bootstrap = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	auto & node1 = *system.add_node (flags);
 | 
						auto & node1 = *system.add_node (flags);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	// We expect one incoming and one outgoing connection
 | 
					 | 
				
			||||||
	std::shared_ptr<nano::transport::socket> outgoing;
 | 
					 | 
				
			||||||
	std::shared_ptr<nano::transport::socket> incoming;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	std::atomic<int> connected_count{ 0 };
 | 
					 | 
				
			||||||
	node1.observers.socket_connected.add ([&] (nano::transport::socket & socket) {
 | 
					 | 
				
			||||||
		connected_count++;
 | 
					 | 
				
			||||||
		outgoing = socket.shared_from_this ();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		std::cout << "connected: " << socket.remote_endpoint () << std::endl;
 | 
					 | 
				
			||||||
	});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	std::atomic<int> accepted_count{ 0 };
 | 
					 | 
				
			||||||
	node1.observers.socket_accepted.add ([&] (nano::transport::socket & socket) {
 | 
					 | 
				
			||||||
		accepted_count++;
 | 
					 | 
				
			||||||
		incoming = socket.shared_from_this ();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		std::cout << "accepted: " << socket.remote_endpoint () << std::endl;
 | 
					 | 
				
			||||||
	});
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	auto & node2 = *system.add_node (flags);
 | 
						auto & node2 = *system.add_node (flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ASSERT_TIMELY_EQ (5s, connected_count, 1);
 | 
						node2.observers.socket_connected.add ([&] (nano::transport::socket & sock) {
 | 
				
			||||||
	ASSERT_ALWAYS_EQ (1s, connected_count, 1);
 | 
							system.logger.debug (nano::log::type::test, "Connected: {}", sock);
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
	ASSERT_TIMELY_EQ (5s, accepted_count, 1);
 | 
					 | 
				
			||||||
	ASSERT_ALWAYS_EQ (1s, accepted_count, 1);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ASSERT_EQ (node1.network.size (), 1);
 | 
				
			||||||
	ASSERT_EQ (node2.network.size (), 1);
 | 
						ASSERT_EQ (node2.network.size (), 1);
 | 
				
			||||||
	ASSERT_ALWAYS_EQ (1s, node2.network.size (), 1);
 | 
						ASSERT_ALWAYS_EQ (500ms, std::min (node1.network.size (), node2.network.size ()), 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Store reference to the only channel
 | 
						// Store reference to the only channel
 | 
				
			||||||
	auto channels = node2.network.list ();
 | 
						auto channels = node2.network.list ();
 | 
				
			||||||
| 
						 | 
					@ -1215,19 +1171,19 @@ TEST (network, purge_dead_channel_incoming)
 | 
				
			||||||
	auto channel = channels.front ();
 | 
						auto channel = channels.front ();
 | 
				
			||||||
	ASSERT_TRUE (channel);
 | 
						ASSERT_TRUE (channel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						auto sockets = node1.tcp_listener.sockets ();
 | 
				
			||||||
 | 
						ASSERT_EQ (sockets.size (), 1);
 | 
				
			||||||
 | 
						auto socket = sockets.front ();
 | 
				
			||||||
 | 
						ASSERT_TRUE (socket);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// When remote socket is dead ensure channel knows about that
 | 
						// When remote socket is dead ensure channel knows about that
 | 
				
			||||||
	ASSERT_TRUE (channel->alive ());
 | 
						ASSERT_TRUE (channel->alive ());
 | 
				
			||||||
	incoming->close ();
 | 
						socket->close ();
 | 
				
			||||||
	ASSERT_TIMELY (5s, !channel->alive ());
 | 
						ASSERT_TIMELY (5s, !channel->alive ());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Shortly after that a new channel should be established
 | 
						auto channel_exists = [] (auto & node, auto & channel) {
 | 
				
			||||||
	ASSERT_TIMELY_EQ (5s, accepted_count, 2);
 | 
							auto channels = node.network.list ();
 | 
				
			||||||
	ASSERT_ALWAYS_EQ (1s, accepted_count, 2);
 | 
							return std::find (channels.begin (), channels.end (), channel) != channels.end ();
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
	// Check that a new channel is healthy
 | 
						ASSERT_TIMELY (5s, !channel_exists (node2, channel));
 | 
				
			||||||
	auto channels2 = node2.network.list ();
 | 
					 | 
				
			||||||
	ASSERT_EQ (channels2.size (), 1);
 | 
					 | 
				
			||||||
	auto channel2 = channels2.front ();
 | 
					 | 
				
			||||||
	ASSERT_TRUE (channel2);
 | 
					 | 
				
			||||||
	ASSERT_TRUE (channel2->alive ());
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue