summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcadl42 <ctrlaltdeleteliu@gmail.com>2019-01-28 11:48:49 +0800
committerAsif Saif Uddin <auvipy@gmail.com>2019-01-28 09:48:49 +0600
commit457b3bad961cc7ad64466ad18909650dd648d749 (patch)
tree65871a797d65e5572551a1a3a88ca67e8bd8eb29
parent40e0ef54a0befc1330ac772ef1d3151001014639 (diff)
downloadpy-amqp-457b3bad961cc7ad64466ad18909650dd648d749.tar.gz
Support float read_timeout/write_timeout (#246)
* support float read/write timeout * test read_timeout/write_timeout settings * fix lint "line too long" issue
-rw-r--r--amqp/transport.py4
-rw-r--r--t/unit/test_transport.py22
2 files changed, 19 insertions, 7 deletions
diff --git a/amqp/transport.py b/amqp/transport.py
index 80b058e..ea713fd 100644
--- a/amqp/transport.py
+++ b/amqp/transport.py
@@ -180,9 +180,11 @@ class _AbstractTransport(object):
for timeout, interval in ((socket.SO_SNDTIMEO, write_timeout),
(socket.SO_RCVTIMEO, read_timeout)):
if interval is not None:
+ sec = int(interval)
+ usec = int((interval - sec) * 1000000)
self.sock.setsockopt(
socket.SOL_SOCKET, timeout,
- pack('ll', interval, 0),
+ pack('ll', sec, usec),
)
self._setup_transport()
diff --git a/t/unit/test_transport.py b/t/unit/test_transport.py
index eeeedb0..10a112b 100644
--- a/t/unit/test_transport.py
+++ b/t/unit/test_transport.py
@@ -2,6 +2,7 @@ from __future__ import absolute_import, unicode_literals
import errno
import socket
+import struct
import pytest
from case import ANY, Mock, call, patch
@@ -213,15 +214,24 @@ class test_socket_options:
def test_set_sockopt_opts_timeout(self):
# tests socket options SO_RCVTIMEO and SO_SNDTIMEO
- # this test is soley for coverage as socket.settimeout
- # is pythonic way to have timeouts
self.transp = transport.Transport(
self.host, self.connect_timeout,
)
- self.transp.read_timeout = 0xdead
- self.transp.write_timeout = 0xbeef
- with patch('socket.socket', return_value=MockSocket()):
- self.transp.connect()
+ read_timeout_sec, read_timeout_usec = 0xdead, 0xbeef
+ write_timeout_sec = 0x42
+
+ self.transp.read_timeout = read_timeout_sec + \
+ read_timeout_usec * 0.000001
+ self.transp.write_timeout = write_timeout_sec
+ self.transp.connect()
+
+ expected_rcvtimeo = struct.pack('ll', read_timeout_sec,
+ read_timeout_usec)
+ expected_sndtimeo = struct.pack('ll', write_timeout_sec, 0)
+ assert expected_rcvtimeo == self.socket.getsockopt(socket.SOL_TCP,
+ socket.SO_RCVTIMEO)
+ assert expected_sndtimeo == self.socket.getsockopt(socket.SOL_TCP,
+ socket.SO_SNDTIMEO)
class test_AbstractTransport: