blob: 1512642d0c2852f533a51f6883c55b3c02e2a55a [file] [log] [blame]
Richard Jones64b02de2010-08-03 06:39:33 +00001"""Mock socket module used by the smtpd and smtplib tests.
2"""
3
4# imported for _GLOBAL_DEFAULT_TIMEOUT
5import socket as socket_module
6
7# Mock socket module
8_defaulttimeout = None
9_reply_data = None
10
11# This is used to queue up data to be read through socket.makefile, typically
12# *before* the socket object is even created. It is intended to handle a single
13# line which the socket will feed on recv() or makefile().
14def reply_with(line):
15 global _reply_data
16 _reply_data = line
17
18
19class MockFile:
20 """Mock file object returned by MockSocket.makefile().
21 """
22 def __init__(self, lines):
23 self.lines = lines
24 def readline(self):
25 return self.lines.pop(0) + b'\r\n'
26 def close(self):
27 pass
28
29
30class MockSocket:
31 """Mock socket object used by smtpd and smtplib tests.
32 """
33 def __init__(self):
34 global _reply_data
35 self.output = []
36 self.lines = []
37 if _reply_data:
38 self.lines.append(_reply_data)
39 self.conn = None
40 self.timeout = None
41
42 def queue_recv(self, line):
43 self.lines.append(line)
44
45 def recv(self, bufsize, flags=None):
46 data = self.lines.pop(0) + b'\r\n'
47 return data
48
49 def fileno(self):
50 return 0
51
52 def settimeout(self, timeout):
53 if timeout is None:
54 self.timeout = _defaulttimeout
55 else:
56 self.timeout = timeout
57
58 def gettimeout(self):
59 return self.timeout
60
61 def setsockopt(self, level, optname, value):
62 pass
63
64 def getsockopt(self, level, optname, buflen=None):
65 return 0
66
67 def bind(self, address):
68 pass
69
70 def accept(self):
71 self.conn = MockSocket()
72 return self.conn, 'c'
73
74 def getsockname(self):
75 return ('0.0.0.0', 0)
76
77 def setblocking(self, flag):
78 pass
79
80 def listen(self, backlog):
81 pass
82
83 def makefile(self, mode='r', bufsize=-1):
84 handle = MockFile(self.lines)
85 return handle
86
87 def sendall(self, buffer, flags=None):
88 self.last = data
89 self.output.append(data)
90 return len(data)
91
92 def send(self, data, flags=None):
93 self.last = data
94 self.output.append(data)
95 return len(data)
96
97 def getpeername(self):
98 return 'peer'
99
100 def close(self):
101 pass
102
103
104def socket(family=None, type=None, proto=None):
105 return MockSocket()
106
107
108def create_connection(address, timeout=socket_module._GLOBAL_DEFAULT_TIMEOUT):
109 try:
110 int_port = int(address[1])
111 except ValueError:
112 raise error
113 ms = MockSocket()
114 if timeout is socket_module._GLOBAL_DEFAULT_TIMEOUT:
115 timeout = getdefaulttimeout()
116 ms.settimeout(timeout)
117 return ms
118
119
120def setdefaulttimeout(timeout):
121 global _defaulttimeout
122 _defaulttimeout = timeout
123
124
125def getdefaulttimeout():
126 return _defaulttimeout
127
128
129def getfqdn():
130 return ""
131
132
133def gethostname():
134 pass
135
136
137def gethostbyname(name):
138 return ""
139
140
141class gaierror(Exception):
142 pass
143
144
145class error(Exception):
146 pass
147
148
149# Constants
150AF_INET = None
151SOCK_STREAM = None
152SOL_SOCKET = None
153SO_REUSEADDR = None