View Javadoc
1   /*
2    * The MIT License (MIT)
3    *
4    * Copyright (c) 2013 - 2023, Tapio Rautonen
5    *
6    * Permission is hereby granted, free of charge, to any person obtaining a copy
7    * of this software and associated documentation files (the "Software"), to deal
8    * in the Software without restriction, including without limitation the rights
9    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   * copies of the Software, and to permit persons to whom the Software is
11   * furnished to do so, subject to the following conditions:
12   *
13   * The above copyright notice and this permission notice shall be included in
14   * all copies or substantial portions of the Software.
15   *
16   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   * THE SOFTWARE.
23   */
24  package org.eluder.coveralls.maven.plugin.util;
25  
26  import static org.junit.jupiter.api.Assertions.assertEquals;
27  import static org.junit.jupiter.api.Assertions.assertThrows;
28  import static org.mockito.Mockito.lenient;
29  
30  import java.io.File;
31  import java.io.IOException;
32  import java.nio.file.Files;
33  import java.nio.file.Path;
34  import java.util.Arrays;
35  import java.util.Collections;
36  import java.util.List;
37  
38  import org.apache.maven.model.Build;
39  import org.apache.maven.model.Model;
40  import org.apache.maven.model.Reporting;
41  import org.apache.maven.project.MavenProject;
42  import org.eluder.coveralls.maven.plugin.CoverageParser;
43  import org.eluder.coveralls.maven.plugin.parser.CoberturaParser;
44  import org.eluder.coveralls.maven.plugin.parser.JaCoCoParser;
45  import org.eluder.coveralls.maven.plugin.parser.SagaParser;
46  import org.eluder.coveralls.maven.plugin.source.SourceLoader;
47  import org.junit.jupiter.api.BeforeEach;
48  import org.junit.jupiter.api.Test;
49  import org.junit.jupiter.api.extension.ExtendWith;
50  import org.junit.jupiter.api.io.CleanupMode;
51  import org.junit.jupiter.api.io.TempDir;
52  import org.mockito.Mock;
53  import org.mockito.junit.jupiter.MockitoExtension;
54  
55  @ExtendWith(MockitoExtension.class)
56  class CoverageParsersFactoryTest {
57  
58      @TempDir(cleanup = CleanupMode.ON_SUCCESS)
59      public Path folder;
60  
61      @Mock
62      private MavenProject projectMock;
63  
64      @Mock
65      private SourceLoader sourceLoaderMock;
66  
67      @Mock
68      private Model modelMock;
69  
70      @Mock
71      private Reporting reportingMock;
72  
73      @Mock
74      private Build buildMock;
75  
76      private Path reportingDir;
77  
78      private Path targetDir;
79  
80      @BeforeEach
81      void init() throws IOException {
82          reportingDir = Files.createDirectory(folder.resolve("reportingDir"));  
83          targetDir = Files.createDirectory(folder.resolve("targetDir"));
84          lenient().when(projectMock.getCollectedProjects()).thenReturn(Collections.<MavenProject>emptyList());
85          lenient().when(projectMock.getModel()).thenReturn(modelMock);
86          lenient().when(projectMock.getBuild()).thenReturn(buildMock);
87          lenient().when(modelMock.getReporting()).thenReturn(reportingMock);
88          lenient().when(reportingMock.getOutputDirectory()).thenReturn(reportingDir.toFile().getAbsolutePath());
89          lenient().when(buildMock.getDirectory()).thenReturn(targetDir.toFile().getAbsolutePath());
90      }
91  
92      @Test
93      void testCreateEmptyParsers() {
94          assertThrows(IOException.class, () -> {
95              createCoverageParsersFactory().createParsers();
96          });
97      }
98  
99      @Test
100     void testCreateJaCoCoParser() throws IOException {
101         Path jacocoDir = Files.createDirectory(reportingDir.resolve("jacoco")); 
102         Files.createFile(jacocoDir.resolve("jacoco.xml"));
103         List<CoverageParser> parsers = createCoverageParsersFactory().createParsers();
104         assertEquals(1, parsers.size());
105         assertEquals(JaCoCoParser.class, parsers.get(0).getClass());
106     }
107 
108     @Test
109     void testCreateCoberturaParser() throws IOException {
110         Path coberturaDir = Files.createDirectory(reportingDir.resolve("cobertura"));
111         Files.createFile(coberturaDir.resolve("coverage.xml"));
112         List<CoverageParser> parsers = createCoverageParsersFactory().createParsers();
113         assertEquals(1, parsers.size());
114         assertEquals(CoberturaParser.class, parsers.get(0).getClass());
115     }
116 
117     @Test
118     void testCreateSagaParser() throws IOException {
119         Path sagaDir = Files.createDirectory(targetDir.resolve("saga-coverage"));
120         Files.createFile(sagaDir.resolve("total-coverage.xml"));
121         List<CoverageParser> parsers = createCoverageParsersFactory().createParsers();
122         assertEquals(1, parsers.size());
123         assertEquals(SagaParser.class, parsers.get(0).getClass());
124     }
125 
126     @Test
127     void testWithJaCoCoReport() throws IOException {
128         File jacocoFile = Files.createFile(reportingDir.resolve("jacoco-report.xml")).toFile();
129         jacocoFile.createNewFile();
130         CoverageParsersFactory factory = createCoverageParsersFactory().withJaCoCoReports(Arrays.asList(jacocoFile));
131         List<CoverageParser> parsers = factory.createParsers();
132         assertEquals(1, parsers.size());
133         assertEquals(JaCoCoParser.class, parsers.get(0).getClass());
134     }
135 
136     @Test
137     void testWithCoberturaReport() throws IOException {
138         File coberturaFile = Files.createFile(reportingDir.resolve("cobertura-report.xml")).toFile();
139         coberturaFile.createNewFile();
140         CoverageParsersFactory factory = createCoverageParsersFactory().withCoberturaReports(Arrays.asList(coberturaFile));
141         List<CoverageParser> parsers = factory.createParsers();
142         assertEquals(1, parsers.size());
143         assertEquals(CoberturaParser.class, parsers.get(0).getClass());
144     }
145 
146     @Test
147     void testWithSagaReport() throws IOException {
148         File sagaFile = Files.createFile(reportingDir.resolve("saga-report.xml")).toFile();
149         sagaFile.createNewFile();
150         CoverageParsersFactory factory = createCoverageParsersFactory().withSagaReports(Arrays.asList(sagaFile));
151         List<CoverageParser> parsers = factory.createParsers();
152         assertEquals(1, parsers.size());
153         assertEquals(SagaParser.class, parsers.get(0).getClass());
154     }
155 
156     @Test
157     void testWithRelativeReportDirectory() throws IOException {
158         Path coberturaDir = Files.createDirectory(reportingDir.resolve("customdir"));
159         Files.createFile(coberturaDir.resolve("coverage.xml"));
160         CoverageParsersFactory factory = createCoverageParsersFactory().withRelativeReportDirs(Arrays.asList("customdir"));
161         List<CoverageParser> parsers = factory.createParsers();
162         assertEquals(1, parsers.size());
163         assertEquals(CoberturaParser.class, parsers.get(0).getClass());
164     }
165 
166     @Test
167     void testWithRootRelativeReportDirectory() throws IOException {
168         Files.createFile(reportingDir.resolve("coverage.xml")).toFile();
169         CoverageParsersFactory factory = createCoverageParsersFactory().withRelativeReportDirs(Arrays.asList(File.separator));
170         List<CoverageParser> parsers = factory.createParsers();
171         assertEquals(1, parsers.size());
172         assertEquals(CoberturaParser.class, parsers.get(0).getClass());
173     }
174 
175     private CoverageParsersFactory createCoverageParsersFactory() {
176         return new CoverageParsersFactory(projectMock, sourceLoaderMock);
177     }
178 }