Skip to content

Commit 428611b

Browse files
author
avandras
committed
Add even further tests
1 parent 0908407 commit 428611b

File tree

2 files changed

+77
-12
lines changed

2 files changed

+77
-12
lines changed

patroni/multisite.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ def _resolve_multisite_leader(self):
220220
self.touch_member()
221221

222222
if cluster.is_unlocked():
223+
# we gave up the lock earlier
223224
if self._release:
224225
self._release = False
225226
self._disconnected_operation()

tests/test_multisite.py

Lines changed: 76 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import json
33
import os
44
import sys
5+
import time
56
from threading import Event
67
import unittest
78

@@ -215,23 +216,86 @@ def test_set_standby_config(self):
215216
self.assertEqual(r, True)
216217

217218
def test_check_transition(self):
218-
on_change = Mock()
219-
os.environ[Config.PATRONI_CONFIG_VARIABLE] = PATRONI_CONFIG.replace('name: mstest', 'name: leader')
220-
self.config = Config(None)
221-
self.m = MultisiteController(self.config, on_change=on_change)
222-
223-
self.m._has_leader = False
224-
self.m._check_transition(True, 'blahblah')
225-
self.m.on_change.assert_called_once()
226-
self.assertEqual(self.m._has_leader, True)
219+
self.multisite.on_change = Mock()
220+
self.multisite._has_leader = False
221+
self.multisite._check_transition(True, 'blahblah')
222+
self.assertEqual(self.multisite._has_leader, True)
227223

228224
# TODO: state_handler case
229225

230-
def test_resolve_multisite_leader(self):
231-
pass
226+
@patch.object(MultisiteController, 'touch_member')
227+
@patch.object(MultisiteController, '_disconnected_operation')
228+
@patch.object(MultisiteController, '_check_transition')
229+
# @patch.object(MultisiteController, '_update_history')
230+
def test_resolve_multisite_leader(self, check_transition, disconnected_operation, touch_member):
231+
# c = get_cluster_initialized_with_leader()
232+
# self.multisite.dcs.get_cluster = Mock(return_value=c)
233+
self.multisite.on_change = Mock()
234+
235+
# update_history.assert_called_once()
236+
237+
# we are not a member of the cluster
238+
# self.multisite._resolve_multisite_leader()
239+
# self.assertEqual(touch_member.call_count, 2)
240+
241+
# we are a member of the cluster
242+
# touch_member.reset_mock()
243+
244+
# unlocked cluster
245+
c = get_cluster_initialized_without_leader(failover=Failover(0, '', 'foo', None, 'mstest'))
246+
self.multisite.dcs.get_cluster = Mock(return_value=c)
247+
248+
self.multisite._release = True
249+
self.multisite._resolve_multisite_leader()
250+
disconnected_operation.assert_called_once()
251+
252+
disconnected_operation.reset_mock()
253+
self.multisite._release = False
254+
self.multisite._failover_target = 'foo'
255+
self.multisite._failover_timeout = 9999999999 # I am not _that_ optimistic
256+
self.multisite._resolve_multisite_leader()
257+
disconnected_operation.assert_called_once()
258+
259+
self.multisite._failover_target = ''
260+
self.multisite._standby_config = {}
261+
262+
# could acquire multisite lock
263+
self.multisite.dcs.attempt_to_acquire_leader = Mock(return_value=True)
264+
self.multisite.dcs.manual_failover = Mock()
265+
self.multisite._resolve_multisite_leader()
266+
self.assertIsNone(self.multisite._standby_config)
267+
check_transition.assert_called_with(leader=True, note='Acquired multisite leader status')
268+
self.multisite.dcs.manual_failover.assert_called_with('', '')
269+
270+
# could not...
271+
c = get_cluster_initialized_without_leader()
272+
self.multisite.dcs.get_cluster = Mock(return_value=c)
273+
self.multisite.dcs.manual_failover.reset_mock()
274+
self.multisite._resolve_multisite_leader()
275+
self.multisite.dcs.manual_failover.assert_not_called()
276+
277+
# self.multisite.name = 'leader'
278+
# self.multisite._resolve_multisite_leader()
279+
# touch_member.assert_called_once()
232280

233281
def test_observe_leader(self):
234-
pass
282+
# there is no leader
283+
with patch.object(MultisiteController, '_disconnected_operation', Mock()) as d:
284+
self.multisite.dcs.get_cluster = Mock(return_value=get_cluster_initialized_without_leader())
285+
self.multisite._observe_leader()
286+
d.assert_called_once()
287+
288+
# there is a leader and it's not us
289+
with patch.object(MultisiteController, '_set_standby_config', Mock()) as s:
290+
c = get_cluster_initialized_with_leader()
291+
self.multisite.dcs.get_cluster = Mock(return_value=c)
292+
self.multisite._observe_leader()
293+
s.assert_called_once_with(c.leader.member)
294+
295+
# we are the leader
296+
self.multisite.name = 'leader'
297+
self.multisite._observe_leader()
298+
self.assertIsNone(self.multisite._standby_config)
235299

236300
def test_update_history(self):
237301
pass

0 commit comments

Comments
 (0)