@@ -16,7 +16,9 @@ import okhttp3.HttpUrl.Companion.toHttpUrl
16
16
import org.junit.jupiter.api.Test
17
17
import org.junit.jupiter.params.ParameterizedTest
18
18
import org.junit.jupiter.params.provider.ValueSource
19
+ import java.time.Clock
19
20
import java.time.Instant
21
+ import java.time.ZoneId
20
22
import java.time.temporal.ChronoUnit
21
23
import java.util.Date
22
24
@@ -99,8 +101,8 @@ internal class OAuth2TokenProviderRSATest {
99
101
100
102
@Test
101
103
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 )
104
106
105
107
tokenProvider.exchangeAccessToken(
106
108
tokenRequest =
@@ -118,6 +120,69 @@ internal class OAuth2TokenProviderRSATest {
118
120
}
119
121
}
120
122
123
+ @Test
124
+ fun `token should have issuedAt set dynamically according to timeProvider` () {
125
+ val clock = object : Clock () {
126
+ private var clock = systemDefaultZone()
127
+
128
+ override fun instant () = clock.instant()
129
+
130
+ override fun withZone (zone : ZoneId ) = clock.withZone(zone)
131
+
132
+ override fun getZone () = clock.zone
133
+
134
+ fun fixed (instant : Instant ) {
135
+ clock = fixed(instant, zone)
136
+ }
137
+ }
138
+
139
+ val tokenProvider = OAuth2TokenProvider { clock.instant() }
140
+
141
+ val instant1 = Instant .parse(" 2000-12-03T10:15:30.00Z" )
142
+ val instant2 = Instant .parse(" 2020-01-21T00:00:00.00Z" )
143
+ instant1 shouldNotBe instant2
144
+
145
+ run {
146
+ clock.fixed(instant1)
147
+ tokenProvider.systemTime shouldBe instant1
148
+
149
+ tokenProvider.exchangeAccessToken(
150
+ tokenRequest =
151
+ nimbusTokenRequest(
152
+ " id" ,
153
+ " grant_type" to GrantType .CLIENT_CREDENTIALS .value,
154
+ " scope" to " scope1" ,
155
+ ),
156
+ issuerUrl = " http://default_if_not_overridden" .toHttpUrl(),
157
+ claimsSet = tokenProvider.jwt(mapOf ()).jwtClaimsSet,
158
+ oAuth2TokenCallback = DefaultOAuth2TokenCallback (),
159
+ ).asClue {
160
+ it.jwtClaimsSet.issueTime shouldBe Date .from(instant1)
161
+ println (it.serialize())
162
+ }
163
+ }
164
+
165
+ run {
166
+ clock.fixed(instant2)
167
+ tokenProvider.systemTime shouldBe instant2
168
+
169
+ tokenProvider.exchangeAccessToken(
170
+ tokenRequest =
171
+ nimbusTokenRequest(
172
+ " id" ,
173
+ " grant_type" to GrantType .CLIENT_CREDENTIALS .value,
174
+ " scope" to " scope1" ,
175
+ ),
176
+ issuerUrl = " http://default_if_not_overridden" .toHttpUrl(),
177
+ claimsSet = tokenProvider.jwt(mapOf ()).jwtClaimsSet,
178
+ oAuth2TokenCallback = DefaultOAuth2TokenCallback (),
179
+ ).asClue {
180
+ it.jwtClaimsSet.issueTime shouldBe Date .from(instant2)
181
+ println (it.serialize())
182
+ }
183
+ }
184
+ }
185
+
121
186
private fun idToken (issuerUrl : String ): SignedJWT =
122
187
tokenProvider.idToken(
123
188
tokenRequest =
0 commit comments