/* * Copyright 2016-present Facebook, 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 com.facebook.buck.event.listener; import static org.junit.Assert.assertThat; import com.facebook.buck.artifact_cache.ArtifactCacheMode; import com.facebook.buck.artifact_cache.CacheResult; import com.facebook.buck.event.TestEventConfigurator; import com.facebook.buck.rules.BuildEvent; import com.facebook.buck.rules.BuildRule; import com.facebook.buck.rules.BuildRuleDurationTracker; import com.facebook.buck.rules.BuildRuleEvent; import com.facebook.buck.rules.BuildRuleKeys; import com.facebook.buck.rules.BuildRuleStatus; import com.facebook.buck.rules.FakeBuildRule; import com.facebook.buck.rules.RuleKey; import com.google.common.collect.ImmutableSet; import java.util.Optional; import org.hamcrest.Matchers; import org.junit.Test; public class CacheRateStatsKeeperTest { @Test public void getStatsWithNoEvents() { CacheRateStatsKeeper cacheRateStatsKeeper = new CacheRateStatsKeeper(); CacheRateStatsKeeper.CacheRateStatsUpdateEvent stats = cacheRateStatsKeeper.getStats(); assertThat(stats.getCacheErrorCount(), Matchers.is(0)); assertThat(stats.getCacheErrorRate(), Matchers.is(0.0)); assertThat(stats.getCacheMissCount(), Matchers.is(0)); assertThat(stats.getCacheMissRate(), Matchers.is(0.0)); assertThat(stats.getCacheHitCount(), Matchers.is(0)); assertThat(stats.getUpdatedRulesCount(), Matchers.is(0)); } BuildRuleEvent.Finished finishedEvent(CacheResult cacheResult) { BuildRule rule = new FakeBuildRule("//fake:rule"); BuildRuleDurationTracker durationTracker = new BuildRuleDurationTracker(); BuildRuleEvent.Started started = TestEventConfigurator.configureTestEvent(BuildRuleEvent.started(rule, durationTracker)); return BuildRuleEvent.finished( started, BuildRuleKeys.of(new RuleKey("aa")), BuildRuleStatus.SUCCESS, cacheResult, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty()); } @Test public void cacheMissHitWithNoCount() { CacheRateStatsKeeper cacheRateStatsKeeper = new CacheRateStatsKeeper(); cacheRateStatsKeeper.buildRuleFinished(finishedEvent(CacheResult.miss())); cacheRateStatsKeeper.buildRuleFinished( finishedEvent(CacheResult.hit("dir", ArtifactCacheMode.dir))); CacheRateStatsKeeper.CacheRateStatsUpdateEvent stats = cacheRateStatsKeeper.getStats(); assertThat(stats.getCacheErrorCount(), Matchers.is(0)); assertThat(stats.getCacheErrorRate(), Matchers.is(0.0)); assertThat(stats.getCacheMissCount(), Matchers.is(1)); assertThat(stats.getCacheMissRate(), Matchers.is(0.0)); assertThat(stats.getCacheHitCount(), Matchers.is(1)); assertThat(stats.getUpdatedRulesCount(), Matchers.is(2)); } @Test public void cacheHit() { CacheRateStatsKeeper cacheRateStatsKeeper = new CacheRateStatsKeeper(); cacheRateStatsKeeper.ruleCountCalculated( BuildEvent.RuleCountCalculated.ruleCountCalculated(ImmutableSet.of(), 4)); cacheRateStatsKeeper.buildRuleFinished( finishedEvent(CacheResult.hit("dir", ArtifactCacheMode.dir))); CacheRateStatsKeeper.CacheRateStatsUpdateEvent stats = cacheRateStatsKeeper.getStats(); assertThat(stats.getCacheErrorCount(), Matchers.is(0)); assertThat(stats.getCacheErrorRate(), Matchers.is(0.0)); assertThat(stats.getCacheMissCount(), Matchers.is(0)); assertThat(stats.getCacheMissRate(), Matchers.is(0.0)); assertThat(stats.getCacheHitCount(), Matchers.is(1)); assertThat(stats.getUpdatedRulesCount(), Matchers.is(1)); } @Test public void cacheMiss() { CacheRateStatsKeeper cacheRateStatsKeeper = new CacheRateStatsKeeper(); cacheRateStatsKeeper.ruleCountCalculated( BuildEvent.RuleCountCalculated.ruleCountCalculated(ImmutableSet.of(), 4)); cacheRateStatsKeeper.buildRuleFinished(finishedEvent(CacheResult.miss())); CacheRateStatsKeeper.CacheRateStatsUpdateEvent stats = cacheRateStatsKeeper.getStats(); assertThat(stats.getCacheErrorCount(), Matchers.is(0)); assertThat(stats.getCacheErrorRate(), Matchers.is(0.0)); assertThat(stats.getCacheMissCount(), Matchers.is(1)); assertThat(stats.getCacheMissRate(), Matchers.is(25.0)); assertThat(stats.getCacheHitCount(), Matchers.is(0)); assertThat(stats.getUpdatedRulesCount(), Matchers.is(1)); } @Test public void cacheError() { CacheRateStatsKeeper cacheRateStatsKeeper = new CacheRateStatsKeeper(); cacheRateStatsKeeper.ruleCountCalculated( BuildEvent.RuleCountCalculated.ruleCountCalculated(ImmutableSet.of(), 4)); cacheRateStatsKeeper.buildRuleFinished( finishedEvent(CacheResult.error("dir", ArtifactCacheMode.dir, "error"))); CacheRateStatsKeeper.CacheRateStatsUpdateEvent stats = cacheRateStatsKeeper.getStats(); assertThat(stats.getCacheErrorCount(), Matchers.is(1)); assertThat(stats.getCacheErrorRate(), Matchers.is(100.0)); assertThat(stats.getCacheMissCount(), Matchers.is(0)); assertThat(stats.getCacheMissRate(), Matchers.is(0.0)); assertThat(stats.getCacheHitCount(), Matchers.is(0)); assertThat(stats.getUpdatedRulesCount(), Matchers.is(1)); } @Test public void cacheIgnored() { CacheRateStatsKeeper cacheRateStatsKeeper = new CacheRateStatsKeeper(); cacheRateStatsKeeper.ruleCountCalculated( BuildEvent.RuleCountCalculated.ruleCountCalculated(ImmutableSet.of(), 4)); cacheRateStatsKeeper.buildRuleFinished(finishedEvent(CacheResult.ignored())); CacheRateStatsKeeper.CacheRateStatsUpdateEvent stats = cacheRateStatsKeeper.getStats(); assertThat(stats.getCacheErrorCount(), Matchers.is(0)); assertThat(stats.getCacheErrorRate(), Matchers.is(0.0)); assertThat(stats.getCacheMissCount(), Matchers.is(0)); assertThat(stats.getCacheMissRate(), Matchers.is(0.0)); assertThat(stats.getCacheHitCount(), Matchers.is(0)); assertThat(stats.getUpdatedRulesCount(), Matchers.is(1)); } @Test public void cacheLocalUnchangedHitDoesntAffectCounters() { CacheRateStatsKeeper cacheRateStatsKeeper = new CacheRateStatsKeeper(); cacheRateStatsKeeper.ruleCountCalculated( BuildEvent.RuleCountCalculated.ruleCountCalculated(ImmutableSet.of(), 4)); cacheRateStatsKeeper.buildRuleFinished(finishedEvent(CacheResult.localKeyUnchangedHit())); CacheRateStatsKeeper.CacheRateStatsUpdateEvent stats = cacheRateStatsKeeper.getStats(); assertThat(stats.getCacheErrorCount(), Matchers.is(0)); assertThat(stats.getCacheErrorRate(), Matchers.is(0.0)); assertThat(stats.getCacheMissCount(), Matchers.is(0)); assertThat(stats.getCacheMissRate(), Matchers.is(0.0)); assertThat(stats.getCacheHitCount(), Matchers.is(0)); assertThat(stats.getUpdatedRulesCount(), Matchers.is(0)); } }