Replace instances of reactor pumping with get_success. (#7619)

Calls `self.get_success` on all deferred methods instead of abusing `self.pump()`. This has the benefit of working with coroutines, as well as checking that method execution completed successfully.

There are also a few small cleanups that I made in the process.
This commit is contained in:
Andrew Morgan 2020-06-03 16:39:30 +01:00 committed by GitHub
parent c9507be989
commit 0188daf32c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 152 additions and 121 deletions

1
changelog.d/7619.misc Normal file
View File

@ -0,0 +1 @@
Check that all asynchronous tasks succeed and general cleanup of `MonthlyActiveUsersTestCase` and `TestMauLimit`.

View File

@ -61,21 +61,27 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
user2_email = threepids[1]["address"]
user3 = "@user3:server"
self.store.register_user(user_id=user1)
self.store.register_user(user_id=user2)
self.get_success(self.store.register_user(user_id=user1))
self.get_success(self.store.register_user(user_id=user2))
self.get_success(
self.store.register_user(user_id=user3, user_type=UserTypes.SUPPORT)
self.pump()
)
now = int(self.hs.get_clock().time_msec())
self.get_success(
self.store.user_add_threepid(user1, "email", user1_email, now, now)
)
self.get_success(
self.store.user_add_threepid(user2, "email", user2_email, now, now)
)
# XXX why are we doing this here? this function is only run at startup
# so it is odd to re-run it here.
self.get_success(
self.store.db.runInteraction(
"initialise", self.store._initialise_reserved_users, threepids
)
self.pump()
)
# the number of users we expect will be counted against the mau limit
# -1 because user3 is a support user and does not count
@ -83,13 +89,13 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
# Check the number of active users. Ensure user3 (support user) is not counted
active_count = self.get_success(self.store.get_monthly_active_count())
self.assertEquals(active_count, user_num)
self.assertEqual(active_count, user_num)
# Test each of the registered users is marked as active
timestamp = self.store.user_last_seen_monthly_active(user1)
self.assertTrue(self.get_success(timestamp))
timestamp = self.store.user_last_seen_monthly_active(user2)
self.assertTrue(self.get_success(timestamp))
timestamp = self.get_success(self.store.user_last_seen_monthly_active(user1))
self.assertGreater(timestamp, 0)
timestamp = self.get_success(self.store.user_last_seen_monthly_active(user2))
self.assertGreater(timestamp, 0)
# Test that users with reserved 3pids are not removed from the MAU table
# XXX some of this is redundant. poking things into the config shouldn't
@ -98,77 +104,79 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
self.hs.config.max_mau_value = 0
self.reactor.advance(FORTY_DAYS)
self.hs.config.max_mau_value = 5
self.store.reap_monthly_active_users()
self.pump()
active_count = self.store.get_monthly_active_count()
self.assertEquals(self.get_success(active_count), user_num)
self.get_success(self.store.reap_monthly_active_users())
active_count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(active_count, user_num)
# Add some more users and check they are counted as active
ru_count = 2
self.store.upsert_monthly_active_user("@ru1:server")
self.store.upsert_monthly_active_user("@ru2:server")
self.pump()
active_count = self.store.get_monthly_active_count()
self.assertEqual(self.get_success(active_count), user_num + ru_count)
self.get_success(self.store.upsert_monthly_active_user("@ru1:server"))
self.get_success(self.store.upsert_monthly_active_user("@ru2:server"))
active_count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(active_count, user_num + ru_count)
# now run the reaper and check that the number of active users is reduced
# to max_mau_value
self.store.reap_monthly_active_users()
self.pump()
self.get_success(self.store.reap_monthly_active_users())
active_count = self.store.get_monthly_active_count()
self.assertEquals(self.get_success(active_count), 3)
active_count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(active_count, 3)
def test_can_insert_and_count_mau(self):
count = self.store.get_monthly_active_count()
self.assertEqual(0, self.get_success(count))
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(count, 0)
self.store.upsert_monthly_active_user("@user:server")
self.pump()
d = self.store.upsert_monthly_active_user("@user:server")
self.get_success(d)
count = self.store.get_monthly_active_count()
self.assertEqual(1, self.get_success(count))
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(count, 1)
def test_user_last_seen_monthly_active(self):
user_id1 = "@user1:server"
user_id2 = "@user2:server"
user_id3 = "@user3:server"
result = self.store.user_last_seen_monthly_active(user_id1)
self.assertFalse(self.get_success(result) == 0)
result = self.get_success(self.store.user_last_seen_monthly_active(user_id1))
self.assertNotEqual(result, 0)
self.store.upsert_monthly_active_user(user_id1)
self.store.upsert_monthly_active_user(user_id2)
self.pump()
self.get_success(self.store.upsert_monthly_active_user(user_id1))
self.get_success(self.store.upsert_monthly_active_user(user_id2))
result = self.store.user_last_seen_monthly_active(user_id1)
self.assertGreater(self.get_success(result), 0)
result = self.get_success(self.store.user_last_seen_monthly_active(user_id1))
self.assertGreater(result, 0)
result = self.store.user_last_seen_monthly_active(user_id3)
self.assertNotEqual(self.get_success(result), 0)
result = self.get_success(self.store.user_last_seen_monthly_active(user_id3))
self.assertNotEqual(result, 0)
@override_config({"max_mau_value": 5})
def test_reap_monthly_active_users(self):
initial_users = 10
for i in range(initial_users):
self.get_success(
self.store.upsert_monthly_active_user("@user%d:server" % i)
self.pump()
)
count = self.store.get_monthly_active_count()
self.assertTrue(self.get_success(count), initial_users)
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(count, initial_users)
self.store.reap_monthly_active_users()
self.pump()
count = self.store.get_monthly_active_count()
self.assertEquals(self.get_success(count), self.hs.config.max_mau_value)
d = self.store.reap_monthly_active_users()
self.get_success(d)
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(count, self.hs.config.max_mau_value)
self.reactor.advance(FORTY_DAYS)
self.store.reap_monthly_active_users()
self.pump()
count = self.store.get_monthly_active_count()
self.assertEquals(self.get_success(count), 0)
d = self.store.reap_monthly_active_users()
self.get_success(d)
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(count, 0)
# Note that below says mau_limit (no s), this is the name of the config
# value, although it gets stored on the config object as mau_limits.
@ -182,7 +190,9 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
for i in range(initial_users):
user = "@user%d:server" % i
email = "user%d@matrix.org" % i
self.get_success(self.store.upsert_monthly_active_user(user))
# Need to ensure that the most recent entries in the
# monthly_active_users table are reserved
now = int(self.hs.get_clock().time_msec())
@ -194,26 +204,37 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
self.store.user_add_threepid(user, "email", email, now, now)
)
self.store.db.runInteraction(
d = self.store.db.runInteraction(
"initialise", self.store._initialise_reserved_users, threepids
)
count = self.store.get_monthly_active_count()
self.assertTrue(self.get_success(count), initial_users)
self.get_success(d)
users = self.store.get_registered_reserved_users()
self.assertEquals(len(self.get_success(users)), reserved_user_number)
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(count, initial_users)
self.get_success(self.store.reap_monthly_active_users())
count = self.store.get_monthly_active_count()
self.assertEquals(self.get_success(count), self.hs.config.max_mau_value)
users = self.get_success(self.store.get_registered_reserved_users())
self.assertEqual(len(users), reserved_user_number)
d = self.store.reap_monthly_active_users()
self.get_success(d)
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(count, self.hs.config.max_mau_value)
def test_populate_monthly_users_is_guest(self):
# Test that guest users are not added to mau list
user_id = "@user_id:host"
self.store.register_user(user_id=user_id, password_hash=None, make_guest=True)
d = self.store.register_user(
user_id=user_id, password_hash=None, make_guest=True
)
self.get_success(d)
self.store.upsert_monthly_active_user = Mock()
self.store.populate_monthly_active_users(user_id)
self.pump()
d = self.store.populate_monthly_active_users(user_id)
self.get_success(d)
self.store.upsert_monthly_active_user.assert_not_called()
def test_populate_monthly_users_should_update(self):
@ -224,8 +245,9 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
self.store.user_last_seen_monthly_active = Mock(
return_value=defer.succeed(None)
)
self.store.populate_monthly_active_users("user_id")
self.pump()
d = self.store.populate_monthly_active_users("user_id")
self.get_success(d)
self.store.upsert_monthly_active_user.assert_called_once()
def test_populate_monthly_users_should_not_update(self):
@ -235,16 +257,18 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
self.store.user_last_seen_monthly_active = Mock(
return_value=defer.succeed(self.hs.get_clock().time_msec())
)
self.store.populate_monthly_active_users("user_id")
self.pump()
d = self.store.populate_monthly_active_users("user_id")
self.get_success(d)
self.store.upsert_monthly_active_user.assert_not_called()
def test_get_reserved_real_user_account(self):
# Test no reserved users, or reserved threepids
users = self.get_success(self.store.get_registered_reserved_users())
self.assertEquals(len(users), 0)
# Test reserved users but no registered users
self.assertEqual(len(users), 0)
# Test reserved users but no registered users
user1 = "@user1:example.com"
user2 = "@user2:example.com"
@ -254,63 +278,64 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
{"medium": "email", "address": user1_email},
{"medium": "email", "address": user2_email},
]
self.hs.config.mau_limits_reserved_threepids = threepids
self.store.db.runInteraction(
d = self.store.db.runInteraction(
"initialise", self.store._initialise_reserved_users, threepids
)
self.get_success(d)
self.pump()
users = self.get_success(self.store.get_registered_reserved_users())
self.assertEquals(len(users), 0)
self.assertEqual(len(users), 0)
# Test reserved registed users
self.store.register_user(user_id=user1, password_hash=None)
self.store.register_user(user_id=user2, password_hash=None)
self.pump()
# Test reserved registered users
self.get_success(self.store.register_user(user_id=user1, password_hash=None))
self.get_success(self.store.register_user(user_id=user2, password_hash=None))
now = int(self.hs.get_clock().time_msec())
self.store.user_add_threepid(user1, "email", user1_email, now, now)
self.store.user_add_threepid(user2, "email", user2_email, now, now)
users = self.get_success(self.store.get_registered_reserved_users())
self.assertEquals(len(users), len(threepids))
self.assertEqual(len(users), len(threepids))
def test_support_user_not_add_to_mau_limits(self):
support_user_id = "@support:test"
count = self.store.get_monthly_active_count()
self.pump()
self.assertEqual(self.get_success(count), 0)
self.store.register_user(
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(count, 0)
d = self.store.register_user(
user_id=support_user_id, password_hash=None, user_type=UserTypes.SUPPORT
)
self.get_success(d)
self.store.upsert_monthly_active_user(support_user_id)
count = self.store.get_monthly_active_count()
self.pump()
self.assertEqual(self.get_success(count), 0)
d = self.store.upsert_monthly_active_user(support_user_id)
self.get_success(d)
d = self.store.get_monthly_active_count()
count = self.get_success(d)
self.assertEqual(count, 0)
# Note that the max_mau_value setting should not matter.
@override_config(
{"limit_usage_by_mau": False, "mau_stats_only": True, "max_mau_value": 1}
)
def test_track_monthly_users_without_cap(self):
count = self.store.get_monthly_active_count()
self.assertEqual(0, self.get_success(count))
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(0, count)
self.store.upsert_monthly_active_user("@user1:server")
self.store.upsert_monthly_active_user("@user2:server")
self.pump()
self.get_success(self.store.upsert_monthly_active_user("@user1:server"))
self.get_success(self.store.upsert_monthly_active_user("@user2:server"))
count = self.store.get_monthly_active_count()
self.assertEqual(2, self.get_success(count))
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(2, count)
@override_config({"limit_usage_by_mau": False, "mau_stats_only": False})
def test_no_users_when_not_tracking(self):
self.store.upsert_monthly_active_user = Mock()
self.store.populate_monthly_active_users("@user:sever")
self.pump()
self.get_success(self.store.populate_monthly_active_users("@user:sever"))
self.store.upsert_monthly_active_user.assert_not_called()
@ -325,33 +350,39 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
service2 = "service2"
native = "native"
self.get_success(
self.store.register_user(
user_id=appservice1_user1, password_hash=None, appservice_id=service1
)
)
self.get_success(
self.store.register_user(
user_id=appservice1_user2, password_hash=None, appservice_id=service1
)
)
self.get_success(
self.store.register_user(
user_id=appservice2_user1, password_hash=None, appservice_id=service2
)
)
self.get_success(
self.store.register_user(user_id=native_user1, password_hash=None)
self.pump()
)
count = self.store.get_monthly_active_count_by_service()
self.assertEqual({}, self.get_success(count))
count = self.get_success(self.store.get_monthly_active_count_by_service())
self.assertEqual(count, {})
self.store.upsert_monthly_active_user(native_user1)
self.store.upsert_monthly_active_user(appservice1_user1)
self.store.upsert_monthly_active_user(appservice1_user2)
self.store.upsert_monthly_active_user(appservice2_user1)
self.pump()
self.get_success(self.store.upsert_monthly_active_user(native_user1))
self.get_success(self.store.upsert_monthly_active_user(appservice1_user1))
self.get_success(self.store.upsert_monthly_active_user(appservice1_user2))
self.get_success(self.store.upsert_monthly_active_user(appservice2_user1))
count = self.store.get_monthly_active_count()
self.assertEqual(4, self.get_success(count))
count = self.get_success(self.store.get_monthly_active_count())
self.assertEqual(count, 4)
count = self.store.get_monthly_active_count_by_service()
result = self.get_success(count)
d = self.store.get_monthly_active_count_by_service()
result = self.get_success(d)
self.assertEqual(2, result[service1])
self.assertEqual(1, result[service2])
self.assertEqual(1, result[native])
self.assertEqual(result[service1], 2)
self.assertEqual(result[service2], 1)
self.assertEqual(result[native], 1)

View File

@ -85,7 +85,7 @@ class TestMauLimit(unittest.HomeserverTestCase):
# Advance time by 31 days
self.reactor.advance(31 * 24 * 60 * 60)
self.store.reap_monthly_active_users()
self.get_success(self.store.reap_monthly_active_users())
self.reactor.advance(0)
@ -147,8 +147,7 @@ class TestMauLimit(unittest.HomeserverTestCase):
# Advance by 2 months so everyone falls out of MAU
self.reactor.advance(60 * 24 * 60 * 60)
self.store.reap_monthly_active_users()
self.reactor.advance(0)
self.get_success(self.store.reap_monthly_active_users())
# We can create as many new users as we want
token4 = self.create_user("kermit4")