def test_local_port(self):
     port_config = get_port_config([])
     upnpc = MagicMock()
     upnpc.port_open_on_router = MagicMock(return_value=False)
     mapper = PortMapper(port_config, upnpc)
     existing_ports = [2000, 2001, 2003]
     self.assertEquals([80, 2002, 2004], mapper.find_available_ports_to_try(existing_ports, 80, 3))
 def test_open_port(self):
     port_config = get_port_config([])
     upnpc = MagicMock()
     upnpc.port_open_on_router = MagicMock(side_effect=[True, True, False, False, False])
     mapper = PortMapper(port_config, upnpc)
     existing_ports = []
     self.assertEquals([2001, 2002, 2003], mapper.find_available_ports_to_try(existing_ports, 1999, 3))
 def test_first_gap(self):
     port_config = get_port_config([])
     upnpc = MagicMock()
     upnpc.port_open_on_router = MagicMock(return_value=False)
     mapper = PortMapper(port_config, upnpc)
     existing_ports = [2000, 2001, 2003]
     ports_to_try = mapper.find_available_ports_to_try(existing_ports, 2000, 3)
     self.assertEquals([2002, 2004, 2005], ports_to_try)
    def test_sync_adds_port(self):
        port_config = get_port_config([Port(80, 10001)])
        upnpc = MagicMock()
        upnpc.port_open_on_router = MagicMock(return_value=False)

        mapper = PortMapper(port_config, upnpc)
        mapper.sync()

        read = port_config.get(80)
        self.assertEquals(80, read.external_port)

        self.assertTrue(upnpc.add.called)
    def test_sync_new_ports(self):
        port_config = get_port_config([])

        upnpc = MagicMock()
        upnpc.port_open_on_router = MagicMock(return_value=False)

        mapper = PortMapper(port_config, upnpc)
        mapper.sync_new_port(80)

        read = port_config.get(80)
        self.assertEquals(80, read.external_port)

        upnpc.add.assert_called_with(80, 80)
    def test_sync_cleans_duplicate_mappings(self):
        port_config = get_port_config([Port(80, 2000)])

        upnpc = MagicMock()
        upnpc.get_external_ports = MagicMock(return_value=[2000, 2001])

        mapper = PortMapper(port_config, upnpc)
        mapper.sync()

        read = port_config.get(80)
        self.assertEquals(2000, read.external_port)

        upnpc.remove.assert_called_with(2001)
    def test_add_success(self):
        port_config = get_port_config([])

        upnpc = MagicMock()
        upnpc.port_open_on_router = MagicMock(return_value=False)

        mapper = PortMapper(port_config, upnpc)
        mapping = mapper.add(80)

        self.assertIsNotNone(mapping)
        self.assertEquals(80, mapping.local_port)
        self.assertEquals(80, mapping.external_port)
        self.assertTrue(upnpc.add.called)

        read = port_config.get(80)
        self.assertEquals(80, read.external_port)
    def test_add_success_after_first_failed(self):
        port_config = get_port_config([])

        upnpc = FailingUpnpc(2)
        upnpc.port_open_on_router = MagicMock(return_value=False)
        upnpc.external_ip = MagicMock()
        upnpc.mapped_external_ports = MagicMock()

        mapper = PortMapper(port_config, upnpc)
        mapping = mapper.add(80)

        self.assertIsNotNone(mapping)
        self.assertEquals(80, mapping.local_port)
        self.assertEquals(2001, mapping.external_port)

        read = port_config.get(80)
        self.assertEquals(2001, read.external_port)