async def test_processing_messages(self): settings.network.magic = 769 socket_mock = NeoNodeSocketMock(self.loop, '127.0.0.1', 1111) m_addr = message.Message(msg_type=message.MessageType.ADDR, payload=payloads.AddrPayload([])) m_block = message.Message(msg_type=message.MessageType.BLOCK, payload=payloads.EmptyPayload()) m_inv1 = message.Message(msg_type=message.MessageType.INV, payload=payloads.InventoryPayload( payloads.InventoryType.BLOCK, hashes=[types.UInt256.from_string("65793a030c0dcd4fff4da8a6a6d5daa8b570750da4fdeea1bbc43bdf124aedc9")] )) m_inv2 = message.Message(msg_type=message.MessageType.INV, payload=payloads.InventoryPayload(payloads.InventoryType.TX, [])) m_getaddr = message.Message(msg_type=message.MessageType.GETADDR, payload=payloads.EmptyPayload()) m_mempool = message.Message(msg_type=message.MessageType.MEMPOOL, payload=payloads.EmptyPayload()) # taken from the Headers testcase in `test_payloads` raw_headers_payload = binascii.unhexlify(b'0000000001FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00A402FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00A400000000000000007B00000000F7B4D00143932F3B6243CFC06CB4A68F22C739E201020102020304') m_headers = message.Message(msg_type=message.MessageType.HEADERS, payload=payloads.HeadersPayload.deserialize_from_bytes(raw_headers_payload)) m_ping = message.Message(msg_type=message.MessageType.PING, payload=payloads.PingPayload(0)) m_pong = message.Message(msg_type=message.MessageType.PONG, payload=payloads.PingPayload(0)) m_reject = message.Message(msg_type=message.MessageType.REJECT, payload=payloads.EmptyPayload()) def _recv_data2(self): # first do handshake yield self.m_send_version.to_array() yield self.m_verack.to_array() # next send all types of messages we handle yield m_addr.to_array() yield m_block.to_array() yield m_inv1.to_array() yield m_inv2.to_array() yield m_getaddr.to_array() yield m_mempool.to_array() yield m_headers.to_array() yield m_ping.to_array() yield m_pong.to_array() yield m_reject.to_array() socket_mock.recv_data = _recv_data2(socket_mock) with self.assertLogs(network_logger, 'DEBUG') as log_context: try: n, _ = await node.NeoNode.connect_to(socket=socket_mock) except Exception as e: print(f"GVD {e}") await asyncio.sleep(0.5) await n.disconnect(payloads.DisconnectReason.SHUTTING_DOWN)
async def test_processing_messages3(self): # we got 2 cases for which we need to test without using a backend settings.network.magic = 769 settings.storage.use_default = False socket_mock = NeoNodeSocketMock(self.loop, '127.0.0.1', 1111) m_inv1 = message.Message( msg_type=message.MessageType.INV, payload=payloads.InventoryPayload( payloads.InventoryType.BLOCK, hashes=[ types.UInt256.from_string( "65793a030c0dcd4fff4da8a6a6d5daa8b570750da4fdeea1bbc43bdf124aedc9" ) ])) m_ping = message.Message(msg_type=message.MessageType.PING, payload=payloads.PingPayload(0)) def _recv_data2(self): print("my recv data 2 called ") # first do handshake yield self.m_send_version.to_array() yield self.m_verack.to_array() yield m_inv1.to_array() yield m_ping.to_array() socket_mock.recv_data = _recv_data2(socket_mock) with self.assertLogs(network_logger, 'DEBUG') as log_context: with mock.patch('neo3.network.node.NeoNode.send_message', new_callable=asynctest.CoroutineMock): # with asynctest.patch('neo3.network.node.NeoNode.send_message', return_value=asynctest.CoroutineMock()): n, _ = await node.NeoNode.connect_to(socket=socket_mock) await asyncio.sleep(0.1) await n.disconnect(payloads.DisconnectReason.SHUTTING_DOWN)
def test_create_inv_message(self): hashes = [UInt256.zero()] inv_payload = payloads.InventoryPayload(payloads.InventoryType.BLOCK, hashes) m = message.Message(message.MessageType.INV, inv_payload) data = m.to_array() self.assertEqual(message.MessageType.INV, m.type) self.assertEqual(message.MessageConfig.NONE, m.config) self.assertIsInstance(m.payload, payloads.InventoryPayload) """ Taken from constructing the same object in C# UInt256[] hashes = { UInt256.Zero }; var inv_payload = InvPayload.Create(InventoryType.Block, hashes); ISerializable message = Message.Create(MessageCommand.Inv, inv_payload); using (MemoryStream ms = new MemoryStream()) using (BinaryWriter writer = new BinaryWriter(ms)) { message.Serialize(writer); writer.Flush(); byte[] data = ms.ToArray(); Console.WriteLine($"b\'{BitConverter.ToString(data).Replace("-","")}\'"); } """ expected_data = binascii.unhexlify( b'0027222C010000000000000000000000000000000000000000000000000000000000000000' ) self.assertEqual(expected_data, data)
def test_deserialization_with_unsupported_payload_type(self): hashes = [UInt256.zero()] inv_payload = payloads.InventoryPayload(payloads.InventoryType.BLOCK, hashes) m = message.Message(message.MessageType.ALERT, inv_payload) m2 = message.Message.deserialize_from_bytes(m.to_array()) self.assertIsInstance(m2.payload, payloads.EmptyPayload)
async def request_data(self, type: payloads.InventoryType, hashes: List[types.UInt256]) -> None: """ Send a request for receiving the specified inventory data. Args: type: hashes: """ if len(hashes) < 1: return m = message.Message(msg_type=message.MessageType.GETDATA, payload=payloads.InventoryPayload(type, hashes)) await self.send_message(m)
def test_create_compressed_inv_message(self): hashes = [UInt256.zero(), UInt256.zero(), UInt256.zero(), UInt256.zero()] inv_payload = payloads.InventoryPayload(payloads.InventoryType.BLOCK, hashes) m = message.Message(message.MessageType.INV, inv_payload) data = m.to_array() # triggers payload compression self.assertEqual(message.MessageType.INV, m.type) self.assertEqual(message.MessageConfig.COMPRESSED, m.config) self.assertIsInstance(m.payload, payloads.InventoryPayload) """ Data created in the same fashion as how it's done in test_create_inv_message() The deviation is `hashes` now contains 4 x UInt256.zero() """ expected_data = binascii.unhexlify(b'01270D3F2C0400010067500000000000') self.assertEqual(expected_data, data)
async def send_inventory(self, inv_type: payloads.InventoryType, inv_hash: types.UInt256): inv = payloads.InventoryPayload(type=inv_type, hashes=[inv_hash]) m = message.Message(msg_type=message.MessageType.INV, payload=inv) await self.send_message(m)