Commit c2ef7578 authored by Andy Wilkinson's avatar Andy Wilkinson

Merge branch '2.3.x' into 2.4.x

Closes gh-26460
parents 73131e99 44447492
...@@ -36,7 +36,6 @@ manifest.yml ...@@ -36,7 +36,6 @@ manifest.yml
out out
overridedb.* overridedb.*
target target
transaction-logs
.flattened-pom.xml .flattened-pom.xml
secrets.yml secrets.yml
.gradletasknamecache .gradletasknamecache
......
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package org.springframework.boot.autoconfigure.orm.jpa; package org.springframework.boot.autoconfigure.orm.jpa;
import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
...@@ -37,6 +38,7 @@ import org.springframework.boot.test.context.assertj.AssertableApplicationContex ...@@ -37,6 +38,7 @@ import org.springframework.boot.test.context.assertj.AssertableApplicationContex
import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.boot.test.context.runner.ContextConsumer;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
import org.springframework.boot.testsupport.BuildOutput;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -69,7 +71,9 @@ abstract class AbstractJpaAutoConfigurationTests { ...@@ -69,7 +71,9 @@ abstract class AbstractJpaAutoConfigurationTests {
protected AbstractJpaAutoConfigurationTests(Class<?> autoConfiguredClass) { protected AbstractJpaAutoConfigurationTests(Class<?> autoConfiguredClass) {
this.autoConfiguredClass = autoConfiguredClass; this.autoConfiguredClass = autoConfiguredClass;
this.contextRunner = new ApplicationContextRunner() this.contextRunner = new ApplicationContextRunner()
.withPropertyValues("spring.datasource.generate-unique-name=true") .withPropertyValues("spring.datasource.generate-unique-name=true",
"spring.jta.log-dir="
+ new File(new BuildOutput(getClass()).getRootLocation(), "transaction-logs"))
.withUserConfiguration(TestConfiguration.class).withConfiguration(AutoConfigurations.of( .withUserConfiguration(TestConfiguration.class).withConfiguration(AutoConfigurations.of(
DataSourceAutoConfiguration.class, TransactionAutoConfiguration.class, autoConfiguredClass)); DataSourceAutoConfiguration.class, TransactionAutoConfiguration.class, autoConfiguredClass));
} }
......
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -48,6 +48,7 @@ import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean; ...@@ -48,6 +48,7 @@ import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.boot.jta.atomikos.AtomikosDependsOnBeanFactoryPostProcessor; import org.springframework.boot.jta.atomikos.AtomikosDependsOnBeanFactoryPostProcessor;
import org.springframework.boot.jta.atomikos.AtomikosProperties; import org.springframework.boot.jta.atomikos.AtomikosProperties;
import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.boot.testsupport.BuildOutput;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 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;
...@@ -70,6 +71,8 @@ import static org.mockito.Mockito.mock; ...@@ -70,6 +71,8 @@ import static org.mockito.Mockito.mock;
// @SuppressWarnings("deprecation") // @SuppressWarnings("deprecation")
class JtaAutoConfigurationTests { class JtaAutoConfigurationTests {
private final File buildOutput = new BuildOutput(JtaAutoConfigurationTests.class).getRootLocation();
private AnnotationConfigApplicationContext context; private AnnotationConfigApplicationContext context;
@AfterEach @AfterEach
...@@ -100,7 +103,11 @@ class JtaAutoConfigurationTests { ...@@ -100,7 +103,11 @@ class JtaAutoConfigurationTests {
@Test @Test
void atomikosSanityCheck() { void atomikosSanityCheck() {
this.context = new AnnotationConfigApplicationContext(JtaProperties.class, AtomikosJtaConfiguration.class); this.context = new AnnotationConfigApplicationContext();
TestPropertyValues.of("spring.jta.log-dir:" + new File(this.buildOutput, "atomikos-logs"))
.applyTo(this.context);
this.context.register(JtaProperties.class, AtomikosJtaConfiguration.class);
this.context.refresh();
this.context.getBean(AtomikosProperties.class); this.context.getBean(AtomikosProperties.class);
this.context.getBean(UserTransactionService.class); this.context.getBean(UserTransactionService.class);
this.context.getBean(UserTransactionManager.class); this.context.getBean(UserTransactionManager.class);
...@@ -114,7 +121,11 @@ class JtaAutoConfigurationTests { ...@@ -114,7 +121,11 @@ class JtaAutoConfigurationTests {
@Test @Test
@Deprecated @Deprecated
void bitronixSanityCheck() { void bitronixSanityCheck() {
this.context = new AnnotationConfigApplicationContext(JtaProperties.class, BitronixJtaConfiguration.class); this.context = new AnnotationConfigApplicationContext();
TestPropertyValues.of("spring.jta.log-dir:" + new File(this.buildOutput, "bitronix-logs"))
.applyTo(this.context);
this.context.register(JtaProperties.class, BitronixJtaConfiguration.class);
this.context.refresh();
this.context.getBean(bitronix.tm.Configuration.class); this.context.getBean(bitronix.tm.Configuration.class);
this.context.getBean(TransactionManager.class); this.context.getBean(TransactionManager.class);
this.context.getBean(XADataSourceWrapper.class); this.context.getBean(XADataSourceWrapper.class);
...@@ -126,7 +137,11 @@ class JtaAutoConfigurationTests { ...@@ -126,7 +137,11 @@ class JtaAutoConfigurationTests {
@Test @Test
@Deprecated @Deprecated
void defaultBitronixServerId() throws UnknownHostException { void defaultBitronixServerId() throws UnknownHostException {
this.context = new AnnotationConfigApplicationContext(BitronixJtaConfiguration.class); this.context = new AnnotationConfigApplicationContext();
TestPropertyValues.of("spring.jta.log-dir:" + new File(this.buildOutput, "bitronix-logs"))
.applyTo(this.context);
this.context.register(BitronixJtaConfiguration.class);
this.context.refresh();
String serverId = this.context.getBean(bitronix.tm.Configuration.class).getServerId(); String serverId = this.context.getBean(bitronix.tm.Configuration.class).getServerId();
assertThat(serverId).isEqualTo(InetAddress.getLocalHost().getHostAddress()); assertThat(serverId).isEqualTo(InetAddress.getLocalHost().getHostAddress());
} }
...@@ -135,7 +150,8 @@ class JtaAutoConfigurationTests { ...@@ -135,7 +150,8 @@ class JtaAutoConfigurationTests {
@Deprecated @Deprecated
void customBitronixServerId() { void customBitronixServerId() {
this.context = new AnnotationConfigApplicationContext(); this.context = new AnnotationConfigApplicationContext();
TestPropertyValues.of("spring.jta.transactionManagerId:custom").applyTo(this.context); TestPropertyValues.of("spring.jta.transactionManagerId:custom",
"spring.jta.log-dir:" + new File(this.buildOutput, "bitronix-logs")).applyTo(this.context);
this.context.register(BitronixJtaConfiguration.class); this.context.register(BitronixJtaConfiguration.class);
this.context.refresh(); this.context.refresh();
String serverId = this.context.getBean(bitronix.tm.Configuration.class).getServerId(); String serverId = this.context.getBean(bitronix.tm.Configuration.class).getServerId();
...@@ -158,7 +174,8 @@ class JtaAutoConfigurationTests { ...@@ -158,7 +174,8 @@ class JtaAutoConfigurationTests {
void atomikosConnectionFactoryPoolConfiguration() { void atomikosConnectionFactoryPoolConfiguration() {
this.context = new AnnotationConfigApplicationContext(); this.context = new AnnotationConfigApplicationContext();
TestPropertyValues.of("spring.jta.atomikos.connectionfactory.minPoolSize:5", TestPropertyValues.of("spring.jta.atomikos.connectionfactory.minPoolSize:5",
"spring.jta.atomikos.connectionfactory.maxPoolSize:10").applyTo(this.context); "spring.jta.atomikos.connectionfactory.maxPoolSize:10",
"spring.jta.log-dir:" + new File(this.buildOutput, "atomikos-logs")).applyTo(this.context);
this.context.register(AtomikosJtaConfiguration.class, PoolConfiguration.class); this.context.register(AtomikosJtaConfiguration.class, PoolConfiguration.class);
this.context.refresh(); this.context.refresh();
AtomikosConnectionFactoryBean connectionFactory = this.context.getBean(AtomikosConnectionFactoryBean.class); AtomikosConnectionFactoryBean connectionFactory = this.context.getBean(AtomikosConnectionFactoryBean.class);
...@@ -171,7 +188,8 @@ class JtaAutoConfigurationTests { ...@@ -171,7 +188,8 @@ class JtaAutoConfigurationTests {
void bitronixConnectionFactoryPoolConfiguration() { void bitronixConnectionFactoryPoolConfiguration() {
this.context = new AnnotationConfigApplicationContext(); this.context = new AnnotationConfigApplicationContext();
TestPropertyValues.of("spring.jta.bitronix.connectionfactory.minPoolSize:5", TestPropertyValues.of("spring.jta.bitronix.connectionfactory.minPoolSize:5",
"spring.jta.bitronix.connectionfactory.maxPoolSize:10").applyTo(this.context); "spring.jta.bitronix.connectionfactory.maxPoolSize:10",
"spring.jta.log-dir:" + new File(this.buildOutput, "bitronix-logs")).applyTo(this.context);
this.context.register(BitronixJtaConfiguration.class, PoolConfiguration.class); this.context.register(BitronixJtaConfiguration.class, PoolConfiguration.class);
this.context.refresh(); this.context.refresh();
org.springframework.boot.jta.bitronix.PoolingConnectionFactoryBean connectionFactory = this.context org.springframework.boot.jta.bitronix.PoolingConnectionFactoryBean connectionFactory = this.context
...@@ -184,7 +202,8 @@ class JtaAutoConfigurationTests { ...@@ -184,7 +202,8 @@ class JtaAutoConfigurationTests {
void atomikosDataSourcePoolConfiguration() { void atomikosDataSourcePoolConfiguration() {
this.context = new AnnotationConfigApplicationContext(); this.context = new AnnotationConfigApplicationContext();
TestPropertyValues TestPropertyValues
.of("spring.jta.atomikos.datasource.minPoolSize:5", "spring.jta.atomikos.datasource.maxPoolSize:10") .of("spring.jta.atomikos.datasource.minPoolSize:5", "spring.jta.atomikos.datasource.maxPoolSize:10",
"spring.jta.log-dir:" + new File(this.buildOutput, "atomikos-logs"))
.applyTo(this.context); .applyTo(this.context);
this.context.register(AtomikosJtaConfiguration.class, PoolConfiguration.class); this.context.register(AtomikosJtaConfiguration.class, PoolConfiguration.class);
this.context.refresh(); this.context.refresh();
...@@ -198,7 +217,8 @@ class JtaAutoConfigurationTests { ...@@ -198,7 +217,8 @@ class JtaAutoConfigurationTests {
void bitronixDataSourcePoolConfiguration() { void bitronixDataSourcePoolConfiguration() {
this.context = new AnnotationConfigApplicationContext(); this.context = new AnnotationConfigApplicationContext();
TestPropertyValues TestPropertyValues
.of("spring.jta.bitronix.datasource.minPoolSize:5", "spring.jta.bitronix.datasource.maxPoolSize:10") .of("spring.jta.bitronix.datasource.minPoolSize:5", "spring.jta.bitronix.datasource.maxPoolSize:10",
"spring.jta.log-dir:" + new File(this.buildOutput, "bitronix-logs"))
.applyTo(this.context); .applyTo(this.context);
this.context.register(BitronixJtaConfiguration.class, PoolConfiguration.class); this.context.register(BitronixJtaConfiguration.class, PoolConfiguration.class);
this.context.refresh(); this.context.refresh();
...@@ -212,7 +232,8 @@ class JtaAutoConfigurationTests { ...@@ -212,7 +232,8 @@ class JtaAutoConfigurationTests {
void atomikosCustomizeJtaTransactionManagerUsingProperties() { void atomikosCustomizeJtaTransactionManagerUsingProperties() {
this.context = new AnnotationConfigApplicationContext(); this.context = new AnnotationConfigApplicationContext();
TestPropertyValues TestPropertyValues
.of("spring.transaction.default-timeout:30", "spring.transaction.rollback-on-commit-failure:true") .of("spring.transaction.default-timeout:30", "spring.transaction.rollback-on-commit-failure:true",
"spring.jta.log-dir:" + new File(this.buildOutput, "atomikos-logs"))
.applyTo(this.context); .applyTo(this.context);
this.context.register(AtomikosJtaConfiguration.class, TransactionAutoConfiguration.class); this.context.register(AtomikosJtaConfiguration.class, TransactionAutoConfiguration.class);
this.context.refresh(); this.context.refresh();
...@@ -226,7 +247,8 @@ class JtaAutoConfigurationTests { ...@@ -226,7 +247,8 @@ class JtaAutoConfigurationTests {
void bitronixCustomizeJtaTransactionManagerUsingProperties() { void bitronixCustomizeJtaTransactionManagerUsingProperties() {
this.context = new AnnotationConfigApplicationContext(); this.context = new AnnotationConfigApplicationContext();
TestPropertyValues TestPropertyValues
.of("spring.transaction.default-timeout:30", "spring.transaction.rollback-on-commit-failure:true") .of("spring.transaction.default-timeout:30", "spring.transaction.rollback-on-commit-failure:true",
"spring.jta.log-dir:" + new File(this.buildOutput, "bitronix-logs"))
.applyTo(this.context); .applyTo(this.context);
this.context.register(BitronixJtaConfiguration.class, TransactionAutoConfiguration.class); this.context.register(BitronixJtaConfiguration.class, TransactionAutoConfiguration.class);
this.context.refresh(); this.context.refresh();
......
...@@ -9,6 +9,7 @@ dependencies { ...@@ -9,6 +9,7 @@ dependencies {
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-artemis")) implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-artemis"))
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa")) implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa"))
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-jta-atomikos")) implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-jta-atomikos"))
implementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
if (JavaVersion.current().java9Compatible) { if (JavaVersion.current().java9Compatible) {
implementation("jakarta.xml.bind:jakarta.xml.bind-api") implementation("jakarta.xml.bind:jakarta.xml.bind-api")
} }
......
/* /*
* Copyright 2012-2019 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package smoketest.atomikos; package smoketest.atomikos;
import java.io.File;
import java.util.function.Consumer; import java.util.function.Consumer;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
...@@ -23,6 +24,7 @@ import org.junit.jupiter.api.extension.ExtendWith; ...@@ -23,6 +24,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.boot.test.system.OutputCaptureExtension;
import org.springframework.boot.testsupport.BuildOutput;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
...@@ -37,7 +39,8 @@ class SampleAtomikosApplicationTests { ...@@ -37,7 +39,8 @@ class SampleAtomikosApplicationTests {
@Test @Test
void testTransactionRollback(CapturedOutput output) throws Exception { void testTransactionRollback(CapturedOutput output) throws Exception {
SampleAtomikosApplication.main(new String[] {}); File logDir = new File(new BuildOutput(getClass()).getRootLocation(), "atomikos-logs");
SampleAtomikosApplication.main(new String[] { "--spring.jta.log-dir=" + logDir });
assertThat(output).satisfies(numberOfOccurrences("---->", 1)); assertThat(output).satisfies(numberOfOccurrences("---->", 1));
assertThat(output).satisfies(numberOfOccurrences("----> josh", 1)); assertThat(output).satisfies(numberOfOccurrences("----> josh", 1));
assertThat(output).satisfies(numberOfOccurrences("Count is 1", 2)); assertThat(output).satisfies(numberOfOccurrences("Count is 1", 2));
......
...@@ -9,6 +9,7 @@ dependencies { ...@@ -9,6 +9,7 @@ dependencies {
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-artemis")) implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-artemis"))
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa")) implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-data-jpa"))
implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-jta-bitronix")) implementation(project(":spring-boot-project:spring-boot-starters:spring-boot-starter-jta-bitronix"))
implementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
if (JavaVersion.current().java9Compatible) { if (JavaVersion.current().java9Compatible) {
implementation("jakarta.xml.bind:jakarta.xml.bind-api") implementation("jakarta.xml.bind:jakarta.xml.bind-api")
} }
......
/* /*
* Copyright 2012-2019 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package smoketest.bitronix; package smoketest.bitronix;
import java.io.File;
import java.util.function.Consumer; import java.util.function.Consumer;
import bitronix.tm.resource.jms.PoolingConnectionFactory; import bitronix.tm.resource.jms.PoolingConnectionFactory;
...@@ -25,6 +26,7 @@ import org.junit.jupiter.api.extension.ExtendWith; ...@@ -25,6 +26,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.boot.test.system.OutputCaptureExtension;
import org.springframework.boot.testsupport.BuildOutput;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
...@@ -38,9 +40,11 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -38,9 +40,11 @@ import static org.assertj.core.api.Assertions.assertThat;
@ExtendWith(OutputCaptureExtension.class) @ExtendWith(OutputCaptureExtension.class)
class SampleBitronixApplicationTests { class SampleBitronixApplicationTests {
private final File jtaLogDir = new File(new BuildOutput(getClass()).getRootLocation(), "bitronix-logs");
@Test @Test
void testTransactionRollback(CapturedOutput output) throws Exception { void testTransactionRollback(CapturedOutput output) throws Exception {
SampleBitronixApplication.main(new String[] {}); SampleBitronixApplication.main(new String[] { "--spring.jta.log-dir=" + this.jtaLogDir });
assertThat(output).satisfies(numberOfOccurrences("---->", 1)); assertThat(output).satisfies(numberOfOccurrences("---->", 1));
assertThat(output).satisfies(numberOfOccurrences("----> josh", 1)); assertThat(output).satisfies(numberOfOccurrences("----> josh", 1));
assertThat(output).satisfies(numberOfOccurrences("Count is 1", 2)); assertThat(output).satisfies(numberOfOccurrences("Count is 1", 2));
...@@ -49,7 +53,8 @@ class SampleBitronixApplicationTests { ...@@ -49,7 +53,8 @@ class SampleBitronixApplicationTests {
@Test @Test
void testExposesXaAndNonXa() { void testExposesXaAndNonXa() {
ApplicationContext context = SpringApplication.run(SampleBitronixApplication.class); ApplicationContext context = SpringApplication.run(SampleBitronixApplication.class,
"--spring.jta.log-dir=" + this.jtaLogDir);
Object jmsConnectionFactory = context.getBean("jmsConnectionFactory"); Object jmsConnectionFactory = context.getBean("jmsConnectionFactory");
Object xaJmsConnectionFactory = context.getBean("xaJmsConnectionFactory"); Object xaJmsConnectionFactory = context.getBean("xaJmsConnectionFactory");
Object nonXaJmsConnectionFactory = context.getBean("nonXaJmsConnectionFactory"); Object nonXaJmsConnectionFactory = context.getBean("nonXaJmsConnectionFactory");
......
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