33
44
55using System ;
6- using System . Threading ;
76using Microsoft . Identity . Client ;
87using Microsoft . Identity . Client . Core ;
98using Microsoft . Identity . Client . OAuth2 . Throttling ;
@@ -60,11 +59,15 @@ public void TryGetOrRemoveExpired_MissingKey_ReturnsFalse()
6059 public void AddAndCleanup_SameKey_KeepsNewerEntry ( )
6160 {
6261 var cache = new ThrottlingCache ( ) ;
63- var olderEntry = new ThrottlingCacheEntry ( _ex1 , TimeSpan . FromMinutes ( 10 ) ) ;
62+ var olderEntry = new ThrottlingCacheEntry (
63+ _ex1 ,
64+ DateTimeOffset . UtcNow . Subtract ( TimeSpan . FromMinutes ( 1 ) ) ,
65+ DateTimeOffset . UtcNow . AddMinutes ( 10 ) ) ;
6466
65- // Small delay to ensure different creation times
66- Thread . Sleep ( 10 ) ;
67- var newerEntry = new ThrottlingCacheEntry ( _ex2 , TimeSpan . FromMinutes ( 10 ) ) ;
67+ var newerEntry = new ThrottlingCacheEntry (
68+ _ex2 ,
69+ DateTimeOffset . UtcNow ,
70+ DateTimeOffset . UtcNow . AddMinutes ( 10 ) ) ;
6871
6972 cache . AddAndCleanup ( "k1" , olderEntry , _logger ) ;
7073 cache . AddAndCleanup ( "k1" , newerEntry , _logger ) ;
@@ -74,18 +77,25 @@ public void AddAndCleanup_SameKey_KeepsNewerEntry()
7477 }
7578
7679 [ TestMethod ]
77- public void AddAndCleanup_SameKey_KeepsOlderIfNewer ( )
80+ public void AddAndCleanup_SameKey_OlderEntryDoesNotReplaceNewer ( )
7881 {
7982 var cache = new ThrottlingCache ( ) ;
80- var newerEntry = new ThrottlingCacheEntry ( _ex1 , TimeSpan . FromMinutes ( 10 ) ) ;
83+ var newerEntry = new ThrottlingCacheEntry (
84+ _ex1 ,
85+ DateTimeOffset . UtcNow ,
86+ DateTimeOffset . UtcNow . AddMinutes ( 10 ) ) ;
8187
82- // Add newer first, then older
88+ var olderEntry = new ThrottlingCacheEntry (
89+ _ex2 ,
90+ DateTimeOffset . UtcNow . Subtract ( TimeSpan . FromMinutes ( 1 ) ) ,
91+ DateTimeOffset . UtcNow . AddMinutes ( 10 ) ) ;
92+
93+ // Add newer first, then try to replace with older
8394 cache . AddAndCleanup ( "k1" , newerEntry , _logger ) ;
95+ cache . AddAndCleanup ( "k1" , olderEntry , _logger ) ;
8496
85- // Create an entry with an older creation time by adding an already-expired entry replacement
86- // The AddOrUpdate will keep the newer one
8797 cache . TryGetOrRemoveExpired ( "k1" , _logger , out var foundEx ) ;
88- Assert . AreSame ( _ex1 , foundEx ) ;
98+ Assert . AreSame ( _ex1 , foundEx , "Should keep the newer entry when an older entry is added later" ) ;
8999 }
90100
91101 [ TestMethod ]
@@ -102,17 +112,16 @@ public void CacheForTest_ExposesInternalDictionary()
102112 [ TestMethod ]
103113 public void Cleanup_RemovesOnlyExpiredEntries ( )
104114 {
105- // Use a very short cleanup interval so cleanup triggers
106- var cache = new ThrottlingCache ( 1 ) ; // 1ms cleanup interval
115+ // Use a cleanup interval of 0 so cleanup triggers immediately on next add
116+ var cache = new ThrottlingCache ( 0 ) ;
107117
108118 var expiredEntry = new ThrottlingCacheEntry ( _ex1 , TimeSpan . FromMilliseconds ( - 10000 ) ) ;
109119 var validEntry = new ThrottlingCacheEntry ( _ex2 , TimeSpan . FromMinutes ( 10 ) ) ;
110120
111121 cache . AddAndCleanup ( "expired" , expiredEntry , _logger ) ;
112122 cache . AddAndCleanup ( "valid" , validEntry , _logger ) ;
113123
114- // Wait for cleanup interval to pass, then trigger cleanup via another add
115- Thread . Sleep ( 50 ) ;
124+ // Trigger cleanup via another add (interval is 0ms so it fires immediately)
116125 cache . AddAndCleanup ( "trigger" , new ThrottlingCacheEntry ( _ex2 , TimeSpan . FromMinutes ( 10 ) ) , _logger ) ;
117126
118127 Assert . IsFalse ( cache . TryGetOrRemoveExpired ( "expired" , _logger , out _ ) , "Expired entry should be cleaned up" ) ;
0 commit comments