3434 'true_getaddrinfo' ,
3535 'true_ssl_wrap_socket' ,
3636 'true_ssl_socket' ,
37+ 'true_ssl_context' ,
38+ 'true_inet_pton' ,
3739 'create_connection' ,
3840 'MocketSocket' ,
3941 'Mocket' ,
4850true_getaddrinfo = socket .getaddrinfo
4951true_ssl_wrap_socket = ssl .wrap_socket
5052true_ssl_socket = ssl .SSLSocket
51- try :
52- true_ssl_context = ssl .SSLContext
53- except AttributeError :
54- # Python 2.6
55- true_ssl_context = None
53+ true_ssl_context = ssl .SSLContext
54+ true_inet_pton = socket .inet_pton
5655
5756
5857class SuperFakeSSLContext (object ):
@@ -98,7 +97,6 @@ def wrap_bio(self, incoming, outcoming, *args, **kwargs):
9897 # FIXME: fake SSLObject implementation
9998 ssl_obj = MocketSocket ()
10099 ssl_obj ._host = kwargs ['server_hostname' ]
101- # ssl_obj.fd = outcoming
102100 return ssl_obj
103101
104102 def __getattr__ (self , name ):
@@ -119,8 +117,8 @@ class MocketSocket(object):
119117 family = None
120118 type = None
121119 proto = None
122- _host = '127.0.0.1'
123- _port = 80
120+ _host = None
121+ _port = None
124122 _address = None
125123 cipher = lambda s : ("ADH" , "AES256" , "SHA" )
126124 compression = lambda s : ssl .OP_NO_COMPRESSION
@@ -177,8 +175,9 @@ def getsockname(self):
177175 return socket .gethostbyname (self ._address [0 ]), self ._address [1 ]
178176
179177 def getpeercert (self , * args , ** kwargs ):
180- if not self ._host :
181- self ._host , _ = self ._address
178+ if not (self ._host and self ._port ):
179+ self ._address = self ._host , self ._port = Mocket ._address
180+
182181 now = datetime .now ()
183182 shift = now + timedelta (days = 30 * 12 )
184183 return {
@@ -205,21 +204,16 @@ def getpeercert(self, *args, **kwargs):
205204 def unwrap (self ):
206205 return self
207206
208- def write (self , c ):
209- return len ( c )
207+ def write (self , data ):
208+ return self . send ( encode_to_bytes ( data ) )
210209
211210 def fileno (self ):
212- if not self .fd .r_fd :
213- self .fd .r_fd , self .fd .w_fd = os .pipe ()
214- return self .fd .r_fd
211+ Mocket .r_fd , Mocket .w_fd = os .pipe ()
212+ return Mocket .r_fd
215213
216214 def connect (self , address ):
217215 self ._address = self ._host , self ._port = address
218-
219- # def close(self):
220- # if self.true_socket and self._connected:
221- # self.true_socket.close()
222- # self._closed = True
216+ Mocket ._address = address
223217
224218 def makefile (self , mode = 'r' , bufsize = - 1 ):
225219 self ._mode = mode
@@ -243,12 +237,17 @@ def sendall(self, data, *args, **kwargs):
243237 self .fd .truncate ()
244238 self .fd .seek (0 )
245239
240+ def read (self , buffersize ):
241+ return self .fd .read (buffersize )
242+
246243 def recv (self , buffersize , flags = None ):
244+ if Mocket .r_fd and Mocket .w_fd :
245+ return os .read (Mocket .r_fd , buffersize )
247246 return self .fd .read (buffersize )
248247
249248 def _connect (self ): # pragma: no cover
250249 if not self ._connected :
251- self .true_socket .connect (self ._address )
250+ self .true_socket .connect (Mocket ._address )
252251 self ._connected = True
253252
254253 def true_sendall (self , data , * args , ** kwargs ):
@@ -318,15 +317,17 @@ def true_sendall(self, data, *args, **kwargs):
318317
319318 def send (self , data , * args , ** kwargs ): # pragma: no cover
320319 entry = self .get_entry (data )
321- if entry :
322- if self ._entry != entry :
323- self .sendall (data , * args , ** kwargs )
320+ if entry and self ._entry != entry :
321+ self .sendall (data , * args , ** kwargs )
324322 self ._entry = entry
325323 return len (data )
326324
325+ # def __getattribute__(self, name):
326+ # return super(MocketSocket, self).__getattribute__(name)
327+
327328 def __getattr__ (self , name ):
328- # useful when clients call methods on real
329- # socket we do not provide on the fake one
329+ """ Useful when clients call methods on real
330+ socket we do not provide on the fake one. """
330331 return getattr (self .true_socket , name ) # pragma: no cover
331332
332333
@@ -335,6 +336,8 @@ class Mocket(object):
335336 _requests = []
336337 _namespace = text_type (id (_entries ))
337338 _truesocket_recording_dir = None
339+ r_fd = None
340+ w_fd = None
338341
339342 @classmethod
340343 def register (cls , * entries ):
@@ -387,6 +390,10 @@ def enable(namespace=None, truesocket_recording_dir=None):
387390 lambda host , port , family = None , socktype = None , proto = None , flags = None : [(2 , 1 , 6 , '' , (host , port ))]
388391 ssl .wrap_socket = ssl .__dict__ ['wrap_socket' ] = FakeSSLContext .wrap_socket
389392 ssl .SSLContext = ssl .__dict__ ['SSLSocket' ] = FakeSSLContext
393+ socket .inet_pton = socket .__dict__ ['inet_pton' ] = lambda family , ip : byte_type (
394+ '\x7f \x00 \x00 \x01 ' ,
395+ 'utf-8'
396+ )
390397
391398 @staticmethod
392399 def disable ():
@@ -400,6 +407,7 @@ def disable():
400407 ssl .wrap_socket = ssl .__dict__ ['SSLSocket' ] = true_ssl_wrap_socket
401408 ssl .SSLSocket = ssl .__dict__ ['wrap_socket' ] = true_ssl_socket
402409 ssl .SSLContext = ssl .__dict__ ['SSLSocket' ] = true_ssl_context
410+ socket .inet_pton = socket .__dict__ ['inet_pton' ] = true_inet_pton
403411
404412 @classmethod
405413 def get_namespace (cls ):
0 commit comments