Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Fix None exception in state res v2 #4135

Merged
merged 2 commits into from
Nov 2, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/4135.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix exception when using state res v2 algorithm
4 changes: 4 additions & 0 deletions synapse/state/v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ def resolve_events_with_store(state_sets, event_map, state_res_store):

logger.debug("Computing conflicted state")

# We use event_map as a cache, so if its None we need to initialize it
if event_map is None:
event_map = {}

# First split up the un/conflicted state
unconflicted_state, conflicted_state = _seperate(state_sets)

Expand Down
100 changes: 98 additions & 2 deletions tests/state/test_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -544,8 +544,7 @@ def do_check(self, events, edges, expected_state_ids):
state_res_store=TestStateResolutionStore(event_map),
)

self.assertTrue(state_d.called)
state_before = state_d.result
state_before = self.successResultOf(state_d)

state_after = dict(state_before)
if fake_event.state_key is not None:
Expand Down Expand Up @@ -599,6 +598,103 @@ def test_simple(self):
self.assertEqual(["o", "l", "n", "m", "p"], res)


class SimpleParamStateTestCase(unittest.TestCase):
def setUp(self):
# We build up a simple DAG.

event_map = {}

create_event = FakeEvent(
id="CREATE",
sender=ALICE,
type=EventTypes.Create,
state_key="",
content={"creator": ALICE},
).to_event([], [])
event_map[create_event.event_id] = create_event

alice_member = FakeEvent(
id="IMA",
sender=ALICE,
type=EventTypes.Member,
state_key=ALICE,
content=MEMBERSHIP_CONTENT_JOIN,
).to_event([create_event.event_id], [create_event.event_id])
event_map[alice_member.event_id] = alice_member

join_rules = FakeEvent(
id="IJR",
sender=ALICE,
type=EventTypes.JoinRules,
state_key="",
content={"join_rule": JoinRules.PUBLIC},
).to_event(
auth_events=[create_event.event_id, alice_member.event_id],
prev_events=[alice_member.event_id],
)
event_map[join_rules.event_id] = join_rules

# Bob and Charlie join at the same time, so there is a fork
bob_member = FakeEvent(
id="IMB",
sender=BOB,
type=EventTypes.Member,
state_key=BOB,
content=MEMBERSHIP_CONTENT_JOIN,
).to_event(
auth_events=[create_event.event_id, join_rules.event_id],
prev_events=[join_rules.event_id],
)
event_map[bob_member.event_id] = bob_member

charlie_member = FakeEvent(
id="IMC",
sender=CHARLIE,
type=EventTypes.Member,
state_key=CHARLIE,
content=MEMBERSHIP_CONTENT_JOIN,
).to_event(
auth_events=[create_event.event_id, join_rules.event_id],
prev_events=[join_rules.event_id],
)
event_map[charlie_member.event_id] = charlie_member

self.event_map = event_map
self.create_event = create_event
self.alice_member = alice_member
self.join_rules = join_rules
self.bob_member = bob_member
self.charlie_member = charlie_member

self.state_at_bob = {
(e.type, e.state_key): e.event_id
for e in [create_event, alice_member, join_rules, bob_member]
}

self.state_at_charlie = {
(e.type, e.state_key): e.event_id
for e in [create_event, alice_member, join_rules, charlie_member]
}

self.expected_combined_state = {
(e.type, e.state_key): e.event_id
for e in [create_event, alice_member, join_rules, bob_member, charlie_member]
}

def test_event_map_none(self):
# Test that we correctly handle passing `None` as the event_map

state_d = resolve_events_with_store(
[self.state_at_bob, self.state_at_charlie],
event_map=None,
state_res_store=TestStateResolutionStore(self.event_map),
)

state = self.successResultOf(state_d)

self.assert_dict(self.expected_combined_state, state)


def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
Expand Down