from tornado.netutil import ssl_wrap_socket
from tornado.stack_context import NullContext
from tornado.testing import AsyncHTTPTestCase, AsyncHTTPSTestCase, AsyncTestCase, bind_unused_port, ExpectLog, gen_test
-from tornado.test.util import unittest, skipIfNonUnix
+from tornado.test.util import unittest, skipIfNonUnix, refusing_port
from tornado.web import RequestHandler, Application
import certifi
import errno
# When a connection is refused, the connect callback should not
# be run. (The kqueue IOLoop used to behave differently from the
# epoll IOLoop in this respect)
- server_socket, port = bind_unused_port()
- server_socket.close()
+ cleanup_func, port = refusing_port()
+ self.addCleanup(cleanup_func)
stream = IOStream(socket.socket(), self.io_loop)
self.connect_called = False
from tornado.simple_httpclient import SimpleAsyncHTTPClient, _default_ca_certs
from tornado.test.httpclient_test import ChunkHandler, CountdownHandler, HelloWorldHandler
from tornado.test import httpclient_test
-from tornado.testing import AsyncHTTPTestCase, AsyncHTTPSTestCase, AsyncTestCase, bind_unused_port, ExpectLog
-from tornado.test.util import skipOnTravis, skipIfNoIPv6
+from tornado.testing import AsyncHTTPTestCase, AsyncHTTPSTestCase, AsyncTestCase, ExpectLog
+from tornado.test.util import skipOnTravis, skipIfNoIPv6, refusing_port
from tornado.web import RequestHandler, Application, asynchronous, url, stream_request_body
self.assertTrue(host_re.match(response.body), response.body)
def test_connection_refused(self):
- server_socket, port = bind_unused_port()
- server_socket.close()
+ cleanup_func, port = refusing_port()
+ self.addCleanup(cleanup_func)
with ExpectLog(gen_log, ".*", required=False):
self.http_client.fetch("http://localhost:%d/" % port, self.stop)
response = self.wait()
from tornado.netutil import bind_sockets, Resolver
from tornado.tcpclient import TCPClient, _Connector
from tornado.tcpserver import TCPServer
-from tornado.testing import AsyncTestCase, bind_unused_port, gen_test
-from tornado.test.util import skipIfNoIPv6, unittest
+from tornado.testing import AsyncTestCase, gen_test
+from tornado.test.util import skipIfNoIPv6, unittest, refusing_port
# Fake address families for testing. Used in place of AF_INET
# and AF_INET6 because some installations do not have AF_INET6.
@gen_test
def test_refused_ipv4(self):
- sock, port = bind_unused_port()
- sock.close()
+ cleanup_func, port = refusing_port()
+ self.addCleanup(cleanup_func)
with self.assertRaises(IOError):
yield self.client.connect('127.0.0.1', port)
import socket
import sys
+from tornado.testing import bind_unused_port
+
# Encapsulate the choice of unittest or unittest2 here.
# To be used as 'from tornado.test.util import unittest'.
if sys.version_info < (2, 7):
'network access disabled')
skipIfNoIPv6 = unittest.skipIf(not socket.has_ipv6, 'ipv6 support not present')
+
+def refusing_port():
+ """Returns a local port number that will refuse all connections.
+
+ Return value is (cleanup_func, port); the cleanup function
+ must be called to free the port to be reused.
+ """
+ # On travis-ci, port numbers are reassigned frequently. To avoid
+ # collisions with other tests, we use an open client-side socket's
+ # ephemeral port number to ensure that nothing can listen on that
+ # port.
+ server_socket, port = bind_unused_port()
+ client_socket = socket.socket()
+ client_socket.connect(("127.0.0.1", port))
+ conn, client_addr = server_socket.accept()
+ conn.close()
+ server_socket.close()
+ return (client_socket.close, client_addr[1])