@@ -176,6 +176,110 @@ fn is_within_limit_true_after_required_span() {
176176 } ) ;
177177}
178178
179+ #[ test]
180+ fn migrate_limit_scope_global_to_scoped ( ) {
181+ new_test_ext ( ) . execute_with ( || {
182+ let target_call =
183+ RuntimeCall :: System ( frame_system:: Call :: < Test > :: remark { remark : Vec :: new ( ) } ) ;
184+ let identifier = identifier_for ( & target_call) ;
185+
186+ Limits :: < Test , ( ) > :: insert ( identifier, RateLimit :: global ( RateLimitKind :: Exact ( 3 ) ) ) ;
187+
188+ assert ! ( RateLimiting :: migrate_limit_scope(
189+ & identifier,
190+ None ,
191+ Some ( 9 )
192+ ) ) ;
193+
194+ match RateLimiting :: limits ( identifier) . expect ( "config" ) {
195+ RateLimit :: Scoped ( map) => {
196+ assert_eq ! ( map. len( ) , 1 ) ;
197+ assert_eq ! ( map. get( & 9 ) , Some ( & RateLimitKind :: Exact ( 3 ) ) ) ;
198+ }
199+ other => panic ! ( "unexpected config: {:?}" , other) ,
200+ }
201+ } ) ;
202+ }
203+
204+ #[ test]
205+ fn migrate_limit_scope_scoped_to_scoped ( ) {
206+ new_test_ext ( ) . execute_with ( || {
207+ let target_call =
208+ RuntimeCall :: RateLimiting ( RateLimitingCall :: set_default_rate_limit { block_span : 0 } ) ;
209+ let identifier = identifier_for ( & target_call) ;
210+
211+ let mut map = sp_std:: collections:: btree_map:: BTreeMap :: new ( ) ;
212+ map. insert ( 1u16 , RateLimitKind :: Exact ( 4 ) ) ;
213+ map. insert ( 2u16 , RateLimitKind :: Exact ( 6 ) ) ;
214+ Limits :: < Test , ( ) > :: insert ( identifier, RateLimit :: Scoped ( map) ) ;
215+
216+ assert ! ( RateLimiting :: migrate_limit_scope(
217+ & identifier,
218+ Some ( 1 ) ,
219+ Some ( 3 )
220+ ) ) ;
221+
222+ match RateLimiting :: limits ( identifier) . expect ( "config" ) {
223+ RateLimit :: Scoped ( map) => {
224+ assert ! ( map. get( & 1 ) . is_none( ) ) ;
225+ assert_eq ! ( map. get( & 3 ) , Some ( & RateLimitKind :: Exact ( 4 ) ) ) ;
226+ assert_eq ! ( map. get( & 2 ) , Some ( & RateLimitKind :: Exact ( 6 ) ) ) ;
227+ }
228+ other => panic ! ( "unexpected config: {:?}" , other) ,
229+ }
230+ } ) ;
231+ }
232+
233+ #[ test]
234+ fn migrate_limit_scope_scoped_to_global ( ) {
235+ new_test_ext ( ) . execute_with ( || {
236+ let target_call =
237+ RuntimeCall :: RateLimiting ( RateLimitingCall :: set_default_rate_limit { block_span : 0 } ) ;
238+ let identifier = identifier_for ( & target_call) ;
239+
240+ let mut map = sp_std:: collections:: btree_map:: BTreeMap :: new ( ) ;
241+ map. insert ( 7u16 , RateLimitKind :: Exact ( 8 ) ) ;
242+ Limits :: < Test , ( ) > :: insert ( identifier, RateLimit :: Scoped ( map) ) ;
243+
244+ assert ! ( RateLimiting :: migrate_limit_scope(
245+ & identifier,
246+ Some ( 7 ) ,
247+ None
248+ ) ) ;
249+
250+ match RateLimiting :: limits ( identifier) . expect ( "config" ) {
251+ RateLimit :: Global ( kind) => assert_eq ! ( kind, RateLimitKind :: Exact ( 8 ) ) ,
252+ other => panic ! ( "unexpected config: {:?}" , other) ,
253+ }
254+ } ) ;
255+ }
256+
257+ #[ test]
258+ fn migrate_usage_key_moves_entry ( ) {
259+ new_test_ext ( ) . execute_with ( || {
260+ let target_call =
261+ RuntimeCall :: RateLimiting ( RateLimitingCall :: set_default_rate_limit { block_span : 0 } ) ;
262+ let identifier = identifier_for ( & target_call) ;
263+
264+ LastSeen :: < Test , ( ) > :: insert ( identifier, Some ( 5u16 ) , 11 ) ;
265+
266+ assert ! ( RateLimiting :: migrate_usage_key(
267+ & identifier,
268+ Some ( 5 ) ,
269+ Some ( 6 )
270+ ) ) ;
271+ assert ! ( LastSeen :: <Test , ( ) >:: get( identifier, Some ( 5u16 ) ) . is_none( ) ) ;
272+ assert_eq ! ( LastSeen :: <Test , ( ) >:: get( identifier, Some ( 6u16 ) ) , Some ( 11 ) ) ;
273+
274+ assert ! ( RateLimiting :: migrate_usage_key( & identifier, Some ( 6 ) , None ) ) ;
275+ assert ! ( LastSeen :: <Test , ( ) >:: get( identifier, Some ( 6u16 ) ) . is_none( ) ) ;
276+ assert_eq ! (
277+ LastSeen :: <Test , ( ) >:: get( identifier, None :: <UsageKey >) ,
278+ Some ( 11 )
279+ ) ;
280+ } ) ;
281+ }
282+
179283#[ test]
180284fn set_rate_limit_updates_storage_and_emits_event ( ) {
181285 new_test_ext ( ) . execute_with ( || {
0 commit comments