@Test public void write_project_branch() throws Exception { when(cpdSettings.isCrossProjectDuplicationEnabled()).thenReturn(false); ProjectDefinition projectDef = ProjectDefinition.create() .setKey("foo") .setProperty(CoreProperties.PROJECT_BRANCH_PROPERTY, "myBranch"); createPublisher(projectDef); File outputDir = temp.newFolder(); ScannerReportWriter writer = new ScannerReportWriter(outputDir); underTest.publish(writer); ScannerReportReader reader = new ScannerReportReader(outputDir); ScannerReport.Metadata metadata = reader.readMetadata(); assertThat(metadata.getAnalysisDate()).isEqualTo(1234567L); assertThat(metadata.getProjectKey()).isEqualTo("root"); assertThat(metadata.getDeprecatedBranch()).isEqualTo("myBranch"); assertThat(metadata.getCrossProjectDuplicationActivated()).isFalse(); }
@Test public void write_short_lived_branch_info() throws Exception { String branchName = "feature"; String branchTarget = "short-lived"; when(branches.branchName()).thenReturn(branchName); when(branches.longLivingSonarReferenceBranch()).thenReturn(branchTarget); File outputDir = temp.newFolder(); underTest.publish(new ScannerReportWriter(outputDir)); ScannerReportReader reader = new ScannerReportReader(outputDir); ScannerReport.Metadata metadata = reader.readMetadata(); assertThat(metadata.getBranchName()).isEqualTo(branchName); assertThat(metadata.getBranchType()).isEqualTo(ScannerReport.Metadata.BranchType.SHORT); assertThat(metadata.getMergeBranchName()).isEqualTo(branchTarget); }
@Test public void scanProjectWithoutProjectName() throws IOException { File srcDir = new File(baseDir, "src"); srcDir.mkdir(); File xooFile = new File(srcDir, "sample.xoo"); FileUtils.write(xooFile, "Sample xoo\ncontent", StandardCharsets.UTF_8); AnalysisResult result = tester.newAnalysis() .properties(builder .put("sonar.sources", "src") .build()) .execute(); int ref = result.getReportReader().readMetadata().getRootComponentRef(); assertThat(result.getReportReader().readComponent(ref).getName()).isEmpty(); assertThat(result.inputFiles()).hasSize(1); DefaultInputFile file = (DefaultInputFile) result.inputFile("src/sample.xoo"); assertThat(file.type()).isEqualTo(InputFile.Type.MAIN); assertThat(file.relativePath()).isEqualTo("src/sample.xoo"); assertThat(file.language()).isEqualTo("xoo"); // file was published, since language matched xoo assertThat(file.isPublished()).isTrue(); assertThat(result.getReportComponent(file.scannerId())).isNotNull(); }
@Override public void publish(ScannerReportWriter writer) { AbstractProjectOrModule rootProject = moduleHierarchy.root(); ScannerReport.Metadata.Builder builder = ScannerReport.Metadata.newBuilder() .setAnalysisDate(projectAnalysisInfo.analysisDate().getTime())
/** * Check that the Quality profiles sent by scanner correctly relate to the project organization. */ private void checkQualityProfilesConsistency(ScannerReport.Metadata metadata, Organization organization) { List<String> profileKeys = metadata.getQprofilesPerLanguage().values().stream() .map(QProfile::getKey) .collect(toList(metadata.getQprofilesPerLanguage().size())); try (DbSession dbSession = dbClient.openSession(false)) { List<QProfileDto> profiles = dbClient.qualityProfileDao().selectByUuids(dbSession, profileKeys); String badKeys = profiles.stream() .filter(p -> !p.getOrganizationUuid().equals(organization.getUuid())) .map(QProfileDto::getKee) .collect(MoreCollectors.join(Joiner.on(", "))); if (!badKeys.isEmpty()) { throw MessageException.of(format("Quality profiles with following keys don't exist in organization [%s]: %s", organization.getKey(), badKeys)); } } }
@Override public void load(Metadata metadata) { String projectUuid = analysisMetadataHolder.getProject().getUuid(); String branchName = StringUtils.trimToNull(metadata.getBranchName()); Branch branch; if (branchName == null) { branch = getMainBranch(projectUuid); } else { BranchType branchType = BranchType.valueOf(metadata.getBranchType().name()); String mergeBranchName = StringUtils.trimToNull(metadata.getMergeBranchName()); branch = getMergeBranch(projectUuid, branchName, branchType, mergeBranchName); } analysisMetadataHolder.setBranch(branch); }
private void updateTitle() { frame.setTitle(metadata.getProjectKey() + (StringUtils.isNotEmpty(metadata.getBranchName()) ? (" (" + metadata.getBranchName() + ")") : "") + " " + sdf.format(new Date(metadata.getAnalysisDate()))); }
public void load(ScannerReport.Metadata metadata) { String deprecatedBranch = trimToNull(metadata.getDeprecatedBranch()); String branchName = trimToNull(metadata.getBranchName()); if (deprecatedBranch != null && branchName != null) { throw MessageException.of("Properties sonar.branch and sonar.branch.name can't be set together"); } if (delegate != null && deprecatedBranch == null) { delegate.load(metadata); } else { metadataHolder.setBranch(new DefaultBranchImpl(deprecatedBranch)); } } }
private void updateQualityProfiles() { qualityProfileEditor.setText(""); StringBuilder builder = new StringBuilder(); for (Map.Entry<String, QProfile> qp : metadata.getQprofilesPerLanguage().entrySet()) { builder.append(qp.getKey()).append(":\n").append(qp.getValue()).append("\n\n"); } qualityProfileEditor.setText(builder.toString()); }
private void loadComponents() { int rootComponentRef = metadata.getRootComponentRef(); Component component = reader.readComponent(rootComponentRef); DefaultMutableTreeNode project = createNode(component); loadChildren(component, project); getComponentTree().setModel(new DefaultTreeModel(project)); }
private void loadQualityProfiles(ScannerReport.Metadata reportMetadata, Organization organization) { checkQualityProfilesConsistency(reportMetadata, organization); analysisMetadata.setQProfilesByLanguage(reportMetadata.getQprofilesPerLanguage().values().stream() .collect(toMap( QProfile::getLanguage, qp -> new QualityProfile(qp.getKey(), qp.getName(), qp.getLanguage(), new Date(qp.getRulesUpdatedAt()))))); analysisMetadata.setScannerPluginsByKey(reportMetadata.getPluginsByKey().values().stream() .collect(toMap( Plugin::getKey, p -> new ScannerPlugin(p.getKey(), getBasePluginKey(p), p.getUpdatedAt())))); }
private static String projectKeyFromReport(ScannerReport.Metadata reportMetadata) { String deprecatedBranch = reportMetadata.getDeprecatedBranch(); if (StringUtils.isNotEmpty(deprecatedBranch)) { return ComponentKeys.createKey(reportMetadata.getProjectKey(), deprecatedBranch); } return reportMetadata.getProjectKey(); }
private void loadMetadata(ScannerReport.Metadata reportMetadata) { analysisMetadata.setAnalysisDate(reportMetadata.getAnalysisDate()); analysisMetadata.setRootComponentRef(reportMetadata.getRootComponentRef()); analysisMetadata.setCrossProjectDuplicationEnabled(reportMetadata.getCrossProjectDuplicationActivated()); }
private void updatePlugins() { pluginEditor.setText(""); StringBuilder builder = new StringBuilder(); for (Map.Entry<String, Plugin> p : metadata.getPluginsByKey().entrySet()) { builder.append(p.getKey()).append(":\n").append(p.getValue()).append("\n\n"); } pluginEditor.setText(builder.toString()); }
@Override public void publish(ScannerReportWriter writer) { AbstractProjectOrModule rootProject = moduleHierarchy.root(); ScannerReport.Metadata.Builder builder = ScannerReport.Metadata.newBuilder() .setAnalysisDate(projectAnalysisInfo.analysisDate().getTime())
@Test public void scanMultiModuleWithBranch() throws IOException { Path srcDir = baseDir.toPath().resolve("moduleA").resolve("src"); Files.createDirectories(srcDir); File xooFile = new File(srcDir.toFile(), "sample.xoo"); FileUtils.write(xooFile, "Sample xoo\ncontent"); AnalysisResult result = tester.newAnalysis() .properties(ImmutableMap.<String, String>builder() .putAll(commonProps) .put("sonar.branch", "branch") .put("sonar.modules", "moduleA") .build()) .execute(); assertThat(result.inputFiles()).hasSize(1); assertThat(result.inputFile("moduleA/src/sample.xoo").key()).isEqualTo("com.foo.project:moduleA/src/sample.xoo"); // no branch in the report DefaultInputFile inputfile = (DefaultInputFile) result.inputFile("moduleA/src/sample.xoo"); assertThat(result.getReportReader().readComponent(inputfile.scannerId()).getProjectRelativePath()).isEqualTo("moduleA/src/sample.xoo"); assertThat(result.getReportReader().readMetadata().getDeprecatedBranch()).isEqualTo("branch"); result = tester.newAnalysis() .properties(ImmutableMap.<String, String>builder() .putAll(commonProps) .put("sonar.branch", "") .put("sonar.modules", "moduleA") .build()) .execute(); assertThat(result.inputFiles()).hasSize(1); assertThat(result.inputFile("moduleA/src/sample.xoo").key()).isEqualTo("com.foo.project:moduleA/src/sample.xoo"); }
@Test public void read_coverage() { ScannerReportWriter writer = new ScannerReportWriter(dir); writer.writeMetadata(ScannerReport.Metadata.newBuilder() .setRootComponentRef(1) .build()); writer.writeComponent(ScannerReport.Component.newBuilder() .setRef(1).build()); writer.writeComponentCoverage(1, asList( ScannerReport.LineCoverage.newBuilder() .setLine(1) .setConditions(1) .setHits(true) .setCoveredConditions(1) .build(), ScannerReport.LineCoverage.newBuilder() .setLine(2) .setConditions(5) .setHits(false) .setCoveredConditions(4) .build())); underTest = new ScannerReportReader(dir); try (CloseableIterator<ScannerReport.LineCoverage> it = new ScannerReportReader(dir).readComponentCoverage(1)) { ScannerReport.LineCoverage coverage = it.next(); assertThat(coverage.getLine()).isEqualTo(1); assertThat(coverage.getConditions()).isEqualTo(1); assertThat(coverage.getHits()).isTrue(); assertThat(coverage.getCoveredConditions()).isEqualTo(1); } }
@Test public void scanProjectWithBranch() throws IOException { File srcDir = new File(baseDir, "src"); srcDir.mkdir(); File xooFile = new File(srcDir, "sample.xoo"); FileUtils.write(xooFile, "Sample xoo\ncontent"); AnalysisResult result = tester.newAnalysis() .properties(ImmutableMap.<String, String>builder() .putAll(commonProps) .put("sonar.branch", "branch") .build()) .execute(); assertThat(result.inputFiles()).hasSize(1); assertThat(result.inputFile("src/sample.xoo").key()).isEqualTo("com.foo.project:src/sample.xoo"); DefaultInputFile inputfile = (DefaultInputFile) result.inputFile("src/sample.xoo"); assertThat(result.getReportReader().readComponent(inputfile.scannerId()).getProjectRelativePath()).isEqualTo("src/sample.xoo"); assertThat(result.getReportReader().readMetadata().getDeprecatedBranch()).isEqualTo("branch"); result = tester.newAnalysis() .properties(ImmutableMap.<String, String>builder() .putAll(commonProps) .put("sonar.branch", "") .build()) .execute(); assertThat(result.inputFiles()).hasSize(1); assertThat(result.inputFile("src/sample.xoo").key()).isEqualTo("com.foo.project:src/sample.xoo"); }
@Test public void write_metadata() throws Exception { Date date = new Date(); when(qProfiles.findAll()).thenReturn(asList(new QProfile("q1", "Q1", "java", date))); when(pluginRepository.getPluginsByKey()).thenReturn(ImmutableMap.of( "java", new ScannerPlugin("java", 12345L, null), "php", new ScannerPlugin("php", 45678L, null))); File outputDir = temp.newFolder(); ScannerReportWriter writer = new ScannerReportWriter(outputDir); underTest.publish(writer); ScannerReportReader reader = new ScannerReportReader(outputDir); ScannerReport.Metadata metadata = reader.readMetadata(); assertThat(metadata.getAnalysisDate()).isEqualTo(1234567L); assertThat(metadata.getProjectKey()).isEqualTo("root"); assertThat(metadata.getModulesProjectRelativePathByKeyMap()).containsOnly(entry("module", "modulePath"), entry("root", "")); assertThat(metadata.getQprofilesPerLanguageMap()).containsOnly(entry("java", org.sonar.scanner.protocol.output.ScannerReport.Metadata.QProfile.newBuilder() .setKey("q1") .setName("Q1") .setLanguage("java") .setRulesUpdatedAt(date.getTime()) .build())); assertThat(metadata.getPluginsByKey()).containsOnly(entry("java", org.sonar.scanner.protocol.output.ScannerReport.Metadata.Plugin.newBuilder() .setKey("java") .setUpdatedAt(12345) .build()), entry("php", org.sonar.scanner.protocol.output.ScannerReport.Metadata.Plugin.newBuilder() .setKey("php") .setUpdatedAt(45678) .build())); }
@Test public void read_symbols() { ScannerReportWriter writer = new ScannerReportWriter(dir); writer.writeMetadata(ScannerReport.Metadata.newBuilder() .setRootComponentRef(1) .build()); writer.writeComponent(ScannerReport.Component.newBuilder() .setRef(1).build()); writer.writeComponentSymbols(1, asList(ScannerReport.Symbol.newBuilder() .setDeclaration(ScannerReport.TextRange.newBuilder() .setStartLine(1) .setStartOffset(3) .setEndLine(1) .setEndOffset(5) .build()) .addReference(ScannerReport.TextRange.newBuilder() .setStartLine(10) .setStartOffset(15) .setEndLine(11) .setEndOffset(2) .build()) .build())); underTest = new ScannerReportReader(dir); assertThat(underTest.readComponentSymbols(1)).hasSize(1); }