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
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
86 {
87 return methodCalls;
88 }
89 }
90 }