From 4ed520cd98fd92382e8aa78728c350e75c67424a Mon Sep 17 00:00:00 2001 From: Dmitry Toptygin Date: Tue, 17 Nov 2020 17:43:44 -0500 Subject: [PATCH] added base-tx-tests project with the TransactionManager for use in unit tests --- base-build/pom.xml | 1 + base-remote-tests/pom.xml | 6 +- .../wlan/remote/tests/BaseRemoteTest.java | 49 +--------- base-tx-tests/pom.xml | 21 ++++ .../core/server/tx/test/TxTestConfig.java | 98 +++++++++++++++++++ 5 files changed, 126 insertions(+), 49 deletions(-) create mode 100644 base-tx-tests/pom.xml create mode 100644 base-tx-tests/src/main/java/com/telecominfraproject/wlan/core/server/tx/test/TxTestConfig.java diff --git a/base-build/pom.xml b/base-build/pom.xml index eb0abad..5ddda00 100644 --- a/base-build/pom.xml +++ b/base-build/pom.xml @@ -47,6 +47,7 @@ ../base-hierarchical-datastore ../base-jdbc ../base-jdbc-tests + ../base-tx-tests ../base-cassandra ../base-cassandra-tests ../base-job diff --git a/base-remote-tests/pom.xml b/base-remote-tests/pom.xml index 285ea0c..57e0cda 100644 --- a/base-remote-tests/pom.xml +++ b/base-remote-tests/pom.xml @@ -13,9 +13,11 @@ - org.springframework - spring-tx + com.telecominfraproject.wlan + base-tx-tests + ${tip-wlan-cloud.release.version} + org.springframework.boot spring-boot-starter-test diff --git a/base-remote-tests/src/main/java/com/telecominfraproject/wlan/remote/tests/BaseRemoteTest.java b/base-remote-tests/src/main/java/com/telecominfraproject/wlan/remote/tests/BaseRemoteTest.java index f684988..6a38302 100644 --- a/base-remote-tests/src/main/java/com/telecominfraproject/wlan/remote/tests/BaseRemoteTest.java +++ b/base-remote-tests/src/main/java/com/telecominfraproject/wlan/remote/tests/BaseRemoteTest.java @@ -32,6 +32,7 @@ import org.springframework.transaction.support.SimpleTransactionStatus; import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; +import com.telecominfraproject.wlan.core.server.tx.test.TxTestConfig; import com.telecominfraproject.wlan.server.RemoteTestServer; /** @@ -75,6 +76,7 @@ import com.telecominfraproject.wlan.server.RemoteTestServer; "tip.wlan.csrf-enabled=false" }) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) @Import(value = { + TxTestConfig.class }) public abstract class BaseRemoteTest { @@ -130,53 +132,6 @@ public abstract class BaseRemoteTest { // @PropertySource({ "classpath:persistence-${envTarget:dev}.properties" }) public static class Config { - @Bean - @Primary - public PlatformTransactionManager transactionManager() { - PlatformTransactionManager ptm = new PlatformTransactionManager() { - - { - LOG.info("*** Using simulated PlatformTransactionManager"); - } - - @Override - public void rollback(TransactionStatus status) throws TransactionException { - LOG.info("Simulating Rollback for {}", status); - if (TransactionSynchronizationManager.isSynchronizationActive()) { - TransactionSynchronizationManager.clearSynchronization(); - } - } - - @Override - public void commit(TransactionStatus status) throws TransactionException { - LOG.info("Simulating Commit for {}", status); - if (TransactionSynchronizationManager.isSynchronizationActive()) { - List synchronizations = TransactionSynchronizationManager - .getSynchronizations(); - if (synchronizations != null) { - for (TransactionSynchronization synchronization : synchronizations) { - synchronization.afterCommit(); - } - } - - TransactionSynchronizationManager.clearSynchronization(); - } - } - - @Override - public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { - LOG.info("Simulating getTransaction for {}", definition); - if (!TransactionSynchronizationManager.isSynchronizationActive()) { - TransactionSynchronizationManager.initSynchronization(); - } - TransactionStatus ts = new SimpleTransactionStatus(); - return ts; - } - }; - - return ptm; - } - } protected int getNextCustomerId() { diff --git a/base-tx-tests/pom.xml b/base-tx-tests/pom.xml new file mode 100644 index 0000000..7c3dec4 --- /dev/null +++ b/base-tx-tests/pom.xml @@ -0,0 +1,21 @@ + + 4.0.0 + + com.telecominfraproject.wlan + tip-wlan-cloud-root-pom + 0.0.1-SNAPSHOT + ../../wlan-cloud-root + + base-tx-tests + base-tx-tests + Common classes used by the unit tests that require transaction support. + + + + org.springframework + spring-tx + + + + diff --git a/base-tx-tests/src/main/java/com/telecominfraproject/wlan/core/server/tx/test/TxTestConfig.java b/base-tx-tests/src/main/java/com/telecominfraproject/wlan/core/server/tx/test/TxTestConfig.java new file mode 100644 index 0000000..ffd11bd --- /dev/null +++ b/base-tx-tests/src/main/java/com/telecominfraproject/wlan/core/server/tx/test/TxTestConfig.java @@ -0,0 +1,98 @@ +package com.telecominfraproject.wlan.core.server.tx.test; + +import java.util.ArrayList; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionException; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.SimpleTransactionStatus; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +/** + * @author dtop + * + */ +@Configuration +public class TxTestConfig { + + private static final Logger LOG = LoggerFactory.getLogger(TxTestConfig.class); + + @Bean + @Primary + public PlatformTransactionManager transactionManager() { + PlatformTransactionManager ptm = new PlatformTransactionManager() { + private ThreadLocal> currentTx = new ThreadLocal<>() ; + + { + LOG.info("*** Using simulated PlatformTransactionManager"); + } + + @Override + public void rollback(TransactionStatus status) throws TransactionException { + LOG.debug("Simulating Rollback for {}", status); + if(currentTx.get().size() == 1 ) { + if (TransactionSynchronizationManager.isSynchronizationActive()) { + TransactionSynchronizationManager.clearSynchronization(); + } + currentTx.remove(); + } else { + currentTx.get().remove(currentTx.get().size() - 1 ); + } + } + + @Override + public void commit(TransactionStatus status) throws TransactionException { + LOG.debug("Simulating Commit for {}", status); + if(currentTx.get().size() == 1 ) { + if (TransactionSynchronizationManager.isSynchronizationActive()) { + List synchronizations = TransactionSynchronizationManager + .getSynchronizations(); + if (synchronizations != null) { + for (TransactionSynchronization synchronization : synchronizations) { + synchronization.afterCommit(); + } + } + + TransactionSynchronizationManager.clearSynchronization(); + } + + currentTx.remove(); + } else { + currentTx.get().remove(currentTx.get().size() - 1 ); + } + } + + @Override + public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { + LOG.debug("Simulating getTransaction for {}", definition); + if (!TransactionSynchronizationManager.isSynchronizationActive()) { + TransactionSynchronizationManager.initSynchronization(); + } + + if (currentTx.get() == null) { + List txList = new ArrayList<>(); + TransactionStatus ts = new SimpleTransactionStatus(true); + txList.add(ts); + currentTx.set(txList); + return ts; + } else { + List txList = currentTx.get(); + TransactionStatus ts = new SimpleTransactionStatus(false); + txList.add(ts); + return ts; + } + } + + }; + return ptm; + } + +}