summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2015-02-09 06:38:36 -0500
committerEric S. Raymond <esr@thyrsus.com>2015-02-09 06:38:36 -0500
commitf05f1facb3eec6c75e7e327a64ad43d10fabbbe9 (patch)
treea2fec64b7cfd3ad3c281cb0f5e7145e6b73b57dd
parent156c381715e13466682af32d284ee1c684b0de96 (diff)
downloadgpsd-f05f1facb3eec6c75e7e327a64ad43d10fabbbe9.tar.gz
Reinstate port-zero allocation magic for tests. All regression tests pass.
-rw-r--r--gps/fake.py20
1 files changed, 14 insertions, 6 deletions
diff --git a/gps/fake.py b/gps/fake.py
index 9a9e9c98..17545bc9 100644
--- a/gps/fake.py
+++ b/gps/fake.py
@@ -308,6 +308,15 @@ class FakePTY(FakeGPS):
"Wait for the associated device to drain (e.g. before closing)."
termios.tcdrain(self.fd)
+def cleansocket(host, port):
+ "Get a socket that we can re-use cleanly after it's closed."
+ cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ # This magic prevents "Address already in use" errors after
+ # we release the socket.
+ cs.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ cs.bind((host, port))
+ return cs
+
class FakeTCP(FakeGPS):
"A TCP serverlet with a test log ready to be cycled to it."
def __init__(self, testload,
@@ -317,11 +326,7 @@ class FakeTCP(FakeGPS):
self.host = host
self.port = int(port)
self.byname = "tcp://" + host + ":" + str(port)
- self.dispatcher = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- # This magic prevents "Address already in use" errors after
- # we release the socket.
- self.dispatcher.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- self.dispatcher.bind((self.host, self.port))
+ self.dispatcher = cleansocket(self.host, self.port)
self.dispatcher.listen(5)
self.readables = [self.dispatcher]
@@ -515,7 +520,10 @@ class TestSession:
if port:
self.port = port
else:
- self.port = gps.GPSD_PORT
+ # Magic way to get a socket with an unused port number
+ s = cleansocket("localhost", 0)
+ self.port = s.getsockname()[1]
+ s.close()
self.progress = lambda x: None
self.reporter = lambda x: None
self.default_predicate = None