Skip to content

Commit d47f9fc

Browse files
committed
Add test for WorkerLeaseManager and WorkerLease
1 parent 855880f commit d47f9fc

File tree

2 files changed

+62
-6
lines changed

2 files changed

+62
-6
lines changed

junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/ConcurrentHierarchicalTestExecutorService.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public ConcurrentHierarchicalTestExecutorService(ParallelExecutionConfiguration
7272
threadPool = new ThreadPoolExecutor(configuration.getCorePoolSize(), configuration.getMaxPoolSize(),
7373
configuration.getKeepAliveSeconds(), SECONDS, new SynchronousQueue<>(), threadFactory);
7474
parallelism = configuration.getParallelism();
75-
workerLeaseManager = new WorkerLeaseManager(parallelism);
75+
workerLeaseManager = new WorkerLeaseManager(parallelism, this::maybeStartWorker);
7676
LOGGER.trace(() -> "initialized thread pool for parallelism of " + configuration.getParallelism());
7777
}
7878

@@ -554,12 +554,14 @@ private boolean isContainer() {
554554

555555
}
556556

557-
private class WorkerLeaseManager {
557+
static class WorkerLeaseManager {
558558

559559
private final Semaphore semaphore;
560+
private final Runnable onRelease;
560561

561-
WorkerLeaseManager(int parallelism) {
562-
semaphore = new Semaphore(parallelism);
562+
WorkerLeaseManager(int parallelism, Runnable onRelease) {
563+
this.semaphore = new Semaphore(parallelism);
564+
this.onRelease = onRelease;
563565
}
564566

565567
@Nullable
@@ -575,7 +577,7 @@ WorkerLease tryAcquire() {
575577
private ReacquisitionToken release() {
576578
semaphore.release();
577579
LOGGER.trace(() -> "release worker lease (available: %d)".formatted(semaphore.availablePermits()));
578-
maybeStartWorker();
580+
onRelease.run();
579581
return new ReacquisitionToken();
580582
}
581583

@@ -596,7 +598,7 @@ void reacquire() throws InterruptedException {
596598
}
597599
}
598600

599-
private static class WorkerLease implements AutoCloseable {
601+
static class WorkerLease implements AutoCloseable {
600602

601603
private final Supplier<WorkerLeaseManager.ReacquisitionToken> releaseAction;
602604
private WorkerLeaseManager.@Nullable ReacquisitionToken reacquisitionToken;
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright 2015-2025 the original author or authors.
3+
*
4+
* All rights reserved. This program and the accompanying materials are
5+
* made available under the terms of the Eclipse Public License v2.0 which
6+
* accompanies this distribution and is available at
7+
*
8+
* https://www.eclipse.org/legal/epl-v20.html
9+
*/
10+
11+
package org.junit.platform.engine.support.hierarchical;
12+
13+
import static org.assertj.core.api.Assertions.assertThat;
14+
15+
import java.util.concurrent.atomic.AtomicInteger;
16+
17+
import org.junit.jupiter.api.Test;
18+
import org.junit.platform.engine.support.hierarchical.ConcurrentHierarchicalTestExecutorService.WorkerLeaseManager;
19+
20+
class WorkerLeaseManagerTests {
21+
22+
@Test
23+
void releasingIsIdempotent() {
24+
var released = new AtomicInteger();
25+
var manager = new WorkerLeaseManager(1, released::incrementAndGet);
26+
27+
var lease = manager.tryAcquire();
28+
assertThat(lease).isNotNull();
29+
30+
lease.close();
31+
assertThat(released.get()).isEqualTo(1);
32+
33+
lease.close();
34+
assertThat(released.get()).isEqualTo(1);
35+
}
36+
37+
@Test
38+
void leaseCanBeReacquired() throws Exception {
39+
var released = new AtomicInteger();
40+
var manager = new WorkerLeaseManager(1, released::incrementAndGet);
41+
42+
var lease = manager.tryAcquire();
43+
assertThat(lease).isNotNull();
44+
45+
lease.close();
46+
assertThat(released.get()).isEqualTo(1);
47+
48+
lease.reacquire();
49+
assertThat(released.get()).isEqualTo(1);
50+
51+
lease.close();
52+
assertThat(released.get()).isEqualTo(2);
53+
}
54+
}

0 commit comments

Comments
 (0)