diff options
author | Godin <mandrikov@gmail.com> | 2010-12-06 15:25:47 +0000 |
---|---|---|
committer | Godin <mandrikov@gmail.com> | 2010-12-06 15:25:47 +0000 |
commit | def5c589d4d2b79c8e4a0c6da5d18c34ca22a889 (patch) | |
tree | ada2bac9cbd22216648f6464149b663c6c2e90d6 /plugins/sonar-core-plugin/src | |
parent | 8c32fa320d796fe4672dd671ea8219989bcaa2eb (diff) | |
download | sonarqube-def5c589d4d2b79c8e4a0c6da5d18c34ca22a889.tar.gz sonarqube-def5c589d4d2b79c8e4a0c6da5d18c34ca22a889.zip |
NewViolationsDecorator :
* Fix bug
* Add unit tests
Diffstat (limited to 'plugins/sonar-core-plugin/src')
3 files changed, 151 insertions, 15 deletions
diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java index d3bc967772e..e3294c0de25 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java @@ -22,6 +22,7 @@ package org.sonar.plugins.core.timemachine; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; import org.sonar.api.batch.Decorator; import org.sonar.api.batch.DecoratorContext; import org.sonar.api.batch.DependedUpon; @@ -122,7 +123,10 @@ public class NewViolationsDecorator implements Decorator { } } - for (Rule rule : childrenByRule.keys()) { + Set<Rule> rules = Sets.newHashSet(violationsByRule.keys()); + rules.addAll(childrenByRule.keys()); + + for (Rule rule : rules) { RuleMeasure measure = RuleMeasure.createForRule(CoreMetrics.NEW_VIOLATIONS, rule, null); measure.setRulePriority(ruleToLevel.get(rule)); for (PastSnapshot variationSnapshot : timeMachineConfiguration.getProjectPastSnapshots()) { diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PastSnapshot.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PastSnapshot.java index 87d803612e8..f4c0e545652 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PastSnapshot.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PastSnapshot.java @@ -24,7 +24,7 @@ import org.sonar.api.database.model.Snapshot; import java.util.Date; -public final class PastSnapshot { +public class PastSnapshot { private int index; private String mode, modeParameter; diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java index 0ab3cfaa4a3..520b5551a55 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java @@ -19,34 +19,74 @@ */ package org.sonar.plugins.core.timemachine; +import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.time.DateUtils; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; import org.junit.Before; import org.junit.Test; import org.sonar.api.batch.DecoratorContext; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.Measure; +import org.sonar.api.measures.Metric; +import org.sonar.api.measures.RuleMeasure; import org.sonar.api.resources.Project; +import org.sonar.api.resources.Resource; +import org.sonar.api.rules.Rule; +import org.sonar.api.rules.RulePriority; import org.sonar.api.rules.Violation; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; -import static org.hamcrest.Matchers.greaterThan; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class NewViolationsDecoratorTest { + private Rule rule1; + private Rule rule2; + private Rule rule3; private NewViolationsDecorator decorator; private DecoratorContext context; + private Resource resource; + + private Date rightNow; + private Date tenDaysAgo; + private Date fiveDaysAgo; @Before public void setUp() { + rightNow = new Date(); + tenDaysAgo = DateUtils.addDays(rightNow, -10); + fiveDaysAgo = DateUtils.addDays(rightNow, -5); + + PastSnapshot pastSnapshot = mock(PastSnapshot.class); + when(pastSnapshot.getIndex()).thenReturn(1); + when(pastSnapshot.getDate()).thenReturn(fiveDaysAgo); + + PastSnapshot pastSnapshot2 = mock(PastSnapshot.class); + when(pastSnapshot2.getIndex()).thenReturn(2); + when(pastSnapshot2.getDate()).thenReturn(tenDaysAgo); + + TimeMachineConfiguration timeMachineConfiguration = mock(TimeMachineConfiguration.class); + when(timeMachineConfiguration.getProjectPastSnapshots()).thenReturn(Arrays.asList(pastSnapshot, pastSnapshot2)); + context = mock(DecoratorContext.class); - decorator = new NewViolationsDecorator(null); + resource = mock(Resource.class); + when(context.getResource()).thenReturn(resource); + + decorator = new NewViolationsDecorator(timeMachineConfiguration); + + rule1 = Rule.create().setPluginName("rule1").setKey("rule1").setName("name1"); + rule2 = Rule.create().setPluginName("rule2").setKey("rule2").setName("name2"); + rule3 = Rule.create().setPluginName("rule3").setKey("rule3").setName("name3"); } @Test @@ -62,21 +102,16 @@ public class NewViolationsDecoratorTest { @Test public void shouldBeDependedUponMetric() { - assertThat(decorator.generatesMetric().size(), greaterThan(0)); + assertThat(decorator.generatesMetric().size(), is(6)); } @Test public void shouldCountViolationsAfterDate() { - Date date1 = new Date(); - Date date2 = DateUtils.addDays(date1, -20); - Project project = new Project("project"); - project.setAnalysisDate(date1); - Violation violation1 = new Violation(null).setCreatedAt(date1); - Violation violation2 = new Violation(null).setCreatedAt(date2); - List<Violation> violations = Arrays.asList(violation1, violation2); - - assertThat(decorator.countViolations(violations, DateUtils.addDays(date1, -10)), is(1)); - assertThat(decorator.countViolations(violations, DateUtils.addDays(date1, -30)), is(2)); + List<Violation> violations = createViolations(); + + assertThat(decorator.countViolations(null, fiveDaysAgo), is(0)); + assertThat(decorator.countViolations(violations, fiveDaysAgo), is(3)); + assertThat(decorator.countViolations(violations, tenDaysAgo), is(6)); } @Test @@ -89,4 +124,101 @@ public class NewViolationsDecoratorTest { assertThat(decorator.sumChildren(2, children), is(3)); assertThat(decorator.sumChildren(3, children), is(6)); } + + @Test + public void priorityViolations() { + when(context.getViolations()).thenReturn(createViolations()); + + decorator.decorate(resource, context); + + verify(context).saveMeasure(argThat(new IsVariationRuleMeasure(CoreMetrics.NEW_VIOLATIONS, null, RulePriority.BLOCKER, 0.0, 0.0))); + verify(context).saveMeasure(argThat(new IsVariationRuleMeasure(CoreMetrics.NEW_VIOLATIONS, null, RulePriority.CRITICAL, 1.0, 2.0))); + verify(context).saveMeasure(argThat(new IsVariationRuleMeasure(CoreMetrics.NEW_VIOLATIONS, null, RulePriority.MAJOR, 1.0, 2.0))); + verify(context).saveMeasure(argThat(new IsVariationRuleMeasure(CoreMetrics.NEW_VIOLATIONS, null, RulePriority.MINOR, 1.0, 2.0))); + verify(context).saveMeasure(argThat(new IsVariationRuleMeasure(CoreMetrics.NEW_VIOLATIONS, null, RulePriority.INFO, 0.0, 0.0))); + + verify(context).saveMeasure(argThat(new IsVariationMeasure(CoreMetrics.NEW_BLOCKER_VIOLATIONS, 0.0, 0.0))); + verify(context).saveMeasure(argThat(new IsVariationMeasure(CoreMetrics.NEW_CRITICAL_VIOLATIONS, 1.0, 2.0))); + verify(context).saveMeasure(argThat(new IsVariationMeasure(CoreMetrics.NEW_MAJOR_VIOLATIONS, 1.0, 2.0))); + verify(context).saveMeasure(argThat(new IsVariationMeasure(CoreMetrics.NEW_MINOR_VIOLATIONS, 1.0, 2.0))); + verify(context).saveMeasure(argThat(new IsVariationMeasure(CoreMetrics.NEW_INFO_VIOLATIONS, 0.0, 0.0))); + } + + @Test + public void ruleViolations() { + when(context.getViolations()).thenReturn(createViolations()); + + decorator.decorate(resource, context); + + verify(context).saveMeasure(argThat(new IsVariationRuleMeasure(CoreMetrics.NEW_VIOLATIONS, rule1, RulePriority.CRITICAL, 1.0, 2.0))); + verify(context).saveMeasure(argThat(new IsVariationRuleMeasure(CoreMetrics.NEW_VIOLATIONS, rule2, RulePriority.MAJOR, 1.0, 2.0))); + verify(context).saveMeasure(argThat(new IsVariationRuleMeasure(CoreMetrics.NEW_VIOLATIONS, rule3, RulePriority.MINOR, 1.0, 2.0))); + } + + private List<Violation> createViolations() { + List<Violation> violations = new ArrayList<Violation>(); + violations.add(Violation.create(rule1, resource).setPriority(RulePriority.CRITICAL).setCreatedAt(rightNow)); + violations.add(Violation.create(rule1, resource).setPriority(RulePriority.CRITICAL).setCreatedAt(tenDaysAgo)); + violations.add(Violation.create(rule2, resource).setPriority(RulePriority.MAJOR).setCreatedAt(fiveDaysAgo)); + violations.add(Violation.create(rule2, resource).setPriority(RulePriority.MAJOR).setCreatedAt(tenDaysAgo)); + violations.add(Violation.create(rule3, resource).setPriority(RulePriority.MINOR).setCreatedAt(fiveDaysAgo)); + violations.add(Violation.create(rule3, resource).setPriority(RulePriority.MINOR).setCreatedAt(tenDaysAgo)); + return violations; + } + + private class IsVariationRuleMeasure extends BaseMatcher<Measure> { + private Metric metric = null; + private Rule rule = null; + private RulePriority priority = null; + private Double var1 = null; + private Double var2 = null; + + public IsVariationRuleMeasure(Metric metric, Rule rule, RulePriority priority, Double var1, Double var2) { + this.metric = metric; + this.rule = rule; + this.priority = priority; + this.var1 = var1; + this.var2 = var2; + } + + public boolean matches(Object o) { + if (!(o instanceof RuleMeasure)) { + return false; + } + RuleMeasure m = (RuleMeasure) o; + return ObjectUtils.equals(metric, m.getMetric()) && + ObjectUtils.equals(rule, m.getRule()) && + ObjectUtils.equals(priority, m.getRulePriority()) && + ObjectUtils.equals(var1, m.getVariation1()) && + ObjectUtils.equals(var2, m.getVariation2()); + } + + public void describeTo(Description arg0) { + } + } + + private class IsVariationMeasure extends BaseMatcher<Measure> { + private Metric metric = null; + private Double var1 = null; + private Double var2 = null; + + public IsVariationMeasure(Metric metric, Double var1, Double var2) { + this.metric = metric; + this.var1 = var1; + this.var2 = var2; + } + + public boolean matches(Object o) { + if (!(o instanceof Measure)) { + return false; + } + Measure m = (Measure) o; + return ObjectUtils.equals(metric, m.getMetric()) && + ObjectUtils.equals(var1, m.getVariation1()) && + ObjectUtils.equals(var2, m.getVariation2()); + } + + public void describeTo(Description o) { + } + } } |