@Test public void verify_getters() { EvaluatedCondition underTest = new EvaluatedCondition(CONDITION_1, ERROR, "value"); assertThat(underTest.getCondition()).isEqualTo(CONDITION_1); assertThat(underTest.getStatus()).isEqualTo(ERROR); assertThat(underTest.getValue()).contains("value"); }
@Test public void hashcode_is_based_on_all_fields() { assertThat(underTest.hashCode()).isEqualTo(underTest.hashCode()); assertThat(underTest.hashCode()).isEqualTo(new EvaluatedCondition(CONDITION_1, ERROR, "value").hashCode()); assertThat(underTest.hashCode()).isNotEqualTo(null); assertThat(underTest.hashCode()).isNotEqualTo(new Object().hashCode()); assertThat(underTest.hashCode()).isNotEqualTo(new EvaluatedCondition(new Condition("other_metric", GREATER_THAN, "a"), ERROR, "value").hashCode()); assertThat(underTest.hashCode()).isNotEqualTo(new EvaluatedCondition(CONDITION_1, OK, "value").hashCode()); assertThat(underTest.hashCode()).isNotEqualTo(new EvaluatedCondition(CONDITION_1, ERROR, null).hashCode()); assertThat(underTest.hashCode()).isNotEqualTo(new EvaluatedCondition(CONDITION_1, ERROR, "other_value").hashCode()); } }
@Test public void toString_does_not_quote_null_value() { EvaluatedCondition underTest = new EvaluatedCondition(CONDITION_1, ERROR, null); assertThat(underTest.toString()).isEqualTo("EvaluatedCondition{condition=" + "Condition{metricKey='metricKey', operator=GREATER_THAN, errorThreshold='2'}, " + "status=ERROR, value=null}"); }
private static JsonObject toJson(EvaluatedCondition evaluatedCondition) { Condition condition = evaluatedCondition.getCondition(); JsonObject result = new JsonObject(); result.addProperty("metric", condition.getMetricKey()); result.addProperty("op", condition.getOperator().getDbValue()); if (condition.isOnLeakPeriod()) { result.addProperty("period", 1); } result.addProperty("error", condition.getErrorThreshold()); evaluatedCondition.getValue().ifPresent(v -> result.addProperty("actual", v)); result.addProperty(FIELD_LEVEL, evaluatedCondition.getStatus().name()); return result; } }
private void test(@Nullable QualityGateEvaluator.Measure measure, Condition.Operator operator, String errorThreshold, EvaluatedCondition.EvaluationStatus expectedStatus, @Nullable String expectedValue) { Condition condition = new Condition("foo", operator, errorThreshold); EvaluatedCondition result = ConditionEvaluator.evaluate(condition, new FakeMeasures(measure)); assertThat(result.getStatus()).isEqualTo(expectedStatus); if (expectedValue == null) { assertThat(result.getValue()).isNotPresent(); } else { assertThat(result.getValue()).hasValue(expectedValue); } }
public Builder addCondition(Condition condition, EvaluationStatus status, @Nullable String value) { evaluatedConditions.put(condition, new EvaluatedCondition(condition, status, value)); return this; }
@Test public void constructor_accepts_null_value() { EvaluatedCondition underTest = new EvaluatedCondition(CONDITION_1, ERROR, null); assertThat(underTest.getValue()).isEmpty(); }
public Builder addCondition(EvaluatedCondition c) { evaluatedConditions.put(c.getCondition(), c); return this; }
private static EvaluatedCondition evaluateConditionsOnMetric(Collection<Condition> conditionsOnSameMetric, Measures measures) { EvaluatedCondition leakEvaluation = null; EvaluatedCondition absoluteEvaluation = null; for (Condition condition : conditionsOnSameMetric) { if (condition.isOnLeakPeriod()) { leakEvaluation = ConditionEvaluator.evaluate(condition, measures); } else { absoluteEvaluation = ConditionEvaluator.evaluate(condition, measures); } } if (leakEvaluation == null) { return requireNonNull(absoluteEvaluation, "Evaluation of absolute value can't be null on conditions " + conditionsOnSameMetric); } if (absoluteEvaluation == null) { return requireNonNull(leakEvaluation, "Evaluation of leak value can't be null on conditions " + conditionsOnSameMetric); } // both conditions are present. Take the worse one. In case of equality, take // the one on the leak period if (absoluteEvaluation.getStatus().compareTo(leakEvaluation.getStatus()) > 0) { return absoluteEvaluation; } return leakEvaluation; }
@Test public void override_toString() { assertThat(underTest.toString()).isEqualTo("EvaluatedCondition{condition=" + "Condition{metricKey='metricKey', operator=GREATER_THAN, errorThreshold='2'}, " + "status=ERROR, value='value'}"); }
private static void writeQualityGate(JsonWriter writer, EvaluatedQualityGate gate) { writer .name("qualityGate") .beginObject() .prop("name", gate.getQualityGate().getName()) .prop(PROPERTY_STATUS, gate.getStatus().toString()) .name("conditions") .beginArray(); for (EvaluatedCondition evaluatedCondition : gate.getEvaluatedConditions()) { Condition condition = evaluatedCondition.getCondition(); writer .beginObject() .prop("metric", condition.getMetricKey()) .prop("operator", condition.getOperator().name()); evaluatedCondition.getValue().ifPresent(t -> writer.prop("value", t)); writer .prop(PROPERTY_STATUS, evaluatedCondition.getStatus().name()) .prop("errorThreshold", condition.getErrorThreshold()) .endObject(); } writer .endArray() .endObject(); }
private void testOnLeak(QualityGateEvaluator.Measure measure, Condition.Operator operator, String errorThreshold, EvaluatedCondition.EvaluationStatus expectedStatus, @Nullable String expectedValue) { Condition condition = new Condition("new_foo", operator, errorThreshold); EvaluatedCondition result = ConditionEvaluator.evaluate(condition, new FakeMeasures(measure)); assertThat(result.getStatus()).isEqualTo(expectedStatus); if (expectedValue == null) { assertThat(result.getValue()).isNotPresent(); } else { assertThat(result.getValue()).hasValue(expectedValue); } }
/** * Evaluates the error condition. Returns empty if threshold or measure value is not defined. */ private static Optional<EvaluatedCondition> evaluateCondition(Condition condition, ValueType type, Comparable value) { Comparable threshold = getThreshold(condition, type); if (reachThreshold(value, threshold, condition)) { return of(new EvaluatedCondition(condition, EvaluationStatus.ERROR, value.toString())); } return Optional.empty(); }
public Builder addCondition(EvaluatedCondition c) { evaluatedConditions.put(c.getCondition(), c); return this; }
@Override public EvaluatedQualityGate evaluate(QualityGate gate, Measures measures) { EvaluatedQualityGate.Builder result = EvaluatedQualityGate.newBuilder() .setQualityGate(gate); boolean isSmallChangeset = isSmallChangeset(measures); gate.getConditions().forEach(condition -> { String metricKey = condition.getMetricKey(); EvaluatedCondition evaluation = ConditionEvaluator.evaluate(condition, measures); if (isSmallChangeset && evaluation.getStatus() != EvaluationStatus.OK && METRICS_TO_IGNORE_ON_SMALL_CHANGESETS.contains(metricKey)) { result.addCondition(new EvaluatedCondition(evaluation.getCondition(), EvaluationStatus.OK, evaluation.getValue().orElse(null))); result.setIgnoredConditionsOnSmallChangeset(true); } else { result.addCondition(evaluation); } }); result.setStatus(overallStatusOf(result.getEvaluatedConditions())); return result.build(); }
private static JsonObject toJson(EvaluatedCondition evaluatedCondition) { Condition condition = evaluatedCondition.getCondition(); JsonObject result = new JsonObject(); result.addProperty("metric", condition.getMetricKey()); result.addProperty("op", condition.getOperator().getDbValue()); if (condition.isOnLeakPeriod()) { result.addProperty("period", 1); } condition.getWarningThreshold().ifPresent(t -> result.addProperty("warning", t)); condition.getErrorThreshold().ifPresent(t -> result.addProperty("error", t)); evaluatedCondition.getValue().ifPresent(v -> result.addProperty("actual", v)); result.addProperty(FIELD_LEVEL, evaluatedCondition.getStatus().name()); return result; } }
/** * Evaluates the condition for the specified measure */ static EvaluatedCondition evaluate(Condition condition, QualityGateEvaluator.Measures measures) { Optional<QualityGateEvaluator.Measure> measure = measures.get(condition.getMetricKey()); if (!measure.isPresent()) { return new EvaluatedCondition(condition, EvaluationStatus.OK, null); } Optional<Comparable> value = getMeasureValue(condition, measure.get()); if (!value.isPresent()) { return new EvaluatedCondition(condition, EvaluationStatus.OK, null); } ValueType type = measure.get().getType(); return evaluateCondition(condition, type, value.get()) .orElseGet(() -> new EvaluatedCondition(condition, EvaluationStatus.OK, value.get().toString())); }
@Override public EvaluatedQualityGate evaluate(QualityGate gate, Measures measures) { EvaluatedQualityGate.Builder result = EvaluatedQualityGate.newBuilder() .setQualityGate(gate); boolean isSmallChangeset = isSmallChangeset(measures); Multimap<String, Condition> conditionsPerMetric = gate.getConditions().stream() .collect(MoreCollectors.index(Condition::getMetricKey, Function.identity())); for (Map.Entry<String, Collection<Condition>> entry : conditionsPerMetric.asMap().entrySet()) { String metricKey = entry.getKey(); Collection<Condition> conditionsOnSameMetric = entry.getValue(); EvaluatedCondition evaluation = evaluateConditionsOnMetric(conditionsOnSameMetric, measures); if (isSmallChangeset && evaluation.getStatus() != EvaluationStatus.OK && METRICS_TO_IGNORE_ON_SMALL_CHANGESETS.contains(metricKey)) { result.addCondition(new EvaluatedCondition(evaluation.getCondition(), EvaluationStatus.OK, evaluation.getValue().orElse(null))); result.setIgnoredConditionsOnSmallChangeset(true); } else { result.addCondition(evaluation); } } result.setStatus(overallStatusOf(result.getEvaluatedConditions())); return result.build(); }
private static void writeQualityGate(JsonWriter writer, EvaluatedQualityGate gate) { writer .name("qualityGate") .beginObject() .prop("name", gate.getQualityGate().getName()) .prop(PROPERTY_STATUS, gate.getStatus().toString()) .name("conditions") .beginArray(); for (EvaluatedCondition evaluatedCondition : gate.getEvaluatedConditions()) { Condition condition = evaluatedCondition.getCondition(); writer .beginObject() .prop("metric", condition.getMetricKey()) .prop("operator", condition.getOperator().name()); evaluatedCondition.getValue().ifPresent(t -> writer.prop("value", t)); writer .prop(PROPERTY_STATUS, evaluatedCondition.getStatus().name()) .prop("onLeakPeriod", condition.isOnLeakPeriod()) .prop("errorThreshold", condition.getErrorThreshold().orElse(null)) .prop("warningThreshold", condition.getWarningThreshold().orElse(null)) .endObject(); } writer .endArray() .endObject(); }
@Test public void equals_is_based_on_all_fields() { assertThat(underTest).isEqualTo(underTest); assertThat(underTest).isEqualTo(new EvaluatedCondition(CONDITION_1, ERROR, "value")); assertThat(underTest).isNotEqualTo(null); assertThat(underTest).isNotEqualTo(new Object()); assertThat(underTest).isNotEqualTo(new EvaluatedCondition(new Condition("other_metric", GREATER_THAN, "a"), ERROR, "value")); assertThat(underTest).isNotEqualTo(new EvaluatedCondition(CONDITION_1, OK, "value")); assertThat(underTest).isNotEqualTo(new EvaluatedCondition(CONDITION_1, ERROR, null)); assertThat(underTest).isNotEqualTo(new EvaluatedCondition(CONDITION_1, ERROR, "other_value")); }