Skip to content

Commit 37e592c

Browse files
authored
[grid] Fix flaky Distributor and GraphqlHandlerTest. Add queuer config to DistributedCdpTest (#8859)
* Add queuer config to DistributedCdpTest set up. * Add wait to DistributorTest and GraphqlHandlerTest to allow node to be added before creating session.
1 parent 4b00c8f commit 37e592c

File tree

4 files changed

+67
-28
lines changed

4 files changed

+67
-28
lines changed

java/server/test/org/openqa/selenium/grid/distributor/DistributorTest.java

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ public class DistributorTest {
104104
private Capabilities stereotype;
105105
private Capabilities caps;
106106
private final Secret registrationSecret = new Secret("hellim");
107+
private final Wait<Object> wait = new FluentWait<>(new Object()).withTimeout(Duration.ofSeconds(5));
107108

108109
@Before
109110
public void setUp() {
@@ -309,6 +310,8 @@ public void testDrainedNodeShutsDownOnceEmpty() throws URISyntaxException, Inter
309310
queuer,
310311
registrationSecret);
311312
distributor.add(node);
313+
wait.until(obj -> distributor.getStatus().hasCapacity());
314+
312315
distributor.drain(node.getId());
313316

314317
latch.await(5, TimeUnit.SECONDS);
@@ -352,6 +355,8 @@ public void drainedNodeDoesNotShutDownIfNotEmpty()
352355
registrationSecret);
353356
distributor.add(node);
354357

358+
wait.until(obj -> distributor.getStatus().hasCapacity());
359+
355360
NewSessionPayload payload = NewSessionPayload.create(caps);
356361
distributor.newSession(createRequest(payload));
357362

@@ -394,6 +399,8 @@ public void drainedNodeShutsDownAfterSessionsFinish()
394399
registrationSecret);
395400
distributor.add(node);
396401

402+
wait.until(obj -> distributor.getStatus().hasCapacity());
403+
397404
NewSessionPayload payload = NewSessionPayload.create(caps);
398405
CreateSessionResponse firstResponse = distributor.newSession(createRequest(payload));
399406
CreateSessionResponse secondResponse = distributor.newSession(createRequest(payload));
@@ -504,6 +511,8 @@ public void theMostLightlyLoadedNodeIsSelectedFirst() {
504511
.add(lightest)
505512
.add(massive);
506513

514+
wait.until(obj -> distributor.getStatus().hasCapacity());
515+
507516
try (NewSessionPayload payload = NewSessionPayload.create(caps)) {
508517
Session session = distributor.newSession(createRequest(payload)).getSession();
509518

@@ -633,7 +642,9 @@ public void shouldIncludeHostsThatAreUpInHostList() {
633642
}
634643

635644
@Test
636-
public void shouldNotScheduleAJobIfAllSlotsAreBeingUsed() {
645+
public void shouldNotScheduleAJobIfAllSlotsAreBeingUsed() throws URISyntaxException {
646+
URI nodeUri = new URI("http://example:5678");
647+
URI routableUri = new URI("http://localhost:1234");
637648
SessionMap sessions = new LocalSessionMap(tracer, bus);
638649
LocalNewSessionQueue localNewSessionQueue = new LocalNewSessionQueue(
639650
tracer,
@@ -642,19 +653,20 @@ public void shouldNotScheduleAJobIfAllSlotsAreBeingUsed() {
642653
Duration.ofSeconds(2));
643654
LocalNewSessionQueuer queuer = new LocalNewSessionQueuer(tracer, bus, localNewSessionQueue);
644655

645-
CombinedHandler handler = new CombinedHandler();
656+
LocalNode node = LocalNode.builder(tracer, bus, routableUri, routableUri, registrationSecret)
657+
.add(caps, new TestSessionFactory((id, c) -> new Session(
658+
id, nodeUri, stereotype, c, Instant.now())))
659+
.build();
646660
Distributor distributor = new LocalDistributor(
647661
tracer,
648662
bus,
649-
new PassthroughHttpClient.Factory(handler),
663+
new PassthroughHttpClient.Factory(node),
650664
sessions,
651665
queuer,
652666
registrationSecret);
653-
handler.addHandler(distributor);
654667

655-
Node node = createNode(caps, 1, 0);
656-
handler.addHandler(node);
657668
distributor.add(node);
669+
wait.until(obj -> distributor.getStatus().hasCapacity());
658670

659671
// Use up the one slot available
660672
try (NewSessionPayload payload = NewSessionPayload.create(caps)) {
@@ -669,7 +681,9 @@ public void shouldNotScheduleAJobIfAllSlotsAreBeingUsed() {
669681
}
670682

671683
@Test
672-
public void shouldReleaseSlotOnceSessionEnds() {
684+
public void shouldReleaseSlotOnceSessionEnds() throws URISyntaxException {
685+
URI nodeUri = new URI("http://example:5678");
686+
URI routableUri = new URI("http://localhost:1234");
673687
SessionMap sessions = new LocalSessionMap(tracer, bus);
674688
LocalNewSessionQueue localNewSessionQueue = new LocalNewSessionQueue(
675689
tracer,
@@ -678,20 +692,22 @@ public void shouldReleaseSlotOnceSessionEnds() {
678692
Duration.ofSeconds(2));
679693
LocalNewSessionQueuer queuer = new LocalNewSessionQueuer(tracer, bus, localNewSessionQueue);
680694

681-
CombinedHandler handler = new CombinedHandler();
695+
LocalNode node = LocalNode.builder(tracer, bus, routableUri, routableUri, registrationSecret)
696+
.add(caps, new TestSessionFactory((id, c) -> new Session(
697+
id, nodeUri, stereotype, c, Instant.now())))
698+
.build();
699+
682700
Distributor distributor = new LocalDistributor(
683701
tracer,
684702
bus,
685-
new PassthroughHttpClient.Factory(handler),
703+
new PassthroughHttpClient.Factory(node),
686704
sessions,
687705
queuer,
688706
registrationSecret);
689-
handler.addHandler(distributor);
690-
691-
Node node = createNode(caps, 1, 0);
692-
handler.addHandler(node);
693707
distributor.add(node);
694708

709+
wait.until(obj -> distributor.getStatus().hasCapacity());
710+
695711
// Use up the one slot available
696712
Session session;
697713
try (NewSessionPayload payload = NewSessionPayload.create(caps)) {
@@ -702,9 +718,7 @@ public void shouldReleaseSlotOnceSessionEnds() {
702718
sessions.get(session.getId());
703719

704720
node.stop(session.getId());
705-
706721
// Now wait for the session map to say the session is gone.
707-
Wait<Object> wait = new FluentWait<>(new Object()).withTimeout(Duration.ofSeconds(2));
708722
wait.until(obj -> {
709723
try {
710724
sessions.get(session.getId());
@@ -756,8 +770,9 @@ public void shouldNotStartASessionIfTheCapabilitiesAreNotSupported() {
756770
}
757771

758772
@Test
759-
public void attemptingToStartASessionWhichFailsMarksAsTheSlotAsAvailable() {
760-
CombinedHandler handler = new CombinedHandler();
773+
public void attemptingToStartASessionWhichFailsMarksAsTheSlotAsAvailable() throws URISyntaxException {
774+
URI nodeUri = new URI("http://example:5678");
775+
URI routableUri = new URI("http://localhost:1234");
761776

762777
SessionMap sessions = new LocalSessionMap(tracer, bus);
763778
LocalNewSessionQueue localNewSessionQueue = new LocalNewSessionQueue(
@@ -766,26 +781,24 @@ public void attemptingToStartASessionWhichFailsMarksAsTheSlotAsAvailable() {
766781
Duration.ofSeconds(2),
767782
Duration.ofSeconds(2));
768783
LocalNewSessionQueuer queuer = new LocalNewSessionQueuer(tracer, bus, localNewSessionQueue);
769-
handler.addHandler(sessions);
770784

771-
URI uri = createUri();
772-
Node node = LocalNode.builder(tracer, bus, uri, uri, registrationSecret)
773-
.add(caps, new TestSessionFactory((id, caps) -> {
774-
throw new SessionNotCreatedException("OMG");
775-
}))
776-
.build();
777-
handler.addHandler(node);
785+
LocalNode node = LocalNode.builder(tracer, bus, routableUri, routableUri, registrationSecret)
786+
.add(caps, new TestSessionFactory((id, caps) -> {
787+
throw new SessionNotCreatedException("OMG");
788+
}))
789+
.build();
778790

779791
Distributor distributor = new LocalDistributor(
780792
tracer,
781793
bus,
782-
new PassthroughHttpClient.Factory(handler),
794+
new PassthroughHttpClient.Factory(node),
783795
sessions,
784796
queuer,
785797
registrationSecret);
786-
handler.addHandler(distributor);
787798
distributor.add(node);
788799

800+
wait.until(obj -> distributor.getStatus().hasCapacity());
801+
789802
try (NewSessionPayload payload = NewSessionPayload.create(caps)) {
790803
assertThatExceptionOfType(SessionNotCreatedException.class)
791804
.isThrownBy(() -> distributor.newSession(createRequest(payload)));

java/server/test/org/openqa/selenium/grid/graphql/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ java_test_suite(
1414
deps = [
1515
"//java/client/src/org/openqa/selenium/json",
1616
"//java/client/src/org/openqa/selenium/remote",
17+
"//java/client/src/org/openqa/selenium/support",
1718
"//java/client/test/org/openqa/selenium/remote/tracing:tracing-support",
1819
"//java/server/src/org/openqa/selenium/events",
1920
"//java/server/src/org/openqa/selenium/events/local",

java/server/test/org/openqa/selenium/grid/graphql/GraphqlHandlerTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
import org.openqa.selenium.remote.http.HttpResponse;
4949
import org.openqa.selenium.remote.tracing.DefaultTestTracer;
5050
import org.openqa.selenium.remote.tracing.Tracer;
51+
import org.openqa.selenium.support.ui.FluentWait;
52+
import org.openqa.selenium.support.ui.Wait;
5153

5254
import java.io.IOException;
5355
import java.io.UncheckedIOException;
@@ -77,6 +79,7 @@ public class GraphqlHandlerTest {
7779
private ImmutableCapabilities caps;
7880
private ImmutableCapabilities stereotype;
7981
private NewSessionPayload payload;
82+
private final Wait<Object> wait = new FluentWait<>(new Object()).withTimeout(Duration.ofSeconds(5));
8083

8184
public GraphqlHandlerTest() throws URISyntaxException {
8285
}
@@ -146,6 +149,7 @@ public boolean test(Capabilities capabilities) {
146149
})
147150
.build();
148151
distributor.add(node);
152+
wait.until(obj -> distributor.getStatus().hasCapacity());
149153

150154
GraphqlHandler handler = new GraphqlHandler(distributor, publicUri);
151155
Map<String, Object> topLevel = executeQuery(handler, "{ grid { nodes { uri } } }");
@@ -169,6 +173,8 @@ public void shouldBeAbleToGetSessionInfo() throws URISyntaxException {
169173
Instant.now()))).build();
170174

171175
distributor.add(node);
176+
wait.until(obj -> distributor.getStatus().hasCapacity());
177+
172178
Session session = distributor.newSession(createRequest(payload)).getSession();
173179

174180
assertThat(session).isNotNull();
@@ -215,6 +221,8 @@ public void shouldBeAbleToGetNodeInfoForSession() throws URISyntaxException {
215221
Instant.now()))).build();
216222

217223
distributor.add(node);
224+
wait.until(obj -> distributor.getStatus().hasCapacity());
225+
218226
Session session = distributor.newSession(createRequest(payload)).getSession();
219227

220228
assertThat(session).isNotNull();
@@ -260,6 +268,8 @@ public void shouldBeAbleToGetSlotInfoForSession() throws URISyntaxException {
260268
Instant.now()))).build();
261269

262270
distributor.add(node);
271+
wait.until(obj -> distributor.getStatus().hasCapacity());
272+
263273
Session session = distributor.newSession(createRequest(payload)).getSession();
264274

265275
assertThat(session).isNotNull();
@@ -311,6 +321,8 @@ public void shouldBeAbleToGetSessionDuration() throws URISyntaxException {
311321
Instant.now()))).build();
312322

313323
distributor.add(node);
324+
wait.until(obj -> distributor.getStatus().hasCapacity());
325+
314326
Session session = distributor.newSession(createRequest(payload)).getSession();
315327

316328
assertThat(session).isNotNull();
@@ -341,6 +353,7 @@ public void shouldThrowExceptionWhenSessionNotFound() throws URISyntaxException
341353
Instant.now()))).build();
342354

343355
distributor.add(node);
356+
wait.until(obj -> distributor.getStatus().hasCapacity());
344357

345358
String randomSessionId = UUID.randomUUID().toString();
346359
String query = "{ session (id: \"" + randomSessionId + "\") { sessionDurationMillis } }";
@@ -376,6 +389,7 @@ public void shouldThrowExceptionWhenSessionIsEmpty() throws URISyntaxException {
376389
Instant.now()))).build();
377390

378391
distributor.add(node);
392+
wait.until(obj -> distributor.getStatus().hasCapacity());
379393

380394
String query = "{ session (id: \"\") { sessionDurationMillis } }";
381395

java/server/test/org/openqa/selenium/grid/router/DistributedCdpTest.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.openqa.selenium.grid.server.BaseServerOptions;
3333
import org.openqa.selenium.grid.server.Server;
3434
import org.openqa.selenium.grid.sessionmap.httpd.SessionMapServer;
35+
import org.openqa.selenium.grid.sessionqueue.httpd.NewSessionQueuerServer;
3536
import org.openqa.selenium.grid.web.Values;
3637
import org.openqa.selenium.net.PortProber;
3738
import org.openqa.selenium.netty.server.NettyServer;
@@ -84,11 +85,21 @@ public void ensureBasicFunctionality() throws MalformedURLException, Interrupted
8485
mergeArgs(eventBusFlags, "--bind-bus", "false", "--port", "" + sessionsPort)).run();
8586
waitUntilUp(sessionsPort);
8687

88+
int queuerPort = PortProber.findFreePort();
89+
new NewSessionQueuerServer().configure(
90+
System.out,
91+
System.err,
92+
mergeArgs(eventBusFlags, "--bind-bus", "false", "--port", "" + queuerPort)).run();
93+
waitUntilUp(sessionsPort);
94+
8795
int distributorPort = PortProber.findFreePort();
8896
new DistributorServer().configure(
8997
System.out,
9098
System.err,
91-
mergeArgs(eventBusFlags, "--bind-bus", "false", "--port", "" + distributorPort, "-s", "http://localhost:" + sessionsPort)).run();
99+
mergeArgs(eventBusFlags,
100+
"--bind-bus", "false", "--port", "" + distributorPort,
101+
"-s", "http://localhost:" + sessionsPort,
102+
"--sessionqueuer", "http://localhost:" + queuerPort)).run();
92103
waitUntilUp(distributorPort);
93104

94105
int routerPort = PortProber.findFreePort();

0 commit comments

Comments
 (0)