• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (C) 2010 Google, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.inject.persist.jpa;
18 
19 import com.google.inject.Guice;
20 import com.google.inject.Inject;
21 import com.google.inject.Injector;
22 import com.google.inject.persist.PersistService;
23 import com.google.inject.persist.Transactional;
24 
25 import junit.framework.TestCase;
26 
27 import java.io.FileNotFoundException;
28 import java.io.IOException;
29 import java.util.Date;
30 import java.util.List;
31 
32 import javax.persistence.EntityManager;
33 
34 /**
35  * This test asserts class level @Transactional annotation behavior.
36  *
37  * Class-level @Transactional is a shortcut if all non-private methods in the class are meant to be
38  * transactional.
39  *
40  * @author Dhanji R. Prasanna (dhanji@gmail.com)
41  */
42 
43 public class ClassLevelManagedLocalTransactionsTest extends TestCase {
44   private Injector injector;
45   private static final String UNIQUE_TEXT = "JPAsome unique text88888" + new Date();
46   private static final String UNIQUE_TEXT_2 = "JPAsome asda unique teasdalsdplasdxt" + new Date();
47   private static final String TRANSIENT_UNIQUE_TEXT = "JPAsome other unique texaksoksojadasdt"
48       + new Date();
49 
setUp()50   public void setUp() {
51     injector = Guice.createInjector(new JpaPersistModule("testUnit"));
52 
53     //startup persistence
54     injector.getInstance(PersistService.class).start();
55   }
56 
tearDown()57   public void tearDown() {
58     injector.getInstance(PersistService.class).stop();
59     injector = null;
60   }
61 
testSimpleTransaction()62   public void testSimpleTransaction() {
63     injector.getInstance(TransactionalObject.class).runOperationInTxn();
64 
65     EntityManager session = injector.getInstance(EntityManager.class);
66     assertFalse("EntityManager was not closed by transactional service",
67         session.getTransaction().isActive());
68 
69     //test that the data has been stored
70     session.getTransaction().begin();
71     Object result = session.createQuery("from JpaTestEntity where text = :text")
72         .setParameter("text", UNIQUE_TEXT).getSingleResult();
73 
74     session.getTransaction().commit();
75 
76     assertTrue("odd result returned fatal", result instanceof JpaTestEntity);
77 
78     assertEquals("queried entity did not match--did automatic txn fail?",
79         UNIQUE_TEXT, (((JpaTestEntity) result).getText()));
80   }
81 
testSimpleTransactionRollbackOnChecked()82   public void testSimpleTransactionRollbackOnChecked() {
83     try {
84       injector.getInstance(TransactionalObject2.class).runOperationInTxnThrowingChecked();
85     } catch (IOException e) {
86       //ignore
87     }
88 
89     EntityManager session = injector.getInstance(EntityManager.class);
90     assertFalse("EntityManager was not closed by transactional service (rollback didnt happen?)",
91         session.getTransaction().isActive());
92 
93     //test that the data has been stored
94     session.getTransaction().begin();
95     List<?> result = session.createQuery("from JpaTestEntity where text = :text")
96         .setParameter("text", TRANSIENT_UNIQUE_TEXT).getResultList();
97 
98     session.getTransaction().commit();
99 
100     assertTrue("a result was returned! rollback sure didnt happen!!!", result.isEmpty());
101   }
102 
testSimpleTransactionRollbackOnCheckedExcepting()103   public void testSimpleTransactionRollbackOnCheckedExcepting() {
104     Exception ex = null;
105     try {
106       injector.getInstance(TransactionalObject3.class).runOperationInTxnThrowingCheckedExcepting();
107       fail("Exception was not thrown by test txn-al method!");
108     } catch (IOException e) {
109       //ignored
110     }
111 
112     EntityManager session = injector.getInstance(EntityManager.class);
113     assertFalse("Txn was not closed by transactional service (commit didnt happen?)",
114         session.getTransaction().isActive());
115 
116     //test that the data has been stored
117     session.getTransaction().begin();
118     Object result = session.createQuery("from JpaTestEntity where text = :text")
119         .setParameter("text", UNIQUE_TEXT_2).getSingleResult();
120 
121     session.getTransaction().commit();
122 
123     assertNotNull("a result was not returned! rollback happened anyway (ignore failed)!!!",
124         result);
125   }
126 
testSimpleTransactionRollbackOnUnchecked()127   public void testSimpleTransactionRollbackOnUnchecked() {
128     try {
129       injector.getInstance(TransactionalObject4.class).runOperationInTxnThrowingUnchecked();
130     } catch (RuntimeException re) {
131       //ignore
132     }
133 
134     EntityManager session = injector.getInstance(EntityManager.class);
135     assertFalse("EntityManager was not closed by transactional service (rollback didnt happen?)",
136         session.getTransaction().isActive());
137 
138     //test that the data has been stored
139     session.getTransaction().begin();
140     List<?> result = session.createQuery("from JpaTestEntity where text = :text")
141         .setParameter("text", TRANSIENT_UNIQUE_TEXT).getResultList();
142 
143     session.getTransaction().commit();
144 
145     assertTrue("a result was returned! rollback sure didnt happen!!!",
146         result.isEmpty());
147   }
148 
149   @Transactional
150   public static class TransactionalObject {
151     @Inject EntityManager session;
152 
runOperationInTxn()153     public void runOperationInTxn() {
154       assertTrue(session.getTransaction().isActive());
155       JpaTestEntity entity = new JpaTestEntity();
156       entity.setText(UNIQUE_TEXT);
157       session.persist(entity);
158     }
159 
160   }
161 
162   @Transactional
163   public static class TransactionalObject4 {
164     @Inject EntityManager session;
165 
166     @Transactional
runOperationInTxnThrowingUnchecked()167     public void runOperationInTxnThrowingUnchecked() {
168       assertTrue(session.getTransaction().isActive());
169       JpaTestEntity entity = new JpaTestEntity();
170       entity.setText(TRANSIENT_UNIQUE_TEXT);
171       session.persist(entity);
172 
173       throw new IllegalStateException();
174     }
175   }
176 
177   @Transactional(rollbackOn = IOException.class, ignore = FileNotFoundException.class)
178   public static class TransactionalObject3 {
179     @Inject EntityManager session;
180 
runOperationInTxnThrowingCheckedExcepting()181     public void runOperationInTxnThrowingCheckedExcepting() throws IOException {
182       assertTrue(session.getTransaction().isActive());
183       JpaTestEntity entity = new JpaTestEntity();
184       entity.setText(UNIQUE_TEXT_2);
185       session.persist(entity);
186 
187       throw new FileNotFoundException();
188     }
189   }
190 
191   @Transactional(rollbackOn = IOException.class)
192   public static class TransactionalObject2 {
193     @Inject EntityManager session;
194 
runOperationInTxnThrowingChecked()195     public void runOperationInTxnThrowingChecked() throws IOException {
196       assertTrue(session.getTransaction().isActive());
197       JpaTestEntity entity = new JpaTestEntity();
198       entity.setText(TRANSIENT_UNIQUE_TEXT);
199       session.persist(entity);
200 
201       throw new IOException();
202     }
203   }
204 }
205