mirror of
https://github.com/chatmail/core.git
synced 2026-05-02 04:46:29 +03:00
fixes
This commit is contained in:
@@ -15,7 +15,7 @@ class Relay:
|
|||||||
self.peers = []
|
self.peers = []
|
||||||
|
|
||||||
def make_peers(self, num):
|
def make_peers(self, num):
|
||||||
newpeers = [Peer(relay, i) for i in range(num)]
|
newpeers = [Peer(self, i) for i in range(num)]
|
||||||
self.peers.extend(newpeers)
|
self.peers.extend(newpeers)
|
||||||
return newpeers
|
return newpeers
|
||||||
|
|
||||||
@@ -51,6 +51,7 @@ 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
|
||||||
@@ -61,6 +62,14 @@ class Peer:
|
|||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"<Peer {self.id} members={repr_peers(self.members)}>"
|
return f"<Peer {self.id} members={repr_peers(self.members)}>"
|
||||||
|
|
||||||
|
def immediate_create_group(self, peers):
|
||||||
|
assert not self.members
|
||||||
|
self.members.add(self)
|
||||||
|
self.members.update(peers)
|
||||||
|
for peer in peers:
|
||||||
|
peer.members.update(self.members)
|
||||||
|
self.relay.receive_all()
|
||||||
|
|
||||||
def add_member(self, newmember):
|
def add_member(self, newmember):
|
||||||
self.members.add(newmember)
|
self.members.add(newmember)
|
||||||
self.queue_message(msgtype="addmember", newmember=newmember)
|
self.queue_message(msgtype="addmember", newmember=newmember)
|
||||||
@@ -78,11 +87,6 @@ class Peer:
|
|||||||
peer.from2mailbox.setdefault(self, []).append(msg)
|
peer.from2mailbox.setdefault(self, []).append(msg)
|
||||||
|
|
||||||
|
|
||||||
def create_group(peers):
|
|
||||||
for peer in peers:
|
|
||||||
peer.members.update(peers)
|
|
||||||
|
|
||||||
|
|
||||||
### Naive Algorithm for processing group membership message
|
### Naive Algorithm for processing group membership message
|
||||||
|
|
||||||
|
|
||||||
@@ -105,10 +109,11 @@ def drain_mailbox(peer, from_peer):
|
|||||||
def test_add_and_remove(relay):
|
def test_add_and_remove(relay):
|
||||||
p0, p1, p2, p3 = relay.make_peers(4)
|
p0, p1, p2, p3 = relay.make_peers(4)
|
||||||
|
|
||||||
create_group([p0, p1])
|
# create group
|
||||||
assert p0.members == p1.members
|
p0.immediate_create_group([p1])
|
||||||
assert not p2.members and not p3.members
|
assert p0.members == p1.members == set([p0, p1])
|
||||||
|
|
||||||
|
# add members
|
||||||
p0.add_member(p2)
|
p0.add_member(p2)
|
||||||
p0.add_member(p3)
|
p0.add_member(p3)
|
||||||
relay.receive_all()
|
relay.receive_all()
|
||||||
@@ -122,8 +127,7 @@ def test_add_and_remove(relay):
|
|||||||
def test_concurrent_add(relay):
|
def test_concurrent_add(relay):
|
||||||
p0, p1, p2, p3 = relay.make_peers(4)
|
p0, p1, p2, p3 = relay.make_peers(4)
|
||||||
|
|
||||||
create_group([p0, p1])
|
p0.immediate_create_group([p1])
|
||||||
assert not p2.members and not p3.members
|
|
||||||
# concurrent adding and then let base set send a chat message
|
# concurrent adding and then let base set send a chat message
|
||||||
p1.add_member(p2)
|
p1.add_member(p2)
|
||||||
p0.add_member(p3)
|
p0.add_member(p3)
|
||||||
|
|||||||
Reference in New Issue
Block a user