From 1cf8de6ee2554c969ee34efe9856c453b247e1d6 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Tue, 8 Oct 2013 12:48:59 +0200 Subject: [PATCH] SONAR-4357 Move some classes to Sonar core --- .../TechnicalDebtMergeModel.java | 14 ++-- .../TechnicalDebtModelFinder.java | 2 +- .../TechnicalDebtRequirement.java | 2 +- .../technicaldebt/TechnicalDebtRuleCache.java | 6 +- .../TechnicalDebtXMLImporter.java | 25 +++--- .../TechnicalDebtMergeModelTest.java | 31 ++++--- .../TechnicalDebtModelFinderTest.java | 4 +- .../TechnicalDebtRuleCacheTest.java | 79 ++++++++++++++++++ .../TechnicalDebtXMLImporterTest.java | 71 ++++++++-------- .../csharp-model.xml | 0 .../java-model.xml | 0 .../shouldImportXML.xml | 0 .../shouldImportXML_badly-formatted.xml | 0 .../shouldLogWarningIfRuleNotFound.xml | 0 .../shouldRejectXML_with_invalid_value.xml | 0 .../org/sonar/server/platform/Platform.java | 6 +- .../startup/RegisterTechnicalDebtModel.java | 8 +- .../technicaldebt/TechnicalDebtManager.java | 26 +++--- .../RegisterTechnicalDebtModelTest.java | 4 +- .../server/technicaldebt/RuleCacheTest.java | 80 ------------------- .../TechnicalDebtManagerTest.java | 25 +++--- 21 files changed, 189 insertions(+), 194 deletions(-) rename sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtModel.java => sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModel.java (87%) rename {sonar-server/src/main/java/org/sonar/server => sonar-core/src/main/java/org/sonar/core}/technicaldebt/TechnicalDebtModelFinder.java (99%) rename sonar-server/src/main/java/org/sonar/server/technicaldebt/RuleCache.java => sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCache.java (94%) rename sonar-server/src/main/java/org/sonar/server/technicaldebt/XMLImporter.java => sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporter.java (89%) rename sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtModelTest.java => sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModelTest.java (81%) rename {sonar-server/src/test/java/org/sonar/server => sonar-core/src/test/java/org/sonar/core}/technicaldebt/TechnicalDebtModelFinderTest.java (98%) create mode 100644 sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCacheTest.java rename sonar-server/src/test/java/org/sonar/server/technicaldebt/XMLImporterTest.java => sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest.java (51%) rename {sonar-server/src/test/resources/org/sonar/server => sonar-core/src/test/resources/org/sonar/core}/technicaldebt/TechnicalDebtModelFinderTest/csharp-model.xml (100%) rename {sonar-server/src/test/resources/org/sonar/server => sonar-core/src/test/resources/org/sonar/core}/technicaldebt/TechnicalDebtModelFinderTest/java-model.xml (100%) rename {sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest => sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest}/shouldImportXML.xml (100%) rename {sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest => sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest}/shouldImportXML_badly-formatted.xml (100%) rename {sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest => sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest}/shouldLogWarningIfRuleNotFound.xml (100%) rename {sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest => sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest}/shouldRejectXML_with_invalid_value.xml (100%) delete mode 100644 sonar-server/src/test/java/org/sonar/server/technicaldebt/RuleCacheTest.java diff --git a/sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtModel.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModel.java similarity index 87% rename from sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtModel.java rename to sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModel.java index d7342d6c1ab..b64f00e4ab3 100644 --- a/sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtModel.java +++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModel.java @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.server.technicaldebt; +package org.sonar.core.technicaldebt; import org.sonar.api.qualitymodel.Characteristic; import org.sonar.api.qualitymodel.CharacteristicProperty; @@ -27,21 +27,21 @@ import org.sonar.api.utils.ValidationMessages; import java.util.List; -public class TechnicalDebtModel { +public class TechnicalDebtMergeModel { private Model model; private List defaultCharacteristics; - public TechnicalDebtModel(Model model, List defaultCharacteristics) { + public TechnicalDebtMergeModel(Model model, List defaultCharacteristics) { this.model = model; this.defaultCharacteristics = defaultCharacteristics; } - public void mergeWith(Model with, ValidationMessages messages, RuleCache ruleCache) { + public void mergeWith(Model with, ValidationMessages messages, TechnicalDebtRuleCache technicalDebtRuleCache) { for (Characteristic characteristic : with.getCharacteristics()) { if (isRequirement(characteristic)) { - mergeRequirement(characteristic, messages, ruleCache); + mergeRequirement(characteristic, messages, technicalDebtRuleCache); } else { mergeCharacteristic(characteristic, messages); } @@ -64,10 +64,10 @@ public class TechnicalDebtModel { return existingCharacteristic; } - private void mergeRequirement(Characteristic requirement, ValidationMessages messages, RuleCache ruleCache) { + private void mergeRequirement(Characteristic requirement, ValidationMessages messages, TechnicalDebtRuleCache technicalDebtRuleCache) { Characteristic targetRequirement = model.getCharacteristicByRule(requirement.getRule()); if (targetRequirement == null && !requirement.getParents().isEmpty()) { - Rule rule = ruleCache.getRule(requirement.getRule().getRepositoryKey(), requirement.getRule().getKey()); + Rule rule = technicalDebtRuleCache.getRule(requirement.getRule().getRepositoryKey(), requirement.getRule().getKey()); if (rule == null) { messages.addWarningText("The rule " + requirement.getRule() + " does not exist."); diff --git a/sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtModelFinder.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinder.java similarity index 99% rename from sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtModelFinder.java rename to sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinder.java index a90a38a65ea..c9234b83d75 100644 --- a/sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtModelFinder.java +++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinder.java @@ -18,7 +18,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.server.technicaldebt; +package org.sonar.core.technicaldebt; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Maps; diff --git a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRequirement.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRequirement.java index 674da01ba04..f597f4bace3 100644 --- a/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRequirement.java +++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRequirement.java @@ -84,7 +84,7 @@ public class TechnicalDebtRequirement { return offset; } - public org.sonar.api.qualitymodel.Characteristic toCharacteristic() { + public Characteristic toCharacteristic() { return characteristic; } } diff --git a/sonar-server/src/main/java/org/sonar/server/technicaldebt/RuleCache.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCache.java similarity index 94% rename from sonar-server/src/main/java/org/sonar/server/technicaldebt/RuleCache.java rename to sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCache.java index 4858fea6dc5..86abd9c66e5 100644 --- a/sonar-server/src/main/java/org/sonar/server/technicaldebt/RuleCache.java +++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCache.java @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.server.technicaldebt; +package org.sonar.core.technicaldebt; import com.google.common.collect.Maps; import org.sonar.api.rules.Rule; @@ -30,13 +30,13 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; -public class RuleCache { +public class TechnicalDebtRuleCache { private final RuleFinder ruleFinder; private Map> cachedRules; - public RuleCache(RuleFinder ruleFinder) { + public TechnicalDebtRuleCache(RuleFinder ruleFinder) { this.ruleFinder = ruleFinder; } diff --git a/sonar-server/src/main/java/org/sonar/server/technicaldebt/XMLImporter.java b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporter.java similarity index 89% rename from sonar-server/src/main/java/org/sonar/server/technicaldebt/XMLImporter.java rename to sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporter.java index 4cf63de05d4..df81a5d88bd 100644 --- a/sonar-server/src/main/java/org/sonar/server/technicaldebt/XMLImporter.java +++ b/sonar-core/src/main/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporter.java @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.server.technicaldebt; +package org.sonar.core.technicaldebt; import com.google.common.collect.Lists; import org.apache.commons.lang.StringUtils; @@ -33,7 +33,6 @@ import org.sonar.api.qualitymodel.Characteristic; import org.sonar.api.qualitymodel.Model; import org.sonar.api.rules.Rule; import org.sonar.api.utils.ValidationMessages; -import org.sonar.server.startup.RegisterTechnicalDebtModel; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; @@ -42,9 +41,9 @@ import java.io.Reader; import java.io.StringReader; import java.util.List; -public class XMLImporter implements ServerExtension { +public class TechnicalDebtXMLImporter implements ServerExtension { - private static final Logger LOG = LoggerFactory.getLogger(XMLImporter.class); + private static final Logger LOG = LoggerFactory.getLogger(TechnicalDebtXMLImporter.class); private static final String CHARACTERISTIC = "chc"; private static final String CHARACTERISTIC_KEY = "key"; @@ -55,12 +54,12 @@ public class XMLImporter implements ServerExtension { private static final String PROPERTY_VALUE = "val"; private static final String PROPERTY_TEXT_VALUE = "txt"; - public Model importXML(String xml, ValidationMessages messages, RuleCache ruleCache) { - return importXML(new StringReader(xml), messages, ruleCache); + public Model importXML(String xml, ValidationMessages messages, TechnicalDebtRuleCache technicalDebtRuleCache) { + return importXML(new StringReader(xml), messages, technicalDebtRuleCache); } - public Model importXML(Reader xml, ValidationMessages messages, RuleCache repositoryCache) { - Model model = Model.createByName(RegisterTechnicalDebtModel.TECHNICAL_DEBT_MODEL); + public Model importXML(Reader xml, ValidationMessages messages, TechnicalDebtRuleCache repositoryCache) { + Model model = Model.createByName(TechnicalDebtModel.MODEL_NAME); try { SMInputFactory inputFactory = initStax(); SMHierarchicCursor cursor = inputFactory.rootElementCursor(xml); @@ -91,7 +90,7 @@ public class XMLImporter implements ServerExtension { return new SMInputFactory(xmlFactory); } - private Characteristic processCharacteristic(Model model, SMInputCursor chcCursor, ValidationMessages messages, RuleCache ruleCache) throws XMLStreamException { + private Characteristic processCharacteristic(Model model, SMInputCursor chcCursor, ValidationMessages messages, TechnicalDebtRuleCache technicalDebtRuleCache) throws XMLStreamException { Characteristic characteristic = Characteristic.create(); SMInputCursor cursor = chcCursor.childElementCursor(); @@ -112,7 +111,7 @@ public class XMLImporter implements ServerExtension { processProperty(characteristic, cursor, messages); } else if (StringUtils.equals(node, CHARACTERISTIC)) { - children.add(processCharacteristic(model, cursor, messages, ruleCache)); + children.add(processCharacteristic(model, cursor, messages, technicalDebtRuleCache)); } else if (StringUtils.equals(node, "rule-repo")) { ruleRepositoryKey = cursor.collectDescendantText().trim(); @@ -121,7 +120,7 @@ public class XMLImporter implements ServerExtension { ruleKey = cursor.collectDescendantText().trim(); } } - fillRule(characteristic, ruleRepositoryKey, ruleKey, messages, ruleCache); + fillRule(characteristic, ruleRepositoryKey, ruleKey, messages, technicalDebtRuleCache); if (StringUtils.isNotBlank(characteristic.getKey()) || characteristic.getRule() != null) { addCharacteristicToModel(model, characteristic, children); @@ -131,9 +130,9 @@ public class XMLImporter implements ServerExtension { } private void fillRule(Characteristic characteristic, String ruleRepositoryKey, String ruleKey, ValidationMessages messages, - RuleCache ruleCache) { + TechnicalDebtRuleCache technicalDebtRuleCache) { if (StringUtils.isNotBlank(ruleRepositoryKey) && StringUtils.isNotBlank(ruleKey)) { - Rule rule = ruleCache.getRule(ruleRepositoryKey, ruleKey); + Rule rule = technicalDebtRuleCache.getRule(ruleRepositoryKey, ruleKey); if (rule != null) { characteristic.setRule(rule); } else { diff --git a/sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtModelTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModelTest.java similarity index 81% rename from sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtModelTest.java rename to sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModelTest.java index 1ade07625e5..13f566e35e8 100644 --- a/sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtModelTest.java +++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtMergeModelTest.java @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.server.technicaldebt; +package org.sonar.core.technicaldebt; import org.junit.Before; import org.junit.Test; @@ -27,7 +27,6 @@ import org.sonar.api.rules.Rule; import org.sonar.api.rules.RuleFinder; import org.sonar.api.rules.RuleQuery; import org.sonar.api.utils.ValidationMessages; -import org.sonar.server.startup.RegisterTechnicalDebtModel; import java.util.List; @@ -38,22 +37,22 @@ import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class TechnicalDebtModelTest { +public class TechnicalDebtMergeModelTest { private Model model; - private TechnicalDebtModel technicalDebtModel; + private TechnicalDebtMergeModel technicalDebtMergeModel; private List defaultCharacteristics; @Before public void setUpModel() { - model = Model.createByName(RegisterTechnicalDebtModel.TECHNICAL_DEBT_MODEL); + model = Model.createByName(TechnicalDebtModel.MODEL_NAME); defaultCharacteristics = newArrayList(); - technicalDebtModel = new TechnicalDebtModel(model, defaultCharacteristics); + technicalDebtMergeModel = new TechnicalDebtMergeModel(model, defaultCharacteristics); } @Test public void merge_with_empty_model() { - Model with = Model.createByName(RegisterTechnicalDebtModel.TECHNICAL_DEBT_MODEL); + Model with = Model.createByName(TechnicalDebtModel.MODEL_NAME); Characteristic efficiency = with.createCharacteristicByKey("efficiency", "Efficiency"); Characteristic ramEfficiency = with.createCharacteristicByKey("ram-efficiency", "RAM Efficiency"); efficiency.addChild(ramEfficiency); @@ -62,7 +61,7 @@ public class TechnicalDebtModelTest { ValidationMessages messages = ValidationMessages.create(); defaultCharacteristics.addAll(newArrayList(efficiency, ramEfficiency, usability)); - technicalDebtModel.mergeWith(with, messages, mockRuleCache()); + technicalDebtMergeModel.mergeWith(with, messages, mockRuleCache()); assertThat(model.getCharacteristics()).hasSize(3); assertThat(model.getRootCharacteristics()).hasSize(2); @@ -74,10 +73,10 @@ public class TechnicalDebtModelTest { public void not_update_existing_characteristics() { model.createCharacteristicByKey("efficiency", "Efficiency"); - Model with = Model.createByName(RegisterTechnicalDebtModel.TECHNICAL_DEBT_MODEL); + Model with = Model.createByName(TechnicalDebtModel.MODEL_NAME); with.createCharacteristicByKey("efficiency", "New efficiency"); - technicalDebtModel.mergeWith(with, ValidationMessages.create(), mockRuleCache()); + technicalDebtMergeModel.mergeWith(with, ValidationMessages.create(), mockRuleCache()); assertThat(model.getCharacteristics()).hasSize(1); assertThat(model.getRootCharacteristics()).hasSize(1); @@ -86,7 +85,7 @@ public class TechnicalDebtModelTest { @Test public void warn_on_missing_rule() { - Model with = Model.createByName(RegisterTechnicalDebtModel.TECHNICAL_DEBT_MODEL); + Model with = Model.createByName(TechnicalDebtModel.MODEL_NAME); Characteristic efficiency = with.createCharacteristicByKey("efficiency", "Efficiency"); Rule fooRule = Rule.create("foo", "bar", "Bar"); Characteristic requirement = with.createCharacteristicByRule(fooRule); @@ -95,7 +94,7 @@ public class TechnicalDebtModelTest { ValidationMessages messages = ValidationMessages.create(); defaultCharacteristics.add(efficiency); - technicalDebtModel.mergeWith(with, messages, mockRuleCache()); + technicalDebtMergeModel.mergeWith(with, messages, mockRuleCache()); assertThat(model.getCharacteristics()).hasSize(1); assertThat(model.getCharacteristicByKey("efficiency").getName()).isEqualTo("Efficiency"); @@ -106,7 +105,7 @@ public class TechnicalDebtModelTest { @Test public void fail_when_adding_characteristic_not_existing_in_default_characteristics() { - Model with = Model.createByName(RegisterTechnicalDebtModel.TECHNICAL_DEBT_MODEL); + Model with = Model.createByName(TechnicalDebtModel.MODEL_NAME); Characteristic efficiency = with.createCharacteristicByKey("efficiency", "Efficiency"); // usability is not available in default characteristics with.createCharacteristicByKey("usability", "Usability"); @@ -115,7 +114,7 @@ public class TechnicalDebtModelTest { defaultCharacteristics.add(efficiency); try { - technicalDebtModel.mergeWith(with, messages, mockRuleCache()); + technicalDebtMergeModel.mergeWith(with, messages, mockRuleCache()); fail(); } catch (Exception e) { assertThat(e).isInstanceOf(IllegalArgumentException.class); @@ -123,10 +122,10 @@ public class TechnicalDebtModelTest { assertThat(model.getCharacteristics()).hasSize(1); } - private RuleCache mockRuleCache() { + private TechnicalDebtRuleCache mockRuleCache() { RuleFinder ruleFinder = mock(RuleFinder.class); when(ruleFinder.findAll(any(RuleQuery.class))).thenReturn(newArrayList(newRegexpRule())); - return new RuleCache(ruleFinder); + return new TechnicalDebtRuleCache(ruleFinder); } private Rule newRegexpRule() { diff --git a/sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtModelFinderTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest.java similarity index 98% rename from sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtModelFinderTest.java rename to sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest.java index b63ac6691ee..16804ca291a 100644 --- a/sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtModelFinderTest.java +++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest.java @@ -18,7 +18,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.server.technicaldebt; +package org.sonar.core.technicaldebt; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -48,7 +48,7 @@ import static org.mockito.Mockito.when; public class TechnicalDebtModelFinderTest { - private static final String TEST_XML_PREFIX_PATH = "org/sonar/server/technicaldebt/TechnicalDebtModelFinderTest/"; + private static final String TEST_XML_PREFIX_PATH = "org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/"; private TechnicalDebtModelFinder modelFinder; diff --git a/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCacheTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCacheTest.java new file mode 100644 index 00000000000..bd13002c771 --- /dev/null +++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtRuleCacheTest.java @@ -0,0 +1,79 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.core.technicaldebt; + +import com.google.common.collect.Lists; +import org.fest.assertions.Assertions; +import org.junit.Test; +import org.mockito.Matchers; +import org.mockito.Mockito; +import org.sonar.api.rules.Rule; +import org.sonar.api.rules.RuleFinder; +import org.sonar.api.rules.RuleQuery; + +import java.util.Collections; + +public class TechnicalDebtRuleCacheTest { + + @Test + public void lazy_load_rules_on_first_call() throws Exception { + + RuleFinder ruleFinder = Mockito.mock(RuleFinder.class); + Mockito.when(ruleFinder.findAll(Matchers.any(RuleQuery.class))).thenReturn(Collections.EMPTY_LIST); + + TechnicalDebtRuleCache technicalDebtRuleCache = new TechnicalDebtRuleCache(ruleFinder); + technicalDebtRuleCache.getRule("", ""); + technicalDebtRuleCache.getRule("", ""); + + Mockito.verify(ruleFinder, Mockito.times(1)).findAll(Matchers.any(RuleQuery.class)); + } + + @Test + public void return_matching_rule() throws Exception { + + Rule rule1 = Rule.create("repo1", "rule1"); + Rule rule2 = Rule.create("repo2", "rule2"); + + RuleFinder ruleFinder = Mockito.mock(RuleFinder.class); + Mockito.when(ruleFinder.findAll(Matchers.any(RuleQuery.class))).thenReturn(Lists.newArrayList(rule1, rule2)); + + TechnicalDebtRuleCache technicalDebtRuleCache = new TechnicalDebtRuleCache(ruleFinder); + Rule actualRule1 = technicalDebtRuleCache.getRule("repo1", "rule1"); + Rule actualRule2 = technicalDebtRuleCache.getRule("repo2", "rule2"); + + Assertions.assertThat(actualRule1).isEqualTo(rule1); + Assertions.assertThat(actualRule2).isEqualTo(rule2); + } + + @Test + public void return_if_rule_exists() throws Exception { + + Rule rule1 = Rule.create("repo1", "rule1"); + Rule rule2 = Rule.create("repo2", "rule2"); + + RuleFinder ruleFinder = Mockito.mock(RuleFinder.class); + Mockito.when(ruleFinder.findAll(Matchers.any(RuleQuery.class))).thenReturn(Lists.newArrayList(rule1)); + + TechnicalDebtRuleCache technicalDebtRuleCache = new TechnicalDebtRuleCache(ruleFinder); + + Assertions.assertThat(technicalDebtRuleCache.exists(rule1)).isTrue(); + Assertions.assertThat(technicalDebtRuleCache.exists(rule2)).isFalse(); + } +} diff --git a/sonar-server/src/test/java/org/sonar/server/technicaldebt/XMLImporterTest.java b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest.java similarity index 51% rename from sonar-server/src/test/java/org/sonar/server/technicaldebt/XMLImporterTest.java rename to sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest.java index 3cec0b311a6..cac08a416cb 100644 --- a/sonar-server/src/test/java/org/sonar/server/technicaldebt/XMLImporterTest.java +++ b/sonar-core/src/test/java/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest.java @@ -17,112 +17,109 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package org.sonar.server.technicaldebt; +package org.sonar.core.technicaldebt; import com.google.common.base.Charsets; import com.google.common.collect.Lists; import com.google.common.io.Resources; +import org.fest.assertions.Assertions; import org.junit.Test; +import org.mockito.Matchers; +import org.mockito.Mockito; import org.sonar.api.qualitymodel.Characteristic; import org.sonar.api.qualitymodel.Model; import org.sonar.api.rules.Rule; import org.sonar.api.rules.RuleFinder; import org.sonar.api.rules.RuleQuery; import org.sonar.api.utils.ValidationMessages; -import org.sonar.server.startup.RegisterTechnicalDebtModel; import java.io.IOException; -import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class XMLImporterTest { +public class TechnicalDebtXMLImporterTest { @Test public void shouldImportXML() { - RuleCache ruleCache = mockRuleCache(); + TechnicalDebtRuleCache technicalDebtRuleCache = mockRuleCache(); String xml = getFileContent("shouldImportXML.xml"); ValidationMessages messages = ValidationMessages.create(); - Model sqale = new XMLImporter().importXML(xml, messages, ruleCache); + Model sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache); checkXmlCorrectlyImported(sqale, messages); } @Test public void shouldBadlyFormattedImportXML() { - RuleCache ruleCache = mockRuleCache(); + TechnicalDebtRuleCache technicalDebtRuleCache = mockRuleCache(); String xml = getFileContent("shouldImportXML_badly-formatted.xml"); ValidationMessages messages = ValidationMessages.create(); - Model sqale = new XMLImporter().importXML(xml, messages, ruleCache); + Model sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache); checkXmlCorrectlyImported(sqale, messages); } @Test public void shouldLogWarningIfRuleNotFound() { - RuleCache ruleCache = mockRuleCache(); + TechnicalDebtRuleCache technicalDebtRuleCache = mockRuleCache(); String xml = getFileContent("shouldLogWarningIfRuleNotFound.xml"); ValidationMessages messages = ValidationMessages.create(); - Model sqale = new XMLImporter().importXML(xml, messages, ruleCache); + Model sqale = new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache); - assertThat(messages.getWarnings()).hasSize(1); + Assertions.assertThat(messages.getWarnings()).hasSize(1); // characteristics - assertThat(sqale.getRootCharacteristics()).hasSize(1); + Assertions.assertThat(sqale.getRootCharacteristics()).hasSize(1); Characteristic efficiency = sqale.getCharacteristicByKey("EFFICIENCY"); - assertThat(efficiency.getChildren()).isEmpty(); - assertThat(messages.getWarnings().get(0)).contains("findbugs"); + Assertions.assertThat(efficiency.getChildren()).isEmpty(); + Assertions.assertThat(messages.getWarnings().get(0)).contains("findbugs"); } @Test public void shouldNotifyOnUnexpectedValueTypeInXml() throws Exception { - RuleCache ruleCache = mockRuleCache(); + TechnicalDebtRuleCache technicalDebtRuleCache = mockRuleCache(); String xml = getFileContent("shouldRejectXML_with_invalid_value.xml"); ValidationMessages messages = ValidationMessages.create(); - new XMLImporter().importXML(xml, messages, ruleCache); + new TechnicalDebtXMLImporter().importXML(xml, messages, technicalDebtRuleCache); - assertThat(messages.getErrors()).hasSize(1); - assertThat(messages.getErrors().get(0)).isEqualTo("Cannot import value 'abc' for field factor - Expected a numeric value instead"); + Assertions.assertThat(messages.getErrors()).hasSize(1); + Assertions.assertThat(messages.getErrors().get(0)).isEqualTo("Cannot import value 'abc' for field factor - Expected a numeric value instead"); } - private RuleCache mockRuleCache() { - RuleFinder finder = mock(RuleFinder.class); - when(finder.findAll(any(RuleQuery.class))).thenReturn(Lists.newArrayList(Rule.create("checkstyle", "Regexp", "Regular expression"))); - return new RuleCache(finder); + private TechnicalDebtRuleCache mockRuleCache() { + RuleFinder finder = Mockito.mock(RuleFinder.class); + Mockito.when(finder.findAll(Matchers.any(RuleQuery.class))).thenReturn(Lists.newArrayList(Rule.create("checkstyle", "Regexp", "Regular expression"))); + return new TechnicalDebtRuleCache(finder); } private void checkXmlCorrectlyImported(Model sqale, ValidationMessages messages) { - assertThat(messages.getErrors()).isEmpty(); - assertThat(sqale.getName()).isEqualTo(RegisterTechnicalDebtModel.TECHNICAL_DEBT_MODEL); + Assertions.assertThat(messages.getErrors()).isEmpty(); + Assertions.assertThat(sqale.getName()).isEqualTo(TechnicalDebtModel.MODEL_NAME); // characteristics - assertThat(sqale.getRootCharacteristics()).hasSize(2); - assertThat(sqale.getCharacteristicByKey("USABILITY").getDescription()).isEqualTo("Estimate usability"); + Assertions.assertThat(sqale.getRootCharacteristics()).hasSize(2); + Assertions.assertThat(sqale.getCharacteristicByKey("USABILITY").getDescription()).isEqualTo("Estimate usability"); Characteristic efficiency = sqale.getCharacteristicByKey("EFFICIENCY"); - assertThat(efficiency.getName()).isEqualTo("Efficiency"); + Assertions.assertThat(efficiency.getName()).isEqualTo("Efficiency"); // sub-characteristics - assertThat(efficiency.getChildren()).hasSize(1); + Assertions.assertThat(efficiency.getChildren()).hasSize(1); Characteristic requirement = efficiency.getChildren().get(0); - assertThat(requirement.getRule().getRepositoryKey()).isEqualTo("checkstyle"); - assertThat(requirement.getRule().getKey()).isEqualTo("Regexp"); - assertThat(requirement.getPropertyTextValue("function", null)).isEqualTo("linear"); - assertThat(requirement.getPropertyValue("factor", null)).isEqualTo(3.2); + Assertions.assertThat(requirement.getRule().getRepositoryKey()).isEqualTo("checkstyle"); + Assertions.assertThat(requirement.getRule().getKey()).isEqualTo("Regexp"); + Assertions.assertThat(requirement.getPropertyTextValue("function", null)).isEqualTo("linear"); + Assertions.assertThat(requirement.getPropertyValue("factor", null)).isEqualTo(3.2); } private String getFileContent(String file) { try { - return Resources.toString(Resources.getResource(XMLImporterTest.class, "XMLImporterTest/" + file), Charsets.UTF_8); + return Resources.toString(Resources.getResource(TechnicalDebtXMLImporterTest.class, "TechnicalDebtXMLImporterTest/" + file), Charsets.UTF_8); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/sonar-server/src/test/resources/org/sonar/server/technicaldebt/TechnicalDebtModelFinderTest/csharp-model.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/csharp-model.xml similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/technicaldebt/TechnicalDebtModelFinderTest/csharp-model.xml rename to sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/csharp-model.xml diff --git a/sonar-server/src/test/resources/org/sonar/server/technicaldebt/TechnicalDebtModelFinderTest/java-model.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/java-model.xml similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/technicaldebt/TechnicalDebtModelFinderTest/java-model.xml rename to sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtModelFinderTest/java-model.xml diff --git a/sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest/shouldImportXML.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML.xml similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest/shouldImportXML.xml rename to sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML.xml diff --git a/sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest/shouldImportXML_badly-formatted.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_badly-formatted.xml similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest/shouldImportXML_badly-formatted.xml rename to sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldImportXML_badly-formatted.xml diff --git a/sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest/shouldLogWarningIfRuleNotFound.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldLogWarningIfRuleNotFound.xml similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest/shouldLogWarningIfRuleNotFound.xml rename to sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldLogWarningIfRuleNotFound.xml diff --git a/sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest/shouldRejectXML_with_invalid_value.xml b/sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldRejectXML_with_invalid_value.xml similarity index 100% rename from sonar-server/src/test/resources/org/sonar/server/technicaldebt/XMLImporterTest/shouldRejectXML_with_invalid_value.xml rename to sonar-core/src/test/resources/org/sonar/core/technicaldebt/TechnicalDebtXMLImporterTest/shouldRejectXML_with_invalid_value.xml diff --git a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java index ee5e3219926..f5e0e944a44 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java @@ -59,6 +59,8 @@ import org.sonar.core.resource.DefaultResourcePermissions; import org.sonar.core.rule.DefaultRuleFinder; import org.sonar.core.source.HtmlSourceDecorator; import org.sonar.core.technicaldebt.TechnicalDebtConverter; +import org.sonar.core.technicaldebt.TechnicalDebtModelFinder; +import org.sonar.core.technicaldebt.TechnicalDebtXMLImporter; import org.sonar.core.test.TestPlanPerspectiveLoader; import org.sonar.core.test.TestablePerspectiveLoader; import org.sonar.core.timemachine.Periods; @@ -93,8 +95,6 @@ import org.sonar.server.rules.RulesConsole; import org.sonar.server.startup.*; import org.sonar.server.technicaldebt.RubyTechnicalDebtService; import org.sonar.server.technicaldebt.TechnicalDebtManager; -import org.sonar.server.technicaldebt.TechnicalDebtModelFinder; -import org.sonar.server.technicaldebt.XMLImporter; import org.sonar.server.text.MacroInterpreter; import org.sonar.server.text.RubyTextService; import org.sonar.server.ui.*; @@ -302,7 +302,7 @@ public final class Platform { // technical debt servicesContainer.addSingleton(TechnicalDebtManager.class); servicesContainer.addSingleton(TechnicalDebtModelFinder.class); - servicesContainer.addSingleton(XMLImporter.class); + servicesContainer.addSingleton(TechnicalDebtXMLImporter.class); servicesContainer.addSingleton(TechnicalDebtConverter.class); servicesContainer.addSingleton(RubyTechnicalDebtService.class); diff --git a/sonar-server/src/main/java/org/sonar/server/startup/RegisterTechnicalDebtModel.java b/sonar-server/src/main/java/org/sonar/server/startup/RegisterTechnicalDebtModel.java index bf9dfb9c27d..06e8636ddd9 100644 --- a/sonar-server/src/main/java/org/sonar/server/startup/RegisterTechnicalDebtModel.java +++ b/sonar-server/src/main/java/org/sonar/server/startup/RegisterTechnicalDebtModel.java @@ -24,15 +24,13 @@ import org.slf4j.LoggerFactory; import org.sonar.api.rules.RuleFinder; import org.sonar.api.utils.TimeProfiler; import org.sonar.api.utils.ValidationMessages; -import org.sonar.server.technicaldebt.RuleCache; +import org.sonar.core.technicaldebt.TechnicalDebtRuleCache; import org.sonar.server.technicaldebt.TechnicalDebtManager; public final class RegisterTechnicalDebtModel { private static final Logger LOGGER = LoggerFactory.getLogger(RegisterTechnicalDebtModel.class); - public static final String TECHNICAL_DEBT_MODEL = "TECHNICAL_DEBT"; - private final TechnicalDebtManager technicalDebtManager; private final RuleFinder ruleFinder; @@ -46,8 +44,8 @@ public final class RegisterTechnicalDebtModel { public void start() { TimeProfiler profiler = new TimeProfiler(LOGGER).start("Register Technical Debt Model"); - RuleCache ruleCache = new RuleCache(ruleFinder); - technicalDebtManager.init(ValidationMessages.create(), ruleCache); + TechnicalDebtRuleCache technicalDebtRuleCache = new TechnicalDebtRuleCache(ruleFinder); + technicalDebtManager.init(ValidationMessages.create(), technicalDebtRuleCache); profiler.stop(); } diff --git a/sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtManager.java b/sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtManager.java index 3d16526965b..1d9962c635e 100644 --- a/sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtManager.java +++ b/sonar-server/src/main/java/org/sonar/server/technicaldebt/TechnicalDebtManager.java @@ -28,8 +28,8 @@ import org.sonar.api.qualitymodel.Characteristic; import org.sonar.api.qualitymodel.Model; import org.sonar.api.qualitymodel.ModelFinder; import org.sonar.api.utils.ValidationMessages; +import org.sonar.core.technicaldebt.*; import org.sonar.jpa.session.DatabaseSessionFactory; -import org.sonar.server.startup.RegisterTechnicalDebtModel; import java.io.Reader; import java.util.Collection; @@ -47,17 +47,17 @@ public class TechnicalDebtManager implements ServerExtension { private DatabaseSessionFactory sessionFactory; private ModelFinder modelFinder; private TechnicalDebtModelFinder languageModelFinder; - private XMLImporter importer; + private TechnicalDebtXMLImporter importer; public TechnicalDebtManager(DatabaseSessionFactory sessionFactory, ModelFinder modelFinder, - TechnicalDebtModelFinder languageModelFinder, XMLImporter importer) { + TechnicalDebtModelFinder languageModelFinder, TechnicalDebtXMLImporter importer) { this.sessionFactory = sessionFactory; this.modelFinder = modelFinder; this.languageModelFinder = languageModelFinder; this.importer = importer; } - public Model init(ValidationMessages messages, RuleCache rulesCache) { + public Model init(ValidationMessages messages, TechnicalDebtRuleCache rulesCache) { DatabaseSession session = sessionFactory.getSession(); disableRequirementsOnRemovedRules(rulesCache); @@ -71,31 +71,31 @@ public class TechnicalDebtManager implements ServerExtension { return model; } - private Model loadOrCreateModelFromDb(Model defaultModel, ValidationMessages messages, RuleCache rulesCache) { - Model model = modelFinder.findByName(RegisterTechnicalDebtModel.TECHNICAL_DEBT_MODEL); + private Model loadOrCreateModelFromDb(Model defaultModel, ValidationMessages messages, TechnicalDebtRuleCache rulesCache) { + Model model = modelFinder.findByName(TechnicalDebtModel.MODEL_NAME); if (model == null) { - model = Model.createByName(RegisterTechnicalDebtModel.TECHNICAL_DEBT_MODEL); + model = Model.createByName(TechnicalDebtModel.MODEL_NAME); merge(defaultModel, model, defaultModel, messages, rulesCache); } return model; } - private void merge(Model pluginModel, Model existingModel, Model defaultModel, ValidationMessages messages, RuleCache rulesCache) { + private void merge(Model pluginModel, Model existingModel, Model defaultModel, ValidationMessages messages, TechnicalDebtRuleCache rulesCache) { messages.log(LOG); if (!messages.hasErrors()) { - new TechnicalDebtModel(existingModel, defaultModel.getCharacteristics()).mergeWith(pluginModel, messages, rulesCache); + new TechnicalDebtMergeModel(existingModel, defaultModel.getCharacteristics()).mergeWith(pluginModel, messages, rulesCache); messages.log(LOG); } } - private void loadRequirementsFromPlugins(Model existingModel, Model defaultModel, ValidationMessages messages, RuleCache rulesCache) { + private void loadRequirementsFromPlugins(Model existingModel, Model defaultModel, ValidationMessages messages, TechnicalDebtRuleCache rulesCache) { for (String pluginKey : getContributingPluginListWithoutSqale()) { Model pluginModel = loadModelFromXml(pluginKey, messages, rulesCache); merge(pluginModel, existingModel, defaultModel, messages, rulesCache); } } - private Model loadModelFromXml(String pluginKey, ValidationMessages messages, RuleCache rulesCache) { + private Model loadModelFromXml(String pluginKey, ValidationMessages messages, TechnicalDebtRuleCache rulesCache) { Reader xmlFileReader = null; try { xmlFileReader = languageModelFinder.createReaderForXMLFile(pluginKey); @@ -108,8 +108,8 @@ public class TechnicalDebtManager implements ServerExtension { /** * Disable requirements linked on removed rules */ - private void disableRequirementsOnRemovedRules(RuleCache rulesCache) { - Model existingModel = modelFinder.findByName(RegisterTechnicalDebtModel.TECHNICAL_DEBT_MODEL); + private void disableRequirementsOnRemovedRules(TechnicalDebtRuleCache rulesCache) { + Model existingModel = modelFinder.findByName(TechnicalDebtModel.MODEL_NAME); if (existingModel != null) { for (Characteristic requirement : existingModel.getCharacteristicsByDepth(REQUIREMENT_LEVEL)) { if (!rulesCache.exists(requirement.getRule())) { diff --git a/sonar-server/src/test/java/org/sonar/server/startup/RegisterTechnicalDebtModelTest.java b/sonar-server/src/test/java/org/sonar/server/startup/RegisterTechnicalDebtModelTest.java index f65e5d17514..022c3103ab2 100644 --- a/sonar-server/src/test/java/org/sonar/server/startup/RegisterTechnicalDebtModelTest.java +++ b/sonar-server/src/test/java/org/sonar/server/startup/RegisterTechnicalDebtModelTest.java @@ -22,7 +22,7 @@ package org.sonar.server.startup; import org.junit.Test; import org.sonar.api.rules.RuleFinder; import org.sonar.api.utils.ValidationMessages; -import org.sonar.server.technicaldebt.RuleCache; +import org.sonar.core.technicaldebt.TechnicalDebtRuleCache; import org.sonar.server.technicaldebt.TechnicalDebtManager; import static org.mockito.Matchers.any; @@ -38,6 +38,6 @@ public class RegisterTechnicalDebtModelTest { sqaleDefinition.start(); - verify(technicalDebtManager, times(1)).init(any(ValidationMessages.class), any(RuleCache.class)); + verify(technicalDebtManager, times(1)).init(any(ValidationMessages.class), any(TechnicalDebtRuleCache.class)); } } diff --git a/sonar-server/src/test/java/org/sonar/server/technicaldebt/RuleCacheTest.java b/sonar-server/src/test/java/org/sonar/server/technicaldebt/RuleCacheTest.java deleted file mode 100644 index 52e439b617f..00000000000 --- a/sonar-server/src/test/java/org/sonar/server/technicaldebt/RuleCacheTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2013 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ -package org.sonar.server.technicaldebt; - -import com.google.common.collect.Lists; -import org.junit.Test; -import org.sonar.api.rules.Rule; -import org.sonar.api.rules.RuleFinder; -import org.sonar.api.rules.RuleQuery; - -import java.util.Collections; - -import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.*; - -public class RuleCacheTest { - - @Test - public void lazy_load_rules_on_first_call() throws Exception { - - RuleFinder ruleFinder = mock(RuleFinder.class); - when(ruleFinder.findAll(any(RuleQuery.class))).thenReturn(Collections.EMPTY_LIST); - - RuleCache ruleCache = new RuleCache(ruleFinder); - ruleCache.getRule("", ""); - ruleCache.getRule("", ""); - - verify(ruleFinder, times(1)).findAll(any(RuleQuery.class)); - } - - @Test - public void return_matching_rule() throws Exception { - - Rule rule1 = Rule.create("repo1", "rule1"); - Rule rule2 = Rule.create("repo2", "rule2"); - - RuleFinder ruleFinder = mock(RuleFinder.class); - when(ruleFinder.findAll(any(RuleQuery.class))).thenReturn(Lists.newArrayList(rule1, rule2)); - - RuleCache ruleCache = new RuleCache(ruleFinder); - Rule actualRule1 = ruleCache.getRule("repo1", "rule1"); - Rule actualRule2 = ruleCache.getRule("repo2", "rule2"); - - assertThat(actualRule1).isEqualTo(rule1); - assertThat(actualRule2).isEqualTo(rule2); - } - - @Test - public void return_if_rule_exists() throws Exception { - - Rule rule1 = Rule.create("repo1", "rule1"); - Rule rule2 = Rule.create("repo2", "rule2"); - - RuleFinder ruleFinder = mock(RuleFinder.class); - when(ruleFinder.findAll(any(RuleQuery.class))).thenReturn(Lists.newArrayList(rule1)); - - RuleCache ruleCache = new RuleCache(ruleFinder); - - assertThat(ruleCache.exists(rule1)).isTrue(); - assertThat(ruleCache.exists(rule2)).isFalse(); - } -} diff --git a/sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtManagerTest.java b/sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtManagerTest.java index 2036f2aa19a..b948e25c0b6 100644 --- a/sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtManagerTest.java +++ b/sonar-server/src/test/java/org/sonar/server/technicaldebt/TechnicalDebtManagerTest.java @@ -28,6 +28,9 @@ import org.sonar.api.rules.Rule; import org.sonar.api.utils.ValidationMessages; import org.sonar.core.qualitymodel.DefaultModelFinder; import org.sonar.core.rule.DefaultRuleFinder; +import org.sonar.core.technicaldebt.TechnicalDebtModelFinder; +import org.sonar.core.technicaldebt.TechnicalDebtRuleCache; +import org.sonar.core.technicaldebt.TechnicalDebtXMLImporter; import org.sonar.jpa.test.AbstractDbUnitTestCase; import java.io.FileNotFoundException; @@ -49,7 +52,7 @@ public class TechnicalDebtManagerTest extends AbstractDbUnitTestCase { when(technicalDebtModelFinder.createReaderForXMLFile("technical-debt")).thenReturn( new FileReader(Resources.getResource(TechnicalDebtManagerTest.class, "TechnicalDebtManagerTest/fake-default-model.xml").getPath())); - manager = new TechnicalDebtManager(getSessionFactory(), new DefaultModelFinder(getSessionFactory()), technicalDebtModelFinder, new XMLImporter()); + manager = new TechnicalDebtManager(getSessionFactory(), new DefaultModelFinder(getSessionFactory()), technicalDebtModelFinder, new TechnicalDebtXMLImporter()); } @Test @@ -67,15 +70,15 @@ public class TechnicalDebtManagerTest extends AbstractDbUnitTestCase { addPluginModel("java", "fake-java-model.xml"); - RuleCache ruleCache = mock(RuleCache.class); + TechnicalDebtRuleCache technicalDebtRuleCache = mock(TechnicalDebtRuleCache.class); Rule rule1 = Rule.create("checkstyle", "import", "Regular expression"); rule1.setId(1); - when(ruleCache.getRule("checkstyle", "import")).thenReturn(rule1); + when(technicalDebtRuleCache.getRule("checkstyle", "import")).thenReturn(rule1); Rule rule2 = Rule.create("checkstyle", "export", "Regular expression"); rule2.setId(2); - when(ruleCache.getRule("checkstyle", "export")).thenReturn(rule2); + when(technicalDebtRuleCache.getRule("checkstyle", "export")).thenReturn(rule2); - manager.init(ValidationMessages.create(), ruleCache); + manager.init(ValidationMessages.create(), technicalDebtRuleCache); checkTables("create_model_with_requirements_from_plugin_on_first_execution", "quality_models", "characteristics", "characteristic_edges", "characteristic_properties"); } @@ -147,23 +150,23 @@ public class TechnicalDebtManagerTest extends AbstractDbUnitTestCase { addPluginModel("java", "fake-java-model.xml"); - RuleCache ruleCache = mock(RuleCache.class); + TechnicalDebtRuleCache technicalDebtRuleCache = mock(TechnicalDebtRuleCache.class); Rule rule1 = Rule.create("checkstyle", "import", "Regular expression"); rule1.setId(1); - when(ruleCache.getRule("checkstyle", "import")).thenReturn(rule1); + when(technicalDebtRuleCache.getRule("checkstyle", "import")).thenReturn(rule1); Rule rule2 = Rule.create("checkstyle", "export", "Regular expression"); rule2.setId(2); - when(ruleCache.getRule("checkstyle", "export")).thenReturn(rule2); + when(technicalDebtRuleCache.getRule("checkstyle", "export")).thenReturn(rule2); ValidationMessages messages = ValidationMessages.create(); - manager.init(messages, ruleCache); + manager.init(messages, technicalDebtRuleCache); assertThat(messages.getWarnings()).hasSize(1); assertThat(messages.getWarnings().get(0)).isEqualTo("Rule not found: [repository=checkstyle, key=ConstantNameCheck]"); } - private RuleCache defaultRuleCache() { - return new RuleCache(new DefaultRuleFinder(getSessionFactory())); + private TechnicalDebtRuleCache defaultRuleCache() { + return new TechnicalDebtRuleCache(new DefaultRuleFinder(getSessionFactory())); } private void addPluginModel(String pluginKey, String xmlFile) throws FileNotFoundException { -- 2.39.5