1   package com.atlassian.user.impl.cache;
2   
3   import com.atlassian.cache.CacheFactory;
4   import com.atlassian.cache.memory.MemoryCacheManager;
5   import com.atlassian.user.EntityException;
6   import com.atlassian.user.Group;
7   import com.atlassian.user.User;
8   import com.atlassian.user.impl.DefaultGroup;
9   import com.atlassian.user.impl.DefaultUser;
10  import com.atlassian.user.impl.memory.MemoryGroupManager;
11  import com.atlassian.user.impl.memory.provider.MemoryProvider;
12  import com.atlassian.user.repository.DefaultRepositoryIdentifier;
13  import com.atlassian.user.search.page.Pager;
14  import junit.framework.TestCase;
15  
16  import java.util.*;
17  
18  public class TestCachingGroupManager extends TestCase
19  {
20      public void testCacheMissCachesReturnedGroupsIndividually() throws Exception
21      {
22          MemoryProvider memoryProvider = new MemoryProvider();
23          CallTrackingGroupManager underlyingGroupManager = new CallTrackingGroupManager(memoryProvider);
24          final CachingGroupManager groupManager = new CachingGroupManager(underlyingGroupManager, new MemoryCacheManager());
25          Group group = new DefaultGroup("group1");
26          User user = new DefaultUser("user1");
27          memoryProvider.addGroup(group);
28          memoryProvider.addUser(user);
29          memoryProvider.addMembership(group, user);
30  
31          Iterator groupsIterator = groupManager.getGroups(user).iterator();
32          assertEquals(group, groupsIterator.next());
33          assertFalse("Should be only one group", groupsIterator.hasNext());
34          // Note that this subsequent retrieval of the group should hit the newly cached group.
35          assertEquals(group, groupManager.getGroup(group.getName()));
36  
37          assertEquals(1, underlyingGroupManager.getMethodCalls().size());
38          assertEquals("getGroups(User)", underlyingGroupManager.getMethodCalls().get(0));
39      }
40  
41      public void testCacheHitGetsGroupsFromUnderlyingManager() throws Exception
42      {
43          MemoryProvider memoryProvider = new MemoryProvider();
44          CallTrackingGroupManager underlyingGroupManager = new CallTrackingGroupManager(memoryProvider);
45          CacheFactory cacheFactory = new MemoryCacheManager();
46          CachingGroupManager groupManager = new CachingGroupManager(underlyingGroupManager, cacheFactory);
47          Group group = new DefaultGroup("group1");
48          User user = new DefaultUser("user1");
49          memoryProvider.addGroup(group);
50          memoryProvider.addUser(user);
51          memoryProvider.addMembership(group, user);
52          cacheFactory.getCache(underlyingGroupManager.getClass().getName() + ".key.groups_getGroupsForUser").put(
53              user.getName(), Collections.singletonList(group.getName()));
54  
55          Iterator groupsIterator = groupManager.getGroups(user).iterator();
56          assertEquals(group, groupsIterator.next());
57          assertFalse("Should be only one group", groupsIterator.hasNext());
58  
59          assertEquals(1, underlyingGroupManager.getMethodCalls().size());
60          assertEquals("getGroup(String)", underlyingGroupManager.getMethodCalls().get(0));
61  
62      }
63  
64      private static class CallTrackingGroupManager extends MemoryGroupManager
65      {
66          private List<String> methodCalls = new ArrayList<String>();
67  
68          public CallTrackingGroupManager(MemoryProvider memoryProvider)
69          {
70              super(new DefaultRepositoryIdentifier("key", "name"), memoryProvider);
71          }
72  
73          public Pager<Group> getGroups(User user) throws EntityException
74          {
75              methodCalls.add("getGroups(User)");
76              return super.getGroups();
77          }
78  
79          public Group getGroup(String groupName)
80          {
81              methodCalls.add("getGroup(String)");
82              return super.getGroup(groupName);
83          }
84  
85          public List/*<String>*/ getMethodCalls()
86          {
87              return methodCalls;
88          }
89      }
90  }