From c981227e2b0c9158deefcc9fec9b4ee1d81cab86 Mon Sep 17 00:00:00 2001 From: Antoine Lambert Date: Mon, 23 Jan 2023 21:48:34 +0100 Subject: [PATCH] CoverageNode: Fix mergePath for node created from cobertura report When a coverage node has been created from a cobertura report, the mergePath method was returning a wrong path if the provided local path contains any subpaths in it. Those subpaths were prepended to the local path thus doubling them in the merged path (for instance "a/b/c" was transformed to "a/b/a/b/c"). As a consequence, FileCoverageNode.getPath was returning a wrong file path which prevented any source file painting and display in the Jenkins UI. Fix #456 --- .../plugins/coverage/model/CoverageNode.java | 8 ++-- .../coverage/model/CoverageNodeTest.java | 37 +++++++++++++++++ .../coverage/model/cobertura-package-root.xml | 40 +++++++++++++++++++ 3 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 plugin/src/test/resources/io/jenkins/plugins/coverage/model/cobertura-package-root.xml diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/model/CoverageNode.java b/plugin/src/main/java/io/jenkins/plugins/coverage/model/CoverageNode.java index dde12a63e..278f6ca29 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/model/CoverageNode.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/model/CoverageNode.java @@ -130,14 +130,16 @@ protected String mergePath(final String localPath) { if (hasParent()) { String parentPath = getParent().getPath(); - - if (StringUtils.isBlank(parentPath)) { + String slash = "/"; + if (StringUtils.isBlank(parentPath) || parentPath.equals(slash) || localPath.startsWith(parentPath + slash)) { + // do not prepend parent path if empty or if root or if local path starts with it + // as it is the case for coverage node created from cobertura report return localPath; } if (StringUtils.isBlank(localPath)) { return parentPath; } - return parentPath + "/" + localPath; + return parentPath + slash + localPath; } return localPath; diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageNodeTest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageNodeTest.java index 7dce47922..93c888f8b 100644 --- a/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageNodeTest.java +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/model/CoverageNodeTest.java @@ -452,6 +452,43 @@ void shouldGetAllFileCoverageNodes() { node -> assertThat(node).isInstanceOf(FileCoverageNode.class))); } + @Test + void shouldReturnCorrectPatshInFileCoverageNodesFromCoberturaReport() { + CoverageResult result = readCoberturaResult("cobertura-lots-of-data.xml"); + CoverageNode tree = new CoverageNodeConverter().convert(result); + tree.splitPackages(); + assertThat(tree.getAllFileCoverageNodes()) + .hasSize(19) + .extracting(FileCoverageNode::getPath) + .containsOnly("org/apache/commons/cli/AlreadySelectedException.java", + "org/apache/commons/cli/BasicParser.java", + "org/apache/commons/cli/CommandLine.java", + "org/apache/commons/cli/CommandLineParser.java", + "org/apache/commons/cli/GnuParser.java", + "org/apache/commons/cli/HelpFormatter.java", + "org/apache/commons/cli/MissingArgumentException.java", + "org/apache/commons/cli/MissingOptionException.java", + "org/apache/commons/cli/NumberUtils.java", + "org/apache/commons/cli/Option.java", + "org/apache/commons/cli/OptionBuilder.java", + "org/apache/commons/cli/OptionGroup.java", + "org/apache/commons/cli/Options.java", + "org/apache/commons/cli/ParseException.java", + "org/apache/commons/cli/Parser.java", + "org/apache/commons/cli/PatternOptionBuilder.java", + "org/apache/commons/cli/PosixParser.java", + "org/apache/commons/cli/TypeHandler.java", + "org/apache/commons/cli/UnrecognizedOptionException.java"); + + result = readCoberturaResult("cobertura-package-root.xml"); + tree = new CoverageNodeConverter().convert(result); + tree.splitPackages(); + assertThat(tree.getAllFileCoverageNodes()) + .hasSize(1) + .extracting(FileCoverageNode::getPath) + .containsOnly("__init__.py"); + } + @Test void shouldProvideExistentChangeCoverage() { CoverageNode tree = createTreeWithMockedTreeCreator(); diff --git a/plugin/src/test/resources/io/jenkins/plugins/coverage/model/cobertura-package-root.xml b/plugin/src/test/resources/io/jenkins/plugins/coverage/model/cobertura-package-root.xml new file mode 100644 index 000000000..4471b7f39 --- /dev/null +++ b/plugin/src/test/resources/io/jenkins/plugins/coverage/model/cobertura-package-root.xml @@ -0,0 +1,40 @@ + + + + /home/user/dev/python/package + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +