@@ -16,7 +16,9 @@ import okhttp3.HttpUrl.Companion.toHttpUrl
1616import org.junit.jupiter.api.Test
1717import org.junit.jupiter.params.ParameterizedTest
1818import org.junit.jupiter.params.provider.ValueSource
19+ import java.time.Clock
1920import java.time.Instant
21+ import java.time.ZoneId
2022import java.time.temporal.ChronoUnit
2123import java.util.Date
2224
@@ -99,8 +101,8 @@ internal class OAuth2TokenProviderRSATest {
99101
100102 @Test
101103 fun `token should have issuedAt set to systemTime if set, otherwise use now()` () {
102- val yesterDay = Instant .now().minus(1 , ChronoUnit .DAYS )
103- val tokenProvider = OAuth2TokenProvider (systemTime = yesterDay )
104+ val yesterday = Instant .now().minus(1 , ChronoUnit .DAYS )
105+ val tokenProvider = OAuth2TokenProvider (systemTime = yesterday )
104106
105107 tokenProvider.exchangeAccessToken(
106108 tokenRequest =
@@ -118,6 +120,70 @@ internal class OAuth2TokenProviderRSATest {
118120 }
119121 }
120122
123+ @Test
124+ fun `token should have issuedAt set dynamically according to timeProvider` () {
125+ val clock =
126+ object : Clock () {
127+ private var clock = systemDefaultZone()
128+
129+ override fun instant () = clock.instant()
130+
131+ override fun withZone (zone : ZoneId ) = clock.withZone(zone)
132+
133+ override fun getZone () = clock.zone
134+
135+ fun fixed (instant : Instant ) {
136+ clock = fixed(instant, zone)
137+ }
138+ }
139+
140+ val tokenProvider = OAuth2TokenProvider { clock.instant() }
141+
142+ val instant1 = Instant .parse(" 2000-12-03T10:15:30.00Z" )
143+ val instant2 = Instant .parse(" 2020-01-21T00:00:00.00Z" )
144+ instant1 shouldNotBe instant2
145+
146+ run {
147+ clock.fixed(instant1)
148+ tokenProvider.systemTime shouldBe instant1
149+
150+ tokenProvider.exchangeAccessToken(
151+ tokenRequest =
152+ nimbusTokenRequest(
153+ " id" ,
154+ " grant_type" to GrantType .CLIENT_CREDENTIALS .value,
155+ " scope" to " scope1" ,
156+ ),
157+ issuerUrl = " http://default_if_not_overridden" .toHttpUrl(),
158+ claimsSet = tokenProvider.jwt(mapOf ()).jwtClaimsSet,
159+ oAuth2TokenCallback = DefaultOAuth2TokenCallback (),
160+ )
161+ }.asClue {
162+ it.jwtClaimsSet.issueTime shouldBe Date .from(instant1)
163+ println (it.serialize())
164+ }
165+
166+ run {
167+ clock.fixed(instant2)
168+ tokenProvider.systemTime shouldBe instant2
169+
170+ tokenProvider.exchangeAccessToken(
171+ tokenRequest =
172+ nimbusTokenRequest(
173+ " id" ,
174+ " grant_type" to GrantType .CLIENT_CREDENTIALS .value,
175+ " scope" to " scope1" ,
176+ ),
177+ issuerUrl = " http://default_if_not_overridden" .toHttpUrl(),
178+ claimsSet = tokenProvider.jwt(mapOf ()).jwtClaimsSet,
179+ oAuth2TokenCallback = DefaultOAuth2TokenCallback (),
180+ )
181+ }.asClue {
182+ it.jwtClaimsSet.issueTime shouldBe Date .from(instant2)
183+ println (it.serialize())
184+ }
185+ }
186+
121187 private fun idToken (issuerUrl : String ): SignedJWT =
122188 tokenProvider.idToken(
123189 tokenRequest =
0 commit comments