Commit e4e56bbc authored by Stephane Nicoll's avatar Stephane Nicoll

Migrate to ApplicationContextRunner

parent 3fa8fe85
...@@ -21,8 +21,6 @@ import java.util.concurrent.Executors; ...@@ -21,8 +21,6 @@ import java.util.concurrent.Executors;
import javax.sql.DataSource; import javax.sql.DataSource;
import com.zaxxer.hikari.HikariDataSource;
import org.junit.After;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.quartz.Calendar; import org.quartz.Calendar;
...@@ -31,7 +29,6 @@ import org.quartz.JobDetail; ...@@ -31,7 +29,6 @@ import org.quartz.JobDetail;
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionContext;
import org.quartz.JobKey; import org.quartz.JobKey;
import org.quartz.Scheduler; import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger; import org.quartz.Trigger;
import org.quartz.TriggerBuilder; import org.quartz.TriggerBuilder;
...@@ -42,13 +39,14 @@ import org.quartz.simpl.RAMJobStore; ...@@ -42,13 +39,14 @@ import org.quartz.simpl.RAMJobStore;
import org.quartz.simpl.SimpleThreadPool; import org.quartz.simpl.SimpleThreadPool;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration; import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.context.runner.ContextConsumer;
import org.springframework.boot.test.rule.OutputCapture; import org.springframework.boot.test.rule.OutputCapture;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
...@@ -59,7 +57,6 @@ import org.springframework.scheduling.quartz.LocalDataSourceJobStore; ...@@ -59,7 +57,6 @@ import org.springframework.scheduling.quartz.LocalDataSourceJobStore;
import org.springframework.scheduling.quartz.LocalTaskExecutorThreadPool; import org.springframework.scheduling.quartz.LocalTaskExecutorThreadPool;
import org.springframework.scheduling.quartz.QuartzJobBean; import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.containsString;
...@@ -75,163 +72,178 @@ public class QuartzAutoConfigurationTests { ...@@ -75,163 +72,178 @@ public class QuartzAutoConfigurationTests {
@Rule @Rule
public OutputCapture output = new OutputCapture(); public OutputCapture output = new OutputCapture();
private ConfigurableApplicationContext context; private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withPropertyValues("spring.datasource.generate-unique-name=true")
@After .withConfiguration(AutoConfigurations.of(QuartzAutoConfiguration.class));
public void closeContext() {
if (this.context != null) {
this.context.close();
}
}
@Test @Test
public void withNoDataSource() throws Exception { public void withNoDataSource() {
load(); this.contextRunner.run((context) -> {
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); assertThat(context).hasSingleBean(Scheduler.class);
Scheduler scheduler = this.context.getBean(Scheduler.class); Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getMetaData().getJobStoreClass()) assertThat(scheduler.getMetaData().getJobStoreClass())
.isAssignableFrom(RAMJobStore.class); .isAssignableFrom(RAMJobStore.class);
});
} }
@Test @Test
public void withDataSourceUseMemoryByDefault() throws Exception { public void withDataSourceUseMemoryByDefault() {
load(new Class<?>[] { EmbeddedDataSourceConfiguration.class, this.contextRunner.withConfiguration(AutoConfigurations.of(
DataSourceTransactionManagerAutoConfiguration.class }); DataSourceAutoConfiguration.class,
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); DataSourceTransactionManagerAutoConfiguration.class)).run((context) -> {
Scheduler scheduler = this.context.getBean(Scheduler.class); assertThat(context).hasSingleBean(Scheduler.class);
Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getMetaData().getJobStoreClass()) assertThat(scheduler.getMetaData().getJobStoreClass())
.isAssignableFrom(RAMJobStore.class); .isAssignableFrom(RAMJobStore.class);
});
} }
@Test @Test
public void withDataSource() throws Exception { public void withDataSource() {
load(new Class<?>[] { QuartzJobsConfiguration.class, this.contextRunner.withUserConfiguration(QuartzJobsConfiguration.class)
EmbeddedDataSourceConfiguration.class, .withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class }, DataSourceTransactionManagerAutoConfiguration.class))
"spring.quartz.job-store-type=jdbc"); .withPropertyValues("spring.quartz.job-store-type=jdbc")
testWithDataSource(); .run(assertDataSourceJobStore("dataSource"));
} }
@Test @Test
public void withDataSourceNoTransactionManager() throws Exception { public void withDataSourceNoTransactionManager() {
load(new Class<?>[] { QuartzJobsConfiguration.class, this.contextRunner.withUserConfiguration(QuartzJobsConfiguration.class)
EmbeddedDataSourceConfiguration.class }, .withConfiguration(AutoConfigurations.of(
"spring.quartz.job-store-type=jdbc"); DataSourceAutoConfiguration.class))
testWithDataSource(); .withPropertyValues("spring.quartz.job-store-type=jdbc")
.run(assertDataSourceJobStore("dataSource"));
} }
private void testWithDataSource() throws SchedulerException { @Test
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); public void dataSourceWithQuartzDataSourceQualifierUsedWhenMultiplePresent() {
Scheduler scheduler = this.context.getBean(Scheduler.class); this.contextRunner
.withUserConfiguration(QuartzJobsConfiguration.class,
MultipleDataSourceConfiguration.class)
.withPropertyValues("spring.quartz.job-store-type=jdbc")
.run(assertDataSourceJobStore("quartzDataSource"));
}
private ContextConsumer<AssertableApplicationContext> assertDataSourceJobStore(
String datasourceName) {
return (context) -> {
assertThat(context).hasSingleBean(Scheduler.class);
Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getMetaData().getJobStoreClass()) assertThat(scheduler.getMetaData().getJobStoreClass())
.isAssignableFrom(LocalDataSourceJobStore.class); .isAssignableFrom(LocalDataSourceJobStore.class);
JdbcTemplate jdbcTemplate = new JdbcTemplate( JdbcTemplate jdbcTemplate = new JdbcTemplate(context.getBean(
this.context.getBean(DataSource.class)); datasourceName, DataSource.class));
assertThat(jdbcTemplate.queryForObject("SELECT COUNT(*) FROM QRTZ_JOB_DETAILS",
Integer.class)).isEqualTo(2);
assertThat(jdbcTemplate.queryForObject( assertThat(jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM QRTZ_SIMPLE_TRIGGERS", Integer.class)).isEqualTo(0); "SELECT COUNT(*) FROM QRTZ_JOB_DETAILS", Integer.class)).isEqualTo(2);
assertThat(jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM QRTZ_SIMPLE_TRIGGERS", Integer.class))
.isEqualTo(0);
};
} }
@Test @Test
public void withTaskExecutor() throws Exception { public void withTaskExecutor() {
load(QuartzExecutorConfiguration.class); this.contextRunner.withUserConfiguration(QuartzExecutorConfiguration.class)
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); .run((context) -> {
Scheduler scheduler = this.context.getBean(Scheduler.class); assertThat(context).hasSingleBean(Scheduler.class);
Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getMetaData().getThreadPoolClass()) assertThat(scheduler.getMetaData().getThreadPoolClass())
.isEqualTo(LocalTaskExecutorThreadPool.class); .isEqualTo(LocalTaskExecutorThreadPool.class);
});
} }
@Test @Test
public void withMultipleTaskExecutors() throws Exception { public void withMultipleTaskExecutors() {
load(QuartzMultipleExecutorsConfiguration.class); this.contextRunner
assertThat(this.context.getBeansOfType(Executor.class)).hasSize(2); .withUserConfiguration(QuartzMultipleExecutorsConfiguration.class)
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); .run((context) -> {
Scheduler scheduler = this.context.getBean(Scheduler.class); assertThat(context.getBeansOfType(Executor.class)).hasSize(2);
assertThat(context).hasSingleBean(Scheduler.class);
Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getMetaData().getThreadPoolClass()) assertThat(scheduler.getMetaData().getThreadPoolClass())
.isEqualTo(SimpleThreadPool.class); .isEqualTo(SimpleThreadPool.class);
});
} }
@Test @Test
public void withMultipleTaskExecutorsWithPrimary() throws Exception { public void withMultipleTaskExecutorsWithPrimary() {
load(QuartzMultipleExecutorsWithPrimaryConfiguration.class); this.contextRunner
assertThat(this.context.getBeansOfType(Executor.class)).hasSize(2); .withUserConfiguration(
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); QuartzMultipleExecutorsWithPrimaryConfiguration.class)
Scheduler scheduler = this.context.getBean(Scheduler.class); .run((context) -> {
assertThat(context.getBeansOfType(Executor.class)).hasSize(2);
assertThat(context).hasSingleBean(Scheduler.class);
Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getMetaData().getThreadPoolClass()) assertThat(scheduler.getMetaData().getThreadPoolClass())
.isEqualTo(LocalTaskExecutorThreadPool.class); .isEqualTo(LocalTaskExecutorThreadPool.class);
});
} }
@Test @Test
public void withMultipleTaskExecutorsWithCustomizer() throws Exception { public void withMultipleTaskExecutorsWithCustomizer() {
load(QuartzMultipleExecutorsWithCustomizerConfiguration.class); this.contextRunner
assertThat(this.context.getBeansOfType(Executor.class)).hasSize(3); .withUserConfiguration(
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); QuartzMultipleExecutorsWithCustomizerConfiguration.class)
Scheduler scheduler = this.context.getBean(Scheduler.class); .run((context) -> {
assertThat(context.getBeansOfType(Executor.class)).hasSize(3);
assertThat(context).hasSingleBean(Scheduler.class);
Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getMetaData().getThreadPoolClass()) assertThat(scheduler.getMetaData().getThreadPoolClass())
.isEqualTo(LocalTaskExecutorThreadPool.class); .isEqualTo(LocalTaskExecutorThreadPool.class);
});
} }
@Test @Test
public void withConfiguredJobAndTrigger() throws Exception { public void withConfiguredJobAndTrigger() {
load(QuartzFullConfiguration.class, "test-name=withConfiguredJobAndTrigger"); this.contextRunner.withUserConfiguration(QuartzFullConfiguration.class)
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); .withPropertyValues("test-name=withConfiguredJobAndTrigger")
Scheduler scheduler = this.context.getBean(Scheduler.class); .run((context) -> {
assertThat(scheduler.getJobDetail(JobKey.jobKey("fooJob"))).isNotNull(); assertThat(context).hasSingleBean(Scheduler.class);
assertThat(scheduler.getTrigger(TriggerKey.triggerKey("fooTrigger"))).isNotNull(); Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getJobDetail(JobKey.jobKey("fooJob")))
.isNotNull();
assertThat(scheduler.getTrigger(TriggerKey.triggerKey("fooTrigger")))
.isNotNull();
Thread.sleep(1000L); Thread.sleep(1000L);
this.output.expect(containsString("withConfiguredJobAndTrigger")); this.output.expect(containsString("withConfiguredJobAndTrigger"));
this.output.expect(containsString("jobDataValue")); this.output.expect(containsString("jobDataValue"));
});
} }
@Test @Test
public void withConfiguredCalendars() throws Exception { public void withConfiguredCalendars() {
load(QuartzCalendarsConfiguration.class); this.contextRunner.withUserConfiguration(QuartzCalendarsConfiguration.class)
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); .run((context) -> {
Scheduler scheduler = this.context.getBean(Scheduler.class); assertThat(context).hasSingleBean(Scheduler.class);
Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getCalendar("weekly")).isNotNull(); assertThat(scheduler.getCalendar("weekly")).isNotNull();
assertThat(scheduler.getCalendar("monthly")).isNotNull(); assertThat(scheduler.getCalendar("monthly")).isNotNull();
});
} }
@Test @Test
public void withQuartzProperties() throws Exception { public void withQuartzProperties() {
load("spring.quartz.properties.org.quartz.scheduler.instanceId=FOO"); this.contextRunner.withPropertyValues(
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); "spring.quartz.properties.org.quartz.scheduler.instanceId=FOO")
Scheduler scheduler = this.context.getBean(Scheduler.class); .run((context) -> {
assertThat(context).hasSingleBean(Scheduler.class);
Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getSchedulerInstanceId()).isEqualTo("FOO"); assertThat(scheduler.getSchedulerInstanceId()).isEqualTo("FOO");
});
} }
@Test @Test
public void withCustomizer() throws Exception { public void withCustomizer() {
load(QuartzCustomConfiguration.class); this.contextRunner.withUserConfiguration(QuartzCustomConfiguration.class)
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1); .run((context) -> {
Scheduler scheduler = this.context.getBean(Scheduler.class); assertThat(context).hasSingleBean(Scheduler.class);
Scheduler scheduler = context.getBean(Scheduler.class);
assertThat(scheduler.getSchedulerName()).isEqualTo("fooScheduler"); assertThat(scheduler.getSchedulerName()).isEqualTo("fooScheduler");
});
} }
@Test
public void dataSourceWithQuartzDataSourceQualifierUsedWhenMultiplePresent() {
load(MultipleDataSourceConfiguration.class, "spring.quartz.job-store-type=jdbc");
}
private void load(String... environment) {
load(new Class<?>[0], environment);
}
private void load(Class<?> config, String... environment) {
load(new Class<?>[] { config }, environment);
}
private void load(Class<?>[] configs, String... environment) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
TestPropertyValues.of(environment).applyTo(ctx);
if (!ObjectUtils.isEmpty(configs)) {
ctx.register(configs);
}
ctx.register(QuartzAutoConfiguration.class);
ctx.refresh();
this.context = ctx;
}
@Import(ComponentThatUsesScheduler.class) @Import(ComponentThatUsesScheduler.class)
@Configuration @Configuration
...@@ -358,15 +370,21 @@ public class QuartzAutoConfigurationTests { ...@@ -358,15 +370,21 @@ public class QuartzAutoConfigurationTests {
@Bean @Bean
@Primary @Primary
public DataSource applicationDataSource() { public DataSource applicationDataSource() throws Exception {
return new HikariDataSource(); return createTestDataSource();
} }
@QuartzDataSource @QuartzDataSource
@Bean @Bean
public DataSource quartzDataSource() { public DataSource quartzDataSource() throws Exception {
return DataSourceBuilder.create().url("jdbc:hsqldb:mem:quartztest") return createTestDataSource();
.username("sa").build(); }
private DataSource createTestDataSource() throws Exception {
DataSourceProperties properties = new DataSourceProperties();
properties.setGenerateUniqueName(true);
properties.afterPropertiesSet();
return properties.initializeDataSourceBuilder().build();
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment