/* * Copyright Terracotta, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.ehcache.impl.internal.statistics; import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; import org.ehcache.Cache; import org.ehcache.CacheManager; import org.ehcache.config.CacheConfiguration; import org.ehcache.config.builders.CacheConfigurationBuilder; import org.ehcache.config.builders.CacheManagerBuilder; import org.ehcache.core.statistics.CacheOperationOutcomes; import org.ehcache.core.statistics.TierOperationOutcomes; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.terracotta.context.ContextManager; import org.terracotta.context.TreeNode; import org.terracotta.context.query.Matchers; import org.terracotta.context.query.Query; import org.terracotta.statistics.OperationStatistic; import org.terracotta.statistics.StatisticsManager; import static org.assertj.core.api.Assertions.assertThat; import static org.ehcache.config.builders.ResourcePoolsBuilder.heap; import static org.ehcache.impl.internal.statistics.StatsUtils.findLowestTier; import static org.ehcache.impl.internal.statistics.StatsUtils.findOperationStatisticOnChildren; import static org.ehcache.impl.internal.statistics.StatsUtils.findStatisticOnDescendants; import static org.ehcache.impl.internal.statistics.StatsUtils.findTiers; import static org.ehcache.impl.internal.statistics.StatsUtils.hasProperty; import static org.ehcache.impl.internal.statistics.StatsUtils.hasTag; import static org.terracotta.context.query.Matchers.attributes; import static org.terracotta.context.query.Matchers.context; import static org.terracotta.context.query.Matchers.hasAttribute; import static org.terracotta.context.query.QueryBuilder.queryBuilder; public class StatsUtilsTest { @Rule public ExpectedException expectedException = ExpectedException.none(); CacheManager cacheManager; Cache<Long, String> cache; @Before public void before() { CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, heap(10)).build(); cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withCache("aCache", cacheConfiguration) .build(true); cache = cacheManager.getCache("aCache", Long.class, String.class); StatisticsManager.createPassThroughStatistic(cache, "test", Collections.<String>emptySet(), Collections.singletonMap("myproperty", "myvalue"), new Callable<Number>() { @Override public Number call() throws Exception { return 0; } }); cache.get(1L); } @After public void after() { if(cacheManager != null) { cacheManager.close(); } } @Test public void testHasTag_found() throws Exception { Set<TreeNode> statResult = queryProperty("cache"); assertThat(statResult.size()).isEqualTo(1); } @Test public void testHasTag_notfound() throws Exception { Set<TreeNode> statResult = queryProperty("xxx"); assertThat(statResult.size()).isZero(); } private Set<TreeNode> queryProperty(String tag) { @SuppressWarnings("unchecked") Query statQuery = queryBuilder() .descendants() .filter(context(attributes(Matchers.<Map<String, Object>>allOf( hasAttribute("name", "get"), hasTag(tag) )))) .build(); return statQuery.execute(Collections.singleton(ContextManager.nodeFor(cache))); } @Test public void testHasProperty_found() throws Exception { Set<TreeNode> statResult = queryProperty("myproperty", "myvalue"); assertThat(statResult.size()).isEqualTo(1); } @Test public void testHasProperty_notfoundKey() throws Exception { Set<TreeNode> statResult = queryProperty("xxx"); assertThat(statResult.size()).isZero(); } @Test public void testHasProperty_valueDoesntMatch() throws Exception { Set<TreeNode> statResult = queryProperty("myproperty", "xxx"); assertThat(statResult.size()).isZero(); } @SuppressWarnings("unchecked") private Set<TreeNode> queryProperty(String key, String value) { Query statQuery = queryBuilder() .descendants() .filter(context(attributes(Matchers.<Map<String, Object>>allOf( hasAttribute("name", "test"), hasProperty(key, value) )))) .build(); return statQuery.execute(Collections.singleton(ContextManager.nodeFor(cache))); } @SuppressWarnings("unchecked") @Test public void testFindStatisticOnDescendantsWithDiscriminator() throws Exception { OperationStatistic<TierOperationOutcomes.GetOutcome> stat = findStatisticOnDescendants(cache, "OnHeap", "tier", "get"); assertThat(stat.sum()).isEqualTo(1L); stat = findStatisticOnDescendants(cache, "OnHeap", "tier", "xxx"); assertThat(stat).isNull(); stat = findStatisticOnDescendants(cache, "xxx", "tier", "xxx"); assertThat(stat).isNull(); } @SuppressWarnings("unchecked") @Test public void testFindStatisticOnDescendants() throws Exception { OperationStatistic<TierOperationOutcomes.GetOutcome> stat = findStatisticOnDescendants(cache, "OnHeap", "get"); assertThat(stat.sum()).isEqualTo(1L); stat = findStatisticOnDescendants(cache, "OnHeap", "xxx"); assertThat(stat).isNull(); stat = findStatisticOnDescendants(cache, "xxx", "xxx"); assertThat(stat).isNull(); } @Test public void testFindCacheStatistic() { OperationStatistic<CacheOperationOutcomes.GetOutcome> stat = findOperationStatisticOnChildren(cache, CacheOperationOutcomes.GetOutcome.class, "get"); assertThat(stat.sum()).isEqualTo(1L); } @Test public void testFindCacheStatistic_notExisting() { expectedException.expect(RuntimeException.class); findOperationStatisticOnChildren(cache, CacheOperationOutcomes.GetOutcome.class, "xxx"); } @Test public void testFindTiers() { String[] tiers = findTiers(cache); assertThat(tiers).containsOnly("OnHeap"); } @Test public void testFindLowerTier_one() { String tier = findLowestTier(new String[] { "OnHeap" }); assertThat(tier).isEqualTo("OnHeap"); } @Test public void testFindLowerTier_two() { String tier = findLowestTier(new String[] { "OnHeap", "Offheap" }); assertThat(tier).isEqualTo("Offheap"); } @Test public void testFindLowerTier_three() { String tier = findLowestTier(new String[] { "OnHeap", "Offheap", "Disk" }); assertThat(tier).isEqualTo("Disk"); } @Test public void testFindLowerTier_none() { expectedException.expect(RuntimeException.class); findLowestTier(new String[0]); } }