/java/sync/annotations/src/test/java/org/obm/annotations/transactional/TransactionalTest.java

https://github.com/goldoraf/OBM · Java · 498 lines · 407 code · 86 blank · 5 comment · 0 complexity · a3c17efc9f0bd7ddc8753a78046e488a MD5 · raw file

  1. package org.obm.annotations.transactional;
  2. import javax.transaction.HeuristicMixedException;
  3. import javax.transaction.HeuristicRollbackException;
  4. import javax.transaction.NotSupportedException;
  5. import javax.transaction.RollbackException;
  6. import javax.transaction.Status;
  7. import javax.transaction.SystemException;
  8. import javax.transaction.TransactionManager;
  9. import org.easymock.EasyMock;
  10. import org.junit.Assert;
  11. import org.junit.Test;
  12. import com.google.inject.AbstractModule;
  13. import com.google.inject.Guice;
  14. import com.google.inject.Injector;
  15. import com.google.inject.Provider;
  16. import com.google.inject.matcher.Matchers;
  17. public class TransactionalTest {
  18. public abstract static class AbstractTestClass {
  19. @Transactional
  20. protected abstract void parentAndChildWithTransactionalTag();
  21. @Transactional
  22. protected abstract void parentWithTransactionalTagAndChildWithout();
  23. protected abstract void childWithTransactionalTagAndParentWithout();
  24. }
  25. public static class TestClass extends AbstractTestClass {
  26. @Transactional(propagation=Propagation.REQUIRED)
  27. public void successfullMethod() {
  28. //success !!
  29. }
  30. @Transactional(propagation=Propagation.REQUIRED)
  31. public void throwingRuntimeExceptionMethod() {
  32. throw new RuntimeException();
  33. }
  34. @Transactional(noRollbackOn=RuntimeException.class, propagation=Propagation.REQUIRED)
  35. public void throwingRuntimeExceptionButNoRollbackMethod() {
  36. throw new RuntimeException();
  37. }
  38. @Transactional(propagation=Propagation.REQUIRED)
  39. public void subThrowingRuntimeExceptionMethod() {
  40. throwingRuntimeExceptionMethod();
  41. }
  42. @Transactional(propagation=Propagation.REQUIRED)
  43. public void subRuntimeExceptionButNoRollbackMethod() {
  44. throwingRuntimeExceptionButNoRollbackMethod();
  45. }
  46. @Transactional(propagation=Propagation.REQUIRED)
  47. public void subMethod() {
  48. successfullMethod();
  49. }
  50. @Transactional(propagation=Propagation.REQUIRED)
  51. @Override
  52. protected void parentAndChildWithTransactionalTag() {
  53. //success !!
  54. }
  55. @Override
  56. protected void parentWithTransactionalTagAndChildWithout() {
  57. //success !!
  58. }
  59. @Transactional(propagation=Propagation.REQUIRED)
  60. @Override
  61. protected void childWithTransactionalTagAndParentWithout() {
  62. //success !!
  63. }
  64. @Transactional(propagation=Propagation.REQUIRES_NEW)
  65. protected void simpleNested() {
  66. //success !!
  67. }
  68. @Transactional(propagation=Propagation.REQUIRED)
  69. public void requiredWithSuccessfulNestedSubMethod() {
  70. simpleNested();
  71. }
  72. @Transactional(propagation=Propagation.REQUIRES_NEW)
  73. public void nestedThrowingRuntimeException(){
  74. throw new RuntimeException();
  75. }
  76. @Transactional(propagation=Propagation.REQUIRES_NEW, noRollbackOn=RuntimeException.class)
  77. public void nestedThrowingRuntimeExceptionButNoRollbackMethod(){
  78. throw new RuntimeException();
  79. }
  80. @Transactional(propagation=Propagation.REQUIRED)
  81. public void requiredWithNestedSubThrowingRuntimeExceptionMethod() {
  82. nestedThrowingRuntimeException();
  83. }
  84. @Transactional(propagation=Propagation.REQUIRED)
  85. public void requiredThrowingRuntimeExceptionAfterNestedSubMethod() {
  86. simpleNested();
  87. throw new RuntimeException();
  88. }
  89. @Transactional(propagation=Propagation.REQUIRED, noRollbackOn=RuntimeException.class)
  90. public void requiredWithNestedSubThrowingRuntimeExceptionButNoRollbackMethod() {
  91. nestedThrowingRuntimeException();
  92. }
  93. @Transactional(propagation=Propagation.REQUIRED, noRollbackOn=RuntimeException.class)
  94. public void requiredThrowingRuntimeExceptionButNoRollbackAfterNestedSubMethod() {
  95. simpleNested();
  96. throw new RuntimeException();
  97. }
  98. }
  99. private TestClass createTestClass(final Provider<TransactionManager> provider) {
  100. Injector injector = Guice.createInjector(new AbstractModule() {
  101. @Override
  102. protected void configure() {
  103. bind(TransactionManager.class).toProvider(provider);
  104. TransactionalInterceptor transactionalInterceptor = new TransactionalInterceptor();
  105. bindInterceptor(Matchers.any(),
  106. Matchers.annotatedWith(Transactional.class),
  107. transactionalInterceptor);
  108. requestInjection(transactionalInterceptor);
  109. }
  110. });
  111. return injector.getInstance(TestClass.class);
  112. }
  113. private <T> Provider<T> getProvider(final T obj) {
  114. return new Provider<T>() {
  115. @Override
  116. public T get() {
  117. return obj;
  118. }
  119. };
  120. }
  121. @Test
  122. public void testOneTransaction() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
  123. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  124. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  125. transaction.begin();
  126. EasyMock.expectLastCall().once();
  127. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(3);
  128. transaction.commit();
  129. EasyMock.expectLastCall().once();
  130. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_COMMITTED)).anyTimes();
  131. EasyMock.replay(transaction);
  132. TestClass testClass = createTestClass(getProvider(transaction));
  133. testClass.successfullMethod();
  134. EasyMock.verify(transaction);
  135. }
  136. @Test
  137. public void testSub() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
  138. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  139. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION)).once();
  140. transaction.begin();
  141. EasyMock.expectLastCall().once();
  142. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(5);
  143. transaction.commit();
  144. EasyMock.expectLastCall().once();
  145. EasyMock.replay(transaction);
  146. TestClass testClass = createTestClass(getProvider(transaction));
  147. testClass.subMethod();
  148. EasyMock.verify(transaction);
  149. }
  150. @Test
  151. public void testRollback() throws NotSupportedException, SystemException, SecurityException, IllegalStateException {
  152. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  153. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  154. transaction.begin();
  155. EasyMock.expectLastCall().once();
  156. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  157. transaction.rollback();
  158. EasyMock.expectLastCall().once();
  159. EasyMock.replay(transaction);
  160. TestClass testClass = createTestClass(getProvider(transaction));
  161. try {
  162. testClass.throwingRuntimeExceptionMethod();
  163. } catch (RuntimeException e) {
  164. return;
  165. } finally {
  166. EasyMock.verify(transaction);
  167. }
  168. Assert.fail("RuntimeExceptionExpected");
  169. }
  170. @Test
  171. public void testSubRollback() throws NotSupportedException, SystemException, SecurityException, IllegalStateException {
  172. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  173. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION)).once();
  174. transaction.begin();
  175. EasyMock.expectLastCall().once();
  176. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(3);
  177. transaction.rollback();
  178. EasyMock.expectLastCall().once();
  179. EasyMock.replay(transaction);
  180. TestClass testClass = createTestClass(getProvider(transaction));
  181. try {
  182. testClass.subThrowingRuntimeExceptionMethod();
  183. } catch (RuntimeException e) {
  184. return;
  185. } finally {
  186. EasyMock.verify(transaction);
  187. }
  188. Assert.fail("RuntimeExceptionExpected");
  189. }
  190. @Test(expected=RuntimeException.class)
  191. public void testRollbackException() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
  192. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  193. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  194. transaction.begin();
  195. EasyMock.expectLastCall().once();
  196. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  197. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  198. transaction.commit();
  199. EasyMock.expectLastCall().once();
  200. EasyMock.replay(transaction);
  201. TestClass testClass = createTestClass(getProvider(transaction));
  202. try {
  203. testClass.throwingRuntimeExceptionButNoRollbackMethod();
  204. } finally {
  205. EasyMock.verify(transaction);
  206. }
  207. }
  208. @Test(expected=RuntimeException.class)
  209. public void testSubRollbackException() throws NotSupportedException, SystemException, SecurityException, IllegalStateException {
  210. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  211. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  212. transaction.begin();
  213. EasyMock.expectLastCall().once();
  214. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(3);
  215. transaction.rollback();
  216. EasyMock.expectLastCall().once();
  217. EasyMock.replay(transaction);
  218. TestClass testClass = createTestClass(getProvider(transaction));
  219. try {
  220. testClass.subRuntimeExceptionButNoRollbackMethod();
  221. } finally {
  222. EasyMock.verify(transaction);
  223. }
  224. }
  225. @Test
  226. public void parentAndChildWithTransactionalTag() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
  227. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  228. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  229. transaction.begin();
  230. EasyMock.expectLastCall().once();
  231. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(3);
  232. transaction.commit();
  233. EasyMock.expectLastCall().once();
  234. EasyMock.replay(transaction);
  235. TestClass testClass = createTestClass(getProvider(transaction));
  236. testClass.parentAndChildWithTransactionalTag();
  237. EasyMock.verify(transaction);
  238. }
  239. @Test
  240. public void parentWithTransactionalTagAndChildWithout() throws SecurityException, IllegalStateException {
  241. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  242. EasyMock.replay(transaction);
  243. TestClass testClass = createTestClass(getProvider(transaction));
  244. testClass.parentWithTransactionalTagAndChildWithout();
  245. EasyMock.verify(transaction);
  246. }
  247. @Test
  248. public void childWithTransactionalTagAndParentWithout() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
  249. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  250. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  251. transaction.begin();
  252. EasyMock.expectLastCall().once();
  253. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(3);
  254. transaction.commit();
  255. EasyMock.expectLastCall().once();
  256. EasyMock.replay(transaction);
  257. TestClass testClass = createTestClass(getProvider(transaction));
  258. testClass.childWithTransactionalTagAndParentWithout();
  259. EasyMock.verify(transaction);
  260. }
  261. @Test
  262. public void testOneNestedTransaction() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
  263. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  264. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  265. transaction.begin();
  266. EasyMock.expectLastCall().once();
  267. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(3);
  268. transaction.commit();
  269. EasyMock.expectLastCall().once();
  270. EasyMock.replay(transaction);
  271. TestClass testClass = createTestClass(getProvider(transaction));
  272. testClass.simpleNested();
  273. EasyMock.verify(transaction);
  274. }
  275. @Test
  276. public void requiredWithNestedChild() throws SystemException, NotSupportedException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException{
  277. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  278. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  279. transaction.begin();
  280. EasyMock.expectLastCall().once();
  281. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  282. transaction.begin();
  283. EasyMock.expectLastCall().once();
  284. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(3);
  285. transaction.commit();
  286. EasyMock.expectLastCall().once();
  287. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(3);
  288. transaction.commit();
  289. EasyMock.expectLastCall().once();
  290. EasyMock.replay(transaction);
  291. TestClass testClass = createTestClass(getProvider(transaction));
  292. testClass.requiredWithSuccessfulNestedSubMethod();
  293. EasyMock.verify(transaction);
  294. }
  295. @Test
  296. public void simpleNestedRollback() throws NotSupportedException, SystemException, SecurityException, IllegalStateException {
  297. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  298. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  299. transaction.begin();
  300. EasyMock.expectLastCall().once();
  301. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  302. transaction.rollback();
  303. EasyMock.expectLastCall().once();
  304. EasyMock.replay(transaction);
  305. TestClass testClass = createTestClass(getProvider(transaction));
  306. try {
  307. testClass.nestedThrowingRuntimeException();
  308. } catch (RuntimeException e) {
  309. return;
  310. } finally {
  311. EasyMock.verify(transaction);
  312. }
  313. Assert.fail("RuntimeExceptionExpected");
  314. }
  315. @Test(expected=RuntimeException.class)
  316. public void nestedNoRollbackException() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
  317. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  318. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  319. transaction.begin();
  320. EasyMock.expectLastCall().once();
  321. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  322. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  323. transaction.commit();
  324. EasyMock.expectLastCall().once();
  325. EasyMock.replay(transaction);
  326. TestClass testClass = createTestClass(getProvider(transaction));
  327. try {
  328. testClass.nestedThrowingRuntimeExceptionButNoRollbackMethod();
  329. } finally {
  330. EasyMock.verify(transaction);
  331. }
  332. }
  333. @Test(expected=RuntimeException.class)
  334. public void requiredWithNestedChildThrowingRuntimeException() throws SystemException, NotSupportedException, SecurityException, IllegalStateException {
  335. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  336. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  337. transaction.begin();
  338. EasyMock.expectLastCall().once();
  339. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  340. transaction.begin();
  341. EasyMock.expectLastCall().once();
  342. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  343. transaction.rollback();
  344. EasyMock.expectLastCall().once();
  345. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  346. transaction.rollback();
  347. EasyMock.expectLastCall().once();
  348. EasyMock.replay(transaction);
  349. TestClass testClass = createTestClass(getProvider(transaction));
  350. testClass.requiredWithNestedSubThrowingRuntimeExceptionMethod();
  351. EasyMock.verify(transaction);
  352. }
  353. @Test(expected=RuntimeException.class)
  354. public void requiredThrowingRuntimeExceptionAfterNestedChild() throws SystemException, NotSupportedException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
  355. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  356. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  357. transaction.begin();
  358. EasyMock.expectLastCall().once();
  359. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  360. transaction.begin();
  361. EasyMock.expectLastCall().once();
  362. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(3);
  363. transaction.commit();
  364. EasyMock.expectLastCall().once();
  365. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(2);
  366. transaction.rollback();
  367. EasyMock.expectLastCall().once();
  368. EasyMock.replay(transaction);
  369. TestClass testClass = createTestClass(getProvider(transaction));
  370. testClass.requiredThrowingRuntimeExceptionAfterNestedSubMethod();
  371. EasyMock.verify(transaction);
  372. }
  373. @Test(expected=RuntimeException.class)
  374. public void requiredWithNestedSubThrowingRuntimeExceptionButNoRollback() throws SystemException, NotSupportedException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
  375. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  376. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  377. transaction.begin();
  378. EasyMock.expectLastCall().once();
  379. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  380. transaction.begin();
  381. EasyMock.expectLastCall().once();
  382. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  383. transaction.rollback();
  384. EasyMock.expectLastCall().once();
  385. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(2);
  386. transaction.commit();
  387. EasyMock.expectLastCall().once();
  388. EasyMock.replay(transaction);
  389. TestClass testClass = createTestClass(getProvider(transaction));
  390. testClass.requiredWithNestedSubThrowingRuntimeExceptionButNoRollbackMethod();
  391. EasyMock.verify(transaction);
  392. }
  393. @Test(expected=RuntimeException.class)
  394. public void requiredThrowingRuntimeExceptionButNoRollbackAfterNestedSub() throws SystemException, NotSupportedException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
  395. TransactionManager transaction = EasyMock.createStrictMock(TransactionManager.class);
  396. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_NO_TRANSACTION));
  397. transaction.begin();
  398. EasyMock.expectLastCall().once();
  399. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE));
  400. transaction.begin();
  401. EasyMock.expectLastCall().once();
  402. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(1);
  403. transaction.commit();
  404. EasyMock.expectLastCall().once();
  405. EasyMock.expect(transaction.getStatus()).andReturn(Integer.valueOf(Status.STATUS_ACTIVE)).times(2);
  406. EasyMock.expectLastCall().once();
  407. EasyMock.replay(transaction);
  408. TestClass testClass = createTestClass(getProvider(transaction));
  409. testClass.requiredThrowingRuntimeExceptionButNoRollbackAfterNestedSubMethod();
  410. EasyMock.verify(transaction);
  411. }
  412. }