2 * Copyright 2005-2010 the original author or authors.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org.wamblee.security.authentication.jpa;
18 import java.sql.Connection;
19 import java.sql.ResultSet;
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;
38 * Tests for {@link org.wamblee.usermgt.hibernate.HibernateGroupSet}
40 * @author Erik Brakkee
42 public class JpaUserSetTest extends InMemoryUserSetTest {
43 private static final String USER_TABLE = "SEC_USER";
45 private static final String GROUP_TABLE = "SEC_GROUP";
47 private static final String USER_QUERY = "select * from " + USER_TABLE +
50 private static final String GROUP_QUERY = "select * from " + GROUP_TABLE +
53 private UserSet userset;
55 private GroupSet groupset;
57 private EhCache<String, User> userCache;
59 private JpaTester jpaTester;
64 * @see org.wamblee.usermgt.InMemoryUserSetTest#setUp()
67 protected void setUp() throws Exception {
68 jpaTester = new JpaTester(new SecurityPersistenceUnit());
71 userCache = new EhCache<String, User>(new ClassPathResource(
72 "properties/org.wamblee.security.ehcache.xml"), "users");
74 userset = createUserSetImpl();
75 groupset = createGroupSetImpl();
82 private UserSet createUserSetImpl() {
83 NameValidator passwordValidator = new RegexpNameValidator(".{5,}",
84 "INVALID_PASSWORD", "Password must have at least 5 characters");
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);
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);
104 protected void tearDown() throws Exception {
110 * Clears the user cache.
112 private void clearUserCache() {
119 * @see org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupCount(int)
122 protected void checkUserCount(int aSize) throws Exception {
123 super.checkUserCount(aSize);
124 assertEquals(aSize, jpaTester.getDbUtils().getTableSize(USER_TABLE));
131 * org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupExists(java.lang.String
135 protected void checkUserExists(final String aUser) throws Exception {
136 assertEquals(1, countUser(aUser));
139 private int countUser(final String aUser) throws Exception {
140 int count = jpaTester.getDbUtils().executeInTransaction(
141 new JdbcUnitOfWork<Integer>() {
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);
156 * org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupNotExists(java.lang
160 protected void checkUserNotExists(String aUser) throws Exception {
161 assertEquals(0, countUser(aUser));
167 * @see org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupCount(int)
170 protected void checkGroupCount(int aSize) throws Exception {
171 assertEquals(aSize, jpaTester.getDbUtils().getTableSize(GROUP_TABLE));
174 private int countGroup(final String aGroup) throws Exception {
175 int count = jpaTester.getDbUtils().executeInTransaction(
176 new JdbcUnitOfWork<Integer>() {
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);
191 * org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupExists(java.lang.String
195 protected void checkGroupExists(String aGroup) throws Exception {
196 assertEquals(1, countGroup(aGroup));
203 * org.wamblee.usermgt.InMemoryGroupSetTest#checkGroupNotExists(java.lang
207 protected void checkGroupNotExists(String aGroup) throws Exception {
208 assertEquals(0, countGroup(aGroup));
214 * @see org.wamblee.usermgt.InMemoryGroupSetTest#createGroupSet()
217 protected UserSet createUserSet() {
224 * @see org.wamblee.usermgt.InMemoryUserSetTest#createGroupSet()
227 protected GroupSet createGroupSet() {
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
237 public void testVerifyAddRemove() throws Exception {
238 jpaTester.getDbUtils().cleanDatabase(new SecurityTables()); // super
246 GroupSet groups = getGroups();
247 assertEquals(0, groups.size());
249 Group group1 = createGroup("group1");
250 Group group2 = createGroup("group2");
253 checkGroupExists("group1");
254 checkGroupExists("group2");
256 User user = createUser("user", PASSWORD, group1);
257 getUsers().add(user);
258 checkUserExists("user");
260 addUserToGroup(user, group2);
261 getUsers().userModified(user);
264 User user2 = getUsers().find("user");
266 Set<Group> userGroups = user2.getGroups();
267 assertTrue(user2.isInGroup("group1"));
268 assertTrue(user2.isInGroup("group2"));
269 assertEquals(2, userGroups.size());
271 removeUserFromGroup(user, group1);
272 getUsers().userModified(user);
274 user2 = getUsers().find("user");
275 userGroups = user2.getGroups();
276 assertFalse(user2.isInGroup("group1"));
277 assertTrue(user2.isInGroup("group2"));
278 assertEquals(1, userGroups.size());