/*****************************************************************************
*
* Copyright (C) Zenoss, Inc. 2012, all rights reserved.
*
* This content is made available according to terms specified in
* License.zenoss under the directory where your Zenoss product is installed.
*
****************************************************************************/
package org.zenoss.zep.dao.impl;
import org.junit.Test;
import org.springframework.dao.DeadlockLoserDataAccessException;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicInteger;
import static org.junit.Assert.*;
public class DaoUtilsTest {
@Test
public void testDeadlockRetry() throws Exception {
final AtomicInteger i = new AtomicInteger();
final int returnVal = new Random().nextInt();
int result = DaoUtils.deadlockRetry(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
if (i.incrementAndGet() < 5) {
throw new DeadlockLoserDataAccessException("My fake exception", null);
}
return returnVal;
}
});
assertEquals(i.get(), 5);
assertEquals(result, returnVal);
}
@Test
public void testDeadlockRetryAllFailed() throws Exception {
final AtomicInteger i = new AtomicInteger();
try {
DaoUtils.deadlockRetry(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
throw new DeadlockLoserDataAccessException(String.valueOf(i.incrementAndGet()), null);
}
});
fail("Should have thrown an exception after 5 retries");
} catch (DeadlockLoserDataAccessException e) {
assertEquals("5", e.getMessage());
}
}
@Test
public void testDeadlockRetryNestedException() throws Exception {
final AtomicInteger i = new AtomicInteger();
final int returnVal = new Random().nextInt();
int result = DaoUtils.deadlockRetry(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
if (i.incrementAndGet() < 5) {
throw new RuntimeException(new DeadlockLoserDataAccessException("My fake exception", null));
}
return returnVal;
}
});
assertEquals(i.get(), 5);
assertEquals(result, returnVal);
}
@Test
public void testDeadlockRetryOtherException() throws Exception {
final AtomicInteger i = new AtomicInteger();
try {
DaoUtils.deadlockRetry(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
i.incrementAndGet();
throw new RuntimeException("Bad exception - no retry");
}
});
fail("Should have thrown an exception after first retry");
} catch (RuntimeException e) {
assertEquals(1, i.get());
assertEquals("Bad exception - no retry", e.getMessage());
}
}
}