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          // first session -- create membership in underlying manager, so it isn't cached
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          // second session -- put the group in the cache, but without loading the membership collections
49  
50          setComplete();
51          endTransaction();
52          startNewTransaction();
53          DefaultHibernateGroup cachedGroup = (DefaultHibernateGroup) getGroupManager().getGroup("group");
54  
55          // third session -- access lazy-loaded membership collections in cached group
56          setComplete();
57          endTransaction();
58          startNewTransaction();
59  
60          // the cached group contains lazy-loaded collections that haven't yet been populated
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              // expected exception (known "buggy" behaviour)
74          }
75          try
76          {
77              cachedGroup.getExternalMembers().size();
78              fail("Expected lazy-load exception");
79          }
80          catch (LazyInitializationException e)
81          {
82              // expected exception (known "buggy" behaviour)
83          }
84  
85          // remove the group we added and committed
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         DefaultUser user = new DefaultUser(notCachedUser);
105         user.setFullName("blah");
106         hibernateUserManager.saveUser(user);
107         assertNotSame(notCachedUser, cachedUser);
108         setComplete();
109         endTransaction();
110         startNewTransaction();
111 
112         getUserManager().removeUser(cachedUser);
113         setComplete();
114         endTransaction();
115     }
116 
117     public void testAssigningUsersToAGroup() throws EntityException
118     {
119         Group group = hibernateGroupManager.createGroup("evil");
120         UserManager cachingUserManager = getUserManager();
121         String userName = "andrew";
122         cachingUserManager.createUser(userName);
123         setComplete();
124         endTransaction();
125         startNewTransaction();
126 
127         User cachedUser = cachingUserManager.getUser(userName);
128         User notCachedUser = hibernateUserManager.getUser(userName);
129         assertNotSame(notCachedUser, cachedUser);
130 
131         getGroupManager().addMembership(group, cachedUser);
132         setComplete();
133         endTransaction();
134         startNewTransaction();
135 
136         hibernateGroupManager.removeMembership(group, hibernateUserManager.getUser(userName));
137         hibernateGroupManager.removeGroup(hibernateGroupManager.getGroup("evil"));
138         hibernateUserManager.removeUser(hibernateUserManager.getUser(userName));
139         setComplete();
140         endTransaction();
141     }
142 
143 }