CachingUserAttributeSource implements UserAttributeSource { @Override public Multimap<String, String> getAttributesForUser(String userName) { try { return cache.get(userName); } catch (ExecutionException e) { throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Error getting user attributes from cache", e); } } CachingUserAttributeSource(final UserAttributeSource userAttributeSource, long ttlSeconds, long maxCacheSize); @VisibleForTesting  CachingUserAttributeSource(final UserAttributeSource userAttributeSource, long ttlSeconds, long maxCacheSize, Ticker ticker); @Override Multimap<String, String> getAttributesForUser(String userName); @Override Class<? extends UserAttributeSourceParams> getParamsClass(); @Override void init(UserAttributeSourceParams params, Collection<String> attributes);  }
@Test public void testWithMocks(){ Multimap<String, String> mockUserAttributes = LinkedListMultimap.create(); mockUserAttributes.putAll("attr1", Arrays.asList("A", "B", "C")); mockUserAttributes.put("attr2", "DEF"); mockUserAttributes.put("attr3", "3"); Mockito.when(mockUserAttributeSource.getAttributesForUser(Mockito.<String>any())).thenReturn(mockUserAttributes); CachingUserAttributeSource cachingUserAttributeSource = new CachingUserAttributeSource(mockUserAttributeSource, SolrAttrBasedFilter.CACHE_TTL_DEFAULT, SolrAttrBasedFilter.CACHE_MAX_SIZE_DEFAULT); cachingUserAttributeSource.getAttributesForUser("user1"); cachingUserAttributeSource.getAttributesForUser("user1"); cachingUserAttributeSource.getAttributesForUser("user1"); cachingUserAttributeSource.getAttributesForUser("user1"); Mockito.verify(mockUserAttributeSource, times(1)).getAttributesForUser("user1"); }
@Test public void testCacheSizeWithMocks(){ Multimap<String, String> mockUserAttributes = LinkedListMultimap.create(); mockUserAttributes.putAll("attr1", Arrays.asList("A", "B", "C")); mockUserAttributes.put("attr2", "DEF"); mockUserAttributes.put("attr3", "3"); Mockito.when(mockUserAttributeSource.getAttributesForUser(Mockito.<String>any())).thenReturn(mockUserAttributes); CachingUserAttributeSource cachingUserAttributeSource = new CachingUserAttributeSource(mockUserAttributeSource, SolrAttrBasedFilter.CACHE_TTL_DEFAULT, 3); cachingUserAttributeSource.getAttributesForUser("user1"); cachingUserAttributeSource.getAttributesForUser("user2"); cachingUserAttributeSource.getAttributesForUser("user3"); cachingUserAttributeSource.getAttributesForUser("user1"); cachingUserAttributeSource.getAttributesForUser("user2"); cachingUserAttributeSource.getAttributesForUser("user3"); Mockito.verify(mockUserAttributeSource, times(1)).getAttributesForUser("user1"); Mockito.verify(mockUserAttributeSource, times(1)).getAttributesForUser("user2"); Mockito.verify(mockUserAttributeSource, times(1)).getAttributesForUser("user3"); cachingUserAttributeSource.getAttributesForUser("user4"); cachingUserAttributeSource.getAttributesForUser("user1"); Mockito.verify(mockUserAttributeSource, times(2)).getAttributesForUser("user1"); }
@Test public void testCacheTtlWithMocks(){ Multimap<String, String> mockUserAttributes = LinkedListMultimap.create(); mockUserAttributes.putAll("attr1", Arrays.asList("A", "B", "C")); mockUserAttributes.put("attr2", "DEF"); mockUserAttributes.put("attr3", "3"); Mockito.when(mockUserAttributeSource.getAttributesForUser(Mockito.<String>any())).thenReturn(mockUserAttributes); FastForwardTicker time = new FastForwardTicker(); CachingUserAttributeSource cachingUserAttributeSource = new CachingUserAttributeSource(mockUserAttributeSource, 1, 100, time); cachingUserAttributeSource.getAttributesForUser("user1"); cachingUserAttributeSource.getAttributesForUser("user2"); cachingUserAttributeSource.getAttributesForUser("user3"); cachingUserAttributeSource.getAttributesForUser("user1"); cachingUserAttributeSource.getAttributesForUser("user2"); cachingUserAttributeSource.getAttributesForUser("user3"); Mockito.verify(mockUserAttributeSource, times(1)).getAttributesForUser("user1"); Mockito.verify(mockUserAttributeSource, times(1)).getAttributesForUser("user2"); Mockito.verify(mockUserAttributeSource, times(1)).getAttributesForUser("user3"); time.fastForward(Duration.ofSeconds(2)); cachingUserAttributeSource.getAttributesForUser("user1"); cachingUserAttributeSource.getAttributesForUser("user2"); cachingUserAttributeSource.getAttributesForUser("user3"); Mockito.verify(mockUserAttributeSource, times(2)).getAttributesForUser("user1"); Mockito.verify(mockUserAttributeSource, times(2)).getAttributesForUser("user2"); Mockito.verify(mockUserAttributeSource, times(2)).getAttributesForUser("user3"); }