diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2015-03-13 16:15:47 +0100 |
---|---|---|
committer | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2015-03-20 08:30:32 +0100 |
commit | ee5860395a505e9acee4a3908e1c7df3c9541536 (patch) | |
tree | 162d1db3264baa32613adc7298dcba003aa7494e /server/sonar-server | |
parent | 47fdcb98f8e1698d9e9606eaf87303ea6d5f1409 (diff) | |
download | sonarqube-ee5860395a505e9acee4a3908e1c7df3c9541536.tar.gz sonarqube-ee5860395a505e9acee4a3908e1c7df3c9541536.zip |
persist measures on server side - SONAR-6253
Diffstat (limited to 'server/sonar-server')
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:<true> but was:<false>\">" + @@ -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]" /> |