diff options
author | cadl42 <ctrlaltdeleteliu@gmail.com> | 2019-01-28 11:48:49 +0800 |
---|---|---|
committer | Asif Saif Uddin <auvipy@gmail.com> | 2019-01-28 09:48:49 +0600 |
commit | 457b3bad961cc7ad64466ad18909650dd648d749 (patch) | |
tree | 65871a797d65e5572551a1a3a88ca67e8bd8eb29 | |
parent | 40e0ef54a0befc1330ac772ef1d3151001014639 (diff) | |
download | py-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.py | 4 | ||||
-rw-r--r-- | t/unit/test_transport.py | 22 |
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: |