Add a basic test for purging rooms. (#9541)

Unfortunately this doesn't test re-joining the room since
that requires having another homeserver to query over
federation, which isn't easily doable in unit tests.
This commit is contained in:
Patrick Cloke 2021-03-08 09:21:36 -05:00 committed by GitHub
parent b988b07bb0
commit cb7fc7523e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 46 additions and 26 deletions

1
changelog.d/9541.misc Normal file
View file

@ -0,0 +1 @@
Add an additional test for purging a room.

View file

@ -13,9 +13,7 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from twisted.internet import defer from synapse.api.errors import NotFoundError, SynapseError
from synapse.api.errors import NotFoundError
from synapse.rest.client.v1 import room from synapse.rest.client.v1 import room
from tests.unittest import HomeserverTestCase from tests.unittest import HomeserverTestCase
@ -33,9 +31,12 @@ class PurgeTests(HomeserverTestCase):
def prepare(self, reactor, clock, hs): def prepare(self, reactor, clock, hs):
self.room_id = self.helper.create_room_as(self.user_id) self.room_id = self.helper.create_room_as(self.user_id)
def test_purge(self): self.store = hs.get_datastore()
self.storage = self.hs.get_storage()
def test_purge_history(self):
""" """
Purging a room will delete everything before the topological point. Purging a room history will delete everything before the topological point.
""" """
# Send four messages to the room # Send four messages to the room
first = self.helper.send(self.room_id, body="test1") first = self.helper.send(self.room_id, body="test1")
@ -43,30 +44,27 @@ class PurgeTests(HomeserverTestCase):
third = self.helper.send(self.room_id, body="test3") third = self.helper.send(self.room_id, body="test3")
last = self.helper.send(self.room_id, body="test4") last = self.helper.send(self.room_id, body="test4")
store = self.hs.get_datastore()
storage = self.hs.get_storage()
# Get the topological token # Get the topological token
token = self.get_success( token = self.get_success(
store.get_topological_token_for_event(last["event_id"]) self.store.get_topological_token_for_event(last["event_id"])
) )
token_str = self.get_success(token.to_string(self.hs.get_datastore())) token_str = self.get_success(token.to_string(self.hs.get_datastore()))
# Purge everything before this topological token # Purge everything before this topological token
self.get_success( self.get_success(
storage.purge_events.purge_history(self.room_id, token_str, True) self.storage.purge_events.purge_history(self.room_id, token_str, True)
) )
# 1-3 should fail and last will succeed, meaning that 1-3 are deleted # 1-3 should fail and last will succeed, meaning that 1-3 are deleted
# and last is not. # and last is not.
self.get_failure(store.get_event(first["event_id"]), NotFoundError) self.get_failure(self.store.get_event(first["event_id"]), NotFoundError)
self.get_failure(store.get_event(second["event_id"]), NotFoundError) self.get_failure(self.store.get_event(second["event_id"]), NotFoundError)
self.get_failure(store.get_event(third["event_id"]), NotFoundError) self.get_failure(self.store.get_event(third["event_id"]), NotFoundError)
self.get_success(store.get_event(last["event_id"])) self.get_success(self.store.get_event(last["event_id"]))
def test_purge_wont_delete_extrems(self): def test_purge_history_wont_delete_extrems(self):
""" """
Purging a room will delete everything before the topological point. Purging a room history will delete everything before the topological point.
""" """
# Send four messages to the room # Send four messages to the room
first = self.helper.send(self.room_id, body="test1") first = self.helper.send(self.room_id, body="test1")
@ -74,22 +72,43 @@ class PurgeTests(HomeserverTestCase):
third = self.helper.send(self.room_id, body="test3") third = self.helper.send(self.room_id, body="test3")
last = self.helper.send(self.room_id, body="test4") last = self.helper.send(self.room_id, body="test4")
storage = self.hs.get_datastore()
# Set the topological token higher than it should be # Set the topological token higher than it should be
token = self.get_success( token = self.get_success(
storage.get_topological_token_for_event(last["event_id"]) self.store.get_topological_token_for_event(last["event_id"])
) )
event = "t{}-{}".format(token.topological + 1, token.stream + 1) event = "t{}-{}".format(token.topological + 1, token.stream + 1)
# Purge everything before this topological token # Purge everything before this topological token
purge = defer.ensureDeferred(storage.purge_history(self.room_id, event, True)) f = self.get_failure(
self.pump() self.storage.purge_events.purge_history(self.room_id, event, True),
f = self.failureResultOf(purge) SynapseError,
)
self.assertIn("greater than forward", f.value.args[0]) self.assertIn("greater than forward", f.value.args[0])
# Try and get the events # Try and get the events
self.get_success(storage.get_event(first["event_id"])) self.get_success(self.store.get_event(first["event_id"]))
self.get_success(storage.get_event(second["event_id"])) self.get_success(self.store.get_event(second["event_id"]))
self.get_success(storage.get_event(third["event_id"])) self.get_success(self.store.get_event(third["event_id"]))
self.get_success(storage.get_event(last["event_id"])) self.get_success(self.store.get_event(last["event_id"]))
def test_purge_room(self):
"""
Purging a room will delete everything about it.
"""
# Send four messages to the room
first = self.helper.send(self.room_id, body="test1")
# Get the current room state.
state_handler = self.hs.get_state_handler()
create_event = self.get_success(
state_handler.get_current_state(self.room_id, "m.room.create", "")
)
self.assertIsNotNone(create_event)
# Purge everything before this topological token
self.get_success(self.storage.purge_events.purge_room(self.room_id))
# The events aren't found.
self.store._invalidate_get_event_cache(create_event.event_id)
self.get_failure(self.store.get_event(create_event.event_id), NotFoundError)
self.get_failure(self.store.get_event(first["event_id"]), NotFoundError)