1 package com.atlassian.user.impl.hibernate;
2
3 import net.sf.hibernate.LazyInitializationException;
4
5 import com.atlassian.cache.CacheFactory;
6 import com.atlassian.cache.memory.MemoryCacheManager;
7 import com.atlassian.user.EntityException;
8 import com.atlassian.user.Group;
9 import com.atlassian.user.GroupManager;
10 import com.atlassian.user.User;
11 import com.atlassian.user.UserManager;
12 import com.atlassian.user.impl.DefaultUser;
13 import com.atlassian.user.impl.cache.CachingGroupManager;
14 import com.atlassian.user.impl.cache.CachingUserManager;
15
16 public class TestCachedHibernateGroupManager extends TestHibernateGroupManager
17 {
18 private CachingGroupManager cachingGroupManager;
19 private CachingUserManager cachingUserManager;
20
21 protected void onSetUp() throws Exception
22 {
23 super.onSetUp();
24 CacheFactory cacheFactory = new MemoryCacheManager();
25 cachingGroupManager = new CachingGroupManager(hibernateGroupManager, cacheFactory);
26 cachingUserManager = new CachingUserManager(hibernateUserManager, cacheFactory);
27 }
28
29 protected GroupManager getGroupManager()
30 {
31 return cachingGroupManager;
32 }
33
34 protected UserManager getUserManager()
35 {
36 return cachingUserManager;
37 }
38
39 public void testCachedGroupMembershipCollectionsAreBroken() throws Exception
40 {
41
42
43 Group group = hibernateGroupManager.createGroup("group");
44 hibernateGroupManager.addMembership(group, getUserManager().createUser("localUser"));
45 DefaultUser externalUser = new DefaultUser("externalUser");
46 hibernateGroupManager.addMembership(group, externalUser);
47
48
49
50 setComplete();
51 endTransaction();
52 startNewTransaction();
53 DefaultHibernateGroup cachedGroup = (DefaultHibernateGroup) getGroupManager().getGroup("group");
54
55
56 setComplete();
57 endTransaction();
58 startNewTransaction();
59
60
61 assertEquals(net.sf.hibernate.collection.Set.class, cachedGroup.getLocalMembers().getClass());
62 assertFalse(((net.sf.hibernate.collection.Set) cachedGroup.getLocalMembers()).wasInitialized());
63 assertEquals(net.sf.hibernate.collection.Set.class, cachedGroup.getExternalMembers().getClass());
64 assertFalse(((net.sf.hibernate.collection.Set) cachedGroup.getExternalMembers()).wasInitialized());
65
66 try
67 {
68 cachedGroup.getLocalMembers().size();
69 fail("Expected lazy-load exception");
70 }
71 catch (LazyInitializationException e)
72 {
73
74 }
75 try
76 {
77 cachedGroup.getExternalMembers().size();
78 fail("Expected lazy-load exception");
79 }
80 catch (LazyInitializationException e)
81 {
82
83 }
84
85
86 hibernateGroupManager.removeMembership(group,externalUser);
87 hibernateGroupManager.removeGroup(hibernateGroupManager.getGroup("group"));
88 hibernateUserManager.removeUser(hibernateUserManager.getUser("localUser"));
89 externalEntityDao.removeExternalEntity("externalUser");
90 setComplete();
91 endTransaction();
92 }
93
94 public void testHanglingDetachedUsers() throws EntityException
95 {
96 String userName = "andrew";
97 getUserManager().createUser(userName);
98 setComplete();
99 endTransaction();
100 startNewTransaction();
101
102 User cachedUser = getUserManager().getUser(userName);
103 User notCachedUser = hibernateUserManager.getUser(userName);
104 cachedUser.setFullName("blah");
105 hibernateUserManager.saveUser(cachedUser);
106 assertNotSame(notCachedUser, cachedUser);
107 setComplete();
108 endTransaction();
109 startNewTransaction();
110
111 getUserManager().removeUser(cachedUser);
112 setComplete();
113 endTransaction();
114 }
115
116 public void testAssigningUsersToAGroup() throws EntityException
117 {
118 Group group = hibernateGroupManager.createGroup("evil");
119 UserManager cachingUserManager = getUserManager();
120 String userName = "andrew";
121 cachingUserManager.createUser(userName);
122 setComplete();
123 endTransaction();
124 startNewTransaction();
125
126 User cachedUser = cachingUserManager.getUser(userName);
127 User notCachedUser = hibernateUserManager.getUser(userName);
128 assertNotSame(notCachedUser, cachedUser);
129
130 getGroupManager().addMembership(group, cachedUser);
131 setComplete();
132 endTransaction();
133 startNewTransaction();
134
135 hibernateGroupManager.removeMembership(group, hibernateUserManager.getUser(userName));
136 hibernateGroupManager.removeGroup(hibernateGroupManager.getGroup("evil"));
137 hibernateUserManager.removeUser(hibernateUserManager.getUser(userName));
138 setComplete();
139 endTransaction();
140 }
141
142 }