示例#1
0
    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)
示例#2
0
    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)
示例#3
0
    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())
示例#4
0
 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)
示例#5
0
    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)
示例#6
0
 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)
示例#7
0
 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)
示例#8
0
 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'))
示例#9
0
 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))
示例#10
0
    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)
示例#11
0
 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())
示例#12
0
 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'))
示例#13
0
 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'))
示例#14
0
 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)
示例#15
0
    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)
示例#16
0
 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)
示例#17
0
 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)
示例#18
0
 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)
示例#19
0
    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)
示例#20
0
 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)
示例#21
0
    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)