|
25 | 25 | from mock import Mock |
26 | 26 |
|
27 | 27 | import errno |
| 28 | +import logging |
28 | 29 | import math |
29 | 30 | import os |
30 | 31 | from socket import error as socket_error |
| 32 | +import ssl |
31 | 33 |
|
32 | 34 | try: |
33 | 35 | import unittest2 as unittest |
|
37 | 39 | import time |
38 | 40 |
|
39 | 41 |
|
| 42 | +log = logging.getLogger(__name__) |
| 43 | + |
| 44 | + |
40 | 45 | class TimerCallback(object): |
41 | 46 |
|
42 | 47 | invoked = False |
@@ -247,18 +252,31 @@ def test_successful_connection(self): |
247 | 252 | return c |
248 | 253 |
|
249 | 254 | def test_eagain_on_buffer_size(self): |
| 255 | + self._check_error_recovery_on_buffer_size(errno.EAGAIN) |
| 256 | + |
| 257 | + def test_ewouldblock_on_buffer_size(self): |
| 258 | + self._check_error_recovery_on_buffer_size(errno.EWOULDBLOCK) |
| 259 | + |
| 260 | + def test_sslwantread_on_buffer_size(self): |
| 261 | + self._check_error_recovery_on_buffer_size(ssl.SSL_ERROR_WANT_READ) |
| 262 | + |
| 263 | + def test_sslwantwrite_on_buffer_size(self): |
| 264 | + self._check_error_recovery_on_buffer_size(ssl.SSL_ERROR_WANT_WRITE) |
| 265 | + |
| 266 | + def _check_error_recovery_on_buffer_size(self, error_code): |
250 | 267 | c = self.test_successful_connection() |
251 | 268 |
|
252 | 269 | header = six.b('\x00\x00\x00\x00') + int32_pack(20000) |
253 | 270 | responses = [ |
254 | 271 | header + (six.b('a') * (4096 - len(header))), |
255 | 272 | six.b('a') * 4096, |
256 | | - socket_error(errno.EAGAIN), |
| 273 | + socket_error(error_code), |
257 | 274 | six.b('a') * 100, |
258 | | - socket_error(errno.EAGAIN)] |
| 275 | + socket_error(error_code)] |
259 | 276 |
|
260 | 277 | def side_effect(*args): |
261 | 278 | response = responses.pop(0) |
| 279 | + log.debug('about to mock return {}'.format(response)) |
262 | 280 | if isinstance(response, socket_error): |
263 | 281 | raise response |
264 | 282 | else: |
|
0 commit comments