@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; }
/** * @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()); }
private long getMeasureValue(DecoratorContext context, Metric metric) { Measure measure = context.getMeasure(metric); if (measure != null) { return measure.getValue().longValue(); } return 0L; }
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); }
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()); }
/** 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 }
/** {@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); } }
@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)); }
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); } } }
@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); }
/** {@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()); } } } }
@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); }
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); }
private boolean shouldDecorateResource(Resource resource, DecoratorContext context) { return ResourceUtils.isProject(resource) && context.getMeasure(CoreMetrics.DEPENDENCY_MATRIX) == null; }