tests: use a random free port for smtp server (#44890)

This commit is contained in:
Nicolas Roche 2020-07-09 11:48:21 +02:00
parent eb22673ee5
commit 3d632d370c
1 changed files with 16 additions and 4 deletions

View File

@ -5,6 +5,7 @@ import dns.resolver
from dns import name
from dns.rdtypes.ANY import MX, TXT
import mock
import random
import smtplib
import smtpd
import socket
@ -21,13 +22,24 @@ from test_manager import login
@pytest.fixture
def dns_resolver(monkeypatch):
def port_available():
errno = 0
while not errno:
port = random.randint(49152, 65534)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
errno = sock.connect_ex(('127.0.0.1', port))
sock.close()
return port
@pytest.fixture
def dns_resolver(monkeypatch, port_available):
def fn(value, kind):
if kind == 'MX':
mx = mock.create_autospec(MX)
mx.exchange = mock.create_autospec(name.Name)
mx.exchange.to_text = mock.MagicMock()
mx.exchange.to_text.return_value = 'localhost:10025'
mx.exchange.to_text.return_value = 'localhost:%s' % port_available
mx.preference = mock.create_autospec(name.Name)
mx.preference.to_text = mock.MagicMock()
mx.preference.to_text.return_value = 10
@ -47,7 +59,7 @@ def dns_resolver(monkeypatch):
@pytest.fixture
def smtp_server(monkeypatch):
def smtp_server(monkeypatch, port_available):
class RecipientValidatingSMTPChannel(smtpd.SMTPChannel):
def smtp_RCPT(self, arg):
if six.PY2:
@ -67,7 +79,7 @@ def smtp_server(monkeypatch):
conn, addr = self.accept()
channel = RecipientValidatingSMTPChannel(self, conn, addr)
server = MailServer(('localhost', 10025), None)
server = MailServer(('localhost', port_available), None)
thread = threading.Thread(target=asyncore.loop, kwargs={'timeout': 1})
thread.start()
yield