introduced a builder to MeasureImpl to simplify creation of MeasureImpl instance with optional characteristic and ruletags/5.2-RC1
@@ -22,10 +22,18 @@ package org.sonar.server.computation.measure; | |||
import com.google.common.base.Optional; | |||
import java.util.Objects; | |||
import javax.annotation.Nullable; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.batch.protocol.output.BatchReport; | |||
import org.sonar.core.rule.RuleDto; | |||
import org.sonar.server.computation.issue.RuleCache; | |||
import org.sonar.server.computation.metric.Metric; | |||
public class BatchMeasureToMeasure { | |||
private final RuleCache ruleCache; | |||
public BatchMeasureToMeasure(RuleCache ruleCache) { | |||
this.ruleCache = ruleCache; | |||
} | |||
public Optional<Measure> toMeasure(@Nullable BatchReport.Measure batchMeasure, Metric metric) { | |||
Objects.requireNonNull(metric); | |||
@@ -33,75 +41,90 @@ public class BatchMeasureToMeasure { | |||
return Optional.absent(); | |||
} | |||
MeasureImpl.Builder builder = createBuilder(batchMeasure); | |||
String data = batchMeasure.hasStringValue() ? batchMeasure.getStringValue() : null; | |||
switch (metric.getType().getValueType()) { | |||
case INT: | |||
return toIntegerMeasure(batchMeasure, data); | |||
return toIntegerMeasure(builder, batchMeasure, data); | |||
case LONG: | |||
return toLongMeasure(batchMeasure, data); | |||
return toLongMeasure(builder, batchMeasure, data); | |||
case DOUBLE: | |||
return toDoubleMeasure(batchMeasure, data); | |||
return toDoubleMeasure(builder, batchMeasure, data); | |||
case BOOLEAN: | |||
return toBooleanMeasure(batchMeasure, data); | |||
return toBooleanMeasure(builder, batchMeasure, data); | |||
case STRING: | |||
return toStringMeasure(batchMeasure); | |||
return toStringMeasure(builder, batchMeasure); | |||
case LEVEL: | |||
return toLevelMeasure(batchMeasure); | |||
return toLevelMeasure(builder, batchMeasure); | |||
case NO_VALUE: | |||
return toNoValueMeasure(batchMeasure); | |||
return toNoValueMeasure(builder, batchMeasure); | |||
default: | |||
throw new IllegalArgumentException("Unsupported Measure.ValueType " + metric.getType().getValueType()); | |||
} | |||
} | |||
private static Optional<Measure> toIntegerMeasure(BatchReport.Measure batchMeasure, @Nullable String data) { | |||
private MeasureImpl.Builder createBuilder(BatchReport.Measure batchMeasure) { | |||
if (batchMeasure.hasCharactericId() && batchMeasure.hasRuleKey()) { | |||
throw new IllegalArgumentException("Measure with both characteristicId and ruleKey are not supported"); | |||
} | |||
if (batchMeasure.hasCharactericId()) { | |||
return MeasureImpl.builder().forCharacteristic(batchMeasure.getCharactericId()); | |||
} | |||
if (batchMeasure.hasRuleKey()) { | |||
RuleDto ruleDto = ruleCache.get(RuleKey.parse(batchMeasure.getRuleKey())); | |||
return MeasureImpl.builder().forRule(ruleDto.getId()); | |||
} | |||
return MeasureImpl.builder(); | |||
} | |||
private static Optional<Measure> toIntegerMeasure(MeasureImpl.Builder builder, BatchReport.Measure batchMeasure, @Nullable String data) { | |||
if (!batchMeasure.hasIntValue()) { | |||
return toMeasure(MeasureImpl.createNoValue(), batchMeasure); | |||
return toMeasure(builder.createNoValue(), batchMeasure); | |||
} | |||
return toMeasure(MeasureImpl.create(batchMeasure.getIntValue(), data), batchMeasure); | |||
return toMeasure(builder.create(batchMeasure.getIntValue(), data), batchMeasure); | |||
} | |||
private static Optional<Measure> toLongMeasure(BatchReport.Measure batchMeasure, @Nullable String data) { | |||
private static Optional<Measure> toLongMeasure(MeasureImpl.Builder builder, BatchReport.Measure batchMeasure, @Nullable String data) { | |||
if (!batchMeasure.hasLongValue()) { | |||
return toMeasure(MeasureImpl.createNoValue(), batchMeasure); | |||
return toMeasure(builder.createNoValue(), batchMeasure); | |||
} | |||
return toMeasure(MeasureImpl.create(batchMeasure.getLongValue(), data), batchMeasure); | |||
return toMeasure(builder.create(batchMeasure.getLongValue(), data), batchMeasure); | |||
} | |||
private static Optional<Measure> toDoubleMeasure(BatchReport.Measure batchMeasure, @Nullable String data) { | |||
private static Optional<Measure> toDoubleMeasure(MeasureImpl.Builder builder, BatchReport.Measure batchMeasure, @Nullable String data) { | |||
if (!batchMeasure.hasDoubleValue()) { | |||
return toMeasure(MeasureImpl.createNoValue(), batchMeasure); | |||
return toMeasure(builder.createNoValue(), batchMeasure); | |||
} | |||
return toMeasure(MeasureImpl.create(batchMeasure.getDoubleValue(), data), batchMeasure); | |||
return toMeasure(builder.create(batchMeasure.getDoubleValue(), data), batchMeasure); | |||
} | |||
private static Optional<Measure> toBooleanMeasure(BatchReport.Measure batchMeasure, @Nullable String data) { | |||
private static Optional<Measure> toBooleanMeasure(MeasureImpl.Builder builder, BatchReport.Measure batchMeasure, @Nullable String data) { | |||
if (!batchMeasure.hasBooleanValue()) { | |||
return toMeasure(MeasureImpl.createNoValue(), batchMeasure); | |||
return toMeasure(builder.createNoValue(), batchMeasure); | |||
} | |||
return toMeasure(MeasureImpl.create(batchMeasure.getBooleanValue(), data), batchMeasure); | |||
return toMeasure(builder.create(batchMeasure.getBooleanValue(), data), batchMeasure); | |||
} | |||
private static Optional<Measure> toStringMeasure(BatchReport.Measure batchMeasure) { | |||
private static Optional<Measure> toStringMeasure(MeasureImpl.Builder builder, BatchReport.Measure batchMeasure) { | |||
if (!batchMeasure.hasStringValue()) { | |||
return toMeasure(MeasureImpl.createNoValue(), batchMeasure); | |||
return toMeasure(builder.createNoValue(), batchMeasure); | |||
} | |||
return toMeasure(MeasureImpl.create(batchMeasure.getStringValue()), batchMeasure); | |||
return toMeasure(builder.create(batchMeasure.getStringValue()), batchMeasure); | |||
} | |||
private static Optional<Measure> toLevelMeasure(BatchReport.Measure batchMeasure) { | |||
private static Optional<Measure> toLevelMeasure(MeasureImpl.Builder builder, BatchReport.Measure batchMeasure) { | |||
if (!batchMeasure.hasStringValue()) { | |||
return toMeasure(MeasureImpl.createNoValue(), batchMeasure); | |||
return toMeasure(builder.createNoValue(), batchMeasure); | |||
} | |||
Optional<Measure.Level> level = Measure.Level.toLevel(batchMeasure.getStringValue()); | |||
if (!level.isPresent()) { | |||
return toMeasure(MeasureImpl.createNoValue(), batchMeasure); | |||
return toMeasure(builder.createNoValue(), batchMeasure); | |||
} | |||
return toMeasure(MeasureImpl.create(level.get()), batchMeasure); | |||
return toMeasure(builder.create(level.get()), batchMeasure); | |||
} | |||
private static Optional<Measure> toNoValueMeasure(BatchReport.Measure batchMeasure) { | |||
return toMeasure(MeasureImpl.createNoValue(), batchMeasure); | |||
private static Optional<Measure> toNoValueMeasure(MeasureImpl.Builder builder, BatchReport.Measure batchMeasure) { | |||
return toMeasure(builder.createNoValue(), batchMeasure); | |||
} | |||
private static Optional<Measure> toMeasure(MeasureImpl measure, BatchReport.Measure batchMeasure) { |
@@ -56,6 +56,12 @@ public interface Measure { | |||
} | |||
} | |||
@CheckForNull | |||
Integer getRuleId(); | |||
@CheckForNull | |||
Integer getCharacteristicId(); | |||
/** | |||
* The type of value stored in the measure. | |||
*/ | |||
@@ -137,4 +143,12 @@ public interface Measure { | |||
*/ | |||
MeasureVariations getVariations(); | |||
/** | |||
* The optional description of the measure. Relevant for manual measures. | |||
*/ | |||
@CheckForNull | |||
String getDescription(); | |||
} |
@@ -20,20 +20,23 @@ | |||
package org.sonar.server.computation.measure; | |||
import com.google.common.base.Optional; | |||
import java.util.Objects; | |||
import javax.annotation.Nullable; | |||
import org.sonar.core.measure.db.MeasureDto; | |||
import org.sonar.server.computation.metric.Metric; | |||
import static com.google.common.base.Preconditions.checkArgument; | |||
import static java.util.Objects.requireNonNull; | |||
import static org.sonar.server.computation.measure.Measure.Level.toLevel; | |||
public class MeasureDtoToMeasure { | |||
public Optional<Measure> toMeasure(@Nullable MeasureDto measureDto, Metric metric) { | |||
Objects.requireNonNull(metric); | |||
requireNonNull(metric); | |||
if (measureDto == null) { | |||
return Optional.absent(); | |||
} | |||
checkArgument(measureDto.getCharacteristicId() == null, "Measures with characteristicId are not supported"); | |||
checkArgument(measureDto.getRuleId() == null, "Measures with ruleId are not supported"); | |||
Double value = measureDto.getValue(); | |||
String data = measureDto.getData(); | |||
@@ -59,52 +62,52 @@ public class MeasureDtoToMeasure { | |||
private static Optional<Measure> toIntegerMeasure(MeasureDto measureDto, @Nullable Double value, String data) { | |||
if (value == null) { | |||
return toMeasure(MeasureImpl.createNoValue(), measureDto); | |||
return toMeasure(MeasureImpl.builder().createNoValue(), measureDto); | |||
} | |||
return toMeasure(MeasureImpl.create(value.intValue(), data), measureDto); | |||
return toMeasure(MeasureImpl.builder().create(value.intValue(), data), measureDto); | |||
} | |||
private static Optional<Measure> toLongMeasure(MeasureDto measureDto, @Nullable Double value, String data) { | |||
if (value == null) { | |||
return toMeasure(MeasureImpl.createNoValue(), measureDto); | |||
return toMeasure(MeasureImpl.builder().createNoValue(), measureDto); | |||
} | |||
return toMeasure(MeasureImpl.create(value.longValue(), data), measureDto); | |||
return toMeasure(MeasureImpl.builder().create(value.longValue(), data), measureDto); | |||
} | |||
private static Optional<Measure> toDoubleMeasure(MeasureDto measureDto, @Nullable Double value, String data) { | |||
if (value == null) { | |||
return toMeasure(MeasureImpl.createNoValue(), measureDto); | |||
return toMeasure(MeasureImpl.builder().createNoValue(), measureDto); | |||
} | |||
return toMeasure(MeasureImpl.create(value.doubleValue(), data), measureDto); | |||
return toMeasure(MeasureImpl.builder().create(value.doubleValue(), data), measureDto); | |||
} | |||
private static Optional<Measure> toBooleanMeasure(MeasureDto measureDto, @Nullable Double value, String data) { | |||
if (value == null) { | |||
return toMeasure(MeasureImpl.createNoValue(), measureDto); | |||
return toMeasure(MeasureImpl.builder().createNoValue(), measureDto); | |||
} | |||
return toMeasure(MeasureImpl.create(value == 1.0d, data), measureDto); | |||
return toMeasure(MeasureImpl.builder().create(value == 1.0d, data), measureDto); | |||
} | |||
private static Optional<Measure> toStringMeasure(MeasureDto measureDto, @Nullable String data) { | |||
if (data == null) { | |||
return toMeasure(MeasureImpl.createNoValue(), measureDto); | |||
return toMeasure(MeasureImpl.builder().createNoValue(), measureDto); | |||
} | |||
return toMeasure(MeasureImpl.create(data), measureDto); | |||
return toMeasure(MeasureImpl.builder().create(data), measureDto); | |||
} | |||
private static Optional<Measure> toLevelMeasure(MeasureDto measureDto, @Nullable String data) { | |||
if (data == null) { | |||
return toMeasure(MeasureImpl.createNoValue(), measureDto); | |||
return toMeasure(MeasureImpl.builder().createNoValue(), measureDto); | |||
} | |||
Optional<Measure.Level> level = toLevel(data); | |||
if (!level.isPresent()) { | |||
return toMeasure(MeasureImpl.createNoValue(), measureDto); | |||
return toMeasure(MeasureImpl.builder().createNoValue(), measureDto); | |||
} | |||
return toMeasure(MeasureImpl.create(level.get()), measureDto); | |||
return toMeasure(MeasureImpl.builder().create(level.get()), measureDto); | |||
} | |||
private static Optional<Measure> toNoValueMeasure(MeasureDto measureDto) { | |||
return toMeasure(MeasureImpl.createNoValue(), measureDto); | |||
return toMeasure(MeasureImpl.builder().createNoValue(), measureDto); | |||
} | |||
private static Optional<Measure> toMeasure(MeasureImpl measure, MeasureDto measureDto) { |
@@ -20,6 +20,7 @@ | |||
package org.sonar.server.computation.measure; | |||
import java.util.Locale; | |||
import javax.annotation.CheckForNull; | |||
import javax.annotation.Nullable; | |||
import static com.google.common.base.Preconditions.checkState; | |||
@@ -29,6 +30,10 @@ public final class MeasureImpl implements Measure { | |||
private final ValueType valueType; | |||
@Nullable | |||
private final Integer ruleId; | |||
@Nullable | |||
private final Integer characteristicId; | |||
@Nullable | |||
private final Double value; | |||
@Nullable | |||
private final String data; | |||
@@ -38,40 +43,98 @@ public final class MeasureImpl implements Measure { | |||
private QualityGateStatus qualityGateStatus; | |||
@Nullable | |||
private MeasureVariations variations; | |||
@Nullable | |||
private String description; | |||
protected MeasureImpl(ValueType valueType, @Nullable Double value, @Nullable String data, @Nullable Level dataLevel) { | |||
protected MeasureImpl(ValueType valueType, @Nullable Integer ruleId, @Nullable Integer characteristicId, @Nullable Double value, @Nullable String data, @Nullable Level dataLevel) { | |||
this.valueType = valueType; | |||
this.ruleId = ruleId; | |||
this.characteristicId = characteristicId; | |||
this.value = value; | |||
this.data = data; | |||
this.dataLevel = dataLevel; | |||
} | |||
public static MeasureImpl create(boolean value, @Nullable String data) { | |||
return new MeasureImpl(ValueType.BOOLEAN, value ? 1.0d : 0.0d, data, null); | |||
} | |||
public static Builder builder() { | |||
return new Builder(); | |||
} | |||
public static final class Builder { | |||
public static final String RULE_AND_CHARACTERISTIC_ERROR_MSG = "A measure can not be associated to both a Characteristic and a Rule"; | |||
private Integer ruleId; | |||
private Integer characteristicId; | |||
/** | |||
* Sets the rule this measure is associated to. | |||
* | |||
* @throws UnsupportedOperationException if the characteristicId as already been set | |||
* | |||
* @see #forCharacteristic(int) | |||
*/ | |||
public Builder forRule(int ruleId) { | |||
if (characteristicId != null) { | |||
throw new UnsupportedOperationException(RULE_AND_CHARACTERISTIC_ERROR_MSG); | |||
} | |||
this.ruleId = ruleId; | |||
return this; | |||
} | |||
public static MeasureImpl create(int value, @Nullable String data) { | |||
return new MeasureImpl(ValueType.INT, (double) value, data, null); | |||
} | |||
public static MeasureImpl create(long value, @Nullable String data) { | |||
return new MeasureImpl(ValueType.LONG, (double) value, data, null); | |||
} | |||
/** | |||
* Sets the characteristic this measure is associated to. | |||
* | |||
* @throws UnsupportedOperationException if the ruleId as already been set | |||
* | |||
* @see #forCharacteristic(int) | |||
*/ | |||
public Builder forCharacteristic(int characteristicId) { | |||
if (ruleId != null) { | |||
throw new UnsupportedOperationException(RULE_AND_CHARACTERISTIC_ERROR_MSG); | |||
} | |||
this.characteristicId = characteristicId; | |||
return this; | |||
} | |||
public static MeasureImpl create(double value, @Nullable String data) { | |||
return new MeasureImpl(ValueType.DOUBLE, value, data, null); | |||
} | |||
public MeasureImpl create(boolean value, @Nullable String data) { | |||
return new MeasureImpl(ValueType.BOOLEAN, ruleId, characteristicId, value ? 1.0d : 0.0d, data, null); | |||
} | |||
public MeasureImpl create(int value, @Nullable String data) { | |||
return new MeasureImpl(ValueType.INT, ruleId, characteristicId, (double) value, data, null); | |||
} | |||
public static MeasureImpl create(String value) { | |||
return new MeasureImpl(ValueType.STRING, null, requireNonNull(value), null); | |||
public MeasureImpl create(long value, @Nullable String data) { | |||
return new MeasureImpl(ValueType.LONG, ruleId, characteristicId, (double) value, data, null); | |||
} | |||
public MeasureImpl create(double value, @Nullable String data) { | |||
return new MeasureImpl(ValueType.DOUBLE, ruleId, characteristicId, value, data, null); | |||
} | |||
public MeasureImpl create(String value) { | |||
return new MeasureImpl(ValueType.STRING, ruleId, characteristicId, null, requireNonNull(value), null); | |||
} | |||
public MeasureImpl create(Level level) { | |||
return new MeasureImpl(ValueType.LEVEL, ruleId, characteristicId, null, null, requireNonNull(level)); | |||
} | |||
public MeasureImpl createNoValue() { | |||
return new MeasureImpl(ValueType.NO_VALUE, ruleId, characteristicId, null, null, null); | |||
} | |||
} | |||
public static MeasureImpl create(Level level) { | |||
return new MeasureImpl(ValueType.LEVEL, null, null, requireNonNull(level)); | |||
@Override | |||
@CheckForNull | |||
public Integer getRuleId() { | |||
return ruleId; | |||
} | |||
public static MeasureImpl createNoValue() { | |||
return new MeasureImpl(ValueType.NO_VALUE, null, null, null); | |||
@Override | |||
@CheckForNull | |||
public Integer getCharacteristicId() { | |||
return characteristicId; | |||
} | |||
@Override | |||
@@ -162,4 +225,14 @@ public final class MeasureImpl implements Measure { | |||
checkState(variations != null, "Measure does not have variations"); | |||
return variations; | |||
} | |||
public void setDescription(String description) { | |||
this.description = requireNonNull(description); | |||
} | |||
@Override | |||
@CheckForNull | |||
public String getDescription() { | |||
return description; | |||
} | |||
} |
@@ -35,6 +35,7 @@ import org.sonar.core.measure.db.MeasureDto; | |||
import org.sonar.core.persistence.DbSession; | |||
import org.sonar.server.computation.batch.BatchReportReader; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.issue.RuleCache; | |||
import org.sonar.server.computation.metric.Metric; | |||
import org.sonar.server.computation.metric.MetricRepository; | |||
import org.sonar.server.db.DbClient; | |||
@@ -46,13 +47,15 @@ public class MeasureRepositoryImpl implements MeasureRepository { | |||
private final DbClient dbClient; | |||
private final BatchReportReader reportReader; | |||
private final MeasureDtoToMeasure measureDtoToMeasure = new MeasureDtoToMeasure(); | |||
private final BatchMeasureToMeasure batchMeasureToMeasure = new BatchMeasureToMeasure(); | |||
private final BatchMeasureToMeasure batchMeasureToMeasure; | |||
private final Function<BatchReport.Measure, Measure> batchMeasureToMeasureFunction; | |||
private final Map<Integer, Map<String, Measure>> measures = new HashMap<>(); | |||
public MeasureRepositoryImpl(DbClient dbClient, BatchReportReader reportReader, final MetricRepository metricRepository) { | |||
public MeasureRepositoryImpl(DbClient dbClient, BatchReportReader reportReader, | |||
final MetricRepository metricRepository, final RuleCache ruleCache) { | |||
this.dbClient = dbClient; | |||
this.reportReader = reportReader; | |||
this.batchMeasureToMeasure = new BatchMeasureToMeasure(ruleCache); | |||
this.batchMeasureToMeasureFunction = new Function<BatchReport.Measure, Measure>() { | |||
@Nullable |
@@ -23,14 +23,20 @@ import com.google.common.base.Optional; | |||
import com.tngtech.java.junit.dataprovider.DataProvider; | |||
import com.tngtech.java.junit.dataprovider.DataProviderRunner; | |||
import com.tngtech.java.junit.dataprovider.UseDataProvider; | |||
import org.junit.Before; | |||
import org.junit.Test; | |||
import org.junit.runner.RunWith; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.batch.protocol.output.BatchReport; | |||
import org.sonar.core.rule.RuleDto; | |||
import org.sonar.server.computation.issue.RuleCache; | |||
import org.sonar.server.computation.metric.Metric; | |||
import org.sonar.server.computation.metric.MetricImpl; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.assertj.guava.api.Assertions.assertThat; | |||
import static org.mockito.Mockito.mock; | |||
import static org.mockito.Mockito.when; | |||
@RunWith(DataProviderRunner.class) | |||
public class BatchMeasureToMeasureTest { | |||
@@ -44,8 +50,17 @@ public class BatchMeasureToMeasureTest { | |||
private static final String SOME_DATA = "some_data man!"; | |||
private static final String SOME_ALERT_TEXT = "some alert text_be_careFul!"; | |||
private static final BatchReport.Measure EMPTY_BATCH_MEASURE = BatchReport.Measure.newBuilder().build(); | |||
private static final RuleKey SOME_RULE_KEY = RuleKey.of("A", "B"); | |||
private static final int SOME_RULE_ID = 9513; | |||
private static final RuleDto SOME_RULE = new RuleDto().setRuleKey(SOME_RULE_KEY.toString()).setId(SOME_RULE_ID); | |||
private BatchMeasureToMeasure underTest = new BatchMeasureToMeasure(); | |||
private RuleCache ruleCache = mock(RuleCache.class); | |||
private BatchMeasureToMeasure underTest = new BatchMeasureToMeasure(ruleCache); | |||
@Before | |||
public void setUp() throws Exception { | |||
when(ruleCache.get(SOME_RULE_KEY)).thenReturn(SOME_RULE); | |||
} | |||
@Test | |||
public void toMeasure_returns_absent_for_null_argument() { | |||
@@ -62,6 +77,25 @@ public class BatchMeasureToMeasureTest { | |||
underTest.toMeasure(null, null); | |||
} | |||
@Test(expected = IllegalArgumentException.class) | |||
public void toMeasure_throws_IAE_if_batch_Measure_has_both_ruleKey_and_characteristicId() { | |||
underTest.toMeasure(BatchReport.Measure.newBuilder().setRuleKey(SOME_RULE_KEY.toString()).setCharactericId(42).build(), SOME_STRING_METRIC); | |||
} | |||
@Test | |||
public void toMeasure_maps_characteristicId_if_present() { | |||
BatchReport.Measure batchMeasure = BatchReport.Measure.newBuilder().setCharactericId(42).build(); | |||
assertThat(underTest.toMeasure(batchMeasure, SOME_STRING_METRIC).get().getCharacteristicId()).isEqualTo(42); | |||
} | |||
@Test | |||
public void toMeasure_maps_ruleKey_if_present() { | |||
BatchReport.Measure batchMeasure = BatchReport.Measure.newBuilder().setRuleKey(SOME_RULE_KEY.toString()).build(); | |||
assertThat(underTest.toMeasure(batchMeasure, SOME_STRING_METRIC).get().getRuleId()).isEqualTo(SOME_RULE_ID); | |||
} | |||
@Test | |||
public void toMeasure_returns_no_value_if_dto_has_no_string_value_for_LEVEL_Metric() { | |||
Optional<Measure> measure = underTest.toMeasure(EMPTY_BATCH_MEASURE, SOME_LEVEL_METRIC); |
@@ -23,7 +23,9 @@ import com.google.common.base.Optional; | |||
import com.tngtech.java.junit.dataprovider.DataProvider; | |||
import com.tngtech.java.junit.dataprovider.DataProviderRunner; | |||
import com.tngtech.java.junit.dataprovider.UseDataProvider; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.junit.runner.RunWith; | |||
import org.sonar.core.measure.db.MeasureDto; | |||
import org.sonar.server.computation.measure.Measure.Level; | |||
@@ -46,6 +48,9 @@ public class MeasureDtoToMeasureTest { | |||
private static final String SOME_ALERT_TEXT = "some alert text_be_careFul!"; | |||
private static final MeasureDto EMPTY_MEASURE_DTO = new MeasureDto(); | |||
@Rule | |||
public final ExpectedException expectedException = ExpectedException.none(); | |||
private MeasureDtoToMeasure underTest = new MeasureDtoToMeasure(); | |||
@Test | |||
@@ -63,6 +68,22 @@ public class MeasureDtoToMeasureTest { | |||
underTest.toMeasure(null, null); | |||
} | |||
@Test | |||
public void toMeasure_throws_IAE_if_MeasureDto_has_non_null_ruleId() { | |||
expectedException.expect(IllegalArgumentException.class); | |||
expectedException.expectMessage("Measures with ruleId are not supported"); | |||
underTest.toMeasure(new MeasureDto().setRuleId(12), SOME_STRING_METRIC); | |||
} | |||
@Test | |||
public void toMeasure_throws_IAE_if_MeasureDto_has_non_null_characteristicId() { | |||
expectedException.expect(IllegalArgumentException.class); | |||
expectedException.expectMessage("Measures with characteristicId are not supported"); | |||
underTest.toMeasure(new MeasureDto().setCharacteristicId(12), SOME_STRING_METRIC); | |||
} | |||
@Test | |||
public void toMeasure_returns_no_value_if_dto_has_no_data_for_Level_Metric() { | |||
Optional<Measure> measure = underTest.toMeasure(EMPTY_MEASURE_DTO, SOME_LEVEL_METRIC); |
@@ -28,33 +28,36 @@ import com.tngtech.java.junit.dataprovider.UseDataProvider; | |||
import java.util.List; | |||
import javax.annotation.Nonnull; | |||
import javax.annotation.Nullable; | |||
import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.junit.runner.RunWith; | |||
import org.sonar.server.computation.measure.Measure.ValueType; | |||
import static com.google.common.collect.FluentIterable.from; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.sonar.server.computation.measure.MeasureImpl.builder; | |||
@RunWith(DataProviderRunner.class) | |||
public class MeasureImplTest { | |||
private static final MeasureImpl INT_MEASURE = MeasureImpl.create((int) 1, null); | |||
private static final MeasureImpl LONG_MEASURE = MeasureImpl.create(1l, null); | |||
private static final MeasureImpl DOUBLE_MEASURE = MeasureImpl.create(1d, null); | |||
private static final MeasureImpl STRING_MEASURE = MeasureImpl.create("some_sT ring"); | |||
private static final MeasureImpl TRUE_MEASURE = MeasureImpl.create(true, null); | |||
private static final MeasureImpl FALSE_MEASURE = MeasureImpl.create(false, null); | |||
private static final MeasureImpl LEVEL_MEASURE = MeasureImpl.create(Measure.Level.OK); | |||
private static final MeasureImpl NO_VALUE_MEASURE = MeasureImpl.createNoValue(); | |||
private static final MeasureImpl INT_MEASURE = builder().create((int) 1, null); | |||
private static final MeasureImpl LONG_MEASURE = builder().create(1l, null); | |||
private static final MeasureImpl DOUBLE_MEASURE = builder().create(1d, null); | |||
private static final MeasureImpl STRING_MEASURE = builder().create("some_sT ring"); | |||
private static final MeasureImpl TRUE_MEASURE = builder().create(true, null); | |||
private static final MeasureImpl FALSE_MEASURE = builder().create(false, null); | |||
private static final MeasureImpl LEVEL_MEASURE = builder().create(Measure.Level.OK); | |||
private static final MeasureImpl NO_VALUE_MEASURE = builder().createNoValue(); | |||
private static final List<MeasureImpl> MEASURES = ImmutableList.of( | |||
INT_MEASURE, LONG_MEASURE, DOUBLE_MEASURE, STRING_MEASURE, TRUE_MEASURE, FALSE_MEASURE, NO_VALUE_MEASURE, LEVEL_MEASURE | |||
); | |||
private static final int SOME_RULE_ID = 95236; | |||
private static final int SOME_CHARACTERISTIC_ID = 42; | |||
@Test(expected = NullPointerException.class) | |||
public void create_from_String_throws_NPE_if_arg_is_null() { | |||
MeasureImpl.create((String) null); | |||
} | |||
@Rule | |||
public final ExpectedException executionException = ExpectedException.none(); | |||
@DataProvider | |||
public static Object[][] all_but_INT_MEASURE() { | |||
@@ -96,10 +99,53 @@ public class MeasureImplTest { | |||
.filter(new Predicate<MeasureImpl>() { | |||
@Override | |||
public boolean apply(@Nonnull MeasureImpl input) { | |||
return input.getValueType() != valueType; | |||
return input.getValueType() != valueType; | |||
} | |||
}).transform(WrapInArray.INSTANCE) | |||
.toArray(MeasureImpl[].class); | |||
.toArray(MeasureImpl[].class); | |||
} | |||
@Test | |||
public void forRule_throw_UOE_if_characteristicId_is_already_set() { | |||
executionException.expect(UnsupportedOperationException.class); | |||
executionException.expectMessage("A measure can not be associated to both a Characteristic and a Rule"); | |||
builder().forCharacteristic(SOME_CHARACTERISTIC_ID).forRule(SOME_RULE_ID); | |||
} | |||
@Test | |||
public void forCharacteristic_throw_UOE_if_ruleKey_is_already_set() { | |||
executionException.expect(UnsupportedOperationException.class); | |||
executionException.expectMessage("A measure can not be associated to both a Characteristic and a Rule"); | |||
builder().forRule(SOME_RULE_ID).forCharacteristic(SOME_CHARACTERISTIC_ID); | |||
} | |||
@Test | |||
public void getRuleId_returns_null_when_ruleKey_has_not_been_set() { | |||
assertThat(builder().createNoValue().getRuleId()).isNull(); | |||
assertThat(builder().forCharacteristic(SOME_CHARACTERISTIC_ID).createNoValue().getRuleId()).isNull(); | |||
} | |||
@Test | |||
public void getRuleId_returns_key_set_in_builder() { | |||
assertThat(builder().forRule(SOME_RULE_ID).createNoValue().getRuleId()).isEqualTo(SOME_RULE_ID); | |||
} | |||
@Test | |||
public void getCharacteristicId_returns_null_when_ruleKey_has_not_been_set() { | |||
assertThat(builder().createNoValue().getCharacteristicId()).isNull(); | |||
assertThat(builder().forRule(SOME_RULE_ID).createNoValue().getCharacteristicId()).isNull(); | |||
} | |||
@Test | |||
public void getCharacteristicId_returns_id_set_in_builder() { | |||
assertThat(builder().forCharacteristic(SOME_CHARACTERISTIC_ID).createNoValue().getCharacteristicId()).isEqualTo(SOME_CHARACTERISTIC_ID); | |||
} | |||
@Test(expected = NullPointerException.class) | |||
public void create_from_String_throws_NPE_if_arg_is_null() { | |||
builder().create((String) null); | |||
} | |||
@Test | |||
@@ -217,13 +263,13 @@ public class MeasureImplTest { | |||
public void getAlertStatus_returns_argument_from_setAlertStatus() { | |||
QualityGateStatus someStatus = new QualityGateStatus(Measure.Level.OK); | |||
assertThat(MeasureImpl.create(true, null).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(MeasureImpl.create(false, null).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(MeasureImpl.create((int) 1, null).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(MeasureImpl.create((long) 1, null).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(MeasureImpl.create((double) 1, null).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(MeasureImpl.create("str").setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(MeasureImpl.create(Measure.Level.OK).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(builder().create(true, null).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(builder().create(false, null).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(builder().create((int) 1, null).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(builder().create((long) 1, null).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(builder().create((double) 1, null).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(builder().create("str").setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
assertThat(builder().create(Measure.Level.OK).setQualityGateStatus(someStatus).getQualityGateStatus()).isEqualTo(someStatus); | |||
} | |||
@Test(expected = NullPointerException.class) | |||
@@ -236,11 +282,11 @@ public class MeasureImplTest { | |||
public void getData_returns_argument_from_factory_method() { | |||
String someData = "lololool"; | |||
assertThat(MeasureImpl.create(true, someData).getData()).isEqualTo(someData); | |||
assertThat(MeasureImpl.create(false, someData).getData()).isEqualTo(someData); | |||
assertThat(MeasureImpl.create((int) 1, someData).getData()).isEqualTo(someData); | |||
assertThat(MeasureImpl.create((long) 1, someData).getData()).isEqualTo(someData); | |||
assertThat(MeasureImpl.create((double) 1, someData).getData()).isEqualTo(someData); | |||
assertThat(builder().create(true, someData).getData()).isEqualTo(someData); | |||
assertThat(builder().create(false, someData).getData()).isEqualTo(someData); | |||
assertThat(builder().create((int) 1, someData).getData()).isEqualTo(someData); | |||
assertThat(builder().create((long) 1, someData).getData()).isEqualTo(someData); | |||
assertThat(builder().create((double) 1, someData).getData()).isEqualTo(someData); | |||
} | |||
@Test |
@@ -37,6 +37,7 @@ import org.sonar.server.computation.batch.BatchReportReader; | |||
import org.sonar.server.computation.batch.BatchReportReaderRule; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.component.DumbComponent; | |||
import org.sonar.server.computation.issue.RuleCache; | |||
import org.sonar.server.computation.metric.Metric; | |||
import org.sonar.server.computation.metric.MetricRepository; | |||
import org.sonar.server.db.DbClient; | |||
@@ -74,11 +75,12 @@ public class MeasureRepositoryImplTest { | |||
private DbClient dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new MeasureDao(), new SnapshotDao(), new MetricDao(), new ComponentDao()); | |||
private MetricRepository metricRepository = mock(MetricRepository.class); | |||
private MeasureRepositoryImpl underTest = new MeasureRepositoryImpl(dbClient, reportReader, metricRepository); | |||
private RuleCache ruleCache = mock(RuleCache.class); | |||
private MeasureRepositoryImpl underTest = new MeasureRepositoryImpl(dbClient, reportReader, metricRepository, ruleCache); | |||
private DbClient mockedDbClient = mock(DbClient.class); | |||
private BatchReportReader mockBatchReportReader = mock(BatchReportReader.class); | |||
private MeasureRepositoryImpl underTestWithMock = new MeasureRepositoryImpl(mockedDbClient, mockBatchReportReader, metricRepository); | |||
private MeasureRepositoryImpl underTestWithMock = new MeasureRepositoryImpl(mockedDbClient, mockBatchReportReader, metricRepository, ruleCache); | |||
@CheckForNull | |||
private DbSession dbSession; |
@@ -92,7 +92,7 @@ public class QualityGateEventsStepTest { | |||
@Test | |||
public void no_event_created_if_raw_ALERT_STATUS_measure_is_null() { | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.createNoValue())); | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.builder().createNoValue())); | |||
underTest.execute(); | |||
@@ -106,7 +106,7 @@ public class QualityGateEventsStepTest { | |||
@Test | |||
public void no_event_created_if_raw_ALERT_STATUS_measure_is_unsupported_value() { | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.create(INVALID_ALERT_STATUS))); | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.builder().create(INVALID_ALERT_STATUS))); | |||
underTest.execute(); | |||
@@ -118,8 +118,8 @@ public class QualityGateEventsStepTest { | |||
public void no_event_created_if_no_base_ALERT_STATUS_and_raw_is_OK() { | |||
QualityGateStatus someQGStatus = new QualityGateStatus(Measure.Level.OK); | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.createNoValue().setQualityGateStatus(someQGStatus))); | |||
when(measureRepository.getBaseMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.createNoValue())); | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.builder().createNoValue().setQualityGateStatus(someQGStatus))); | |||
when(measureRepository.getBaseMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.builder().createNoValue())); | |||
underTest.execute(); | |||
@@ -161,8 +161,8 @@ public class QualityGateEventsStepTest { | |||
private void verify_event_created_if_no_base_ALERT_STATUS_measure(Measure.Level rawAlterStatus, String expectedLabel) { | |||
QualityGateStatus someQGStatus = new QualityGateStatus(rawAlterStatus, ALERT_TEXT); | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.createNoValue().setQualityGateStatus(someQGStatus))); | |||
when(measureRepository.getBaseMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.createNoValue())); | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.builder().createNoValue().setQualityGateStatus(someQGStatus))); | |||
when(measureRepository.getBaseMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.builder().createNoValue())); | |||
underTest.execute(); | |||
@@ -189,8 +189,8 @@ public class QualityGateEventsStepTest { | |||
@Test | |||
public void no_event_created_if_base_ALERT_STATUS_measure_but_status_is_the_same() { | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.createNoValue().setQualityGateStatus(OK_QUALITY_GATE_STATUS))); | |||
when(measureRepository.getBaseMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.createNoValue().setQualityGateStatus(OK_QUALITY_GATE_STATUS))); | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.builder().createNoValue().setQualityGateStatus(OK_QUALITY_GATE_STATUS))); | |||
when(measureRepository.getBaseMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.builder().createNoValue().setQualityGateStatus(OK_QUALITY_GATE_STATUS))); | |||
underTest.execute(); | |||
@@ -211,9 +211,9 @@ public class QualityGateEventsStepTest { | |||
private void verify_event_created_if_base_ALERT_STATUS_measure_exists_and_status_has_changed(Measure.Level previousAlertStatus, | |||
QualityGateStatus newQualityGateStatus, String expectedLabel) { | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.createNoValue().setQualityGateStatus(newQualityGateStatus))); | |||
when(measureRepository.getRawMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn(of(MeasureImpl.builder().createNoValue().setQualityGateStatus(newQualityGateStatus))); | |||
when(measureRepository.getBaseMeasure(PROJECT_COMPONENT, alertStatusMetric)).thenReturn( | |||
of(MeasureImpl.createNoValue().setQualityGateStatus(new QualityGateStatus(previousAlertStatus)))); | |||
of(MeasureImpl.builder().createNoValue().setQualityGateStatus(new QualityGateStatus(previousAlertStatus)))); | |||
underTest.execute(); | |||
@@ -281,7 +281,7 @@ public class QualityProfileEventsStepTest { | |||
} | |||
private static Measure newMeasure(@Nullable QualityProfile... qps) { | |||
return MeasureImpl.create(toJson(qps)); | |||
return MeasureImpl.builder().create(toJson(qps)); | |||
} | |||
private static String toJson(@Nullable QualityProfile... qps) { |