/**
* Copyright (c) 2009-2011 VMware, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.springsource.insight.plugin.springtx;
import java.sql.Connection;
import java.util.logging.Logger;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.TransactionSystemException;
import com.springsource.insight.collection.test.OperationCollectionAspectTestSupport;
import com.springsource.insight.intercept.operation.Operation;
/**
*
*/
public class TransactionOperationCollectionAspectTest
extends OperationCollectionAspectTestSupport {
public TransactionOperationCollectionAspectTest() {
super();
}
@Test
public void testCollectionAspect() {
final PlatformTransactionManager manager = new PlatformTransactionManagerImpl();
final int timeout = (int) Thread.currentThread().getId();
for (final TransactionOperationStatus opStatus : TransactionOperationStatus.values()) {
for (final boolean readOnly : new boolean[]{true, false}) {
for (int propagationValue = 0;
propagationValue < TransactionOperationFinalizer.propagationNames.size();
propagationValue++) {
final int propagationBehavior = propagationValue; // has to be final for use in the anonymous class
for (final int isolationLevel : new int[]{
Connection.TRANSACTION_NONE,
Connection.TRANSACTION_READ_COMMITTED,
Connection.TRANSACTION_REPEATABLE_READ,
Connection.TRANSACTION_SERIALIZABLE
}) {
TransactionDefinition txDefinition = new TransactionDefinition() {
public boolean isReadOnly() {
return readOnly;
}
public int getTimeout() {
return timeout;
}
public int getPropagationBehavior() {
return propagationBehavior;
}
public String getName() {
return opStatus.name()
+ ";readOnly=" + readOnly
+ ";propagation=" + TransactionOperationFinalizer.propagationNames.get(propagationBehavior)
+ ";isolation=" + isolationLevel
+ ";timeout=" + timeout
;
}
public int getIsolationLevel() {
return isolationLevel;
}
@Override
public String toString() {
return getName();
}
};
TransactionStatus txStatus = manager.getTransaction(txDefinition);
switch (opStatus) {
case Committed:
manager.commit(txStatus);
break;
case RolledBack:
manager.rollback(txStatus);
break;
default:
fail("Unknown status action: " + opStatus);
}
assertTransactionOperation(txDefinition.getName(), opStatus, txDefinition);
Mockito.reset(spiedOperationCollector); // prepare for next iteration
}
}
}
}
}
@Override
public TransactionOperationCollectionAspect getAspect() {
return TransactionOperationCollectionAspect.aspectOf();
}
protected Operation assertTransactionOperation(String testName,
TransactionOperationStatus opStatus,
TransactionDefinition txDefinition) {
Operation op = getLastEntered();
assertNotNull(testName + ": No operation extracted", op);
assertEquals(testName + ": Mismatched operation type", TransactionOperationCollectionAspect.TYPE, op.getType());
assertEquals(testName + ": Mismatched name", txDefinition.getName(), op.get("name", String.class));
assertEquals(testName + ": Mismatched read only value",
Boolean.valueOf(txDefinition.isReadOnly()), op.get("readOnly", Boolean.class));
assertEquals(testName + ": Mismatched timeout value", txDefinition.getTimeout(), op.getInt("timeout", (-1)));
Operation dummyOp = new Operation()
.put("propagation", txDefinition.getPropagationBehavior())
.put("isolation", txDefinition.getIsolationLevel());
assertEquals(testName + ": Mismatched propagation value",
TransactionOperationFinalizer.normalizePropagation(dummyOp),
op.get("propagation", String.class));
assertEquals(testName + ": Mismatched isolation value",
TransactionOperationFinalizer.normalizeIsolation(dummyOp),
op.get("isolation", String.class));
return op;
}
static class PlatformTransactionManagerImpl implements PlatformTransactionManager {
private final Logger logger = Logger.getLogger(getClass().getName());
PlatformTransactionManagerImpl() {
super();
}
public TransactionStatus getTransaction(TransactionDefinition definition)
throws TransactionException {
logger.info("getTransaction(" + definition + ")");
return new TransactionStatus() {
public Object createSavepoint() throws TransactionException {
throw new TransactionSystemException("createSavepoint N/A");
}
public void rollbackToSavepoint(Object savepoint)
throws TransactionException {
throw new TransactionSystemException("rollbackToSavepoint N/A");
}
public void releaseSavepoint(Object savepoint)
throws TransactionException {
throw new TransactionSystemException("releaseSavepoint N/A");
}
public boolean isNewTransaction() {
return true;
}
public boolean hasSavepoint() {
return false;
}
public void setRollbackOnly() {
throw new TransactionSystemException("setRollbackOnly N/A");
}
public boolean isRollbackOnly() {
return false;
}
public void flush() {
throw new TransactionSystemException("flush N/A");
}
public boolean isCompleted() {
return true;
}
};
}
public void commit(TransactionStatus status)
throws TransactionException {
logger.info("commit()");
}
public void rollback(TransactionStatus status)
throws TransactionException {
logger.info("rollback()");
}
}
}