mirror of
https://github.com/chatmail/core.git
synced 2026-05-16 13:26:38 +03:00
add failing test for removing a member while one peer is offline
This commit is contained in:
@@ -19,8 +19,9 @@ class Relay:
|
|||||||
self.peers.extend(newpeers)
|
self.peers.extend(newpeers)
|
||||||
return newpeers
|
return newpeers
|
||||||
|
|
||||||
def receive_all(self):
|
def receive_all(self, peers=None):
|
||||||
for peer in self.peers:
|
peers = peers if peers else self.peers
|
||||||
|
for peer in peers:
|
||||||
for from_peer in self.peers:
|
for from_peer in self.peers:
|
||||||
drain_mailbox(peer, from_peer)
|
drain_mailbox(peer, from_peer)
|
||||||
|
|
||||||
@@ -51,7 +52,6 @@ class Peer:
|
|||||||
self.id = f"p{num}"
|
self.id = f"p{num}"
|
||||||
self.members = set()
|
self.members = set()
|
||||||
self.from2mailbox = {}
|
self.from2mailbox = {}
|
||||||
assert isinstance(relay, Relay)
|
|
||||||
|
|
||||||
def __eq__(self, other):
|
def __eq__(self, other):
|
||||||
return self.id == other.id
|
return self.id == other.id
|
||||||
@@ -86,7 +86,7 @@ class Peer:
|
|||||||
peer.from2mailbox.setdefault(self, []).append(msg)
|
peer.from2mailbox.setdefault(self, []).append(msg)
|
||||||
|
|
||||||
|
|
||||||
### Naive Algorithm for processing group membership message
|
### processing group membership message
|
||||||
|
|
||||||
|
|
||||||
def drain_mailbox(peer, from_peer):
|
def drain_mailbox(peer, from_peer):
|
||||||
@@ -135,6 +135,29 @@ def test_concurrent_add(relay):
|
|||||||
p0.send_chatmessage()
|
p0.send_chatmessage()
|
||||||
p1.send_chatmessage()
|
p1.send_chatmessage()
|
||||||
relay.receive_all()
|
relay.receive_all()
|
||||||
|
# only now do p0 and p1 know of each others additions
|
||||||
|
# so p0 or p1 needs to send another message to get consistent membership
|
||||||
p0.send_chatmessage()
|
p0.send_chatmessage()
|
||||||
relay.receive_all()
|
relay.receive_all()
|
||||||
relay.assert_same_members()
|
relay.assert_same_members()
|
||||||
|
|
||||||
|
|
||||||
|
def test_add_remove_and_stale_old_suddenly_sends(relay):
|
||||||
|
p0, p1, p2, p3 = relay.make_peers(4)
|
||||||
|
|
||||||
|
p0.immediate_create_group([p1, p2, p3])
|
||||||
|
|
||||||
|
# p3 is offline and a member get deleted
|
||||||
|
p0.del_member(p2)
|
||||||
|
relay.receive_all([p0, p1, p2])
|
||||||
|
|
||||||
|
# p3 sends a message with old memberlist and goes online
|
||||||
|
p3.send_chatmessage()
|
||||||
|
relay.receive_all()
|
||||||
|
|
||||||
|
# p0 sends a message which should update all peers' members
|
||||||
|
p0.send_chatmessage()
|
||||||
|
relay.receive_all()
|
||||||
|
|
||||||
|
relay.assert_same_members()
|
||||||
|
assert p0.members == set([p0, p1, p3])
|
||||||
|
|||||||
Reference in New Issue
Block a user