1616
1717import pymacaroons
1818
19- from twisted .internet import defer
20-
21- import synapse
22- import synapse .api .errors
23- from synapse .api .errors import ResourceLimitError
19+ from synapse .api .errors import AuthError , ResourceLimitError
2420
2521from tests import unittest
2622from tests .test_utils import make_awaitable
27- from tests .utils import setup_test_homeserver
2823
2924
30- class AuthTestCase (unittest .TestCase ):
31- @defer .inlineCallbacks
32- def setUp (self ):
33- self .hs = yield setup_test_homeserver (self .addCleanup )
34- self .auth_handler = self .hs .get_auth_handler ()
35- self .macaroon_generator = self .hs .get_macaroon_generator ()
25+ class AuthTestCase (unittest .HomeserverTestCase ):
26+ def prepare (self , reactor , clock , hs ):
27+ self .auth_handler = hs .get_auth_handler ()
28+ self .macaroon_generator = hs .get_macaroon_generator ()
3629
3730 # MAU tests
3831 # AuthBlocking reads from the hs' config on initialization. We need to
3932 # modify its config instead of the hs'
40- self .auth_blocking = self . hs .get_auth ()._auth_blocking
33+ self .auth_blocking = hs .get_auth ()._auth_blocking
4134 self .auth_blocking ._max_mau_value = 50
4235
4336 self .small_number_of_users = 1
@@ -52,8 +45,6 @@ def test_token_is_a_macaroon(self):
5245 self .fail ("some_user was not in %s" % macaroon .inspect ())
5346
5447 def test_macaroon_caveats (self ):
55- self .hs .get_clock ().now = 5000
56-
5748 token = self .macaroon_generator .generate_access_token ("a_user" )
5849 macaroon = pymacaroons .Macaroon .deserialize (token )
5950
@@ -76,29 +67,25 @@ def verify_nonce(caveat):
7667 v .satisfy_general (verify_nonce )
7768 v .verify (macaroon , self .hs .config .macaroon_secret_key )
7869
79- @defer .inlineCallbacks
8070 def test_short_term_login_token_gives_user_id (self ):
81- self .hs .get_clock ().now = 1000
82-
8371 token = self .macaroon_generator .generate_short_term_login_token ("a_user" , 5000 )
84- user_id = yield defer . ensureDeferred (
72+ user_id = self . get_success (
8573 self .auth_handler .validate_short_term_login_token_and_get_user_id (token )
8674 )
8775 self .assertEqual ("a_user" , user_id )
8876
8977 # when we advance the clock, the token should be rejected
90- self .hs . get_clock (). now = 6000
91- with self .assertRaises ( synapse . api . errors . AuthError ):
92- yield defer . ensureDeferred (
93- self . auth_handler . validate_short_term_login_token_and_get_user_id ( token )
94- )
78+ self .reactor . advance ( 6 )
79+ self .get_failure (
80+ self . auth_handler . validate_short_term_login_token_and_get_user_id ( token ),
81+ AuthError ,
82+ )
9583
96- @defer .inlineCallbacks
9784 def test_short_term_login_token_cannot_replace_user_id (self ):
9885 token = self .macaroon_generator .generate_short_term_login_token ("a_user" , 5000 )
9986 macaroon = pymacaroons .Macaroon .deserialize (token )
10087
101- user_id = yield defer . ensureDeferred (
88+ user_id = self . get_success (
10289 self .auth_handler .validate_short_term_login_token_and_get_user_id (
10390 macaroon .serialize ()
10491 )
@@ -109,110 +96,98 @@ def test_short_term_login_token_cannot_replace_user_id(self):
10996 # user_id.
11097 macaroon .add_first_party_caveat ("user_id = b_user" )
11198
112- with self .assertRaises ( synapse . api . errors . AuthError ):
113- yield defer . ensureDeferred (
114- self . auth_handler . validate_short_term_login_token_and_get_user_id (
115- macaroon . serialize ()
116- )
117- )
99+ self .get_failure (
100+ self . auth_handler . validate_short_term_login_token_and_get_user_id (
101+ macaroon . serialize ()
102+ ),
103+ AuthError ,
104+ )
118105
119- @defer .inlineCallbacks
120106 def test_mau_limits_disabled (self ):
121107 self .auth_blocking ._limit_usage_by_mau = False
122108 # Ensure does not throw exception
123- yield defer . ensureDeferred (
109+ self . get_success (
124110 self .auth_handler .get_access_token_for_user_id (
125111 "user_a" , device_id = None , valid_until_ms = None
126112 )
127113 )
128114
129- yield defer . ensureDeferred (
115+ self . get_success (
130116 self .auth_handler .validate_short_term_login_token_and_get_user_id (
131117 self ._get_macaroon ().serialize ()
132118 )
133119 )
134120
135- @defer .inlineCallbacks
136121 def test_mau_limits_exceeded_large (self ):
137122 self .auth_blocking ._limit_usage_by_mau = True
138123 self .hs .get_datastore ().get_monthly_active_count = Mock (
139124 return_value = make_awaitable (self .large_number_of_users )
140125 )
141126
142- with self .assertRaises ( ResourceLimitError ):
143- yield defer . ensureDeferred (
144- self . auth_handler . get_access_token_for_user_id (
145- "user_a" , device_id = None , valid_until_ms = None
146- )
147- )
127+ self .get_failure (
128+ self . auth_handler . get_access_token_for_user_id (
129+ "user_a" , device_id = None , valid_until_ms = None
130+ ),
131+ ResourceLimitError ,
132+ )
148133
149134 self .hs .get_datastore ().get_monthly_active_count = Mock (
150135 return_value = make_awaitable (self .large_number_of_users )
151136 )
152- with self .assertRaises ( ResourceLimitError ):
153- yield defer . ensureDeferred (
154- self .auth_handler . validate_short_term_login_token_and_get_user_id (
155- self . _get_macaroon (). serialize ()
156- )
157- )
137+ self .get_failure (
138+ self . auth_handler . validate_short_term_login_token_and_get_user_id (
139+ self ._get_macaroon (). serialize ()
140+ ),
141+ ResourceLimitError ,
142+ )
158143
159- @defer .inlineCallbacks
160144 def test_mau_limits_parity (self ):
145+ # Ensure we're not at the unix epoch.
146+ self .reactor .advance (1 )
161147 self .auth_blocking ._limit_usage_by_mau = True
162148
163- # If not in monthly active cohort
149+ # Set the server to be at the edge of too many users.
164150 self .hs .get_datastore ().get_monthly_active_count = Mock (
165151 return_value = make_awaitable (self .auth_blocking ._max_mau_value )
166152 )
167- with self .assertRaises (ResourceLimitError ):
168- yield defer .ensureDeferred (
169- self .auth_handler .get_access_token_for_user_id (
170- "user_a" , device_id = None , valid_until_ms = None
171- )
172- )
173153
174- self .hs .get_datastore ().get_monthly_active_count = Mock (
175- return_value = make_awaitable (self .auth_blocking ._max_mau_value )
154+ # If not in monthly active cohort
155+ self .get_failure (
156+ self .auth_handler .get_access_token_for_user_id (
157+ "user_a" , device_id = None , valid_until_ms = None
158+ ),
159+ ResourceLimitError ,
176160 )
177- with self .assertRaises (ResourceLimitError ):
178- yield defer .ensureDeferred (
179- self .auth_handler .validate_short_term_login_token_and_get_user_id (
180- self ._get_macaroon ().serialize ()
181- )
182- )
161+ self .get_failure (
162+ self .auth_handler .validate_short_term_login_token_and_get_user_id (
163+ self ._get_macaroon ().serialize ()
164+ ),
165+ ResourceLimitError ,
166+ )
167+
183168 # If in monthly active cohort
184169 self .hs .get_datastore ().user_last_seen_monthly_active = Mock (
185- return_value = make_awaitable (self .hs . get_clock () .time_msec ())
170+ return_value = make_awaitable (self .clock .time_msec ())
186171 )
187- self .hs .get_datastore ().get_monthly_active_count = Mock (
188- return_value = make_awaitable (self .auth_blocking ._max_mau_value )
189- )
190- yield defer .ensureDeferred (
172+ self .get_success (
191173 self .auth_handler .get_access_token_for_user_id (
192174 "user_a" , device_id = None , valid_until_ms = None
193175 )
194176 )
195- self .hs .get_datastore ().user_last_seen_monthly_active = Mock (
196- return_value = make_awaitable (self .hs .get_clock ().time_msec ())
197- )
198- self .hs .get_datastore ().get_monthly_active_count = Mock (
199- return_value = make_awaitable (self .auth_blocking ._max_mau_value )
200- )
201- yield defer .ensureDeferred (
177+ self .get_success (
202178 self .auth_handler .validate_short_term_login_token_and_get_user_id (
203179 self ._get_macaroon ().serialize ()
204180 )
205181 )
206182
207- @defer .inlineCallbacks
208183 def test_mau_limits_not_exceeded (self ):
209184 self .auth_blocking ._limit_usage_by_mau = True
210185
211186 self .hs .get_datastore ().get_monthly_active_count = Mock (
212187 return_value = make_awaitable (self .small_number_of_users )
213188 )
214189 # Ensure does not raise exception
215- yield defer . ensureDeferred (
190+ self . get_success (
216191 self .auth_handler .get_access_token_for_user_id (
217192 "user_a" , device_id = None , valid_until_ms = None
218193 )
@@ -221,7 +196,7 @@ def test_mau_limits_not_exceeded(self):
221196 self .hs .get_datastore ().get_monthly_active_count = Mock (
222197 return_value = make_awaitable (self .small_number_of_users )
223198 )
224- yield defer . ensureDeferred (
199+ self . get_success (
225200 self .auth_handler .validate_short_term_login_token_and_get_user_id (
226201 self ._get_macaroon ().serialize ()
227202 )
0 commit comments