Browse Source

SONAR-6620 add support for Measure characteriticId and ruleId

introduced a builder to MeasureImpl to simplify creation of MeasureImpl instance with optional characteristic and rule
tags/5.2-RC1
Sébastien Lesaint 9 years ago
parent
commit
a8d025a142

+ 51
- 28
server/sonar-server/src/main/java/org/sonar/server/computation/measure/BatchMeasureToMeasure.java View File

@@ -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) {

+ 14
- 0
server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java View File

@@ -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();



}

+ 19
- 16
server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureDtoToMeasure.java View File

@@ -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) {

+ 92
- 19
server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureImpl.java View File

@@ -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;
}
}

+ 5
- 2
server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureRepositoryImpl.java View File

@@ -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

+ 35
- 1
server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchMeasureToMeasureTest.java View File

@@ -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);

+ 21
- 0
server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java View File

@@ -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);

+ 72
- 26
server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureImplTest.java View File

@@ -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

+ 4
- 2
server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureRepositoryImplTest.java View File

@@ -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;

+ 10
- 10
server/sonar-server/src/test/java/org/sonar/server/computation/step/QualityGateEventsStepTest.java View File

@@ -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();


+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/computation/step/QualityProfileEventsStepTest.java View File

@@ -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) {

Loading…
Cancel
Save