|
4 | 4 | import multiprocessing
|
5 | 5 | import os
|
6 | 6 | import signal
|
| 7 | +import socket |
7 | 8 | import sys
|
8 | 9 | import traceback
|
9 | 10 | import unittest
|
|
12 | 13 |
|
13 | 14 | from memcache import Client, SERVER_MAX_KEY_LENGTH, SERVER_MAX_VALUE_LENGTH # noqa: H301
|
14 | 15 |
|
| 16 | +from mock import Mock |
| 17 | +from mock import patch |
| 18 | + |
15 | 19 |
|
16 | 20 | class FooStruct(object):
|
17 | 21 |
|
@@ -172,6 +176,41 @@ def test_disconnect_all_delete_multi(self):
|
172 | 176 | ret = self.mc.delete_multi({'keyhere': 'a', 'keythere': 'b'})
|
173 | 177 | self.assertEqual(ret, 1)
|
174 | 178 |
|
| 179 | + def test_socket_error(self): |
| 180 | + """Tests case when socket.error exception was raised""" |
| 181 | + self.mc.set('socket.error', 1) |
| 182 | + server = Mock( |
| 183 | + # Should we catch secket.error when establishing connection? |
| 184 | + # connect=Mock(side_effect=socket.error(-1, 'connect error')), |
| 185 | + send_cmd=Mock(side_effect=socket.error(-1, 'send cmd error')), |
| 186 | + send_cmds=Mock(side_effect=socket.error(-1, 'send cmds error')), |
| 187 | + flush=Mock(side_effect=socket.error(-1, 'flush error')), |
| 188 | + ) |
| 189 | + with patch.object(self.mc, 'servers', [server]), \ |
| 190 | + patch.object(self.mc, 'buckets', [server]): |
| 191 | + self.assertEqual(self.mc.set('socket.error', 2), 0) |
| 192 | + self.assertEqual( |
| 193 | + self.mc.set_multi({'socket.error': 2}), |
| 194 | + ['socket.error'] |
| 195 | + ) |
| 196 | + self.assertIs(self.mc.incr('socket.error'), None) |
| 197 | + self.assertIs(self.mc.decr('socket.error'), None) |
| 198 | + self.assertEqual(self.mc.add('socket.error', 5), 0) |
| 199 | + self.assertEqual(self.mc.append('socket.error', 9), 0) |
| 200 | + self.assertEqual(self.mc.prepend('socket.error', 1), 0) |
| 201 | + self.assertEqual(self.mc.replace('socket.error', 100), 0) |
| 202 | + self.assertEqual(self.mc.cas('socket.error', 100), 0) |
| 203 | + self.assertEqual(self.mc.delete('socket.error'), 0) |
| 204 | + self.assertEqual(self.mc.delete_multi(['socket.error']), 0) |
| 205 | + self.assertEqual(self.mc.touch('socket.error'), 0) |
| 206 | + self.assertIs(self.mc.get('socket.error'), None) |
| 207 | + self.assertIs(self.mc.gets('socket.error'), None) |
| 208 | + self.assertEqual(self.mc.get_multi(['socket.error']), {}) |
| 209 | + self.assertRaises(socket.error, self.mc.get_stats) |
| 210 | + self.assertRaises(socket.error, self.mc.get_slab_stats) |
| 211 | + self.assertRaises(socket.error, self.mc.get_slabs) |
| 212 | + self.assertRaises(socket.error, self.mc.flush_all) |
| 213 | + |
175 | 214 | def test_exception_handling(self):
|
176 | 215 | """Tests closing socket when custom exception raised"""
|
177 | 216 | queue = multiprocessing.Queue()
|
|
0 commit comments