Skip to content

Commit d7138cd

Browse files
committed
Repair Flaky Tests
The error between MockWebServer and OpenSAML still happens on occasion. This commit uses MockWebServer's default queue dispatcher to remove any customization that might be contributing to the flakiness. Issue gh-15395
1 parent 1118b0e commit d7138cd

File tree

2 files changed

+20
-62
lines changed

2 files changed

+20
-62
lines changed

saml2/saml2-service-provider/src/opensaml4Test/java/org/springframework/security/saml2/provider/service/registration/OpenSaml4AssertingPartyMetadataRepositoryTests.java

+10-32
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public void setup() throws Exception {
9090
@Test
9191
public void withMetadataUrlLocationWhenResolvableThenFindByEntityIdReturns() throws Exception {
9292
try (MockWebServer server = new MockWebServer()) {
93-
server.setDispatcher(new AlwaysDispatch(this.metadata));
93+
enqueue(server, this.metadata, 3);
9494
AssertingPartyMetadataRepository parties = OpenSaml4AssertingPartyMetadataRepository
9595
.withTrustedMetadataLocation(server.url("/").toString())
9696
.build();
@@ -107,7 +107,7 @@ public void withMetadataUrlLocationWhenResolvableThenFindByEntityIdReturns() thr
107107
@Test
108108
public void withMetadataUrlLocationnWhenResolvableThenIteratorReturns() throws Exception {
109109
try (MockWebServer server = new MockWebServer()) {
110-
server.setDispatcher(new AlwaysDispatch(this.entitiesDescriptor));
110+
enqueue(server, this.entitiesDescriptor, 3);
111111
List<AssertingPartyMetadata> parties = new ArrayList<>();
112112
OpenSaml4AssertingPartyMetadataRepository.withTrustedMetadataLocation(server.url("/").toString())
113113
.build()
@@ -122,9 +122,6 @@ public void withMetadataUrlLocationnWhenResolvableThenIteratorReturns() throws E
122122
@Test
123123
public void withMetadataUrlLocationWhenUnresolvableThenThrowsSaml2Exception() throws Exception {
124124
try (MockWebServer server = new MockWebServer()) {
125-
server.enqueue(new MockResponse().setBody(this.metadata)
126-
.setResponseCode(200)
127-
.setBodyDelay(1, TimeUnit.MILLISECONDS));
128125
String url = server.url("/").toString();
129126
server.shutdown();
130127
assertThatExceptionOfType(Saml2Exception.class)
@@ -135,7 +132,7 @@ public void withMetadataUrlLocationWhenUnresolvableThenThrowsSaml2Exception() th
135132
@Test
136133
public void withMetadataUrlLocationWhenMalformedResponseThenSaml2Exception() throws Exception {
137134
try (MockWebServer server = new MockWebServer()) {
138-
server.setDispatcher(new AlwaysDispatch("malformed"));
135+
enqueue(server, "malformed", 3);
139136
String url = server.url("/").toString();
140137
assertThatExceptionOfType(Saml2Exception.class)
141138
.isThrownBy(() -> OpenSaml4AssertingPartyMetadataRepository.withTrustedMetadataLocation(url).build());
@@ -218,8 +215,7 @@ public void withTrustedMetadataLocationWhenMatchingCredentialsThenVerifiesSignat
218215
Credential credential = TestOpenSamlObjects
219216
.getSigningCredential(TestSaml2X509Credentials.relyingPartyVerifyingCredential(), descriptor.getEntityID());
220217
try (MockWebServer server = new MockWebServer()) {
221-
server.start();
222-
server.setDispatcher(new AlwaysDispatch(serialized));
218+
enqueue(server, serialized, 3);
223219
AssertingPartyMetadataRepository parties = OpenSaml4AssertingPartyMetadataRepository
224220
.withTrustedMetadataLocation(server.url("/").toString())
225221
.verificationCredentials((c) -> c.add(credential))
@@ -238,8 +234,7 @@ public void withTrustedMetadataLocationWhenMismatchingCredentialsThenSaml2Except
238234
Credential credential = TestOpenSamlObjects
239235
.getSigningCredential(TestSaml2X509Credentials.relyingPartyVerifyingCredential(), descriptor.getEntityID());
240236
try (MockWebServer server = new MockWebServer()) {
241-
server.start();
242-
server.setDispatcher(new AlwaysDispatch(serialized));
237+
enqueue(server, serialized, 3);
243238
assertThatExceptionOfType(Saml2Exception.class).isThrownBy(() -> OpenSaml4AssertingPartyMetadataRepository
244239
.withTrustedMetadataLocation(server.url("/").toString())
245240
.verificationCredentials((c) -> c.add(credential))
@@ -255,8 +250,7 @@ public void withTrustedMetadataLocationWhenNoCredentialsThenSkipsVerifySignature
255250
descriptor.getEntityID());
256251
String serialized = serialize(descriptor);
257252
try (MockWebServer server = new MockWebServer()) {
258-
server.start();
259-
server.setDispatcher(new AlwaysDispatch(serialized));
253+
enqueue(server, serialized, 3);
260254
AssertingPartyMetadataRepository parties = OpenSaml4AssertingPartyMetadataRepository
261255
.withTrustedMetadataLocation(server.url("/").toString())
262256
.build();
@@ -336,8 +330,7 @@ public void withMetadataLocationWhenMatchingCredentialsThenVerifiesSignature() t
336330
Credential credential = TestOpenSamlObjects
337331
.getSigningCredential(TestSaml2X509Credentials.relyingPartyVerifyingCredential(), descriptor.getEntityID());
338332
try (MockWebServer server = new MockWebServer()) {
339-
server.start();
340-
server.setDispatcher(new AlwaysDispatch(serialized));
333+
enqueue(server, serialized, 3);
341334
AssertingPartyMetadataRepository parties = OpenSaml4AssertingPartyMetadataRepository
342335
.withMetadataLocation(server.url("/").toString())
343336
.verificationCredentials((c) -> c.add(credential))
@@ -357,25 +350,10 @@ private static String serialize(XMLObject object) {
357350
}
358351
}
359352

360-
private static final class AlwaysDispatch extends Dispatcher {
361-
362-
private final MockResponse response;
363-
364-
private AlwaysDispatch(String body) {
365-
this.response = new MockResponse().setBody(body)
366-
.setResponseCode(200)
367-
.setBodyDelay(1, TimeUnit.MILLISECONDS);
368-
}
369-
370-
private AlwaysDispatch(MockResponse response) {
371-
this.response = response;
353+
private static void enqueue(MockWebServer web, String body, int times) {
354+
for (int i = 0; i < times; i++) {
355+
web.enqueue(new MockResponse().setBody(body).setResponseCode(200));
372356
}
373-
374-
@Override
375-
public MockResponse dispatch(RecordedRequest recordedRequest) throws InterruptedException {
376-
return this.response;
377-
}
378-
379357
}
380358

381359
}

saml2/saml2-service-provider/src/opensaml5Test/java/org/springframework/security/saml2/provider/service/registration/OpenSaml5AssertingPartyMetadataRepositoryTests.java

+10-30
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public void setup() throws Exception {
9090
@Test
9191
public void withMetadataUrlLocationWhenResolvableThenFindByEntityIdReturns() throws Exception {
9292
try (MockWebServer server = new MockWebServer()) {
93-
server.setDispatcher(new AlwaysDispatch(this.metadata));
93+
enqueue(server, this.metadata, 3);
9494
AssertingPartyMetadataRepository parties = OpenSaml5AssertingPartyMetadataRepository
9595
.withTrustedMetadataLocation(server.url("/").toString())
9696
.build();
@@ -107,7 +107,7 @@ public void withMetadataUrlLocationWhenResolvableThenFindByEntityIdReturns() thr
107107
@Test
108108
public void withMetadataUrlLocationnWhenResolvableThenIteratorReturns() throws Exception {
109109
try (MockWebServer server = new MockWebServer()) {
110-
server.setDispatcher(new AlwaysDispatch(this.entitiesDescriptor));
110+
enqueue(server, this.entitiesDescriptor, 3);
111111
List<AssertingPartyMetadata> parties = new ArrayList<>();
112112
OpenSaml5AssertingPartyMetadataRepository.withTrustedMetadataLocation(server.url("/").toString())
113113
.build()
@@ -122,7 +122,6 @@ public void withMetadataUrlLocationnWhenResolvableThenIteratorReturns() throws E
122122
@Test
123123
public void withMetadataUrlLocationWhenUnresolvableThenThrowsSaml2Exception() throws Exception {
124124
try (MockWebServer server = new MockWebServer()) {
125-
server.enqueue(new MockResponse().setBody(this.metadata).setResponseCode(200));
126125
String url = server.url("/").toString();
127126
server.shutdown();
128127
assertThatExceptionOfType(Saml2Exception.class)
@@ -133,7 +132,7 @@ public void withMetadataUrlLocationWhenUnresolvableThenThrowsSaml2Exception() th
133132
@Test
134133
public void withMetadataUrlLocationWhenMalformedResponseThenSaml2Exception() throws Exception {
135134
try (MockWebServer server = new MockWebServer()) {
136-
server.setDispatcher(new AlwaysDispatch("malformed"));
135+
enqueue(server, "malformed", 3);
137136
String url = server.url("/").toString();
138137
assertThatExceptionOfType(Saml2Exception.class)
139138
.isThrownBy(() -> OpenSaml5AssertingPartyMetadataRepository.withTrustedMetadataLocation(url).build());
@@ -216,8 +215,7 @@ public void withTrustedMetadataLocationWhenMatchingCredentialsThenVerifiesSignat
216215
Credential credential = TestOpenSamlObjects
217216
.getSigningCredential(TestSaml2X509Credentials.relyingPartyVerifyingCredential(), descriptor.getEntityID());
218217
try (MockWebServer server = new MockWebServer()) {
219-
server.start();
220-
server.setDispatcher(new AlwaysDispatch(serialized));
218+
enqueue(server, serialized, 3);
221219
AssertingPartyMetadataRepository parties = OpenSaml5AssertingPartyMetadataRepository
222220
.withTrustedMetadataLocation(server.url("/").toString())
223221
.verificationCredentials((c) -> c.add(credential))
@@ -236,8 +234,7 @@ public void withTrustedMetadataLocationWhenMismatchingCredentialsThenSaml2Except
236234
Credential credential = TestOpenSamlObjects
237235
.getSigningCredential(TestSaml2X509Credentials.relyingPartyVerifyingCredential(), descriptor.getEntityID());
238236
try (MockWebServer server = new MockWebServer()) {
239-
server.start();
240-
server.setDispatcher(new AlwaysDispatch(serialized));
237+
enqueue(server, serialized, 3);
241238
assertThatExceptionOfType(Saml2Exception.class).isThrownBy(() -> OpenSaml5AssertingPartyMetadataRepository
242239
.withTrustedMetadataLocation(server.url("/").toString())
243240
.verificationCredentials((c) -> c.add(credential))
@@ -253,8 +250,7 @@ public void withTrustedMetadataLocationWhenNoCredentialsThenSkipsVerifySignature
253250
descriptor.getEntityID());
254251
String serialized = serialize(descriptor);
255252
try (MockWebServer server = new MockWebServer()) {
256-
server.start();
257-
server.setDispatcher(new AlwaysDispatch(serialized));
253+
enqueue(server, serialized, 3);
258254
AssertingPartyMetadataRepository parties = OpenSaml5AssertingPartyMetadataRepository
259255
.withTrustedMetadataLocation(server.url("/").toString())
260256
.build();
@@ -334,8 +330,7 @@ public void withMetadataLocationWhenMatchingCredentialsThenVerifiesSignature() t
334330
Credential credential = TestOpenSamlObjects
335331
.getSigningCredential(TestSaml2X509Credentials.relyingPartyVerifyingCredential(), descriptor.getEntityID());
336332
try (MockWebServer server = new MockWebServer()) {
337-
server.start();
338-
server.setDispatcher(new AlwaysDispatch(serialized));
333+
enqueue(server, serialized, 3);
339334
AssertingPartyMetadataRepository parties = OpenSaml5AssertingPartyMetadataRepository
340335
.withMetadataLocation(server.url("/").toString())
341336
.verificationCredentials((c) -> c.add(credential))
@@ -355,25 +350,10 @@ private static String serialize(XMLObject object) {
355350
}
356351
}
357352

358-
private static final class AlwaysDispatch extends Dispatcher {
359-
360-
private final MockResponse response;
361-
362-
private AlwaysDispatch(String body) {
363-
this.response = new MockResponse().setBody(body)
364-
.setResponseCode(200)
365-
.setBodyDelay(1, TimeUnit.MILLISECONDS);
366-
}
367-
368-
private AlwaysDispatch(MockResponse response) {
369-
this.response = response;
353+
private static void enqueue(MockWebServer web, String body, int times) {
354+
for (int i = 0; i < times; i++) {
355+
web.enqueue(new MockResponse().setBody(body).setResponseCode(200));
370356
}
371-
372-
@Override
373-
public MockResponse dispatch(RecordedRequest recordedRequest) throws InterruptedException {
374-
return this.response;
375-
}
376-
377357
}
378358

379359
}

0 commit comments

Comments
 (0)