(no commit message)
[utils] / security / jpatest / src / test / java / org / wamblee / security / authentication / jpa / JpaUserSetTest.java
1 /*
2  * Copyright 2005-2010 the original author or authors.
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 package org.wamblee.security.authentication.jpa;
17
18 import java.sql.Connection;
19 import java.sql.ResultSet;
20 import java.util.Set;
21
22 import org.wamblee.cache.EhCache;
23 import org.wamblee.io.ClassPathResource;
24 import org.wamblee.security.authentication.Group;
25 import org.wamblee.security.authentication.GroupSet;
26 import org.wamblee.security.authentication.InMemoryUserSetTest;
27 import org.wamblee.security.authentication.Md5HexMessageDigester;
28 import org.wamblee.security.authentication.MessageDigester;
29 import org.wamblee.security.authentication.NameValidator;
30 import org.wamblee.security.authentication.RegexpNameValidator;
31 import org.wamblee.security.authentication.User;
32 import org.wamblee.security.authentication.UserSet;
33 import org.wamblee.test.persistence.JpaTester;
34 import org.wamblee.test.persistence.DatabaseUtils.JdbcUnitOfWork;
35 import org.wamblee.test.transactions.TransactionProxyFactory;
36
37 /**
38  * Tests for {@link org.wamblee.usermgt.hibernate.HibernateGroupSet}
39  * 
40  * @author Erik Brakkee
41  */
42 public class JpaUserSetTest extends InMemoryUserSetTest {
43     private static final String USER_TABLE = "SEC_USER";
44
45     private static final String GROUP_TABLE = "SEC_GROUP";
46
47     private static final String USER_QUERY = "select * from " + USER_TABLE +
48         " where name = ?";
49
50     private static final String GROUP_QUERY = "select * from " + GROUP_TABLE +
51         " where name = ?";
52
53     private UserSet userset;
54
55     private GroupSet groupset;
56
57     private EhCache<String, User> userCache;
58
59     private JpaTester jpaTester;
60
61     /*
62      * (non-Javadoc)
63      * 
64      * @see org.wamblee.usermgt.InMemoryUserSetTest#setUp()
65      */
66     @Override
67     protected void setUp() throws Exception {
68         jpaTester = new JpaTester(new SecurityPersistenceUnit());
69         jpaTester.start();
70
71         userCache = new EhCache<String, User>(new ClassPathResource(
72             "properties/org.wamblee.security.ehcache.xml"), "users");
73
74         userset = createUserSetImpl();
75         groupset = createGroupSetImpl();
76
77         clearUserCache();
78
79         super.setUp();
80     }
81
82     private UserSet createUserSetImpl() {
83         NameValidator passwordValidator = new RegexpNameValidator(".{5,}",
84             "INVALID_PASSWORD", "Password must have at least 5 characters");
85
86         MessageDigester passwordDigester = new Md5HexMessageDigester();
87         TransactionProxyFactory<UserSet> factory = new TransactionProxyFactory<UserSet>(
88             jpaTester.getJpaBuilder(), UserSet.class);
89         UserSet jpaUserset = new JpaUserSet(userCache, passwordValidator,
90             passwordDigester, factory.getTransactionScopedEntityManager());
91         return factory.getProxy(jpaUserset);
92     }
93
94     private GroupSet createGroupSetImpl() {
95         TransactionProxyFactory<GroupSet> factory = new TransactionProxyFactory<GroupSet>(
96             jpaTester.getJpaBuilder(), GroupSet.class);
97         GroupSet groups = new JpaGroupSet(factory
98             .getTransactionScopedEntityManager());
99         GroupSet proxy = factory.getProxy(groups);
100         return proxy;
101     }
102
103     @Override
104     protected void tearDown() throws Exception {
105         jpaTester.stop();
106         super.tearDown();
107     }
108
109     /**
110      * Clears the user cache.
111      */
112     private void clearUserCache() {
113         userCache.clear();
114     }
115
116     /*
117      * (non-Javadoc)
118      * 
119      * @see org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupCount(int)
120      */
121     @Override
122     protected void checkUserCount(int aSize) throws Exception {
123         super.checkUserCount(aSize);
124         assertEquals(aSize, jpaTester.getDbUtils().getTableSize(USER_TABLE));
125     }
126
127     /*
128      * (non-Javadoc)
129      * 
130      * @see
131      * org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupExists(java.lang.String
132      * )
133      */
134     @Override
135     protected void checkUserExists(final String aUser) throws Exception {
136         assertEquals(1, countUser(aUser));
137     }
138
139     private int countUser(final String aUser) throws Exception {
140         int count = jpaTester.getDbUtils().executeInTransaction(
141             new JdbcUnitOfWork<Integer>() {
142                 @Override
143                 public Integer execute(Connection aConnection) throws Exception {
144                     ResultSet res = jpaTester.getDbUtils().executeQuery(
145                         aConnection, USER_QUERY, aUser);
146                     return jpaTester.getDbUtils().countResultSet(res);
147                 }
148             });
149         return count;
150     }
151
152     /*
153      * (non-Javadoc)
154      * 
155      * @see
156      * org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupNotExists(java.lang
157      * .String)
158      */
159     @Override
160     protected void checkUserNotExists(String aUser) throws Exception {
161         assertEquals(0, countUser(aUser));
162     }
163
164     /*
165      * (non-Javadoc)
166      * 
167      * @see org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupCount(int)
168      */
169     @Override
170     protected void checkGroupCount(int aSize) throws Exception {
171         assertEquals(aSize, jpaTester.getDbUtils().getTableSize(GROUP_TABLE));
172     }
173
174     private int countGroup(final String aGroup) throws Exception {
175         int count = jpaTester.getDbUtils().executeInTransaction(
176             new JdbcUnitOfWork<Integer>() {
177                 @Override
178                 public Integer execute(Connection aConnection) throws Exception {
179                     ResultSet res = jpaTester.getDbUtils().executeQuery(
180                         aConnection, GROUP_QUERY, aGroup);
181                     return jpaTester.getDbUtils().countResultSet(res);
182                 }
183             });
184         return count;
185     }
186
187     /*
188      * (non-Javadoc)
189      * 
190      * @see
191      * org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupExists(java.lang.String
192      * )
193      */
194     @Override
195     protected void checkGroupExists(String aGroup) throws Exception {
196         assertEquals(1, countGroup(aGroup));
197     }
198
199     /*
200      * (non-Javadoc)
201      * 
202      * @see
203      * org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupNotExists(java.lang
204      * .String)
205      */
206     @Override
207     protected void checkGroupNotExists(String aGroup) throws Exception {
208         assertEquals(0, countGroup(aGroup));
209     }
210
211     /*
212      * (non-Javadoc)
213      * 
214      * @see org.wamblee.usermgt.InMemoryGroupSetTest#createGroupSet()
215      */
216     @Override
217     protected UserSet createUserSet() {
218         return userset;
219     }
220
221     /*
222      * (non-Javadoc)
223      * 
224      * @see org.wamblee.usermgt.InMemoryUserSetTest#createGroupSet()
225      */
226     @Override
227     protected GroupSet createGroupSet() {
228         return groupset;
229     }
230
231     /**
232      * Reproduction of a bug. Create a user which is in group1 Add it to a
233      * second group group2. Remove the user from group1. Verify the user is in
234      * group2.
235      * 
236      */
237     public void testVerifyAddRemove() throws Exception {
238         jpaTester.getDbUtils().cleanDatabase(new SecurityTables()); // super
239                                                                     // class
240                                                                     // setup
241                                                                     // always
242                                                                     // creates
243                                                                     // one
244                                                                     // group.
245
246         GroupSet groups = getGroups();
247         assertEquals(0, groups.size());
248
249         Group group1 = createGroup("group1");
250         Group group2 = createGroup("group2");
251         groups.add(group1);
252         groups.add(group2);
253         checkGroupExists("group1");
254         checkGroupExists("group2");
255
256         User user = createUser("user", PASSWORD, group1);
257         getUsers().add(user);
258         checkUserExists("user");
259
260         addUserToGroup(user, group2);
261         getUsers().userModified(user);
262         clearUserCache();
263
264         User user2 = getUsers().find("user");
265
266         Set<Group> userGroups = user2.getGroups();
267         assertTrue(user2.isInGroup("group1"));
268         assertTrue(user2.isInGroup("group2"));
269         assertEquals(2, userGroups.size());
270
271         removeUserFromGroup(user, group1);
272         getUsers().userModified(user);
273         clearUserCache();
274         user2 = getUsers().find("user");
275         userGroups = user2.getGroups();
276         assertFalse(user2.isInGroup("group1"));
277         assertTrue(user2.isInGroup("group2"));
278         assertEquals(1, userGroups.size());
279     }
280 }