summaryrefslogtreecommitdiff
path: root/gps
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2015-02-02 14:14:49 -0500
committerEric S. Raymond <esr@thyrsus.com>2015-02-02 14:14:49 -0500
commitaa4b25a90d2501553658d96267a01e2eda2297bf (patch)
tree62d9953f631aca2e909c9e0d6d3b224996dcc09e /gps
parentef39b1cd848a006751b1d30c931056a5790e3116 (diff)
downloadgpsd-aa4b25a90d2501553658d96267a01e2eda2297bf.tar.gz
In the test framework, use the bind-to-port-0 trick to get a random unused port.
This makes the -f option of gpsfake obsolete, and it has been removed. All regression tests pass.
Diffstat (limited to 'gps')
-rw-r--r--gps/fake.py20
1 files changed, 14 insertions, 6 deletions
diff --git a/gps/fake.py b/gps/fake.py
index b4115ef6..95b0b11e 100644
--- a/gps/fake.py
+++ b/gps/fake.py
@@ -364,6 +364,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,
@@ -373,11 +382,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]
@@ -571,7 +576,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.close_delay = CLOSE_DELAY
if slow:
self.close_delay += CLOSE_DELAY_SLOWDOWN