|
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