async def test_m_search_reply_unicast(self): replies = { (self.query_packet.encode().encode(), ("10.0.0.1", 1900)): self.reply_packet.encode().encode() } sent = [] with mock_tcp_and_udp(self.loop, udp_replies=replies, udp_expected_addr="10.0.0.1", sent_udp_packets=sent): reply = await m_search("10.0.0.2", "10.0.0.1", self.successful_args, timeout=1, loop=self.loop, unicast=True) self.assertEqual(reply.encode(), self.reply_packet.encode()) self.assertListEqual(sent, [self.query_packet.encode().encode()]) with self.assertRaises(UPnPError): with mock_tcp_and_udp(self.loop, udp_expected_addr="10.0.0.1", udp_replies=replies): await m_search("10.0.0.2", "10.0.0.1", self.successful_args, timeout=1, loop=self.loop, unicast=False)
async def test_m_search_reply_multicast(self): replies = { (self.query_packet.encode().encode(), (SSDP_IP_ADDRESS, 1900)): self.reply_packet.encode().encode() } sent = [] with mock_tcp_and_udp(self.loop, udp_replies=replies, udp_expected_addr="10.0.0.1", sent_udp_packets=sent): reply = await m_search("10.0.0.2", "10.0.0.1", self.successful_args, timeout=1, loop=self.loop) self.assertEqual(reply.encode(), self.reply_packet.encode()) self.assertIn(self.query_packet.encode().encode(), sent) with self.assertRaises(UPnPError): with mock_tcp_and_udp(self.loop, udp_replies=replies, udp_expected_addr="10.0.0.10"): await m_search("10.0.0.2", "10.0.0.1", self.successful_args, timeout=1, loop=self.loop)
def test_m_search(self): actual_output = StringIO() timeout_msg = "aioupnp encountered an error: M-SEARCH for 10.0.0.1:1900 timed out\n" with contextlib.redirect_stdout(actual_output): with mock_tcp_and_udp(self.loop, '10.0.0.1', tcp_replies={}, udp_replies={}): main([ None, '--timeout=1', '--gateway_address=10.0.0.1', '--lan_address=10.0.0.2', 'm-search' ], self.loop) self.assertEqual(timeout_msg, actual_output.getvalue()) actual_output = StringIO() with contextlib.redirect_stdout(actual_output): with mock_tcp_and_udp(self.loop, '10.0.0.1', tcp_replies=self.scpd_replies, udp_replies=self.udp_replies): main([ None, '--timeout=1', '--gateway_address=10.0.0.1', '--lan_address=10.0.0.2', 'm-search' ], self.loop) self.assertEqual(m_search_cli_result, actual_output.getvalue())
async def test_scpd_get(self): sent = [] replies = {self.get_request: self.response} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent): result, raw, err = await scpd_get(self.path, self.lan_address, self.port, self.loop) self.assertIsNone(err) self.assertDictEqual(self.expected_parsed, result)
async def test_m_search_reply_multicast(self): replies = { (self.query_packet.encode().encode(), (SSDP_IP_ADDRESS, 1900)): self.reply_packet.encode().encode() } sent = [] with mock_tcp_and_udp(self.loop, udp_replies=replies, udp_expected_addr="10.0.0.1", sent_udp_packets=sent): reply = await m_search("10.0.0.2", "10.0.0.1", self.successful_args, timeout=1, loop=self.loop) self.assertEqual(reply.encode(), self.reply_packet.encode()) self.assertIn(self.query_packet.encode().encode(), sent) with self.assertRaises(UPnPError): with mock_tcp_and_udp(self.loop, udp_replies=replies, udp_expected_addr="10.0.0.10"): await m_search("10.0.0.2", "10.0.0.1", self.successful_args, timeout=1, loop=self.loop) # async def test_packets_sent_fuzzy_m_search(self): # sent = [] # # with self.assertRaises(UPnPError): # with mock_tcp_and_udp(self.loop, udp_expected_addr="10.0.0.1", sent_udp_packets=sent): # await fuzzy_m_search("10.0.0.2", "10.0.0.1", 1, self.loop) # for packet in self.byte_packets: # self.assertIn(packet, sent) # # async def test_packets_fuzzy_m_search(self): # replies = { # (self.query_packet.encode().encode(), (SSDP_IP_ADDRESS, 1900)): self.reply_packet.encode().encode() # } # sent = [] # # with mock_tcp_and_udp(self.loop, udp_expected_addr="10.0.0.1", udp_replies=replies, sent_udp_packets=sent): # args, reply = await fuzzy_m_search("10.0.0.2", "10.0.0.1", 1, self.loop) # # self.assertEqual(reply.encode(), self.reply_packet.encode()) # self.assertEqual(args, self.successful_args) # # async def test_packets_sent_fuzzy_m_search_ignore_invalid_datagram_replies(self): # sent = [] # # with self.assertRaises(UPnPError): # with mock_tcp_and_udp(self.loop, udp_expected_addr="10.0.0.1", sent_udp_packets=sent, # add_potato_datagrams=True): # await fuzzy_m_search("10.0.0.2", "10.0.0.1", 1, self.loop) # # for packet in self.byte_packets: # self.assertIn(packet, sent)
async def test_socket_setup_error(self): with mock_tcp_and_udp(self.loop, raise_oserror_on_bind=True): with self.assertRaises(UPnPError): await m_search("10.0.0.2", "10.0.0.1", self.successful_args, timeout=1, loop=self.loop)
async def test_scpd_get_timeout(self): sent = [] replies = {} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent): result, raw, err = await scpd_get(self.path, self.lan_address, self.port, self.loop) self.assertIsInstance(err, UPnPError) self.assertDictEqual({}, result) self.assertEqual(b'', raw)
async def test_scpd_get_bad_xml(self): sent = [] replies = {self.get_request: self.bad_response} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent): result, raw, err = await scpd_get(self.path, self.lan_address, self.port, self.loop) self.assertDictEqual({}, result) self.assertEqual(self.bad_response, raw) self.assertIsInstance(err, UPnPError) self.assertTrue(str(err).startswith('no element found'))
async def test_scpd_duplicate_header(self): sent = [] replies = {self.get_request: self.bad_response3} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent): result, raw, err = await scpd_get(self.path, self.lan_address, self.port, self.loop) self.assertDictEqual({}, result) self.assertTrue(self.bad_response3.startswith(raw)) self.assertIsInstance(err, UPnPError) self.assertEqual("duplicate headers", str(err))
async def test_deadbeef_response(self): replies = { (self.query_packet.encode().encode(), ("10.0.0.1", 1900)): b'\xde\xad\xbe\xef' } sent = [] with mock_tcp_and_udp(self.loop, udp_replies=replies, udp_expected_addr="10.0.0.1", sent_udp_packets=sent): with self.assertRaises(UPnPError): await m_search("10.0.0.2", "10.0.0.1", self.successful_args, timeout=1, loop=self.loop)
def test_get_external_ip(self): actual_output = StringIO() with contextlib.redirect_stdout(actual_output): with mock_tcp_and_udp(self.loop, '10.0.0.1', tcp_replies=self.scpd_replies, udp_replies=self.udp_replies): main( [None, '--timeout=1', '--gateway_address=10.0.0.1', '--lan_address=10.0.0.2', 'get-external-ip'], self.loop ) self.assertEqual("11.22.33.44\n", actual_output.getvalue())
async def test_scpd_get_overrun_unspecified_content_length(self): sent = [] replies = {self.get_request: self.bad_response2} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent): result, raw, err = await scpd_get(self.path, self.lan_address, self.port, self.loop) self.assertDictEqual({}, result) self.assertEqual(self.bad_response2.decode(), raw.decode()) self.assertIsInstance(err, UPnPError) self.assertTrue(str(err).endswith('with unspecified content length'))
async def test_scpd_get_overrun_content_length(self): sent = [] replies = {self.get_request: self.bad_response + b'\r\n'} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent): result, raw, err = await scpd_get(self.path, self.lan_address, self.port, self.loop) self.assertDictEqual({}, result) self.assertEqual(self.bad_response + b'\r\n', raw) self.assertIsInstance(err, UPnPError) self.assertTrue(str(err).startswith('too many bytes written'))
async def test_scpd_post(self): sent = [] replies = {self.post_bytes: self.post_response} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent): result, raw, err = await scpd_post( self.path, self.gateway_address, self.port, self.method, self.param_names, self.st, self.loop ) self.assertIsNone(err) self.assertEqual(self.post_response, raw) self.assertDictEqual({'NewExternalIPAddress': '11.22.33.44'}, result)
async def test_packets_sent_fuzzy_m_search(self): sent = [] with self.assertRaises(UPnPError): with mock_tcp_and_udp(self.loop, udp_expected_addr="10.0.0.1", sent_udp_packets=sent): await fuzzy_m_search("10.0.0.2", "10.0.0.1", 1, self.loop) self.assertListEqual(sent, self.byte_packets)
async def test_scpd_post_overrun_response(self): sent = [] replies = {self.post_bytes: self.post_response + b'\r\n'} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent): result, raw, err = await scpd_post( self.path, self.gateway_address, self.port, self.method, self.param_names, self.st, self.loop ) self.assertIsInstance(err, UPnPError) self.assertTrue(str(err).startswith('too many bytes written')) self.assertEqual(self.post_response + b'\r\n', raw) self.assertDictEqual({}, result)
async def test_scpd_post_bad_xml_response(self): sent = [] replies = {self.post_bytes: self.bad_envelope_response} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent): result, raw, err = await scpd_post( self.path, self.gateway_address, self.port, self.method, self.param_names, self.st, self.loop ) self.assertIsInstance(err, UPnPError) self.assertTrue(str(err).startswith('no element found')) self.assertEqual(self.bad_envelope_response, raw) self.assertDictEqual({}, result)
async def test_scpd_post_timeout(self): sent = [] replies = {} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent): result, raw, err = await scpd_post( self.path, self.gateway_address, self.port, self.method, self.param_names, self.st, self.loop ) self.assertIsInstance(err, UPnPError) self.assertTrue(str(err).startswith('Timeout')) self.assertEqual(b'', raw) self.assertDictEqual({}, result)
async def test_packets_sent_fuzzy_m_search_ignore_invalid_datagram_replies( self): sent = [] with self.assertRaises(UPnPError): with mock_tcp_and_udp(self.loop, udp_expected_addr="10.0.0.1", sent_udp_packets=sent, add_potato_datagrams=True): await fuzzy_m_search("10.0.0.2", "10.0.0.1", 1, self.loop) self.assertListEqual(sent, self.byte_packets)
async def test_scpd_post_connection_error(self): sent = [] replies = {} with mock_tcp_and_udp(self.loop, tcp_replies=replies, sent_tcp_packets=sent, raise_connectionerror=True): result, raw, err = await scpd_post(self.path, self.gateway_address, self.port, self.method, self.param_names, self.st, self.loop) self.assertIsInstance(err, UPnPError) self.assertEqual('ConnectionRefusedError()', str(err)) self.assertEqual(b'', raw) self.assertDictEqual({}, result)
async def test_packets_fuzzy_m_search(self): replies = { (self.query_packet.encode().encode(), (SSDP_IP_ADDRESS, 1900)): self.reply_packet.encode().encode() } sent = [] with mock_tcp_and_udp(self.loop, udp_expected_addr="10.0.0.1", udp_replies=replies, sent_udp_packets=sent): args, reply = await fuzzy_m_search("10.0.0.2", "10.0.0.1", 1, self.loop) self.assertEqual(reply.encode(), self.reply_packet.encode()) self.assertEqual(args, self.successful_args)