aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-server
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2015-03-13 16:15:47 +0100
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2015-03-20 08:30:32 +0100
commitee5860395a505e9acee4a3908e1c7df3c9541536 (patch)
tree162d1db3264baa32613adc7298dcba003aa7494e /server/sonar-server
parent47fdcb98f8e1698d9e9606eaf87303ea6d5f1409 (diff)
downloadsonarqube-ee5860395a505e9acee4a3908e1c7df3c9541536.tar.gz
sonarqube-ee5860395a505e9acee4a3908e1c7df3c9541536.zip
persist measures on server side - SONAR-6253
Diffstat (limited to 'server/sonar-server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentAppAction.java52
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/ComputationContainer.java42
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/measure/BatchReportMeasureUtils.java87
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/measure/MetricCache.java56
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java1
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java120
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/duplication/ws/ShowAction.java8
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/measure/persistence/MeasureDao.java53
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java4
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/test/CoverageService.java3
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java2
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentAppActionTest.java13
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchReportMeasureUtilsTest.java93
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/measure/MetricCacheTest.java56
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java5
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java234
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/duplication/ws/ShowActionTest.java16
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/measure/persistence/MeasureDaoTest.java89
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/source/SourceServiceTest.java25
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/test/CoverageServiceTest.java28
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/test/ws/TestsShowActionTest.java18
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/measure/MetricCacheTest/metrics.xml13
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/step/PersistMeasuresStepTest/shared.xml5
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/empty.xml3
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/insert-result.xml27
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/shared.xml2
26 files changed, 873 insertions, 182 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentAppAction.java b/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentAppAction.java
index c5132c9c934..e08f7aa136a 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentAppAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentAppAction.java
@@ -183,8 +183,8 @@ public class ComponentAppAction implements RequestHandler {
private Map<String, MeasureDto> measuresByMetricKey(ComponentDto component, DbSession session) {
Map<String, MeasureDto> measuresByMetricKey = newHashMap();
String fileKey = component.getKey();
- for (MeasureDto measureDto : dbClient.measureDao().findByComponentKeyAndMetricKeys(fileKey, METRIC_KEYS, session)) {
- measuresByMetricKey.put(measureDto.getKey().metricKey(), measureDto);
+ for (MeasureDto measureDto : dbClient.measureDao().findByComponentKeyAndMetricKeys(session, fileKey, METRIC_KEYS)) {
+ measuresByMetricKey.put(measureDto.getMetricKey(), measureDto);
}
return measuresByMetricKey;
}
@@ -199,29 +199,31 @@ public class ComponentAppAction implements RequestHandler {
@CheckForNull
private String formatMeasure(@Nullable MeasureDto measure) {
- if (measure != null) {
- Metric metric = CoreMetrics.getMetric(measure.getKey().metricKey());
- Metric.ValueType metricType = metric.getType();
- Double value = measure.getValue();
- String data = measure.getData();
- if (BooleanUtils.isTrue(metric.isOptimizedBestValue()) && value == null) {
- value = metric.getBestValue();
- }
- if (metricType.equals(Metric.ValueType.FLOAT) && value != null) {
- return i18n.formatDouble(UserSession.get().locale(), value);
- }
- if (metricType.equals(Metric.ValueType.INT) && value != null) {
- return i18n.formatInteger(UserSession.get().locale(), value.intValue());
- }
- if (metricType.equals(Metric.ValueType.PERCENT) && value != null) {
- return i18n.formatDouble(UserSession.get().locale(), value) + "%";
- }
- if (metricType.equals(Metric.ValueType.WORK_DUR) && value != null) {
- return durations.format(UserSession.get().locale(), durations.create(value.longValue()), Durations.DurationFormat.SHORT);
- }
- if ((metricType.equals(Metric.ValueType.STRING) || metricType.equals(Metric.ValueType.RATING)) && data != null) {
- return data;
- }
+ if (measure == null) {
+ return null;
+ }
+
+ Metric metric = CoreMetrics.getMetric(measure.getMetricKey());
+ Metric.ValueType metricType = metric.getType();
+ Double value = measure.getValue();
+ String data = measure.getData();
+ if (BooleanUtils.isTrue(metric.isOptimizedBestValue()) && value == null) {
+ value = metric.getBestValue();
+ }
+ if (metricType.equals(Metric.ValueType.FLOAT) && value != null) {
+ return i18n.formatDouble(UserSession.get().locale(), value);
+ }
+ if (metricType.equals(Metric.ValueType.INT) && value != null) {
+ return i18n.formatInteger(UserSession.get().locale(), value.intValue());
+ }
+ if (metricType.equals(Metric.ValueType.PERCENT) && value != null) {
+ return i18n.formatDouble(UserSession.get().locale(), value) + "%";
+ }
+ if (metricType.equals(Metric.ValueType.WORK_DUR) && value != null) {
+ return durations.format(UserSession.get().locale(), durations.create(value.longValue()), Durations.DurationFormat.SHORT);
+ }
+ if ((metricType.equals(Metric.ValueType.STRING) || metricType.equals(Metric.ValueType.RATING)) && data != null) {
+ return data;
}
return null;
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationContainer.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationContainer.java
index 21e9e7c9cb2..95ad3ef370e 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationContainer.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationContainer.java
@@ -21,13 +21,8 @@ package org.sonar.server.computation;
import org.sonar.api.platform.ComponentContainer;
import org.sonar.core.issue.db.UpdateConflictResolver;
-import org.sonar.server.computation.issue.IssueCache;
-import org.sonar.server.computation.issue.IssueComputation;
-import org.sonar.server.computation.issue.RuleCache;
-import org.sonar.server.computation.issue.RuleCacheLoader;
-import org.sonar.server.computation.issue.ScmAccountCache;
-import org.sonar.server.computation.issue.ScmAccountCacheLoader;
-import org.sonar.server.computation.issue.SourceLinesCache;
+import org.sonar.server.computation.issue.*;
+import org.sonar.server.computation.measure.MetricCache;
import org.sonar.server.computation.step.ComputationSteps;
import org.sonar.server.platform.Platform;
import org.sonar.server.view.index.ViewIndex;
@@ -37,22 +32,6 @@ import java.util.List;
public class ComputationContainer {
- public void execute(ReportQueue.Item item) {
- ComponentContainer container = Platform.getInstance().getContainer();
- ComponentContainer child = container.createChild();
- child.addSingletons(componentClasses());
- child.addSingletons(ComputationSteps.orderedStepClasses());
- child.startComponents();
- try {
- child.getComponentByType(ComputationService.class).process(item);
- } finally {
- child.stopComponents();
- // TODO not possible to have multiple children -> will be
- // a problem when we will have multiple concurrent computation workers
- container.removeChild();
- }
- }
-
/**
* List of all objects to be injected in the picocontainer dedicated to computation stack.
* Does not contain the steps declared in {@link org.sonar.server.computation.step.ComputationSteps#orderedStepClasses()}.
@@ -70,9 +49,26 @@ public class ComputationContainer {
RuleCache.class,
RuleCacheLoader.class,
IssueCache.class,
+ MetricCache.class,
UpdateConflictResolver.class,
// views
ViewIndex.class);
}
+
+ public void execute(ReportQueue.Item item) {
+ ComponentContainer container = Platform.getInstance().getContainer();
+ ComponentContainer child = container.createChild();
+ child.addSingletons(componentClasses());
+ child.addSingletons(ComputationSteps.orderedStepClasses());
+ child.startComponents();
+ try {
+ child.getComponentByType(ComputationService.class).process(item);
+ } finally {
+ child.stopComponents();
+ // TODO not possible to have multiple children -> will be
+ // a problem when we will have multiple concurrent computation workers
+ container.removeChild();
+ }
+ }
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/BatchReportMeasureUtils.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/BatchReportMeasureUtils.java
new file mode 100644
index 00000000000..3e35b9970aa
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/BatchReportMeasureUtils.java
@@ -0,0 +1,87 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.computation.measure;
+
+import org.sonar.batch.protocol.output.BatchReport;
+
+import javax.annotation.CheckForNull;
+
+public class BatchReportMeasureUtils {
+ private BatchReportMeasureUtils() {
+ // static methods only
+ }
+
+ /**
+ * return the numerical value as a double. It's the type used in db.
+ * Returns null if no numerical value found
+ */
+ @CheckForNull
+ public static Double valueAsDouble(BatchReport.Measure measure) {
+ switch (measure.getValueType()) {
+ case BOOLEAN:
+ return measure.getBooleanValue() ? 1.0d : 0.0d;
+ case INT:
+ return Double.valueOf(measure.getIntValue());
+ case LONG:
+ return Double.valueOf(measure.getLongValue());
+ case DOUBLE:
+ return measure.getDoubleValue();
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * check that measure has a value (numerical or string) and a metric key
+ */
+ public static void checkMeasure(BatchReport.Measure measure) {
+ if (!measure.hasValueType() || !measure.hasMetricKey()) {
+ throw newIllegalStateException(measure);
+ }
+
+ boolean hasValueOrData = false;
+ switch (measure.getValueType()) {
+ case DOUBLE:
+ hasValueOrData = measure.hasDoubleValue();
+ break;
+ case INT:
+ hasValueOrData = measure.hasIntValue();
+ break;
+ case LONG:
+ hasValueOrData = measure.hasLongValue();
+ break;
+ case STRING:
+ hasValueOrData = measure.hasStringValue();
+ break;
+ case BOOLEAN:
+ hasValueOrData = measure.hasBooleanValue();
+ break;
+ }
+
+ if (!hasValueOrData) {
+ throw newIllegalStateException(measure);
+ }
+ }
+
+ private static IllegalStateException newIllegalStateException(BatchReport.Measure measure) {
+ return new IllegalStateException(String.format("Measure %s does not have value", measure));
+ }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MetricCache.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MetricCache.java
new file mode 100644
index 00000000000..cd908bf4190
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MetricCache.java
@@ -0,0 +1,56 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.computation.measure;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Maps;
+import org.sonar.core.measure.db.MetricDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.db.DbClient;
+import org.sonar.server.exceptions.NotFoundException;
+
+import java.util.List;
+import java.util.Map;
+
+public class MetricCache {
+ private final Map<String, MetricDto> metrics;
+
+ public MetricCache(DbClient dbClient) {
+ try (DbSession dbSession = dbClient.openSession(false)) {
+ List<MetricDto> metricList = dbClient.metricDao().findEnabled(dbSession);
+ this.metrics = Maps.uniqueIndex(metricList, new Function<MetricDto, String>() {
+ @Override
+ public String apply(MetricDto metric) {
+ return metric.getKey();
+ }
+ });
+ }
+ }
+
+ public MetricDto get(String key) {
+ MetricDto metric = metrics.get(key);
+ if (metric == null) {
+ throw new NotFoundException(String.format("Not found: '%s'", key));
+ }
+
+ return metric;
+ }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java
index 81cdeea9eda..530fcaad11b 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java
@@ -41,6 +41,7 @@ public class ComputationSteps {
ParseReportStep.class,
// Persist data
+ PersistMeasuresStep.class,
PersistIssuesStep.class,
PersistComponentLinksStep.class,
PersistEventsStep.class,
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java
new file mode 100644
index 00000000000..68d8ea11706
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java
@@ -0,0 +1,120 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.computation.step;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+import org.sonar.api.resources.Qualifiers;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.batch.protocol.output.BatchReport;
+import org.sonar.batch.protocol.output.BatchReportReader;
+import org.sonar.core.measure.db.MeasureDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.computation.ComputationContext;
+import org.sonar.server.computation.issue.RuleCache;
+import org.sonar.server.computation.measure.MetricCache;
+import org.sonar.server.db.DbClient;
+
+import java.util.List;
+
+import static org.sonar.server.computation.measure.BatchReportMeasureUtils.checkMeasure;
+import static org.sonar.server.computation.measure.BatchReportMeasureUtils.valueAsDouble;
+
+public class PersistMeasuresStep implements ComputationStep {
+
+ private final DbClient dbClient;
+ private final RuleCache ruleCache;
+ private final MetricCache metricCache;
+
+ public PersistMeasuresStep(DbClient dbClient, RuleCache ruleCache, MetricCache metricCache) {
+ this.dbClient = dbClient;
+ this.ruleCache = ruleCache;
+ this.metricCache = metricCache;
+ }
+
+ @Override
+ public String[] supportedProjectQualifiers() {
+ return new String[] {Qualifiers.PROJECT, Qualifiers.VIEW};
+ }
+
+ @Override
+ public String getDescription() {
+ return "Persist measures";
+ }
+
+ @Override
+ public void execute(ComputationContext context) {
+ int rootComponentRef = context.getReportMetadata().getRootComponentRef();
+ try (DbSession dbSession = dbClient.openSession(true)) {
+ recursivelyProcessComponent(dbSession, context, rootComponentRef);
+ dbSession.commit();
+ }
+ }
+
+ private void recursivelyProcessComponent(DbSession dbSession, ComputationContext context, int componentRef) {
+ BatchReportReader reportReader = context.getReportReader();
+ BatchReport.Component component = reportReader.readComponent(componentRef);
+ List<BatchReport.Measure> measures = reportReader.readComponentMeasures(componentRef);
+ persistMeasures(dbSession, measures, component);
+ for (Integer childRef : component.getChildRefList()) {
+ recursivelyProcessComponent(dbSession, context, childRef);
+ }
+ }
+
+ private void persistMeasures(DbSession dbSession, List<BatchReport.Measure> batchReportMeasures, final BatchReport.Component component) {
+ List<MeasureDto> measures = Lists.transform(batchReportMeasures, new Function<BatchReport.Measure, MeasureDto>() {
+ @Override
+ public MeasureDto apply(BatchReport.Measure batchMeasure) {
+ return toMeasureDto(batchMeasure, component);
+ }
+ });
+
+ for (MeasureDto measure : measures) {
+ dbClient.measureDao().insert(dbSession, measure);
+ }
+ }
+
+ @VisibleForTesting
+ MeasureDto toMeasureDto(BatchReport.Measure in, BatchReport.Component component) {
+ checkMeasure(in);
+
+ MeasureDto out = new MeasureDto()
+ .setTendency(in.hasTendency() ? in.getTendency() : null)
+ .setVariation(1, in.hasVariationValue1() ? in.getVariationValue1() : null)
+ .setVariation(2, in.hasVariationValue2() ? in.getVariationValue2() : null)
+ .setVariation(3, in.hasVariationValue3() ? in.getVariationValue3() : null)
+ .setVariation(4, in.hasVariationValue4() ? in.getVariationValue4() : null)
+ .setVariation(5, in.hasVariationValue5() ? in.getVariationValue5() : null)
+ .setAlertStatus(in.hasAlertStatus() ? in.getAlertStatus() : null)
+ .setAlertText(in.hasAlertText() ? in.getAlertText() : null)
+ .setDescription(in.hasDescription() ? in.getDescription() : null)
+ .setSeverity(in.hasSeverity() ? in.getSeverity().name() : null)
+ .setComponentId(component.getId())
+ .setSnapshotId(component.getSnapshotId())
+ .setMetricId(metricCache.get(in.getMetricKey()).getId())
+ .setRuleId(ruleCache.get(RuleKey.parse(in.getRuleKey())).getId())
+ .setCharacteristicId(in.hasCharactericId() ? in.getCharactericId() : null);
+ out.setValue(valueAsDouble(in));
+ out.setData(in.hasStringValue() ? in.getStringValue() : null);
+ return out;
+ }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/duplication/ws/ShowAction.java b/server/sonar-server/src/main/java/org/sonar/server/duplication/ws/ShowAction.java
index e3d309a57cc..5f18d58f81f 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/duplication/ws/ShowAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/duplication/ws/ShowAction.java
@@ -31,7 +31,6 @@ import org.sonar.api.utils.text.JsonWriter;
import org.sonar.api.web.UserRole;
import org.sonar.core.component.ComponentDto;
import org.sonar.core.measure.db.MeasureDto;
-import org.sonar.core.measure.db.MeasureKey;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.MyBatis;
import org.sonar.server.component.db.ComponentDao;
@@ -41,7 +40,6 @@ import org.sonar.server.measure.persistence.MeasureDao;
import org.sonar.server.user.UserSession;
import javax.annotation.CheckForNull;
-
import java.util.List;
public class ShowAction implements RequestHandler {
@@ -105,9 +103,9 @@ public class ShowAction implements RequestHandler {
@CheckForNull
private String findDataFromComponent(String fileKey, String metricKey, DbSession session) {
- MeasureDto data = measureDao.getNullableByKey(session, MeasureKey.of(fileKey, metricKey));
- if (data != null) {
- return data.getData();
+ MeasureDto measure = measureDao.findByComponentKeyAndMetricKey(session, fileKey, metricKey);
+ if (measure != null) {
+ return measure.getData();
}
return null;
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/measure/persistence/MeasureDao.java b/server/sonar-server/src/main/java/org/sonar/server/measure/persistence/MeasureDao.java
index 89790d9524c..7b1b40db23d 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/measure/persistence/MeasureDao.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/measure/persistence/MeasureDao.java
@@ -20,55 +20,42 @@
package org.sonar.server.measure.persistence;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.Lists;
+import com.google.common.base.Function;
import org.sonar.api.ServerComponent;
-import org.sonar.api.utils.System2;
import org.sonar.core.measure.db.MeasureDto;
-import org.sonar.core.measure.db.MeasureKey;
import org.sonar.core.measure.db.MeasureMapper;
import org.sonar.core.persistence.DaoComponent;
+import org.sonar.core.persistence.DaoUtils;
import org.sonar.core.persistence.DbSession;
-import org.sonar.server.db.BaseDao;
-import java.util.Collections;
+import javax.annotation.CheckForNull;
import java.util.List;
-import static com.google.common.collect.Lists.newArrayList;
+public class MeasureDao implements ServerComponent, DaoComponent {
-public class MeasureDao extends BaseDao<MeasureMapper, MeasureDto, MeasureKey> implements ServerComponent, DaoComponent {
-
- public MeasureDao() {
- this(System2.INSTANCE);
- }
-
- @VisibleForTesting
- public MeasureDao(System2 system) {
- super(MeasureMapper.class, system);
+ public boolean existsByKey(DbSession session, String componentKey, String metricKey) {
+ return mapper(session).countByComponentAndMetric(componentKey, metricKey) > 0;
}
- @Override
- protected MeasureDto doGetNullableByKey(DbSession session, MeasureKey key) {
- return mapper(session).selectByKey(key);
+ @CheckForNull
+ public MeasureDto findByComponentKeyAndMetricKey(DbSession session, String componentKey, String metricKey) {
+ return mapper(session).selectByComponentAndMetric(componentKey, metricKey);
}
- public boolean existsByKey(MeasureKey key, DbSession session) {
- return mapper(session).countByKey(key) > 0;
+ public List<MeasureDto> findByComponentKeyAndMetricKeys(final DbSession session, final String componentKey, List<String> metricKeys) {
+ return DaoUtils.executeLargeInputs(metricKeys, new Function<List<String>, List<MeasureDto>>() {
+ @Override
+ public List<MeasureDto> apply(List<String> keys) {
+ return mapper(session).selectByComponentAndMetrics(componentKey, keys);
+ }
+ });
}
- public List<MeasureDto> findByComponentKeyAndMetricKeys(String componentKey, List<String> metricKeys, DbSession session) {
- if (metricKeys.isEmpty()) {
- return Collections.emptyList();
- }
- List<MeasureDto> dtos = newArrayList();
- List<List<String>> partitions = Lists.partition(newArrayList(metricKeys), 1000);
- for (List<String> partition : partitions) {
- dtos.addAll(mapper(session).selectByComponentAndMetrics(componentKey, partition));
- }
- return dtos;
+ public void insert(DbSession session, MeasureDto measureDto) {
+ mapper(session).insert(measureDto);
}
- public MeasureDto findByComponentKeyAndMetricKey(String componentKey, String metricKey, DbSession session) {
- return mapper(session).selectByComponentAndMetric(componentKey, metricKey);
+ private MeasureMapper mapper(DbSession session) {
+ return session.getMapper(MeasureMapper.class);
}
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java b/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java
index 4b4add00ce5..ed80adb8f94 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java
@@ -26,7 +26,6 @@ import org.sonar.api.ServerComponent;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.web.UserRole;
import org.sonar.core.measure.db.MeasureDto;
-import org.sonar.core.measure.db.MeasureKey;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.MyBatis;
import org.sonar.server.db.DbClient;
@@ -36,7 +35,6 @@ import org.sonar.server.user.UserSession;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
-
import java.util.List;
public class SourceService implements ServerComponent {
@@ -97,7 +95,7 @@ public class SourceService implements ServerComponent {
private String findDataFromComponent(String fileKey, String metricKey) {
DbSession session = dbClient.openSession(false);
try {
- MeasureDto data = dbClient.measureDao().getNullableByKey(session, MeasureKey.of(fileKey, metricKey));
+ MeasureDto data = dbClient.measureDao().findByComponentKeyAndMetricKey(session, fileKey, metricKey);
if (data != null) {
return data.getData();
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/test/CoverageService.java b/server/sonar-server/src/main/java/org/sonar/server/test/CoverageService.java
index 3a72095367c..3f34be942f3 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/test/CoverageService.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/test/CoverageService.java
@@ -29,7 +29,6 @@ import org.sonar.api.utils.KeyValueFormat;
import org.sonar.api.web.UserRole;
import org.sonar.core.component.SnapshotPerspectives;
import org.sonar.core.measure.db.MeasureDto;
-import org.sonar.core.measure.db.MeasureKey;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.MyBatis;
import org.sonar.server.measure.persistence.MeasureDao;
@@ -109,7 +108,7 @@ public class CoverageService implements ServerComponent {
private Map<Integer, Integer> findDataFromComponent(String fileKey, String metricKey) {
DbSession session = myBatis.openSession(false);
try {
- MeasureDto data = measureDao.getNullableByKey(session, MeasureKey.of(fileKey, metricKey));
+ MeasureDto data = measureDao.findByComponentKeyAndMetricKey(session, fileKey, metricKey);
String dataValue = data != null ? data.getData() : null;
if (dataValue != null) {
return KeyValueFormat.parseIntInt(dataValue);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java b/server/sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java
index 4213c5553be..2b04e68cf0a 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/test/ws/TestsShowAction.java
@@ -138,7 +138,7 @@ public class TestsShowAction implements RequestHandler {
private String findTestData(String fileKey) {
DbSession session = dbClient.openSession(false);
try {
- MeasureDto testData = dbClient.measureDao().findByComponentKeyAndMetricKey(fileKey, CoreMetrics.TEST_DATA_KEY, session);
+ MeasureDto testData = dbClient.measureDao().findByComponentKeyAndMetricKey(session, fileKey, CoreMetrics.TEST_DATA_KEY);
if (testData != null) {
return testData.getData();
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentAppActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentAppActionTest.java
index 19496fb97ad..b7d0e949216 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentAppActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentAppActionTest.java
@@ -34,7 +34,6 @@ import org.sonar.api.utils.Durations;
import org.sonar.api.web.UserRole;
import org.sonar.core.component.ComponentDto;
import org.sonar.core.measure.db.MeasureDto;
-import org.sonar.core.measure.db.MeasureKey;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.properties.PropertiesDao;
import org.sonar.core.properties.PropertyDto;
@@ -99,7 +98,7 @@ public class ComponentAppActionTest {
when(dbClient.propertiesDao()).thenReturn(propertiesDao);
when(dbClient.measureDao()).thenReturn(measureDao);
- when(measureDao.findByComponentKeyAndMetricKeys(anyString(), anyListOf(String.class), eq(session))).thenReturn(measures);
+ when(measureDao.findByComponentKeyAndMetricKeys(eq(session), anyString(), anyListOf(String.class))).thenReturn(measures);
tester = new WsTester(new ComponentsWs(new ComponentAppAction(dbClient, durations, i18n), mock(SearchAction.class)));
}
@@ -139,13 +138,13 @@ public class ComponentAppActionTest {
addMeasure(CoreMetrics.SQALE_RATING_KEY, "C");
addMeasure(CoreMetrics.SQALE_DEBT_RATIO_KEY, 35d);
- measures.add(MeasureDto.createFor(MeasureKey.of(COMPONENT_KEY, CoreMetrics.TECHNICAL_DEBT_KEY)).setValue(182.0));
+ measures.add(new MeasureDto().setComponentKey(COMPONENT_KEY).setMetricKey(CoreMetrics.TECHNICAL_DEBT_KEY).setValue(182.0));
when(durations.format(any(Locale.class), any(Duration.class), eq(Durations.DurationFormat.SHORT))).thenReturn("3h 2min");
WsTester.TestRequest request = tester.newGetRequest("api/components", "app").setParam("uuid", COMPONENT_UUID);
request.execute().assertJson(getClass(), "app_with_measures.json");
- verify(measureDao).findByComponentKeyAndMetricKeys(eq(COMPONENT_KEY), measureKeysCaptor.capture(), eq(session));
+ verify(measureDao).findByComponentKeyAndMetricKeys(eq(session), eq(COMPONENT_KEY), measureKeysCaptor.capture());
assertThat(measureKeysCaptor.getValue()).contains(CoreMetrics.LINES_KEY, CoreMetrics.COVERAGE_KEY, CoreMetrics.DUPLICATED_LINES_DENSITY_KEY,
CoreMetrics.TECHNICAL_DEBT_KEY);
}
@@ -229,17 +228,17 @@ public class ComponentAppActionTest {
}
private void addMeasure(String metricKey, Integer value) {
- measures.add(MeasureDto.createFor(MeasureKey.of(COMPONENT_KEY, metricKey)).setValue(value.doubleValue()));
+ measures.add(new MeasureDto().setComponentKey(COMPONENT_KEY).setMetricKey(metricKey).setValue(value.doubleValue()));
when(i18n.formatInteger(any(Locale.class), eq(value.intValue()))).thenReturn(Integer.toString(value));
}
private void addMeasure(String metricKey, Double value) {
- measures.add(MeasureDto.createFor(MeasureKey.of(COMPONENT_KEY, metricKey)).setValue(value));
+ measures.add(new MeasureDto().setComponentKey(COMPONENT_KEY).setMetricKey(metricKey).setValue(value));
when(i18n.formatDouble(any(Locale.class), eq(value))).thenReturn(Double.toString(value));
}
private void addMeasure(String metricKey, String value) {
- measures.add(MeasureDto.createFor(MeasureKey.of(COMPONENT_KEY, metricKey)).setTextValue(value));
+ measures.add(new MeasureDto().setComponentKey(COMPONENT_KEY).setMetricKey(metricKey).setData(value));
}
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchReportMeasureUtilsTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchReportMeasureUtilsTest.java
new file mode 100644
index 00000000000..6d743fa2757
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchReportMeasureUtilsTest.java
@@ -0,0 +1,93 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.computation.measure;
+
+import org.junit.Test;
+import org.sonar.batch.protocol.Constants;
+import org.sonar.batch.protocol.output.BatchReport;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.batch.protocol.Constants.MeasureValueType.*;
+import static org.sonar.server.computation.measure.BatchReportMeasureUtils.checkMeasure;
+import static org.sonar.server.computation.measure.BatchReportMeasureUtils.valueAsDouble;
+
+public class BatchReportMeasureUtilsTest {
+
+ @Test(expected = IllegalStateException.class)
+ public void fail_when_no_metric_key() throws Exception {
+ BatchReport.Measure measure = BatchReport.Measure.newBuilder()
+ .setValueType(STRING)
+ .setStringValue("string-value")
+ .build();
+
+ checkMeasure(measure);
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void fail_when_no_value() throws Exception {
+ BatchReport.Measure measure = BatchReport.Measure.newBuilder()
+ .setMetricKey("repo:metric-key")
+ .build();
+
+ checkMeasure(measure);
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void fail_when_no_consistency_between_string_value_and_numerical_value_type() throws Exception {
+ BatchReport.Measure measure = BatchReport.Measure.newBuilder()
+ .setValueType(DOUBLE)
+ .setStringValue("string-value")
+ .build();
+
+ checkMeasure(measure);
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void fail_when_no_consistence_between_numerical_value_types() throws Exception {
+ BatchReport.Measure measure = BatchReport.Measure.newBuilder()
+ .setValueType(DOUBLE)
+ .setIntValue(3)
+ .build();
+
+ checkMeasure(measure);
+ }
+
+ @Test
+ public void validate_all_value_type_without_exception_thrown() throws Exception {
+ checkMeasure(newBuilder().setValueType(STRING).setStringValue("string-value").build());
+ checkMeasure(newBuilder().setValueType(DOUBLE).setDoubleValue(1.0d).build());
+ checkMeasure(newBuilder().setValueType(Constants.MeasureValueType.INT).setIntValue(1).build());
+ checkMeasure(newBuilder().setValueType(Constants.MeasureValueType.LONG).setLongValue(2L).build());
+ checkMeasure(newBuilder().setValueType(BOOLEAN).setBooleanValue(true).build());
+ }
+
+ @Test
+ public void value_type_as_double_correct_for_all_numerical_types() throws Exception {
+ assertThat(valueAsDouble(newBuilder().setBooleanValue(true).setValueType(BOOLEAN).build())).isEqualTo(1.0d);
+ assertThat(valueAsDouble(newBuilder().setIntValue(2).setValueType(INT).build())).isEqualTo(2.0d);
+ assertThat(valueAsDouble(newBuilder().setLongValue(3L).setValueType(LONG).build())).isEqualTo(3.0d);
+ assertThat(valueAsDouble(newBuilder().setDoubleValue(4.4d).setValueType(DOUBLE).build())).isEqualTo(4.4d);
+ }
+
+ private BatchReport.Measure.Builder newBuilder() {
+ return BatchReport.Measure.newBuilder().setMetricKey("repo:metric-key");
+ }
+} \ No newline at end of file
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MetricCacheTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MetricCacheTest.java
new file mode 100644
index 00000000000..38f61abee62
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MetricCacheTest.java
@@ -0,0 +1,56 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.computation.measure;
+
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.sonar.core.persistence.DbTester;
+import org.sonar.server.db.DbClient;
+import org.sonar.server.exceptions.NotFoundException;
+import org.sonar.server.measure.persistence.MetricDao;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class MetricCacheTest {
+
+ @ClassRule
+ public static DbTester db = new DbTester();
+
+ MetricCache sut;
+
+ @Before
+ public void setUp() throws Exception {
+ db.prepareDbUnit(getClass(), "metrics.xml");
+ sut = new MetricCache(new DbClient(db.database(), db.myBatis(), new MetricDao()));
+ }
+
+ @Test
+ public void cache_give_access_to_enabled_metrics() throws Exception {
+ assertThat(sut.get("ncloc").getId()).isEqualTo(1);
+ assertThat(sut.get("coverage").getId()).isEqualTo(2);
+ }
+
+ @Test(expected = NotFoundException.class)
+ public void fail_when_metric_not_found() throws Exception {
+ sut.get("complexity");
+ }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java
index 696ce5e6555..06f7580a42c 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputationStepsTest.java
@@ -44,12 +44,13 @@ public class ComputationStepsTest {
mock(SendIssueNotificationsStep.class),
mock(IndexComponentsStep.class),
mock(PersistComponentLinksStep.class),
+ mock(PersistMeasuresStep.class),
mock(PersistEventsStep.class)
);
- assertThat(registry.orderedSteps()).hasSize(13);
+ assertThat(registry.orderedSteps()).hasSize(14);
assertThat(registry.orderedSteps().get(0)).isInstanceOf(ParseReportStep.class);
- assertThat(registry.orderedSteps().get(12)).isInstanceOf(SendIssueNotificationsStep.class);
+ assertThat(registry.orderedSteps().get(13)).isInstanceOf(SendIssueNotificationsStep.class);
}
@Test
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java
new file mode 100644
index 00000000000..0e5aea549c7
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java
@@ -0,0 +1,234 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.computation.step;
+
+import org.assertj.core.data.Offset;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.rule.Severity;
+import org.sonar.batch.protocol.Constants;
+import org.sonar.batch.protocol.output.BatchReport;
+import org.sonar.batch.protocol.output.BatchReportReader;
+import org.sonar.batch.protocol.output.BatchReportWriter;
+import org.sonar.core.component.ComponentDto;
+import org.sonar.core.measure.db.MeasureDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.computation.ComputationContext;
+import org.sonar.server.computation.issue.RuleCache;
+import org.sonar.server.computation.measure.MetricCache;
+import org.sonar.server.db.DbClient;
+import org.sonar.server.measure.persistence.MeasureDao;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Date;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.*;
+
+public class PersistMeasuresStepTest extends BaseStepTest {
+
+ @Rule
+ public TemporaryFolder temp = new TemporaryFolder();
+
+ DbClient dbClient;
+ RuleCache ruleCache;
+ MetricCache metricCache;
+ MeasureDao measureDao;
+
+ PersistMeasuresStep sut;
+
+ @Before
+ public void setUp() throws Exception {
+ dbClient = mock(DbClient.class, Mockito.RETURNS_DEEP_STUBS);
+ ruleCache = mock(RuleCache.class, Mockito.RETURNS_DEEP_STUBS);
+ metricCache = mock(MetricCache.class, Mockito.RETURNS_DEEP_STUBS);
+ when(metricCache.get("metric-key").getId()).thenReturn(654);
+ measureDao = mock(MeasureDao.class);
+ when(ruleCache.get(any(RuleKey.class)).getId()).thenReturn(987);
+
+ sut = new PersistMeasuresStep(dbClient, ruleCache, metricCache);
+ }
+
+ @Test
+ public void insert_measures_from_report() throws Exception {
+ File dir = temp.newFolder();
+ BatchReportWriter report = new BatchReportWriter(dir);
+
+ when(dbClient.measureDao()).thenReturn(measureDao);
+
+ report.writeMetadata(BatchReport.Metadata.newBuilder()
+ .setAnalysisDate(new Date().getTime())
+ .setRootComponentRef(1)
+ .setProjectKey("project-key")
+ .setSnapshotId(3)
+ .build());
+
+ report.writeComponent(defaultComponent()
+ .addChildRef(2)
+ .build());
+ report.writeComponent(
+ defaultComponent()
+ .setRef(2)
+ .build());
+
+ report.writeComponentMeasures(1, Arrays.asList(
+ BatchReport.Measure.newBuilder()
+ .setValueType(Constants.MeasureValueType.STRING)
+ .setStringValue("measure-data")
+ .setTendency(2)
+ .setVariationValue1(1.1d)
+ .setVariationValue2(2.2d)
+ .setVariationValue3(3.3d)
+ .setVariationValue4(4.4d)
+ .setVariationValue5(5.5d)
+ .setAlertStatus("measure-alert-status")
+ .setAlertText("measure-alert-text")
+ .setDescription("measure-description")
+ .setSeverity(Constants.Severity.INFO)
+ .setMetricKey("metric-key")
+ .setRuleKey("repo:rule-key")
+ .setCharactericId(123456)
+ .build()));
+
+ report.writeComponentMeasures(2, Arrays.asList(
+ BatchReport.Measure.newBuilder()
+ .setValueType(Constants.MeasureValueType.DOUBLE)
+ .setDoubleValue(123.123d)
+ .setTendency(2)
+ .setVariationValue1(1.1d)
+ .setVariationValue2(2.2d)
+ .setVariationValue3(3.3d)
+ .setVariationValue4(4.4d)
+ .setVariationValue5(5.5d)
+ .setAlertStatus("measure-alert-status")
+ .setAlertText("measure-alert-text")
+ .setDescription("measure-description")
+ .setSeverity(Constants.Severity.BLOCKER)
+ .setMetricKey("metric-key")
+ .setRuleKey("repo:rule-key")
+ .setCharactericId(123456)
+ .build()));
+
+ sut.execute(new ComputationContext(new BatchReportReader(dir), mock(ComponentDto.class)));
+
+ ArgumentCaptor<MeasureDto> argument = ArgumentCaptor.forClass(MeasureDto.class);
+ verify(measureDao, times(2)).insert(any(DbSession.class), argument.capture());
+ assertThat(argument.getValue().getValue()).isEqualTo(123.123d, Offset.offset(0.0001d));
+ assertThat(argument.getValue().getMetricId()).isEqualTo(654);
+ assertThat(argument.getValue().getRuleId()).isEqualTo(987);
+ assertThat(argument.getValue().getSeverity()).isEqualTo(Severity.BLOCKER);
+ }
+
+ private BatchReport.Component.Builder defaultComponent() {
+ return BatchReport.Component.newBuilder()
+ .setRef(1)
+ .setId(2)
+ .setSnapshotId(3);
+ }
+
+ @Test
+ public void map_full_batch_measure() throws Exception {
+ BatchReport.Measure batchMeasure = BatchReport.Measure.newBuilder()
+ .setValueType(Constants.MeasureValueType.DOUBLE)
+ .setDoubleValue(123.123d)
+ .setTendency(2)
+ .setVariationValue1(1.1d)
+ .setVariationValue2(2.2d)
+ .setVariationValue3(3.3d)
+ .setVariationValue4(4.4d)
+ .setVariationValue5(5.5d)
+ .setAlertStatus("measure-alert-status")
+ .setAlertText("measure-alert-text")
+ .setDescription("measure-description")
+ .setSeverity(Constants.Severity.CRITICAL)
+ .setMetricKey("metric-key")
+ .setRuleKey("repo:rule-key")
+ .setCharactericId(123456)
+ .build();
+
+ BatchReport.Component component = defaultComponent().build();
+
+ MeasureDto measure = sut.toMeasureDto(batchMeasure, component);
+
+ assertThat(measure).isEqualToComparingFieldByField(expectedFullMeasure());
+ }
+
+ @Test
+ public void map_minimal_batch_measure() throws Exception {
+ BatchReport.Measure batchMeasure = BatchReport.Measure.newBuilder()
+ .setValueType(Constants.MeasureValueType.INT)
+ .setIntValue(123)
+ .setSeverity(Constants.Severity.INFO)
+ .setMetricKey("metric-key")
+ .setRuleKey("repo:rule-key")
+ .build();
+
+ BatchReport.Component component = defaultComponent()
+ .build();
+
+ MeasureDto measure = sut.toMeasureDto(batchMeasure, component);
+
+ assertThat(measure).isEqualToComparingFieldByField(expectedMinimalistMeasure());
+ }
+
+ private MeasureDto expectedFullMeasure() {
+ return new MeasureDto()
+ .setComponentId(2L)
+ .setSnapshotId(3L)
+ .setCharacteristicId(123456)
+ .setValue(123.123d)
+ .setTendency(2)
+ .setVariation(1, 1.1d)
+ .setVariation(2, 2.2d)
+ .setVariation(3, 3.3d)
+ .setVariation(4, 4.4d)
+ .setVariation(5, 5.5d)
+ .setAlertStatus("measure-alert-status")
+ .setAlertText("measure-alert-text")
+ .setDescription("measure-description")
+ .setSeverity(Severity.CRITICAL)
+ .setMetricId(654)
+ .setRuleId(987);
+ }
+
+ private MeasureDto expectedMinimalistMeasure() {
+ return new MeasureDto()
+ .setComponentId(2L)
+ .setSnapshotId(3L)
+ .setValue(123d)
+ .setSeverity(Severity.INFO)
+ .setMetricId(654)
+ .setRuleId(987);
+ }
+
+ @Override
+ protected ComputationStep step() throws IOException {
+ return sut;
+ }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/duplication/ws/ShowActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/duplication/ws/ShowActionTest.java
index 7fc53c3acc0..db137bb750e 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/duplication/ws/ShowActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/duplication/ws/ShowActionTest.java
@@ -31,7 +31,6 @@ import org.sonar.api.utils.text.JsonWriter;
import org.sonar.api.web.UserRole;
import org.sonar.core.component.ComponentDto;
import org.sonar.core.measure.db.MeasureDto;
-import org.sonar.core.measure.db.MeasureKey;
import org.sonar.core.persistence.DbSession;
import org.sonar.server.component.db.ComponentDao;
import org.sonar.server.db.DbClient;
@@ -86,10 +85,9 @@ public class ShowActionTest {
when(componentDao.getNullableByKey(session, componentKey)).thenReturn(componentDto);
String data = "{duplications}";
- MeasureKey measureKey = MeasureKey.of(componentKey, CoreMetrics.DUPLICATIONS_DATA_KEY);
- when(measureDao.getNullableByKey(session, measureKey)).thenReturn(
- MeasureDto.createFor(measureKey).setTextValue("{duplications}")
- );
+ when(measureDao.findByComponentKeyAndMetricKey(session, componentKey, CoreMetrics.DUPLICATIONS_DATA_KEY)).thenReturn(
+ new MeasureDto().setComponentKey(componentKey).setMetricKey(CoreMetrics.DUPLICATIONS_DATA_KEY).setData("{duplications}")
+ );
List<DuplicationsParser.Block> blocks = newArrayList(new DuplicationsParser.Block(newArrayList(new DuplicationsParser.Duplication(componentDto, 1, 2))));
when(parser.parse(componentDto, data, session)).thenReturn(blocks);
@@ -112,9 +110,8 @@ public class ShowActionTest {
when(componentDao.getNullableByKey(session, componentKey)).thenReturn(componentDto);
String data = "{duplications}";
- MeasureKey measureKey = MeasureKey.of(componentKey, CoreMetrics.DUPLICATIONS_DATA_KEY);
- when(measureDao.getNullableByKey(session, measureKey)).thenReturn(
- MeasureDto.createFor(measureKey).setTextValue("{duplications}")
+ when(measureDao.findByComponentKeyAndMetricKey(session, componentKey, CoreMetrics.DUPLICATIONS_DATA_KEY)).thenReturn(
+ new MeasureDto().setComponentKey(componentKey).setMetricKey(CoreMetrics.DUPLICATIONS_DATA_KEY).setData("{duplications}")
);
List<DuplicationsParser.Block> blocks = newArrayList(new DuplicationsParser.Block(newArrayList(new DuplicationsParser.Duplication(componentDto, 1, 2))));
@@ -134,8 +131,7 @@ public class ShowActionTest {
ComponentDto componentDto = new ComponentDto().setId(10L);
when(componentDao.getNullableByKey(session, componentKey)).thenReturn(componentDto);
- MeasureKey measureKey = MeasureKey.of(componentKey, CoreMetrics.DUPLICATIONS_DATA_KEY);
- when(measureDao.getNullableByKey(session, measureKey)).thenReturn(null);
+ when(measureDao.findByComponentKeyAndMetricKey(session, componentKey, CoreMetrics.DUPLICATIONS_DATA_KEY)).thenReturn(null);
WsTester.TestRequest request = tester.newGetRequest("api/duplications", "show").setParam("key", componentKey);
request.execute();
diff --git a/server/sonar-server/src/test/java/org/sonar/server/measure/persistence/MeasureDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/measure/persistence/MeasureDaoTest.java
index 4f1260a0ad8..d37060f1b1a 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/measure/persistence/MeasureDaoTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/measure/persistence/MeasureDaoTest.java
@@ -22,28 +22,33 @@ package org.sonar.server.measure.persistence;
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
-import org.sonar.api.utils.System2;
+import org.junit.experimental.categories.Category;
+import org.sonar.api.rule.Severity;
import org.sonar.core.measure.db.MeasureDto;
-import org.sonar.core.measure.db.MeasureKey;
-import org.sonar.core.persistence.AbstractDaoTestCase;
import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.DbTester;
+import org.sonar.test.DbTests;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
-public class MeasureDaoTest extends AbstractDaoTestCase {
+@Category(DbTests.class)
+public class MeasureDaoTest {
- DbSession session;
+ @Rule
+ public DbTester db = new DbTester();
- MeasureDao dao;
+ DbSession session;
+ MeasureDao sut;
@Before
- public void createDao() {
- session = getMyBatis().openSession(false);
- dao = new MeasureDao(System2.INSTANCE);
+ public void setUp() {
+ session = db.myBatis().openSession(false);
+ sut = new MeasureDao();
}
@After
@@ -53,46 +58,48 @@ public class MeasureDaoTest extends AbstractDaoTestCase {
@Test
public void get_value_by_key() throws Exception {
- setupData("shared");
+ db.prepareDbUnit(getClass(), "shared.xml");
- MeasureDto result = dao.getNullableByKey(session, MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc"));
+ MeasureDto result = sut.findByComponentKeyAndMetricKey(session, "org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc");
assertThat(result.getId()).isEqualTo(22);
assertThat(result.getValue()).isEqualTo(10d);
}
@Test
+ // TODO the string must be longer than 4000 char to be persisted in the data field
public void get_data_by_key() throws Exception {
- setupData("shared");
+ db.prepareDbUnit(getClass(), "shared.xml");
- MeasureDto result = dao.getNullableByKey(session, MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "authors_by_line"));
+ MeasureDto result = sut.findByComponentKeyAndMetricKey(session, "org.struts:struts-core:src/org/struts/RequestContext.java", "authors_by_line");
assertThat(result.getId()).isEqualTo(20);
assertThat(result.getData()).isEqualTo("0123456789012345678901234567890123456789");
}
@Test
public void get_text_value_by_key() throws Exception {
- setupData("shared");
+ db.prepareDbUnit(getClass(), "shared.xml");
- MeasureDto result = dao.getNullableByKey(session, MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "coverage_line_hits_data"));
+ MeasureDto result = sut.findByComponentKeyAndMetricKey(session, "org.struts:struts-core:src/org/struts/RequestContext.java", "coverage_line_hits_data");
assertThat(result.getId()).isEqualTo(21);
assertThat(result.getData()).isEqualTo("36=1;37=1;38=1;39=1;43=1;48=1;53=1");
}
@Test
public void find_by_component_key_and_metrics() throws Exception {
- setupData("shared");
+ db.prepareDbUnit(getClass(), "shared.xml");
- List<MeasureDto> results = dao.findByComponentKeyAndMetricKeys("org.struts:struts-core:src/org/struts/RequestContext.java",
- newArrayList("ncloc", "authors_by_line"), session);
+ List<MeasureDto> results = sut.findByComponentKeyAndMetricKeys(session, "org.struts:struts-core:src/org/struts/RequestContext.java",
+ newArrayList("ncloc", "authors_by_line"));
assertThat(results).hasSize(2);
- results = dao.findByComponentKeyAndMetricKeys("org.struts:struts-core:src/org/struts/RequestContext.java", newArrayList("ncloc"), session);
+ results = sut.findByComponentKeyAndMetricKeys(session, "org.struts:struts-core:src/org/struts/RequestContext.java", newArrayList("ncloc"));
assertThat(results).hasSize(1);
MeasureDto result = results.get(0);
assertThat(result.getId()).isEqualTo(22);
assertThat(result.getValue()).isEqualTo(10d);
- assertThat(result.getKey()).isEqualTo(MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc"));
+ assertThat(result.getComponentKey()).isEqualTo("org.struts:struts-core:src/org/struts/RequestContext.java");
+ assertThat(result.getMetricKey()).isEqualTo("ncloc");
assertThat(result.getVariation(1)).isEqualTo(1d);
assertThat(result.getVariation(2)).isEqualTo(2d);
assertThat(result.getVariation(3)).isEqualTo(3d);
@@ -102,31 +109,55 @@ public class MeasureDaoTest extends AbstractDaoTestCase {
@Test
public void find_by_component_key_and_metric() throws Exception {
- setupData("shared");
+ db.prepareDbUnit(getClass(), "shared.xml");
- MeasureDto result = dao.findByComponentKeyAndMetricKey("org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc", session);
+ MeasureDto result = sut.findByComponentKeyAndMetricKey(session, "org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc");
assertThat(result.getId()).isEqualTo(22);
assertThat(result.getValue()).isEqualTo(10d);
- assertThat(result.getKey()).isEqualTo(MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc"));
+ assertThat(result.getMetricKey()).isEqualTo("ncloc");
+ assertThat(result.getComponentKey()).isEqualTo("org.struts:struts-core:src/org/struts/RequestContext.java");
assertThat(result.getVariation(1)).isEqualTo(1d);
assertThat(result.getVariation(2)).isEqualTo(2d);
assertThat(result.getVariation(3)).isEqualTo(3d);
assertThat(result.getVariation(4)).isEqualTo(4d);
assertThat(result.getVariation(5)).isEqualTo(-5d);
- assertThat(dao.findByComponentKeyAndMetricKey("org.struts:struts-core:src/org/struts/RequestContext.java", "unknown", session)).isNull();
+ assertThat(sut.findByComponentKeyAndMetricKey(session, "org.struts:struts-core:src/org/struts/RequestContext.java", "unknown")).isNull();
}
@Test
public void exists_by_key() throws Exception {
- setupData("shared");
+ db.prepareDbUnit(getClass(), "shared.xml");
- assertThat(dao.existsByKey(MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc"), session)).isTrue();
- assertThat(dao.existsByKey(MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "unknown"), session)).isFalse();
+ assertThat(sut.existsByKey(session, "org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc")).isTrue();
+ assertThat(sut.existsByKey(session, "org.struts:struts-core:src/org/struts/RequestContext.java", "unknown")).isFalse();
}
- @Test(expected = IllegalStateException.class)
+ @Test
public void insert() throws Exception {
- dao.insert(session, MeasureDto.createFor(MeasureKey.of("org.struts:struts-core:src/org/struts/RequestContext.java", "ncloc")));
+ db.prepareDbUnit(getClass(), "empty.xml");
+
+ sut.insert(session, new MeasureDto()
+ .setSnapshotId(2L)
+ .setMetricId(3)
+ .setCharacteristicId(4)
+ .setRuleId(5)
+ .setComponentId(6L)
+ .setValue(2.0d)
+ .setData("measure-value")
+ .setTendency(42)
+ .setSeverity(Severity.INFO)
+ .setVariation(1, 1.0d)
+ .setVariation(2, 2.0d)
+ .setVariation(3, 3.0d)
+ .setVariation(4, 4.0d)
+ .setVariation(5, 5.0d)
+ .setAlertStatus("alert")
+ .setAlertText("alert-text")
+ .setDescription("measure-description")
+ );
+ session.commit();
+
+ db.assertDbUnit(getClass(), "insert-result.xml", "project_measures");
}
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/source/SourceServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/source/SourceServiceTest.java
index 77c359e228c..468f6cdd89b 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/source/SourceServiceTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/source/SourceServiceTest.java
@@ -27,7 +27,6 @@ import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.web.UserRole;
-import org.sonar.core.measure.db.MeasureKey;
import org.sonar.core.persistence.DbSession;
import org.sonar.server.db.DbClient;
import org.sonar.server.exceptions.ForbiddenException;
@@ -41,31 +40,23 @@ import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class SourceServiceTest {
+ static final String PROJECT_KEY = "org.sonar.sample";
+ static final String COMPONENT_UUID = "abc123";
@Mock
DbSession session;
-
@Mock
HtmlSourceDecorator sourceDecorator;
-
@Mock
MeasureDao measureDao;
-
@Mock
SourceLineIndex sourceLineIndex;
-
- static final String PROJECT_KEY = "org.sonar.sample";
- static final String COMPONENT_UUID = "abc123";
-
SourceService service;
@Before
@@ -104,7 +95,7 @@ public class SourceServiceTest {
@Test
public void get_scm_author_data() throws Exception {
service.getScmAuthorData(COMPONENT_UUID);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_UUID, CoreMetrics.SCM_AUTHORS_BY_LINE_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_UUID, CoreMetrics.SCM_AUTHORS_BY_LINE_KEY);
}
@Test
@@ -122,7 +113,7 @@ public class SourceServiceTest {
@Test
public void not_get_scm_author_data_if_no_data() throws Exception {
MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_UUID);
- when(measureDao.getNullableByKey(eq(session), any(MeasureKey.class))).thenReturn(null);
+ when(measureDao.findByComponentKeyAndMetricKey(eq(session), anyString(), anyString())).thenReturn(null);
assertThat(service.getScmAuthorData(COMPONENT_UUID)).isNull();
}
@@ -130,13 +121,13 @@ public class SourceServiceTest {
public void get_scm_date_data() throws Exception {
MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_UUID);
service.getScmDateData(COMPONENT_UUID);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_UUID, CoreMetrics.SCM_LAST_COMMIT_DATETIMES_BY_LINE_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_UUID, CoreMetrics.SCM_LAST_COMMIT_DATETIMES_BY_LINE_KEY);
}
@Test
public void not_get_scm_date_data_if_no_data() throws Exception {
MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_UUID);
- when(measureDao.getNullableByKey(eq(session), any(MeasureKey.class))).thenReturn(null);
+ when(measureDao.findByComponentKeyAndMetricKey(eq(session), anyString(), anyString())).thenReturn(null);
assertThat(service.getScmDateData(COMPONENT_UUID)).isNull();
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/test/CoverageServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/test/CoverageServiceTest.java
index 7bf569fe196..e514c411f6b 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/test/CoverageServiceTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/test/CoverageServiceTest.java
@@ -30,7 +30,6 @@ import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.test.MutableTestable;
import org.sonar.api.web.UserRole;
import org.sonar.core.component.SnapshotPerspectives;
-import org.sonar.core.measure.db.MeasureKey;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.MyBatis;
import org.sonar.server.measure.persistence.MeasureDao;
@@ -45,20 +44,15 @@ import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class CoverageServiceTest {
+ static final String COMPONENT_KEY = "org.sonar.sample:Sample";
@org.junit.Rule
public ExpectedException thrown = ExpectedException.none();
-
@Mock
DbSession session;
-
@Mock
MeasureDao measureDao;
-
@Mock
SnapshotPerspectives snapshotPerspectives;
-
- static final String COMPONENT_KEY = "org.sonar.sample:Sample";
-
CoverageService service;
@Before
@@ -79,43 +73,43 @@ public class CoverageServiceTest {
@Test
public void get_hits_data() throws Exception {
service.getHits(COMPONENT_KEY, CoverageService.TYPE.UT);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.COVERAGE_LINE_HITS_DATA_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_KEY, CoreMetrics.COVERAGE_LINE_HITS_DATA_KEY);
service.getHits(COMPONENT_KEY, CoverageService.TYPE.IT);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.IT_COVERAGE_LINE_HITS_DATA_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_KEY, CoreMetrics.IT_COVERAGE_LINE_HITS_DATA_KEY);
service.getHits(COMPONENT_KEY, CoverageService.TYPE.OVERALL);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.OVERALL_COVERAGE_LINE_HITS_DATA_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_KEY, CoreMetrics.OVERALL_COVERAGE_LINE_HITS_DATA_KEY);
}
@Test
public void not_get_hits_data_if_no_data() throws Exception {
- when(measureDao.getNullableByKey(eq(session), any(MeasureKey.class))).thenReturn(null);
+ when(measureDao.findByComponentKeyAndMetricKey(eq(session), anyString(), anyString())).thenReturn(null);
assertThat(service.getHits(COMPONENT_KEY, CoverageService.TYPE.UT)).isEqualTo(Collections.emptyMap());
}
@Test
public void get_conditions_data() throws Exception {
service.getConditions(COMPONENT_KEY, CoverageService.TYPE.UT);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.CONDITIONS_BY_LINE_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_KEY, CoreMetrics.CONDITIONS_BY_LINE_KEY);
service.getConditions(COMPONENT_KEY, CoverageService.TYPE.IT);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.IT_CONDITIONS_BY_LINE_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_KEY, CoreMetrics.IT_CONDITIONS_BY_LINE_KEY);
service.getConditions(COMPONENT_KEY, CoverageService.TYPE.OVERALL);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.OVERALL_CONDITIONS_BY_LINE_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_KEY, CoreMetrics.OVERALL_CONDITIONS_BY_LINE_KEY);
}
@Test
public void get_covered_conditions_data() throws Exception {
service.getCoveredConditions(COMPONENT_KEY, CoverageService.TYPE.UT);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.COVERED_CONDITIONS_BY_LINE_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_KEY, CoreMetrics.COVERED_CONDITIONS_BY_LINE_KEY);
service.getCoveredConditions(COMPONENT_KEY, CoverageService.TYPE.IT);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.IT_COVERED_CONDITIONS_BY_LINE_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_KEY, CoreMetrics.IT_COVERED_CONDITIONS_BY_LINE_KEY);
service.getCoveredConditions(COMPONENT_KEY, CoverageService.TYPE.OVERALL);
- verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.OVERALL_COVERED_CONDITIONS_BY_LINE_KEY));
+ verify(measureDao).findByComponentKeyAndMetricKey(session, COMPONENT_KEY, CoreMetrics.OVERALL_COVERED_CONDITIONS_BY_LINE_KEY);
}
@Test
diff --git a/server/sonar-server/src/test/java/org/sonar/server/test/ws/TestsShowActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/test/ws/TestsShowActionTest.java
index 9f7648e975a..0c1117c3fef 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/test/ws/TestsShowActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/test/ws/TestsShowActionTest.java
@@ -31,7 +31,6 @@ import org.sonar.api.test.TestCase;
import org.sonar.api.web.UserRole;
import org.sonar.core.component.SnapshotPerspectives;
import org.sonar.core.measure.db.MeasureDto;
-import org.sonar.core.measure.db.MeasureKey;
import org.sonar.core.persistence.DbSession;
import org.sonar.server.db.DbClient;
import org.sonar.server.measure.persistence.MeasureDao;
@@ -96,8 +95,10 @@ public class TestsShowActionTest {
public void show_from_test_data() throws Exception {
MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "SonarQube", TEST_PLAN_KEY);
- when(measureDao.findByComponentKeyAndMetricKey(TEST_PLAN_KEY, "test_data", session)).thenReturn(MeasureDto.createFor(MeasureKey.of(TEST_PLAN_KEY, "test_data"))
- .setTextValue("<tests-details>" +
+ when(measureDao.findByComponentKeyAndMetricKey(session, TEST_PLAN_KEY, "test_data")).thenReturn(new MeasureDto()
+ .setComponentKey(TEST_PLAN_KEY)
+ .setMetricKey("test_data")
+ .setData("<tests-details>" +
"<testcase status=\"ok\" time=\"10\" name=\"test1\"/>" +
"<testcase status=\"error\" time=\"97\" name=\"test2\">" +
"<error message=\"expected:&lt;true&gt; but was:&lt;false&gt;\">" +
@@ -121,10 +122,13 @@ public class TestsShowActionTest {
public void show_from_test_data_with_a_time_in_float() throws Exception {
MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, "SonarQube", TEST_PLAN_KEY);
- when(measureDao.findByComponentKeyAndMetricKey(TEST_PLAN_KEY, "test_data", session)).thenReturn(MeasureDto.createFor(MeasureKey.of(TEST_PLAN_KEY, "test_data"))
- .setTextValue("<tests-details>" +
- "<testcase status=\"ok\" time=\"12.5\" name=\"test1\"/>" +
- "</tests-details>"));
+ when(measureDao.findByComponentKeyAndMetricKey(session, TEST_PLAN_KEY, "test_data")).thenReturn(
+ new MeasureDto()
+ .setComponentKey(TEST_PLAN_KEY)
+ .setMetricKey("test_data")
+ .setData("<tests-details>" +
+ "<testcase status=\"ok\" time=\"12.5\" name=\"test1\"/>" +
+ "</tests-details>"));
WsTester.TestRequest request = tester.newGetRequest("api/tests", "show").setParam("key", TEST_PLAN_KEY);
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/measure/MetricCacheTest/metrics.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/measure/MetricCacheTest/metrics.xml
new file mode 100644
index 00000000000..dcfc8850a1c
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/measure/MetricCacheTest/metrics.xml
@@ -0,0 +1,13 @@
+<dataset>
+ <!-- enabled metrics -->
+ <metrics id="1" name="ncloc" VAL_TYPE="INT" DESCRIPTION="[null]" domain="[null]"
+ short_name="" enabled="true" worst_value="[null]" optimized_best_value="[null]" best_value="[null]"
+ direction="0" delete_historical_data="[null]" hidden="false"/>
+ <metrics id="2" name="coverage" VAL_TYPE="INT" DESCRIPTION="[null]" domain="[null]"
+ short_name="" enabled="true" worst_value="0" optimized_best_value="true" best_value="100" direction="1"
+ delete_historical_data="[null]" hidden="false"/>
+ <!-- disabled metric -->
+ <metrics id="3" name="complexity" VAL_TYPE="INT" DESCRIPTION="[null]" domain="[null]"
+ short_name="" enabled="false" worst_value="0" optimized_best_value="true" best_value="100" direction="1"
+ delete_historical_data="[null]" hidden="false"/>
+</dataset> \ No newline at end of file
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/step/PersistMeasuresStepTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/step/PersistMeasuresStepTest/shared.xml
new file mode 100644
index 00000000000..e9cb4686ecd
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/step/PersistMeasuresStepTest/shared.xml
@@ -0,0 +1,5 @@
+<dataset>
+ <rules id="987" tags="[null]" system_tags="[null]" name="[null]" plugin_rule_key="AvoidCycles" plugin_config_key="[null]" plugin_name="[null]"/>
+ <metrics id="654" delete_historical_data="[null]" name="coverage" VAL_TYPE="INT" DESCRIPTION="[null]" domain="[null]" short_name=""
+ enabled="true" worst_value="0" optimized_best_value="true" best_value="100" direction="1" hidden="false"/>
+</dataset> \ No newline at end of file
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/empty.xml b/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/empty.xml
new file mode 100644
index 00000000000..dda18829567
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/empty.xml
@@ -0,0 +1,3 @@
+<dataset>
+ <project_measures/>
+</dataset>
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/insert-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/insert-result.xml
new file mode 100644
index 00000000000..6714a2ad41c
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/insert-result.xml
@@ -0,0 +1,27 @@
+<dataset>
+ <project_measures
+ id="1"
+ snapshot_id="2"
+ metric_id="3"
+ characteristic_id="4"
+ rule_id="5"
+ project_id="6"
+ person_id="[null]"
+ value="2.0"
+ text_value="measure-value"
+ tendency="42"
+ rule_priority="0"
+ measure_date="[null]"
+ measure_data="[null]"
+ variation_value_1="1.0"
+ variation_value_2="2.0"
+ variation_value_3="3.0"
+ variation_value_4="4.0"
+ variation_value_5="5.0"
+ alert_status="alert"
+ alert_text="alert-text"
+ url="[null]"
+ description="measure-description"
+ rules_category_id="[null]"
+ />
+</dataset>
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/shared.xml
index 041ca607f35..a82f76dd770 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/shared.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MeasureDaoTest/shared.xml
@@ -8,7 +8,7 @@
<snapshots id="5" project_id="1" islast="[true]" />
- <project_measures id="20" snapshot_id="5" metric_id="10" value="[null]" text_value="[null]" measure_data="MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQ=="
+ <project_measures id="20" snapshot_id="5" metric_id="10" value="[null]" text_value="0123456789012345678901234567890123456789" measure_data="[null]"
variation_value_1="[null]" variation_value_2="[null]" variation_value_3="[null]" variation_value_4="[null]" variation_value_5="[null]" />
<project_measures id="21" snapshot_id="5" metric_id="11" value="[null]" text_value="36=1;37=1;38=1;39=1;43=1;48=1;53=1" measure_data="[null]"
variation_value_1="[null]" variation_value_2="[null]" variation_value_3="[null]" variation_value_4="[null]" variation_value_5="[null]" />