Rev 6: Start implementing port management for tests. in file:///v/home/vila/.bazaar/plugins/local_test_server/

Vincent Ladeuil v.ladeuil+lp at free.fr
Wed May 28 11:57:58 BST 2008


At file:///v/home/vila/.bazaar/plugins/local_test_server/

------------------------------------------------------------
revno: 6
revision-id: v.ladeuil+lp at free.fr-20080528105757-6rdlzl1tohf27osd
parent: v.ladeuil+lp at free.fr-20080528091508-y8f72o1afg1zhxsd
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: local_test_server
timestamp: Wed 2008-05-28 12:57:57 +0200
message:
  Start implementing port management for tests.
  
  * tests/test_server.py:
  (TestAvailablePort): Tests for avaiable ports.
  
  * server.py:
  (_get_available_port): Manage a pool of available ports for tests.
modified:
  TODO                           todo-20080526134120-eibvvebw74t8j2xh-1
  server.py                      server.py-20080524160639-rqhbexqatjqbwypw-1
  tests/test_server.py           test_server.py-20080524160641-lco15o23ub9mac33-1
-------------- next part --------------
=== modified file 'TODO'
--- a/TODO	2008-05-26 19:42:08 +0000
+++ b/TODO	2008-05-28 10:57:57 +0000
@@ -1,7 +1,5 @@
 * server.py
 
-- test stop
-
 - create a hierarchy by server at start time (making more obvious
   what server is used and the requirements for each server)
 

=== modified file 'server.py'
--- a/server.py	2008-05-28 09:15:08 +0000
+++ b/server.py	2008-05-28 10:57:57 +0000
@@ -30,8 +30,14 @@
 
 class Server(object):
 
-    def __init__(self, conf):
+    def __init__(self, conf, host='localhost', port=-1):
         self.config = conf
+        self.host = host
+        if port != -1:
+            self.port = port
+        else:
+            # For tests only
+            self.port = _get_available_port()
 
     def start(self):
         raise NotImplementedError(self.start)
@@ -180,3 +186,27 @@
         return None
     else:
         return klass()
+
+
+_next_available_port = 49000
+_max_available_port = 49151
+def _get_available_port():
+    """Returns an hopefully available port for test purposes.
+
+    We deal with servers as black boxes, so we can't just bind on port 0 to
+    leave the os provide us an available port.
+
+    Yet, we want to be able to test these servers without interfering with some
+    already running ones (since we want to provide these servers for use by the
+    bzr test suite).
+
+    This function returns an available port in a range chosen in unassigned
+    ones as described in http://www.iana.org/assignments/port-numbers.
+    """
+    global _next_available_port
+    global _max_available_port
+    port = _next_available_port
+    if port >= _max_available_port:
+        raise ValueError('No more available ports')
+    _next_available_port += 1
+    return port

=== modified file 'tests/test_server.py'
--- a/tests/test_server.py	2008-05-26 19:42:08 +0000
+++ b/tests/test_server.py	2008-05-28 10:57:57 +0000
@@ -22,10 +22,35 @@
     tests,
     )
 
+
 from bzrlib.plugins.local_test_server import (
     server,
     )
 
+
+class TestAvailablePort(tests.TestCase):
+
+    def setUp(self):
+        super(TestAvailablePort, self).setUp()
+        original_next = server._next_available_port
+        original_max = server._max_available_port
+        server._next_available_port = 42
+        server._max_available_port = 43
+
+        def restore_values():
+            server._next_available_port = original_next
+            server._max_available_port = original_max
+
+        self.addCleanup(restore_values)
+
+    def test_available_port(self):
+        self.assertNotEqual(0, server._get_available_port())
+
+    def test_no_more_available_port(self):
+        port = server._get_available_port()
+        self.assertRaises(ValueError, server._get_available_port)
+
+
 class TestApache2(tests.TestCase):
 
     def test_server_doesn_t_run(self):



More information about the bazaar-commits mailing list