Skip to content

Commit 39ace04

Browse files
committed
Correct tests for new behavior.
1 parent 82d5ab8 commit 39ace04

7 files changed

Lines changed: 118 additions & 40 deletions

File tree

cwbi-auth-http-client/src/main/java/hec/army/usace/hec/cwbi/auth/http/client/AuthCodePkceTokenRequestBuilder.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,53 +50,55 @@
5050

5151
/**
5252
* Use Authorization Code + PKCE method to retrieve initial token set.
53-
*
53+
*
5454
* If a desktop is available users's default Browser is opened with the given auth URL
5555
* To complete the additional requirements.
5656
*/
5757
public final class AuthCodePkceTokenRequestBuilder extends TokenRequestBuilder<AuthCodePkceTokenRequestBuilder> {
5858
private static final Logger LOGGER = Logger.getLogger(AuthCodePkceTokenRequestBuilder.class.getName());
5959
@Override
6060
OAuth2Token retrieveToken() throws IOException {
61-
61+
6262
OAuth2Token retVal = null;
63+
HttpServer server = null;
6364
// https://datatracker.ietf.org/doc/html/rfc7636#section-4.1
6465
try {
65-
byte[] verifierBytes = new byte[64];
66+
byte[] verifierBytes = new byte[128];
6667
SecureRandom.getInstanceStrong().nextBytes(verifierBytes);
6768
Base64.Encoder b64encoder = Base64.getUrlEncoder().withoutPadding();
6869
final String verifier = b64encoder.encodeToString(verifierBytes);
6970
final String originalState = UUID.randomUUID().toString();
7071

7172
MessageDigest md = MessageDigest.getInstance("SHA-256");
7273
final String challenge = b64encoder.encodeToString(md.digest(verifier.getBytes(StandardCharsets.US_ASCII)));
73-
HttpServer server = HttpServer.create(new InetSocketAddress("localhost", 0), 0);
74+
server = HttpServer.create(new InetSocketAddress("localhost", 0), 0);
7475
int port = server.getAddress().getPort();
7576
String host = server.getAddress().getHostName();
7677

7778
final CompletableFuture<Result> future = new CompletableFuture<>();
78-
79+
7980
server.createContext("/", new HttpHandler() {
8081

8182
@Override
8283
public void handle(HttpExchange exchange) throws IOException {
8384
Result ret = null;
84-
85+
8586
final String query = exchange.getRequestURI().getQuery();
86-
LOGGER.finest("Got auth server response." + query);
87+
LOGGER.fine("Got auth server response." + query);
8788
final QueryParameters parameters = QueryParameters.parse(query);
8889
if (!parameters.get("error").isEmpty()) {
8990
String error = parameters.get("error").get(0);
9091
String errorDescription = parameters.get("error_description").get(0);
91-
ret = Result.failure(error, errorDescription);
92+
ret = Result.failure(error, errorDescription);
9293
} else {
9394
String code = parameters.get("code").get(0);
9495
String state = parameters.get("state").get(0);
9596
String session_state = parameters.get("session_state").get(0);
9697
ret = Result.success(code ,state, session_state);
9798
}
98-
LOGGER.finest("Returning result back to thread.");
99-
server.stop(0);
99+
LOGGER.fine("Returning result back to thread.");
100+
exchange.sendResponseHeaders(201, 0);
101+
100102
future.complete(ret);
101103
}
102104

@@ -117,7 +119,7 @@ public void handle(HttpExchange exchange) throws IOException {
117119
LOGGER.info("Handling Auth Request");
118120
LOGGER.finer("Auth Request URL: " + urlStr);
119121
this.authCallBack.accept(URI.create(urlStr));
120-
122+
121123
Result result = future.get(3, TimeUnit.MINUTES); // The user is now required to perform manual operations.
122124
LOGGER.info("Retrieving Token.");
123125
if (result.error != null) {
@@ -155,6 +157,11 @@ public void handle(HttpExchange exchange) throws IOException {
155157
} catch (InterruptedException | ExecutionException | TimeoutException ex) {
156158
throw new IOException("Unable to form login sequence.", ex);
157159
}
160+
finally {
161+
if (server != null) {
162+
server.stop(0);
163+
}
164+
}
158165
}
159166

160167
private static class Result {

cwbi-auth-http-client/src/test/java/hec/army/usace/hec/cwbi/auth/http/client/TestCwbiTokenProvider.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.Collections;
2929
import javax.net.ssl.KeyManager;
3030
import static org.junit.jupiter.api.Assertions.assertEquals;
31+
import static org.junit.jupiter.api.Assertions.assertNotNull;
3132

3233
import java.io.File;
3334
import java.io.IOException;
@@ -99,7 +100,7 @@ private String getResource(String resource) throws IOException {
99100

100101
protected void launchMockServerWithResource(String resource) throws IOException {
101102
mockHttpServer.getMockServer().setDispatcher(new Dispatcher() {
102-
private static final Logger LOGGER = Logger.getLogger(TestOidcTokenProvider.class.getName()+"_dispatcher");
103+
private final Logger LOGGER = Logger.getLogger(TestOidcTokenProvider.class.getName());
103104
@Override
104105
public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
105106
final HttpUrl url = request.getRequestUrl();
@@ -113,7 +114,8 @@ public MockResponse dispatch(RecordedRequest request) throws InterruptedExceptio
113114
.replace("PORT", ""+mockHttpServer.getPort()));
114115
}
115116
else if (path.endsWith("/auth")) {
116-
fail("CwbiTokenProvider uses direct grant and should not call the /auth endpoint.");
117+
throw new IOException("Endpoint should not be called. Request was " + url.toString());
118+
//fail("CwbiTokenProvider uses direct grant and should not call the /auth endpoint.");
117119
}
118120
else if (path.endsWith("/token")) {
119121
return new MockResponse().setBody(getResource("oauth2token.json"));
@@ -173,13 +175,7 @@ void testClear() throws IOException {
173175
String resource = "oauth2token.json";
174176
launchMockServerWithResource(resource);
175177
String url = buildConnectionInfo().getApiRoot();
176-
MockCwbiAuthTokenProvider tokenProvider = new MockCwbiAuthTokenProvider(url, "cumulus", getTestSslSocketFactory());
177-
OAuth2Token token = new OAuth2Token();
178-
token.setAccessToken("abc123");
179-
token.setTokenType("Bearer");
180-
token.setExpiresIn(3600);
181-
token.setRefreshToken("123abc");
182-
tokenProvider.setOAuth2Token(token);
178+
CwbiAuthTokenProvider tokenProvider = new CwbiAuthTokenProvider(url, "cumulus", getTestSslSocketFactory());
183179
OAuth2Token token1 = tokenProvider.getToken();
184180
OAuth2Token token2 = tokenProvider.getToken();
185181
assertSame(token1, token2);
@@ -192,13 +188,9 @@ void testRefreshToken() throws IOException {
192188
String resource = "oauth2token.json";
193189
launchMockServerWithResource(resource);
194190
String url = buildConnectionInfo().getApiRoot();
195-
MockCwbiAuthTokenProvider tokenProvider = new MockCwbiAuthTokenProvider(url, "cumulus", getTestSslSocketFactory());
196-
OAuth2Token token = new OAuth2Token();
197-
token.setAccessToken("abc123");
198-
token.setTokenType("Bearer");
199-
token.setExpiresIn(3600);
200-
token.setRefreshToken("123abc");
201-
tokenProvider.setOAuth2Token(token);
191+
CwbiAuthTokenProvider tokenProvider = new CwbiAuthTokenProvider(url, "cumulus", getTestSslSocketFactory());
192+
OAuth2Token token = tokenProvider.getToken();
193+
assertNotNull(token, "Failed to retrieve initial token.");
202194

203195
OAuth2Token refreshedToken = tokenProvider.refreshToken();
204196
assertEquals("MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3", refreshedToken.getAccessToken());

cwbi-auth-http-client/src/test/java/hec/army/usace/hec/cwbi/auth/http/client/TestDirectGrantX509TokenRequestBuilder.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import static org.junit.jupiter.api.Assertions.assertNotNull;
3131
import static org.junit.jupiter.api.Assertions.assertNull;
3232
import static org.junit.jupiter.api.Assertions.assertThrows;
33+
import static org.junit.jupiter.api.Assertions.fail;
3334

3435
import java.io.File;
3536
import java.io.IOException;
@@ -38,10 +39,16 @@
3839
import java.net.URL;
3940
import java.nio.file.Files;
4041
import java.nio.file.Path;
42+
import java.util.logging.Logger;
43+
4144
import javax.net.ssl.SSLSocketFactory;
4245
import mil.army.usace.hec.cwms.http.client.auth.OAuth2Token;
46+
import okhttp3.HttpUrl;
47+
import okhttp3.mockwebserver.Dispatcher;
4348
import okhttp3.mockwebserver.MockResponse;
4449
import okhttp3.mockwebserver.MockWebServer;
50+
import okhttp3.mockwebserver.RecordedRequest;
51+
4552
import org.junit.jupiter.api.Test;
4653

4754
class TestDirectGrantX509TokenRequestBuilder {
@@ -52,7 +59,7 @@ void testRetrieveTokenMissingParams() {
5259
SslSocketData sslSocketData = new SslSocketData(getTestSslSocketFactory(), CwbiAuthTrustManager.getTrustManager());
5360
assertThrows(NullPointerException.class, () -> {
5461
OAuth2Token token = new DirectGrantX509TokenRequestBuilder()
55-
.withUrl(new ApiConnectionInfoBuilder("https://test.com")
62+
.withUrl(new ApiConnectionInfoBuilder("https://test.com/openid-configuration")
5663
.withSslSocketData(sslSocketData)
5764
.build())
5865
.withClientId(null)
@@ -72,13 +79,36 @@ void testDirectGrantX509TokenRequestBuilder() throws IOException {
7279
try (MockWebServer mockWebServer = new MockWebServer()) {
7380
SslSocketData sslSocketData = new SslSocketData(getTestSslSocketFactory(), CwbiAuthTrustManager.getTrustManager());
7481
String body = readJsonFile();
75-
mockWebServer.enqueue(new MockResponse().setBody(body).setResponseCode(200));
82+
mockWebServer.setDispatcher(new Dispatcher() {
83+
private final Logger LOGGER = Logger.getLogger(TestOidcTokenProvider.class.getName());
84+
@Override
85+
public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
86+
final HttpUrl url = request.getRequestUrl();
87+
final String path = url.encodedPath();
88+
LOGGER.fine("Request for: " + url.toString());
89+
LOGGER.fine("Path: " + path);
90+
91+
92+
if (path.endsWith("openid-configuration")) {
93+
fail("Using Direct Grant Request builder directly should not invoke the configuration request");
94+
}
95+
else if (path.endsWith("/auth")) {
96+
fail("CwbiTokenProvider uses direct grant and should not call the /auth endpoint.");
97+
}
98+
else if (path.endsWith("/token")) {
99+
return new MockResponse().setBody(body);
100+
}
101+
102+
return new MockResponse().setResponseCode(404).setBody("Request not mocked.");
103+
}
104+
});
76105
mockWebServer.start();
77-
String baseUrl = String.format("http://localhost:%s", mockWebServer.getPort());
106+
String baseUrl = String.format("http://localhost:%s/token", mockWebServer.getPort());
78107
OAuth2Token token = new DirectGrantX509TokenRequestBuilder()
79-
.withUrl(new ApiConnectionInfoBuilder(baseUrl)
108+
.withTokenUrl(new ApiConnectionInfoBuilder(baseUrl)
80109
.withSslSocketData(sslSocketData)
81110
.build())
111+
.buildRequest()
82112
.withClientId("cumulus")
83113
.fetchToken();
84114
assertNotNull(token);

cwbi-auth-http-client/src/test/java/hec/army/usace/hec/cwbi/auth/http/client/TestOidcTokenProvider.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,14 @@
6060
import okhttp3.mockwebserver.RecordedRequest;
6161

6262
import org.junit.jupiter.api.AfterEach;
63-
import static org.junit.jupiter.api.Assertions.assertNotSame;
64-
import static org.junit.jupiter.api.Assertions.assertSame;
65-
import static org.junit.jupiter.api.Assertions.assertThrows;
6663
import static org.junit.jupiter.api.Assertions.fail;
6764

6865
import org.junit.jupiter.api.BeforeAll;
6966
import org.junit.jupiter.api.BeforeEach;
7067
import org.junit.jupiter.api.Test;
71-
import org.mockito.Mock;
7268

7369
class TestOidcTokenProvider {
74-
70+
private static final Logger LOGGER = Logger.getLogger(TestOidcTokenProvider.class.getName());
7571
static MockHttpServer mockCdaServer;
7672
static MockHttpServer mockAuthServer;
7773

@@ -118,12 +114,12 @@ protected String getResource(String resource) throws IOException {
118114
@Test
119115
void testBuildTokenProvider() throws Exception {
120116
mockAuthServer.getMockServer().setDispatcher(new Dispatcher() {
121-
private static final Logger LOGGER = Logger.getLogger(TestOidcTokenProvider.class.getName()+"_dispatcher");
117+
private final Logger LOGGER = Logger.getLogger(TestOidcTokenProvider.class.getName()+"_dispatcher");
122118
@Override
123119
public MockResponse dispatch(RecordedRequest request) throws InterruptedException {
124120
final HttpUrl url = request.getRequestUrl();
125121
final String path = url.encodedPath();
126-
LOGGER.fine("Request for: " + url.toString());
122+
LOGGER.info("Request for: " + url.toString());
127123
LOGGER.fine("Path: " + path);
128124

129125
try {
@@ -134,8 +130,12 @@ public MockResponse dispatch(RecordedRequest request) throws InterruptedExceptio
134130
else if (path.endsWith("/auth")) {
135131
final String query = request.getRequestUrl().query();
136132
final QueryParameters parameters = QueryParameters.parse(query);
137-
final String loc = String.format("%s?code=test&state=a test", parameters.get("redirect_uri").get(0));
138-
return new MockResponse().setResponseCode(302).setHeader("Location", loc);
133+
String redirect = parameters.get("redirect_uri").get(0);
134+
String state = parameters.get("state").get(0);
135+
final String loc = String.format("%s?code=test&state=%s&session_state=zzz", redirect, state);
136+
MockResponse response = new MockResponse().setResponseCode(302).setHeader("Location", loc).setBody("hello");
137+
LOGGER.info(response.toString());
138+
return response;
139139
}
140140
else if (path.endsWith("/token")) {
141141
return new MockResponse().setBody(getResource("oauth2token.json"));
@@ -152,6 +152,7 @@ else if (path.endsWith("/token")) {
152152
OidcAuthTokenProvider tokenProvider = new OidcAuthTokenProvider("test", wellKnown);
153153
tokenProvider.setAuthCallback(u -> {
154154
try {
155+
LOGGER.info("Sending " + u.toString());
155156
HttpRequestExecutor executor =
156157
new HttpRequestBuilderImpl(new ApiConnectionInfoBuilder(u.toString()).build())
157158
.get()

cwms-http-client/src/test/java/mil/army/usace/hec/cwms/http/client/TestApiConnectionInfo.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,18 @@ public OAuth2Token newToken() {
233233
token.setScope("create");
234234
return token;
235235
}
236+
237+
@Override
238+
public ApiConnectionInfo getAuthUrl() {
239+
// TODO Auto-generated method stub
240+
throw new UnsupportedOperationException("Unimplemented method 'getAuthUrl'");
241+
}
242+
243+
@Override
244+
public ApiConnectionInfo getTokenUrl() {
245+
// TODO Auto-generated method stub
246+
throw new UnsupportedOperationException("Unimplemented method 'getTokenUrl'");
247+
}
236248
};
237249
}
238250

@@ -278,6 +290,18 @@ public OAuth2Token refreshToken() {
278290
public OAuth2Token newToken() {
279291
return null;
280292
}
293+
294+
@Override
295+
public ApiConnectionInfo getAuthUrl() {
296+
// TODO Auto-generated method stub
297+
throw new UnsupportedOperationException("Unimplemented method 'getAuthUrl'");
298+
}
299+
300+
@Override
301+
public ApiConnectionInfo getTokenUrl() {
302+
// TODO Auto-generated method stub
303+
throw new UnsupportedOperationException("Unimplemented method 'getTokenUrl'");
304+
}
281305
};
282306
}
283307

cwms-http-client/src/test/java/mil/army/usace/hec/cwms/http/client/TestOAuth2TokenAuthenticator.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,5 +261,17 @@ public OAuth2Token newToken() {
261261
token.setRefreshToken(ACCESS_TOKEN);
262262
return token;
263263
}
264+
265+
@Override
266+
public ApiConnectionInfo getAuthUrl() {
267+
// TODO Auto-generated method stub
268+
throw new UnsupportedOperationException("Unimplemented method 'getAuthUrl'");
269+
}
270+
271+
@Override
272+
public ApiConnectionInfo getTokenUrl() {
273+
// TODO Auto-generated method stub
274+
throw new UnsupportedOperationException("Unimplemented method 'getTokenUrl'");
275+
}
264276
}
265277
}

cwms-http-client/src/test/java/mil/army/usace/hec/cwms/http/client/TestOAuth2TokenInterceptor.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,18 @@ public OAuth2Token newToken() {
104104
return token;
105105
}
106106

107+
@Override
108+
public ApiConnectionInfo getAuthUrl() {
109+
// TODO Auto-generated method stub
110+
throw new UnsupportedOperationException("Unimplemented method 'getAuthUrl'");
111+
}
112+
113+
@Override
114+
public ApiConnectionInfo getTokenUrl() {
115+
// TODO Auto-generated method stub
116+
throw new UnsupportedOperationException("Unimplemented method 'getTokenUrl'");
117+
}
118+
107119
};
108120
}
109121
}

0 commit comments

Comments
 (0)