Add more tests for BootstrapExecutorConfiguration

See gh-45161

Signed-off-by: Dmytro Nosan <dimanosan@gmail.com>
This commit is contained in:
Dmytro Nosan 2025-04-11 13:01:54 +03:00 committed by Moritz Halbritter
parent 06cc550524
commit 409f74acc6
1 changed files with 51 additions and 29 deletions

View File

@ -19,8 +19,6 @@ package org.springframework.boot.autoconfigure.task;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
@ -381,42 +379,66 @@ class TaskExecutionAutoConfigurationTests {
} }
@Test @Test
void shouldAliasApplicationExecutorToBootstrapExecutor() { void shouldAliasApplicationTaskExecutorToBootstrapExecutor() {
this.contextRunner.run((context) -> { this.contextRunner.run((context) -> {
String[] aliases = context.getAliases("applicationTaskExecutor"); assertThat(context).hasSingleBean(Executor.class)
assertThat(aliases).containsExactly("bootstrapExecutor"); .hasBean("applicationTaskExecutor")
.hasBean("bootstrapExecutor");
assertThat(context.getAliases("applicationTaskExecutor")).containsExactly("bootstrapExecutor");
assertThat(context.getBean("bootstrapExecutor")).isSameAs(context.getBean("applicationTaskExecutor"));
}); });
} }
@Test @Test
void shouldNotAliasIfBootstrapExecutorIsDefined() { void shouldNotAliasApplicationTaskExecutorWhenBootstrapExecutorIsDefined() {
ExecutorService executor = Executors.newSingleThreadExecutor(); this.contextRunner.withBean("applicationTaskExecutor", Executor.class, () -> createCustomAsyncExecutor("app-"))
try { .withBean("bootstrapExecutor", Executor.class, () -> createCustomAsyncExecutor("bootstrap-"))
this.contextRunner.withBean("applicationTaskExecutor", Executor.class, () -> executor) .run((context) -> {
.withBean("bootstrapExecutor", Executor.class, () -> executor) assertThat(context.getBeansOfType(Executor.class)).hasSize(2);
.run((context) -> { assertThat(context).hasBean("applicationTaskExecutor").hasBean("bootstrapExecutor");
assertThat(context).hasBean("applicationTaskExecutor"); assertThat(context.getAliases("applicationTaskExecutor")).isEmpty();
String[] aliases = context.getAliases("applicationTaskExecutor"); assertThat(context.getBean("bootstrapExecutor"))
assertThat(aliases).isEmpty(); .isNotSameAs(context.getBean("applicationTaskExecutor"));
}); });
}
finally {
executor.shutdownNow();
}
} }
@Test @Test
void shouldNotAliasIfApplicationTaskExecutorIsMissing() { void shouldNotAliasApplicationTaskExecutorWhenApplicationTaskExecutorIsMissing() {
ExecutorService executor = Executors.newSingleThreadExecutor(); this.contextRunner.withBean("customExecutor", Executor.class, () -> createCustomAsyncExecutor("custom-"))
try { .run((context) -> assertThat(context).hasSingleBean(Executor.class)
this.contextRunner.withBean("customExecutor", Executor.class, () -> executor).run((context) -> { .hasBean("customExecutor")
assertThat(context).doesNotHaveBean("applicationTaskExecutor"); .doesNotHaveBean("applicationTaskExecutor")
assertThat(context).doesNotHaveBean("bootstrapExecutor"); .doesNotHaveBean("bootstrapExecutor"));
}
@Test
void shouldNotAliasApplicationTaskExecutorWhenBootstrapExecutorRegisteredAsSingleton() {
this.contextRunner.withBean("applicationTaskExecutor", Executor.class, () -> createCustomAsyncExecutor("app-"))
.withInitializer((context) -> context.getBeanFactory()
.registerSingleton("bootstrapExecutor", createCustomAsyncExecutor("bootstrap-")))
.run((context) -> {
assertThat(context.getBeansOfType(Executor.class)).hasSize(2);
assertThat(context).hasBean("applicationTaskExecutor").hasBean("bootstrapExecutor");
assertThat(context.getAliases("applicationTaskExecutor")).isEmpty();
assertThat(context.getBean("bootstrapExecutor"))
.isNotSameAs(context.getBean("applicationTaskExecutor"));
});
}
@Test
void shouldNotAliasApplicationTaskExecutorWhenBootstrapExecutorAliasIsDefined() {
Executor executor = Runnable::run;
this.contextRunner.withBean("applicationTaskExecutor", Executor.class, () -> executor)
.withBean("customExecutor", Executor.class, () -> createCustomAsyncExecutor("custom"))
.withInitializer((context) -> context.getBeanFactory().registerAlias("customExecutor", "bootstrapExecutor"))
.run((context) -> {
assertThat(context.getBeansOfType(Executor.class)).hasSize(2);
assertThat(context).hasBean("applicationTaskExecutor").hasBean("customExecutor");
assertThat(context.getAliases("applicationTaskExecutor")).isEmpty();
assertThat(context.getAliases("customExecutor")).contains("bootstrapExecutor");
assertThat(context.getBean("bootstrapExecutor")).isNotSameAs(context.getBean("applicationTaskExecutor"))
.isSameAs(context.getBean("customExecutor"));
}); });
}
finally {
executor.shutdownNow();
}
} }
private Executor createCustomAsyncExecutor(String threadNamePrefix) { private Executor createCustomAsyncExecutor(String threadNamePrefix) {