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