Merge bitcoin/bitcoin#27986: test: remove race in the user-agent reception check

20b49460b3 test: remove race in the user-agent reception check (Vasil Dimov)

Pull request description:

  In `add_p2p_connection()` we connect to `bitcoind` from the Python client and check that it has received our version string.

  This check looked up the last/newest entry from `getpeerinfo` RPC, assuming that it must be the connection we have just opened. But this will not be the case if a new inbound or outbound connection is made to/from `bitcoind` in the meantime.

  Instead of the last entry in `getpeerinfo`, check all and find the one which corresponds to our connection using our outgoing address:port tuple which is unique.

ACKs for top commit:
  jonatack:
    re-ACK 20b49460b3
  MarcoFalke:
    Concept ACK 20b49460b3

Tree-SHA512: 61fd3359ef11ea830021ede0e745497a7b60690c32d21c47cd12ff79f78907bb45e922c9d01e5d7ff614a8cd5e4560d39a3fc86b01b200429773a23ace3917e4
This commit is contained in:
fanquake
2023-07-19 12:26:48 +01:00

View File

@@ -644,10 +644,13 @@ class TestNode():
# in comparison to the upside of making tests less fragile and unexpected intermittent errors less likely. # in comparison to the upside of making tests less fragile and unexpected intermittent errors less likely.
p2p_conn.sync_with_ping() p2p_conn.sync_with_ping()
# Consistency check that the Bitcoin Core has received our user agent string. This checks the # Consistency check that the node received our user agent string.
# node's newest peer. It could be racy if another Bitcoin Core node has connected since we opened # Find our connection in getpeerinfo by our address:port, as it is unique.
# our connection, but we don't expect that to happen. sockname = p2p_conn._transport.get_extra_info("socket").getsockname()
assert_equal(self.getpeerinfo()[-1]['subver'], P2P_SUBVERSION) our_addr_and_port = f"{sockname[0]}:{sockname[1]}"
info = [peer for peer in self.getpeerinfo() if peer["addr"] == our_addr_and_port]
assert_equal(len(info), 1)
assert_equal(info[0]["subver"], P2P_SUBVERSION)
return p2p_conn return p2p_conn