Skip to content

Commit 3b9fcb7

Browse files
committed
refactor(manager)!: remove Stop method
Remove Stop method, fix tests.
1 parent 76cefcc commit 3b9fcb7

File tree

6 files changed

+55
-33
lines changed

6 files changed

+55
-33
lines changed

credentials_provider_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ func TestCredentialsProviderSubscribe(t *testing.T) {
343343
mtm.On("GetToken", false).Return(testToken, nil)
344344
mtm.On("Start", mock.Anything).
345345
Run(mockTokenManagerLoop(mtm, tokenExpiration, testToken, nil)).
346-
Return(manager.StopFunc(mtm.Stop), nil)
346+
Return(manager.StopFunc(mtm.stop), nil)
347347
provider, err := NewConfidentialCredentialsProvider(options)
348348
require.NoError(t, err)
349349
require.NotNil(t, provider)
@@ -396,7 +396,7 @@ func TestCredentialsProviderSubscribe(t *testing.T) {
396396

397397
mtm.On("Start", mock.Anything).
398398
Run(mockTokenManagerLoop(mtm, tokenExpiration, nil, errTokenError)).
399-
Return(manager.StopFunc(mtm.Stop), nil)
399+
Return(manager.StopFunc(mtm.stop), nil)
400400
provider, err := NewConfidentialCredentialsProvider(options)
401401
require.NoError(t, err)
402402
require.NotNil(t, provider)
@@ -467,7 +467,7 @@ func TestCredentialsProviderSubscribe(t *testing.T) {
467467

468468
mtm.On("Start", mock.Anything).
469469
Run(mockTokenManagerLoop(mtm, tokenExpiration, nil, errTokenError)).
470-
Return(manager.StopFunc(mtm.Stop), nil)
470+
Return(manager.StopFunc(mtm.stop), nil)
471471
provider, err := NewConfidentialCredentialsProvider(options)
472472
require.NoError(t, err)
473473
require.NotNil(t, provider)

entraid_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func (m *fakeTokenManager) Start(listener manager.TokenListener) (manager.StopFu
8484
}, nil
8585
}
8686

87-
func (m *fakeTokenManager) Stop() error {
87+
func (m *fakeTokenManager) stop() error {
8888
return nil
8989
}
9090

@@ -163,7 +163,7 @@ func (m *mockTokenManager) Start(listener manager.TokenListener) (manager.StopFu
163163
m.lock.Unlock()
164164
return args.Get(0).(manager.StopFunc), args.Error(1)
165165
}
166-
func (m *mockTokenManager) Stop() error {
166+
func (m *mockTokenManager) stop() error {
167167
m.lock.Lock()
168168
defer m.lock.Unlock()
169169
if m.listener == nil {

manager/defaults.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func (*defaultIdentityProviderResponseParser) ParseResponse(response shared.Iden
104104

105105
var username, password, rawToken string
106106
var expiresOn time.Time
107-
now := time.Now().UTC()
107+
now := time.Now().UTC().Truncate(time.Second)
108108

109109
switch response.Type() {
110110
case shared.ResponseTypeAuthResult:

manager/manager_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
1010
"github.com/AzureAD/microsoft-authentication-library-for-go/apps/public"
11+
"github.com/golang-jwt/jwt/v5"
1112
"github.com/redis-developer/go-redis-entraid/shared"
1213
"github.com/redis-developer/go-redis-entraid/token"
1314
"github.com/stretchr/testify/mock"
@@ -63,6 +64,26 @@ var testTokenValid = token.New(
6364
int64(time.Hour),
6465
)
6566

67+
func newTestJWTToken(expiresOn time.Time) string {
68+
claims := struct {
69+
jwt.RegisteredClaims
70+
Oid string `json:"oid,omitempty"`
71+
}{}
72+
73+
// Parse the token to extract claims, but note that signature verification
74+
// should be handled by the identity provider
75+
_, _, err := jwt.NewParser().ParseUnverified(testJWTToken, &claims)
76+
if err != nil {
77+
panic(err)
78+
}
79+
claims.ExpiresAt = jwt.NewNumericDate(expiresOn)
80+
tokenStr, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte("qwertyuiopasdfghjklzxcvbnm123456"))
81+
if err != nil {
82+
panic(err)
83+
}
84+
return tokenStr
85+
}
86+
6687
type mockIdentityProviderResponseParser struct {
6788
// Mock implementation of the IdentityProviderResponseParser interface
6889
mock.Mock

manager/token_manager.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,6 @@ type TokenManager interface {
8383
GetToken(forceRefresh bool) (*token.Token, error)
8484
// Start starts the token manager and returns a channel that will receive updates.
8585
Start(listener TokenListener) (StopFunc, error)
86-
// Stop stops the token manager and releases any resources.
87-
Stop() error
8886
}
8987

9088
// StopFunc is a function that stops the token manager.
@@ -327,11 +325,11 @@ func (e *entraidTokenManager) Start(listener TokenListener) (StopFunc, error) {
327325
}
328326
}(listener, e.closedChan)
329327

330-
return e.Stop, nil
328+
return e.stop, nil
331329
}
332330

333-
// Stop closes the token manager and releases any resources.
334-
func (e *entraidTokenManager) Stop() (err error) {
331+
// stop closes the token manager and releases any resources.
332+
func (e *entraidTokenManager) stop() (err error) {
335333
e.lock.Lock()
336334
defer e.lock.Unlock()
337335
defer func() {

manager/token_manager_test.go

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ func TestTokenManager_Close(t *testing.T) {
155155
t.Parallel()
156156
t.Run("Close", func(t *testing.T) {
157157
t.Parallel()
158+
var err error
158159
idp := &mockIdentityProvider{}
159160
listener := &mockTokenListener{}
160161
mParser := &mockIdentityProviderResponseParser{}
@@ -169,7 +170,7 @@ func TestTokenManager_Close(t *testing.T) {
169170
assert.True(t, ok)
170171
assert.Nil(t, tm.listener)
171172
assert.NotPanics(t, func() {
172-
err = tokenManager.Stop()
173+
err = tm.stop()
173174
assert.Error(t, err)
174175
})
175176
rawResponse, err := shared.NewIDPResponse(shared.ResponseTypeRawToken, "test")
@@ -179,19 +180,20 @@ func TestTokenManager_Close(t *testing.T) {
179180
mParser.On("ParseResponse", rawResponse).Return(testTokenValid, nil)
180181
listener.On("OnNext", testTokenValid).Return()
181182

183+
var stopper StopFunc
182184
assert.NotPanics(t, func() {
183-
cancel, err := tokenManager.Start(listener)
184-
assert.NotNil(t, cancel)
185+
stopper, err = tokenManager.Start(listener)
186+
assert.NotNil(t, stopper)
185187
assert.NoError(t, err)
186188
})
187189
assert.NotNil(t, tm.listener)
188190

189-
err = tokenManager.Stop()
191+
err = stopper()
190192
assert.Nil(t, tm.listener)
191193
assert.NoError(t, err)
192194

193195
assert.NotPanics(t, func() {
194-
err = tokenManager.Stop()
196+
err = stopper()
195197
assert.Error(t, err)
196198
})
197199
})
@@ -256,8 +258,8 @@ func TestTokenManager_Close(t *testing.T) {
256258
listener.On("OnNext", testTokenValid).Return()
257259

258260
assert.NotPanics(t, func() {
259-
cancel, err := tokenManager.Start(listener)
260-
assert.NotNil(t, cancel)
261+
stopper, err := tokenManager.Start(listener)
262+
assert.NotNil(t, stopper)
261263
assert.NoError(t, err)
262264
assert.NotNil(t, tm.listener)
263265
var hasStopped int
@@ -272,7 +274,7 @@ func TestTokenManager_Close(t *testing.T) {
272274
go func() {
273275
defer wg.Done()
274276
time.Sleep(time.Duration(int64(rand.Intn(100)) * int64(time.Millisecond)))
275-
err := tokenManager.Stop()
277+
err := stopper()
276278
if err == nil {
277279
hasStopped += 1
278280
return
@@ -383,7 +385,7 @@ func TestTokenManager_Start(t *testing.T) {
383385
time.Sleep(time.Duration(int64(rand.Intn(1000)+(300-int(num)/2)) * int64(time.Millisecond)))
384386
last.Store(num)
385387
if num%2 == 0 {
386-
err = tokenManager.Stop()
388+
err = tm.stop()
387389
} else {
388390
l := &mockTokenListener{Id: num}
389391
l.On("OnNext", testTokenValid).Return()
@@ -410,11 +412,11 @@ func TestTokenManager_Start(t *testing.T) {
410412
log.Printf("FAILING WITH lastExecution[STOPPED]: %d", lastExecution)
411413
}
412414
assert.NotNil(t, tm.listener)
413-
cancel, err := tokenManager.Start(listener)
414-
assert.Nil(t, cancel)
415+
stopper, err := tokenManager.Start(listener)
416+
assert.Nil(t, stopper)
415417
assert.Error(t, err)
416-
// Close the token manager
417-
err = tokenManager.Stop()
418+
// Stop the token manager with internal stop, since stopper should be nil
419+
err = tm.stop()
418420
assert.Nil(t, err)
419421
}
420422
assert.Nil(t, tm.listener)
@@ -435,7 +437,7 @@ func TestDefaultIdentityProviderResponseParser(t *testing.T) {
435437
token1, err := parser.ParseResponse(idpResponse)
436438
assert.NoError(t, err)
437439
assert.NotNil(t, token1)
438-
assert.Equal(t, authResultVal.ExpiresOn, token1.ExpirationOn())
440+
assert.InEpsilon(t, authResultVal.ExpiresOn.Unix(), token1.ExpirationOn().Unix(), 1)
439441
})
440442
t.Run("Default IdentityProviderResponseParser with type AccessToken", func(t *testing.T) {
441443
t.Parallel()
@@ -784,8 +786,8 @@ func TestEntraidTokenManager_Streaming(t *testing.T) {
784786
mParser.On("ParseResponse", idpResponse).Return(token1, nil).Once()
785787
listener.On("OnNext", token1).Return().Once()
786788

787-
cancel, err := tokenManager.Start(listener)
788-
assert.NotNil(t, cancel)
789+
stopper, err := tokenManager.Start(listener)
790+
assert.NotNil(t, stopper)
789791
assert.NoError(t, err)
790792
assert.NotNil(t, tm.listener)
791793

@@ -795,14 +797,15 @@ func TestEntraidTokenManager_Streaming(t *testing.T) {
795797
assert.True(t, expiresIn > toRenewal)
796798
<-time.After(toRenewal / 10)
797799
assert.NotNil(t, tm.listener)
798-
assert.NoError(t, tokenManager.Stop())
800+
assert.NoError(t, stopper())
799801
assert.Nil(t, tm.listener)
800802
assert.Panics(t, func() {
801803
close(tm.closedChan)
802804
})
803805

804806
<-time.After(toRenewal)
805-
assert.Error(t, tokenManager.Stop())
807+
// already stopped
808+
assert.Error(t, stopper())
806809
mock.AssertExpectationsForObjects(t, idp, mParser, listener)
807810
})
808811

@@ -1251,9 +1254,9 @@ func TestEntraidTokenManager_Streaming(t *testing.T) {
12511254

12521255
func testAuthResult(expiersOn time.Time) *public.AuthResult {
12531256
r := &public.AuthResult{
1254-
ExpiresOn: expiersOn,
1257+
ExpiresOn: expiersOn,
1258+
AccessToken: newTestJWTToken(expiersOn),
12551259
}
1256-
r.IDToken.Oid = "test"
12571260
return r
12581261
}
12591262

@@ -1333,14 +1336,14 @@ func BenchmarkTokenManager_Close(b *testing.B) {
13331336
mParser.On("ParseResponse", rawResponse).Return(testTokenValid, nil)
13341337
listener.On("OnNext", testTokenValid).Return()
13351338

1336-
_, err = tokenManager.Start(listener)
1339+
stopper, err := tokenManager.Start(listener)
13371340
if err != nil {
13381341
b.Fatal(err)
13391342
}
13401343

13411344
b.ResetTimer()
13421345
for i := 0; i < b.N; i++ {
1343-
_ = tokenManager.Stop()
1346+
_ = stopper()
13441347
}
13451348
}
13461349

0 commit comments

Comments
 (0)