Пример #1
0
  @Test
  public void includeCurrentMeasures() throws ParseException {
    TendencyAnalyser analyser = mock(TendencyAnalyser.class);
    TimeMachineQuery query =
        new TimeMachineQuery(null).setMetrics(CoreMetrics.LINES, CoreMetrics.COVERAGE);
    TimeMachine timeMachine = mock(TimeMachine.class);

    when(timeMachine.getMeasuresFields(query))
        .thenReturn(
            Arrays.<Object[]>asList(
                new Object[] {date("2009-12-01"), CoreMetrics.LINES, 1200.0},
                new Object[] {date("2009-12-01"), CoreMetrics.COVERAGE, 80.5},
                new Object[] {date("2009-12-02"), CoreMetrics.LINES, 1300.0},
                new Object[] {date("2009-12-02"), CoreMetrics.COVERAGE, 79.6},
                new Object[] {date("2009-12-15"), CoreMetrics.LINES, 1150.0}));

    DecoratorContext context = mock(DecoratorContext.class);
    when(context.getMeasure(CoreMetrics.LINES)).thenReturn(new Measure(CoreMetrics.LINES, 1400.0));
    when(context.getMeasure(CoreMetrics.COVERAGE)).thenReturn(new Measure(CoreMetrics.LINES, 90.0));

    TendencyDecorator decorator = new TendencyDecorator(timeMachine, query, analyser, newConf());
    decorator.decorate(new JavaPackage("org.foo"), context);

    verify(analyser).analyseLevel(Arrays.asList(1200.0, 1300.0, 1150.0, 1400.0));
    verify(analyser).analyseLevel(Arrays.asList(80.5, 79.6, 90.0));
  }
 private static DecoratorContext mockContext(int conditions, int uncoveredConditions) {
   DecoratorContext context = mock(DecoratorContext.class);
   when(context.getMeasure(CoreMetrics.IT_CONDITIONS_TO_COVER))
       .thenReturn(new Measure(CoreMetrics.IT_CONDITIONS_TO_COVER, (double) conditions));
   when(context.getMeasure(CoreMetrics.IT_UNCOVERED_CONDITIONS))
       .thenReturn(new Measure(CoreMetrics.IT_UNCOVERED_CONDITIONS, (double) uncoveredConditions));
   return context;
 }
 @Override
 protected Double countCoveredElements(DecoratorContext context) {
   double uncoveredLines =
       MeasureUtils.getValue(context.getMeasure(JaCoCoItMetrics.IT_UNCOVERED_LINES), 0.0);
   double lines =
       MeasureUtils.getValue(context.getMeasure(JaCoCoItMetrics.IT_LINES_TO_COVER), 0.0);
   return lines - uncoveredLines;
 }
Пример #4
0
  /**
   * @param context the context
   * @return the valid lines of the component, i.e. the real number of lines
   */
  protected double getValidLines(DecoratorContext context) {
    double duplicatedLines =
        MeasureUtils.getValue(context.getMeasure(CoreMetrics.DUPLICATED_LINES), 0.0);
    double totalLines = MeasureUtils.getValue(context.getMeasure(CoreMetrics.NCLOC), 0.0);
    double validLines = totalLines - duplicatedLines;

    return validLines > 0 ? validLines : 1.0;
  }
  @Test
  public void densityEvenIfNoComments() {
    DecoratorContext context = mock(DecoratorContext.class);
    when(context.getMeasure(CoreMetrics.NCLOC)).thenReturn(new Measure(CoreMetrics.NCLOC, 40.0));
    when(context.getMeasure(CoreMetrics.DUPLICATED_LINES))
        .thenReturn(new Measure(CoreMetrics.DUPLICATED_LINES, 10.0));

    DuplicationDensityDecorator decorator = new DuplicationDensityDecorator();
    decorator.decorate(null, context);

    verify(context).saveMeasure(CoreMetrics.DUPLICATED_LINES_DENSITY, 25.0);
  }
  @Test
  public void checkShouldGenerateViolationOnFileIfTestFailures() {
    when(resource.getQualifier()).thenReturn(Qualifiers.UNIT_TEST_FILE);
    when(context.getMeasure(CoreMetrics.TEST_ERRORS))
        .thenReturn(new Measure(CoreMetrics.TEST_ERRORS, 2.0));
    when(context.getMeasure(CoreMetrics.TEST_FAILURES))
        .thenReturn(new Measure(CoreMetrics.TEST_FAILURES, 3.0));

    check.checkResource(resource, context, null, perspectives);

    verify(perspectives, times(1)).as(Issuable.class, resource);
  }
  @Test
  public void densityIsBalancedByNclocAndCommentLines() {
    DecoratorContext context = mock(DecoratorContext.class);
    when(context.getMeasure(CoreMetrics.NCLOC)).thenReturn(new Measure(CoreMetrics.NCLOC, 40.0));
    when(context.getMeasure(CoreMetrics.COMMENT_LINES))
        .thenReturn(new Measure(CoreMetrics.COMMENT_LINES, 10.0));
    when(context.getMeasure(CoreMetrics.DUPLICATED_LINES))
        .thenReturn(new Measure(CoreMetrics.DUPLICATED_LINES, 10.0));

    DuplicationDensityDecorator decorator = new DuplicationDensityDecorator();
    decorator.decorate(null, context);

    verify(context).saveMeasure(CoreMetrics.DUPLICATED_LINES_DENSITY, 20.0);
  }
  @Test
  public void noDensityWhenZeroNclocAndComments() {
    DecoratorContext context = mock(DecoratorContext.class);
    when(context.getMeasure(CoreMetrics.NCLOC)).thenReturn(new Measure(CoreMetrics.NCLOC, 0.0));
    when(context.getMeasure(CoreMetrics.DUPLICATED_LINES))
        .thenReturn(new Measure(CoreMetrics.COMMENT_LINES, 0.0));
    when(context.getMeasure(CoreMetrics.DUPLICATED_LINES))
        .thenReturn(new Measure(CoreMetrics.DUPLICATED_LINES, 10.0));

    DuplicationDensityDecorator decorator = new DuplicationDensityDecorator();
    decorator.decorate(null, context);

    verify(context, never()).saveMeasure(eq(CoreMetrics.DUPLICATED_LINES_DENSITY), anyDouble());
  }
Пример #9
0
 private long getMeasureValue(DecoratorContext context, Metric metric) {
   Measure measure = context.getMeasure(metric);
   if (measure != null) {
     return measure.getValue().longValue();
   }
   return 0L;
 }
Пример #10
0
  private void decorateResource(DecoratorContext context) {
    Metric.Level globalLevel = Metric.Level.OK;
    List<String> labels = Lists.newArrayList();

    for (final Alert alert : profile.getAlerts()) {
      Measure measure = context.getMeasure(alert.getMetric());
      if (measure != null) {
        Metric.Level level = AlertUtils.getLevel(alert, measure);

        measure.setAlertStatus(level);
        String text = getText(alert, level);
        if (!StringUtils.isBlank(text)) {
          measure.setAlertText(text);
          labels.add(text);
        }

        context.saveMeasure(measure);

        if (Metric.Level.WARN == level && globalLevel != Metric.Level.ERROR) {
          globalLevel = Metric.Level.WARN;

        } else if (Metric.Level.ERROR == level) {
          globalLevel = Metric.Level.ERROR;
        }
      }
    }

    Measure globalMeasure = new Measure(CoreMetrics.ALERT_STATUS, globalLevel);
    globalMeasure.setAlertStatus(globalLevel);
    globalMeasure.setAlertText(StringUtils.join(labels, ", "));
    context.saveMeasure(globalMeasure);
  }
  @Test
  public void checkShouldNotGenerateViolationIfNoFailedTests() {
    when(resource.getQualifier()).thenReturn(Qualifiers.UNIT_TEST_FILE);

    // this test has no "test_errors" or "test_failures" measure
    check.checkResource(resource, context, null, perspectives);
    verify(perspectives, times(0)).as(Issuable.class, resource);

    // this is the case of a test file that has only successful tests
    when(context.getMeasure(CoreMetrics.TEST_ERRORS))
        .thenReturn(new Measure(CoreMetrics.TEST_ERRORS, 0.0));
    when(context.getMeasure(CoreMetrics.TEST_FAILURES))
        .thenReturn(new Measure(CoreMetrics.TEST_FAILURES, 0.0));
    check.checkResource(resource, context, null, perspectives);
    verify(perspectives, times(0)).as(Issuable.class, resource);
  }
Пример #12
0
 private void computeTotalViolations(DecoratorContext context) {
   if (context.getMeasure(CoreMetrics.VIOLATIONS) == null) {
     Collection<Measure> childrenViolations = context.getChildrenMeasures(CoreMetrics.VIOLATIONS);
     Double sum = MeasureUtils.sum(true, childrenViolations);
     context.saveMeasure(CoreMetrics.VIOLATIONS, sum + context.getViolations().size());
   }
 }
  @Test
  public void noDensityIfNoDuplicationMeasure() {
    DecoratorContext context = mock(DecoratorContext.class);
    when(context.getMeasure(CoreMetrics.NCLOC)).thenReturn(new Measure(CoreMetrics.NCLOC, 45.0));

    DuplicationDensityDecorator decorator = new DuplicationDensityDecorator();
    decorator.decorate(null, context);

    verify(context, never()).saveMeasure(eq(CoreMetrics.DUPLICATED_LINES_DENSITY), anyDouble());
  }
Пример #14
0
  /** See http://jira.codehaus.org/browse/SONAR-1729 */
  @Test
  public void shouldNotCountViolationsIfMeasureAlreadyExists() {
    when(resource.getScope()).thenReturn(Scopes.PROJECT);
    when(context.getViolations()).thenReturn(createViolations());
    when(context.getChildrenMeasures((MeasuresFilter) anyObject()))
        .thenReturn(Collections.<Measure>emptyList());
    when(context.getMeasure(CoreMetrics.VIOLATIONS))
        .thenReturn(new Measure(CoreMetrics.VIOLATIONS, 3000.0));
    when(context.getMeasure(CoreMetrics.MAJOR_VIOLATIONS))
        .thenReturn(new Measure(CoreMetrics.MAJOR_VIOLATIONS, 500.0));

    decorator.decorate(resource, context);

    verify(context, never()).saveMeasure(eq(CoreMetrics.VIOLATIONS), anyDouble()); // not changed
    verify(context, never())
        .saveMeasure(eq(CoreMetrics.MAJOR_VIOLATIONS), anyDouble()); // not changed
    verify(context, times(1))
        .saveMeasure(eq(CoreMetrics.CRITICAL_VIOLATIONS), anyDouble()); // did not exist
  }
Пример #15
0
 /** {@inheritDoc} */
 @SuppressWarnings("rawtypes")
 public void decorate(Resource resource, DecoratorContext context) {
   if (ResourceUtils.isFile(resource) && context.getMeasure(testMetric) == null) {
     if (isExcludedFromCoverage(resource)) {
       return;
     }
     // for LINES_TO_COVER and UNCOVERED_LINES, we use NCLOC and STATEMENTS as an approximation
     Measure ncloc = context.getMeasure(CoreMetrics.NCLOC);
     if (ncloc != null) {
       Measure sts = context.getMeasure(CoreMetrics.STATEMENTS);
       double lines = Math.min(ncloc.getValue(), sts.getValue());
       if (lines > 0d) {
         LOG.debug(
             "Coverage metrics have not been set on '{}': default values will be inserted.",
             resource.getName());
         handleUncoveredResource(context, lines);
       }
     }
   }
 }
  private Map<Integer, String> getAuthorsByLineFromScm(DecoratorContext context) {
    Measure measure = context.getMeasure(CoreMetrics.SCM_AUTHORS_BY_LINE);

    if (measure != null && measure.getData() != null && measure.getData().length() > 0) {
      logger.debug("Measure for metric [{}] data: [{}]", measure.getMetricKey(), measure.getData());
      return parseAuthorsByLineMeasure(measure.getData());
    } else {
      logger.debug("Cannot find measure for metric [{}]", CoreMetrics.SCM_AUTHORS_BY_LINE.getKey());
      return EMPTY_MAP;
    }
  }
  @Override
  public void checkResource(
      Resource resource,
      DecoratorContext context,
      RuleKey rule,
      ResourcePerspectives perspectives) {
    double lineCoverage =
        MeasureUtils.getValue(context.getMeasure(CoreMetrics.BRANCH_COVERAGE), 0.0);
    if (context.getMeasure(CoreMetrics.BRANCH_COVERAGE) != null
        && lineCoverage < minimumBranchCoverageRatio) {
      double uncoveredConditions =
          MeasureUtils.getValue(context.getMeasure(CoreMetrics.UNCOVERED_CONDITIONS), 0.0);
      double conditionsToCover =
          MeasureUtils.getValue(context.getMeasure(CoreMetrics.CONDITIONS_TO_COVER), 0.0);
      double conditionsToCoverToReachThreshold =
          Math.ceil(
              (conditionsToCover * minimumBranchCoverageRatio / 100)
                  - (conditionsToCover - uncoveredConditions));

      createIssue(resource, rule, conditionsToCoverToReachThreshold, perspectives);
    }
  }
Пример #18
0
  @Test
  public void shouldNotNotifyUserIfFirstAnalysis() throws Exception {
    Project project = new Project("key").setName("LongName");
    project.setId(45);
    // PastSnapshot with targetDate==null means first analysis
    PastSnapshot pastSnapshot = new PastSnapshot("", null);
    when(timeMachineConfiguration.getProjectPastSnapshots())
        .thenReturn(Lists.newArrayList(pastSnapshot));
    Measure m = new Measure(CoreMetrics.NEW_VIOLATIONS).setVariation1(0.0);
    when(context.getMeasure(CoreMetrics.NEW_VIOLATIONS)).thenReturn(m);

    decorator.decorate(project, context);
    verify(notificationManager, never()).scheduleForSending(any(Notification.class));
  }
Пример #19
0
  private void computeViolationsPerSeverities(DecoratorContext context) {
    Multiset<RulePriority> severitiesBag = HashMultiset.create();
    for (Violation violation : context.getViolations()) {
      severitiesBag.add(violation.getSeverity());
    }

    for (RulePriority severity : RulePriority.values()) {
      Metric metric = SeverityUtils.severityToViolationMetric(severity);
      if (context.getMeasure(metric) == null) {
        Collection<Measure> children = context.getChildrenMeasures(MeasuresFilters.metric(metric));
        int sum = MeasureUtils.sum(true, children).intValue() + severitiesBag.count(severity);
        context.saveMeasure(metric, (double) sum);
      }
    }
  }
Пример #20
0
  @Test
  public void shouldNotNotifyIfNoNewViolations() throws Exception {
    Project project = new Project("key");
    Measure m = new Measure(CoreMetrics.NEW_VIOLATIONS);
    when(context.getMeasure(CoreMetrics.NEW_VIOLATIONS)).thenReturn(m);

    // NULL is returned here
    decorator.notifyNewViolations(project, context);
    verify(notificationManager, never()).scheduleForSending(any(Notification.class));

    // 0 will be returned now
    m.setVariation1(0.0);
    decorator.notifyNewViolations(project, context);
    verify(notificationManager, never()).scheduleForSending(any(Notification.class));
  }
  public void decorate(Resource resource, DecoratorContext context) {
    if (!shouldDecorateResource(resource)) {
      return;
    }
    Measure currentStatus = context.getMeasure(CoreMetrics.ALERT_STATUS);
    if (currentStatus == null) {
      return;
    }

    TimeMachineQuery query =
        new TimeMachineQuery(resource)
            .setOnlyLastAnalysis(true)
            .setMetrics(CoreMetrics.ALERT_STATUS);
    List<Measure> measures = timeMachine.getMeasures(query);

    Measure pastStatus = measures != null && measures.size() == 1 ? measures.get(0) : null;
    checkQualityGateStatusChange(resource, context, currentStatus, pastStatus);
  }
Пример #22
0
  /** {@inheritDoc} */
  public void decorate(Resource resource, DecoratorContext context) {

    if (ResourceUtils.isProject(resource)) {

      Collection<Measure> childMeasures =
          context.getChildrenMeasures(CodesizeMetrics.CODE_COUNTERS);

      if (!childMeasures.isEmpty()) {
        Measure projectMeasure = context.getMeasure(CodesizeMetrics.CODE_COUNTERS);
        final PropertiesBuilder<String, Integer> counters =
            new PropertiesBuilder<String, Integer>(CodesizeMetrics.CODE_COUNTERS);
        if (projectMeasure != null) {
          Map<String, Integer> map = KeyValueFormat.parseStringInt(projectMeasure.getData());
          counters.addAll(map);
        }

        for (Measure childMeasure : childMeasures) {
          Map<String, Integer> childcounters =
              KeyValueFormat.parseStringInt(childMeasure.getData());
          for (Entry<String, Integer> entry : childcounters.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            if (counters.getProps().containsKey(key)) {
              counters.add(key, value + counters.getProps().get(key));
            } else {
              counters.add(key, value);
            }
          }
        }

        if (projectMeasure != null) {
          projectMeasure.setData(counters.buildData());
        } else {
          context.saveMeasure(counters.build());
        }
      }
    }
  }
Пример #23
0
  @Test
  public void shouldNotifyUserAboutNewViolations() throws Exception {
    Project project = new Project("key").setName("LongName");
    project.setId(45);
    Calendar pastDate = new GregorianCalendar(2011, 10, 25);
    PastSnapshot pastSnapshot = new PastSnapshot("", pastDate.getTime());
    when(timeMachineConfiguration.getProjectPastSnapshots())
        .thenReturn(Lists.newArrayList(pastSnapshot, pastSnapshot));
    Measure m = new Measure(CoreMetrics.NEW_VIOLATIONS).setVariation1(32.0);
    when(context.getMeasure(CoreMetrics.NEW_VIOLATIONS)).thenReturn(m);

    decorator.decorate(project, context);

    DateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd");
    Notification notification =
        new Notification("new-violations")
            .setDefaultMessage("32 new violations on LongName.")
            .setFieldValue("count", "32")
            .setFieldValue("projectName", "LongName")
            .setFieldValue("projectKey", "key")
            .setFieldValue("projectId", "45")
            .setFieldValue("fromDate", dateformat.format(pastDate.getTime()));
    verify(notificationManager, times(1)).scheduleForSending(eq(notification));
  }
 protected boolean shouldDecorate(final Resource resource, final DecoratorContext context) {
   return context.getMeasure(getTargetMetric()) == null
       && !ResourceUtils.isUnitTestClass(resource);
 }
Пример #25
0
 private boolean shouldSaveMeasure(DecoratorContext context) {
   return context.getMeasure(CoreMetrics.TECHNICAL_DEBT) == null;
 }
 @Override
 protected Double countElements(DecoratorContext context) {
   return MeasureUtils.getValue(context.getMeasure(JaCoCoItMetrics.IT_LINES_TO_COVER), 0.0);
 }
Пример #27
0
 private boolean shouldDecorateResource(Resource resource, DecoratorContext context) {
   return ResourceUtils.isProject(resource)
       && context.getMeasure(CoreMetrics.DEPENDENCY_MATRIX) == null;
 }