2019-09-09 10:57:44 +02:00
package com.baeldung.caffeine ;
import static org.junit.Assert.* ;
import java.util.Arrays ;
import java.util.Map ;
import java.util.concurrent.TimeUnit ;
import javax.annotation.Nonnull ;
2020-04-29 20:49:15 +02:00
import org.junit.Assert ;
2019-09-09 10:57:44 +02:00
import org.junit.Test ;
import com.github.benmanes.caffeine.cache.* ;
public class CaffeineUnitTest {
@Test
public void givenCache_whenPopulate_thenValueStored ( ) {
Cache < String , DataObject > cache = Caffeine . newBuilder ( ) . expireAfterWrite ( 1 , TimeUnit . MINUTES ) . maximumSize ( 100 ) . build ( ) ;
String key = " A " ;
DataObject dataObject = cache . getIfPresent ( key ) ;
assertNull ( dataObject ) ;
dataObject = cache . get ( key , k - > DataObject . get ( " Data for A " ) ) ;
assertNotNull ( dataObject ) ;
assertEquals ( " Data for A " , dataObject . getData ( ) ) ;
cache . put ( key , dataObject ) ;
dataObject = cache . getIfPresent ( key ) ;
assertNotNull ( dataObject ) ;
cache . invalidate ( key ) ;
dataObject = cache . getIfPresent ( key ) ;
assertNull ( dataObject ) ;
}
@Test
public void givenLoadingCache_whenGet_thenValuePopulated ( ) {
LoadingCache < String , DataObject > cache = Caffeine . newBuilder ( ) . maximumSize ( 100 ) . expireAfterWrite ( 1 , TimeUnit . MINUTES ) . build ( k - > DataObject . get ( " Data for " + k ) ) ;
String key = " A " ;
DataObject dataObject = cache . get ( key ) ;
assertNotNull ( dataObject ) ;
assertEquals ( " Data for " + key , dataObject . getData ( ) ) ;
Map < String , DataObject > dataObjectMap = cache . getAll ( Arrays . asList ( " A " , " B " , " C " ) ) ;
assertEquals ( 3 , dataObjectMap . size ( ) ) ;
}
@Test
public void givenAsyncLoadingCache_whenGet_thenValuePopulated ( ) {
AsyncLoadingCache < String , DataObject > cache = Caffeine . newBuilder ( ) . maximumSize ( 100 ) . expireAfterWrite ( 1 , TimeUnit . MINUTES ) . buildAsync ( k - > DataObject . get ( " Data for " + k ) ) ;
String key = " A " ;
cache . get ( key ) . thenAccept ( dataObject - > {
assertNotNull ( dataObject ) ;
assertEquals ( " Data for " + key , dataObject . getData ( ) ) ;
} ) ;
2020-04-29 20:49:15 +02:00
cache . getAll ( Arrays . asList ( " A " , " B " , " C " ) ) . thenAccept ( dataObjectMap - > Assert . assertEquals ( 3 , dataObjectMap . size ( ) ) ) ;
2019-09-09 10:57:44 +02:00
}
@Test
public void givenLoadingCacheWithSmallSize_whenPut_thenSizeIsConstant ( ) {
LoadingCache < String , DataObject > cache = Caffeine . newBuilder ( ) . maximumSize ( 1 ) . refreshAfterWrite ( 10 , TimeUnit . MINUTES ) . build ( k - > DataObject . get ( " Data for " + k ) ) ;
2020-04-29 20:49:15 +02:00
Assert . assertEquals ( 0 , cache . estimatedSize ( ) ) ;
2019-09-09 10:57:44 +02:00
cache . get ( " A " ) ;
2020-04-29 20:49:15 +02:00
Assert . assertEquals ( 1 , cache . estimatedSize ( ) ) ;
2019-09-09 10:57:44 +02:00
cache . get ( " B " ) ;
cache . cleanUp ( ) ;
2020-04-29 20:49:15 +02:00
Assert . assertEquals ( 1 , cache . estimatedSize ( ) ) ;
2019-09-09 10:57:44 +02:00
}
@Test
public void givenLoadingCacheWithWeigher_whenPut_thenSizeIsConstant ( ) {
LoadingCache < String , DataObject > cache = Caffeine . newBuilder ( ) . maximumWeight ( 10 ) . weigher ( ( k , v ) - > 5 ) . build ( k - > DataObject . get ( " Data for " + k ) ) ;
2020-04-29 20:49:15 +02:00
Assert . assertEquals ( 0 , cache . estimatedSize ( ) ) ;
2019-09-09 10:57:44 +02:00
cache . get ( " A " ) ;
2020-04-29 20:49:15 +02:00
Assert . assertEquals ( 1 , cache . estimatedSize ( ) ) ;
2019-09-09 10:57:44 +02:00
cache . get ( " B " ) ;
2020-04-29 20:49:15 +02:00
Assert . assertEquals ( 2 , cache . estimatedSize ( ) ) ;
2019-09-09 10:57:44 +02:00
cache . get ( " C " ) ;
cache . cleanUp ( ) ;
2020-04-29 20:49:15 +02:00
Assert . assertEquals ( 2 , cache . estimatedSize ( ) ) ;
2019-09-09 10:57:44 +02:00
}
@Test
public void givenTimeEvictionCache_whenTimeLeft_thenValueEvicted ( ) {
LoadingCache < String , DataObject > cache = Caffeine . newBuilder ( ) . expireAfterAccess ( 5 , TimeUnit . MINUTES ) . build ( k - > DataObject . get ( " Data for " + k ) ) ;
cache = Caffeine . newBuilder ( ) . expireAfterWrite ( 10 , TimeUnit . SECONDS ) . weakKeys ( ) . weakValues ( ) . build ( k - > DataObject . get ( " Data for " + k ) ) ;
cache = Caffeine . newBuilder ( ) . expireAfterWrite ( 10 , TimeUnit . SECONDS ) . softValues ( ) . build ( k - > DataObject . get ( " Data for " + k ) ) ;
cache = Caffeine . newBuilder ( ) . expireAfter ( new Expiry < String , DataObject > ( ) {
@Override
public long expireAfterCreate ( @Nonnull String key , @Nonnull DataObject value , long currentTime ) {
return value . getData ( ) . length ( ) * 1000 ;
}
@Override
public long expireAfterUpdate ( @Nonnull String key , @Nonnull DataObject value , long currentTime , long currentDuration ) {
return currentDuration ;
}
@Override
public long expireAfterRead ( @Nonnull String key , @Nonnull DataObject value , long currentTime , long currentDuration ) {
return currentDuration ;
}
} ) . build ( k - > DataObject . get ( " Data for " + k ) ) ;
cache = Caffeine . newBuilder ( ) . refreshAfterWrite ( 1 , TimeUnit . MINUTES ) . build ( k - > DataObject . get ( " Data for " + k ) ) ;
}
@Test
public void givenCache_whenStatsEnabled_thenStatsRecorded ( ) {
LoadingCache < String , DataObject > cache = Caffeine . newBuilder ( ) . maximumSize ( 100 ) . recordStats ( ) . build ( k - > DataObject . get ( " Data for " + k ) ) ;
cache . get ( " A " ) ;
cache . get ( " A " ) ;
2020-04-29 20:49:15 +02:00
Assert . assertEquals ( 1 , cache . stats ( ) . hitCount ( ) ) ;
Assert . assertEquals ( 1 , cache . stats ( ) . missCount ( ) ) ;
2019-09-09 10:57:44 +02:00
}
}