blob: b28c4732cc3c2a64bcbdbeec167d3157e5f46db2 [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
Georg Brandlc1143532014-01-25 09:02:18 +010024 def readline(self, limit=-1):
25 result = self.lines.pop(0) + b'\r\n'
26 if limit >= 0:
27 # Re-insert the line, removing the \r\n we added.
28 self.lines.insert(0, result[limit:-2])
29 result = result[:limit]
30 return result
Richard Jones64b02de2010-08-03 06:39:33 +000031 def close(self):
32 pass
33
34
35class MockSocket:
36 """Mock socket object used by smtpd and smtplib tests.
37 """
R David Murray6fe56a32014-06-11 13:48:58 -040038 def __init__(self, family=None):
Richard Jones64b02de2010-08-03 06:39:33 +000039 global _reply_data
R David Murray6fe56a32014-06-11 13:48:58 -040040 self.family = family
Richard Jones64b02de2010-08-03 06:39:33 +000041 self.output = []
42 self.lines = []
43 if _reply_data:
44 self.lines.append(_reply_data)
Richard Jones6a9e6bb2010-08-04 12:27:36 +000045 _reply_data = None
Richard Jones64b02de2010-08-03 06:39:33 +000046 self.conn = None
47 self.timeout = None
48
49 def queue_recv(self, line):
50 self.lines.append(line)
51
52 def recv(self, bufsize, flags=None):
53 data = self.lines.pop(0) + b'\r\n'
54 return data
55
56 def fileno(self):
57 return 0
58
59 def settimeout(self, timeout):
60 if timeout is None:
61 self.timeout = _defaulttimeout
62 else:
63 self.timeout = timeout
64
65 def gettimeout(self):
66 return self.timeout
67
68 def setsockopt(self, level, optname, value):
69 pass
70
71 def getsockopt(self, level, optname, buflen=None):
72 return 0
73
74 def bind(self, address):
75 pass
76
77 def accept(self):
78 self.conn = MockSocket()
79 return self.conn, 'c'
80
81 def getsockname(self):
82 return ('0.0.0.0', 0)
83
84 def setblocking(self, flag):
85 pass
86
87 def listen(self, backlog):
88 pass
89
90 def makefile(self, mode='r', bufsize=-1):
91 handle = MockFile(self.lines)
92 return handle
93
94 def sendall(self, buffer, flags=None):
95 self.last = data
96 self.output.append(data)
97 return len(data)
98
99 def send(self, data, flags=None):
100 self.last = data
101 self.output.append(data)
102 return len(data)
103
104 def getpeername(self):
R David Murray2539e672014-08-09 16:40:49 -0400105 return ('peer-address', 'peer-port')
Richard Jones64b02de2010-08-03 06:39:33 +0000106
107 def close(self):
108 pass
109
110
111def socket(family=None, type=None, proto=None):
R David Murray6fe56a32014-06-11 13:48:58 -0400112 return MockSocket(family)
Richard Jones64b02de2010-08-03 06:39:33 +0000113
Senthil Kumaran3d23fd62011-07-30 10:56:50 +0800114def create_connection(address, timeout=socket_module._GLOBAL_DEFAULT_TIMEOUT,
115 source_address=None):
Richard Jones64b02de2010-08-03 06:39:33 +0000116 try:
117 int_port = int(address[1])
118 except ValueError:
119 raise error
120 ms = MockSocket()
121 if timeout is socket_module._GLOBAL_DEFAULT_TIMEOUT:
122 timeout = getdefaulttimeout()
123 ms.settimeout(timeout)
124 return ms
125
126
127def setdefaulttimeout(timeout):
128 global _defaulttimeout
129 _defaulttimeout = timeout
130
131
132def getdefaulttimeout():
133 return _defaulttimeout
134
135
136def getfqdn():
137 return ""
138
139
140def gethostname():
141 pass
142
143
144def gethostbyname(name):
145 return ""
146
R David Murray1351ee72014-06-11 16:10:10 -0400147def getaddrinfo(*args, **kw):
148 return socket_module.getaddrinfo(*args, **kw)
Richard Jones64b02de2010-08-03 06:39:33 +0000149
Andrew Svetlov2ade6f22012-12-17 18:57:16 +0200150gaierror = socket_module.gaierror
151error = socket_module.error
Richard Jones64b02de2010-08-03 06:39:33 +0000152
153
154# Constants
R David Murray6fe56a32014-06-11 13:48:58 -0400155AF_INET = socket_module.AF_INET
156AF_INET6 = socket_module.AF_INET6
R David Murray1351ee72014-06-11 16:10:10 -0400157SOCK_STREAM = socket_module.SOCK_STREAM
Richard Jones64b02de2010-08-03 06:39:33 +0000158SOL_SOCKET = None
159SO_REUSEADDR = None