@@ -832,6 +832,66 @@ func TestEntraidTokenManager_Streaming(t *testing.T) {
832832 mock .AssertExpectationsForObjects (t , idp , listener )
833833 })
834834
835+ t .Run ("Start and Listen with 0 renewal duration and closing the manager" , func (t * testing.T ) {
836+ idp := & mockIdentityProvider {}
837+ listener := & mockTokenListener {}
838+ tokenManager , err := NewTokenManager (idp ,
839+ TokenManagerOptions {
840+ LowerRefreshBoundMs : 1000 * 60 * 60 , // 1 hour
841+ RetryOptions : RetryOptions {
842+ InitialDelayMs : 5000 , // 5 seconds
843+ },
844+ },
845+ )
846+ assert .NoError (t , err )
847+ assert .NotNil (t , tokenManager )
848+ tm , ok := tokenManager .(* entraidTokenManager )
849+ assert .True (t , ok )
850+ assert .Nil (t , tm .listener )
851+
852+ assert .NoError (t , err )
853+
854+ expiresIn := time .Second
855+ expiresOn := time .Now ().Add (expiresIn ).UTC ()
856+ res := & public.AuthResult {
857+ ExpiresOn : expiresOn ,
858+ }
859+ idpResponse , err := NewIDPResponse (ResponseTypeAuthResult ,
860+ res )
861+ assert .NoError (t , err )
862+ idp .On ("RequestToken" ).Run (func (args mock.Arguments ) {
863+ expiresOn := time .Now ().Add (expiresIn ).UTC ()
864+ res := & public.AuthResult {
865+ ExpiresOn : expiresOn ,
866+ }
867+ response := idpResponse .(* authResult )
868+ response .authResult = res
869+ }).Return (idpResponse , nil )
870+
871+ listener .On ("OnTokenNext" , mock .AnythingOfType ("*entraid.Token" )).Return ()
872+
873+ cancel , err := tokenManager .Start (listener )
874+ assert .NotNil (t , cancel )
875+ assert .NoError (t , err )
876+ assert .NotNil (t , tm .listener )
877+
878+ toRenewal := tm .durationToRenewal ()
879+ assert .Equal (t , time .Duration (0 ), toRenewal )
880+ assert .True (t , expiresIn > toRenewal )
881+
882+ <- time .After (time .Duration (tm .retryOptions .InitialDelayMs / 2 ) * time .Millisecond )
883+ assert .NoError (t , cancel ())
884+ assert .Nil (t , tm .listener )
885+ assert .Panics (t , func () {
886+ close (tm .closed )
887+ })
888+
889+ // called only once since the token manager was closed prior to initial delay passing
890+ idp .AssertNumberOfCalls (t , "RequestToken" , 1 )
891+ listener .AssertNumberOfCalls (t , "OnTokenNext" , 1 )
892+ mock .AssertExpectationsForObjects (t , idp , listener )
893+ })
894+
835895 t .Run ("Start and Listen" , func (t * testing.T ) {
836896 idp := & mockIdentityProvider {}
837897 listener := & mockTokenListener {}
0 commit comments