Skip to content

Commit c5dc3e3

Browse files
authored
Merge pull request #14 from naver/ksmail13/feat/allow_other_file_types
Allow non java files
2 parents ca907c7 + 93dfdc0 commit c5dc3e3

File tree

13 files changed

+257
-130
lines changed

13 files changed

+257
-130
lines changed

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
language: java
22
jdk:
3-
- oraclejdk8
3+
- oraclejdk11
44
- openjdk8
5-
5+
- openjdk11

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.naver.nid</groupId>
88
<artifactId>coverchecker</artifactId>
9-
<version>1.3.3</version>
9+
<version>1.3.4</version>
1010

1111
<packaging>jar</packaging>
1212

src/main/java/com/naver/nid/cover/CoverChecker.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@
2929
import lombok.RequiredArgsConstructor;
3030
import lombok.extern.slf4j.Slf4j;
3131

32+
import java.util.ArrayList;
3233
import java.util.List;
34+
import java.util.Optional;
3335
import java.util.concurrent.CompletableFuture;
3436
import java.util.function.Function;
3537
import java.util.stream.Collectors;
38+
import java.util.stream.Stream;
3639

3740
@Slf4j
3841
@RequiredArgsConstructor
@@ -52,13 +55,15 @@ public CoverChecker(ObjectFactory objectManager) {
5255
objectManager.getReporter());
5356
}
5457

55-
public void check(Parameter param) {
58+
public boolean check(Parameter param) {
5659
try {
5760
RawDiffReader diffReader = createDiffReader(param);
5861

5962
log.info("Check new line of code coverage by {}", coverageParser.getClass().getSimpleName());
60-
CompletableFuture<List<FileCoverageReport>> coverage = executeByBackground((Function<String, List<FileCoverageReport>>) coverageParser::parse)
61-
.apply(param.getCoveragePath());
63+
CompletableFuture<List<FileCoverageReport>> coverage = param.getCoveragePath().stream()
64+
.map(s -> executeByBackground((Function<String, List<FileCoverageReport>>) coverageParser::parse).apply(s))
65+
.reduce((f1, f2) -> f1.thenCombine(f2, (r1, r2) -> Stream.concat(r1.stream(), r2.stream()).collect(Collectors.toList())))
66+
.orElseThrow(() -> new IllegalStateException("No Coverage Report"));
6267

6368
log.info("read diff by {}", diffReader.getClass().getSimpleName());
6469
CompletableFuture<List<Diff>> diff = executeByBackground(diffParser::parse)
@@ -69,12 +74,14 @@ public void check(Parameter param) {
6974

7075
reporter.report(check);
7176
log.info("check result {}", check.result());
77+
return true;
7278
} catch (Exception e) {
7379
NewCoverageCheckReport failResult = NewCoverageCheckReport.builder()
7480
.error(e)
7581
.build();
7682

7783
reporter.report(failResult);
84+
return false;
7885
}
7986
}
8087

src/main/java/com/naver/nid/cover/checker/NewCoverageChecker.java

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,20 @@
2828

2929
import java.util.*;
3030
import java.util.stream.Collectors;
31+
import java.util.stream.Stream;
3132

3233
/**
33-
* diff 정보와 coverage report를 이용해 신규 코드에 대한 커버리지를 측정
34+
* <p>코드의 변경점과 coverage 리포트를 이용해 신규 코드에 대한 커버리지를 측정</p>
35+
*
36+
* <p>NewCoverageChecker calculate test code coverage that updated.</p>
3437
*/
3538
public class NewCoverageChecker {
3639
private static final Logger logger = LoggerFactory.getLogger(NewCoverageChecker.class);
3740

3841
/**
39-
* coverage report 와 diff 를 확인하여 신규 코드의 테스트 코드의 커버 정도를 확인한다.
42+
* <p>coverage report 와 diff 를 확인하여 신규 코드의 테스트 코드의 커버 정도를 확인한다.</p>
43+
*
44+
* <p>The method Check will calculate test coverage for new code for compare test coverage report and code diff.</p>
4045
*
4146
* @param coverage 파일 커버리지 리포트 결과
4247
* @param diff 구 버전 파일과 신 버전 파일의 차이
@@ -46,35 +51,22 @@ public class NewCoverageChecker {
4651
*/
4752
public NewCoverageCheckReport check(List<FileCoverageReport> coverage, List<Diff> diff, int threshold, int fileThreshold) {
4853
Map<String, List<Line>> diffMap = diff.stream()
49-
.filter(d -> !d.getFileName().startsWith("src/test/java/"))
50-
.filter(d -> d.getFileName().endsWith(".java"))
54+
.filter(d -> !d.getFileName().startsWith("src/test"))
5155
.filter(d -> !d.getDiffSectionList().isEmpty())
5256
.peek(d -> logger.debug("diff file {}", d.getFileName()))
53-
.peek(d -> d.setFileName(d.getFileName().replaceFirst("src/main/java/", "")))
5457
.collect(Collectors.toMap(Diff::getFileName
5558
, d -> d.getDiffSectionList().stream()
5659
.flatMap(s -> s.getLineList().stream())
5760
.filter(l -> l.getType() == ModifyType.ADD)
5861
.collect(Collectors.toList())
59-
, (u1, u2) -> {
60-
ArrayList<Line> diffs = new ArrayList<>();
61-
diffs.addAll(u1);
62-
diffs.addAll(u2);
63-
64-
return diffs;
65-
}));
62+
, (u1, u2) -> Stream.concat(u1.stream(), u2.stream()).collect(Collectors.toList())));
6663

64+
// TODO redesign for multi module
6765
Map<String, List<LineCoverageReport>> coverageMap = coverage.stream()
6866
.peek(r -> logger.debug("file coverage {}", r.getFileName()))
6967
.collect(Collectors.toMap(FileCoverageReport::getFileName
7068
, FileCoverageReport::getLineCoverageReportList
71-
, (u1, u2) -> {
72-
ArrayList<LineCoverageReport> diffs = new ArrayList<>();
73-
diffs.addAll(u1);
74-
diffs.addAll(u2);
75-
76-
return diffs;
77-
}));
69+
, (u1, u2) -> Stream.concat(u1.stream(), u2.stream()).collect(Collectors.toList())));
7870

7971

8072
NewCoverageCheckReport result = combine(coverageMap, diffMap);
@@ -96,11 +88,23 @@ private NewCoverageCheckReport combine(Map<String, List<LineCoverageReport>> cov
9688
int coveredLineCount = 0;
9789

9890
Set<String> files = new HashSet<>(coverageReport.keySet());
99-
files.retainAll(newCodeLines.keySet());
10091

10192
List<NewCoveredFile> coveredFileList = new ArrayList<>();
10293
for (String file : files) {
103-
List<Line> diffList = newCodeLines.get(file);
94+
// TODO 다른 모듈의 동일 패키지 동일 파일 이름일 경우에 대한 처리 필요
95+
96+
// 코드 커버리지의 끝 경로가 같은 경우에 대해 검색
97+
List<Line> diffList = newCodeLines.entrySet().stream()
98+
.filter(e -> e.getKey().endsWith(file))
99+
.findFirst()
100+
.map(Map.Entry::getValue)
101+
.orElse(Collections.emptyList());
102+
103+
if (diffList.isEmpty()) {
104+
logger.debug("file({}) is not changed", file);
105+
continue;
106+
}
107+
104108
List<LineCoverageReport> lineCoverageReports = coverageReport.get(file);
105109

106110
logger.debug("check file {}", file);

src/main/java/com/naver/nid/cover/util/Parameter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import lombok.Getter;
2020
import lombok.ToString;
2121

22+
import java.util.List;
23+
2224
@Getter
2325
@ToString
2426
@Builder
@@ -27,7 +29,7 @@ public class Parameter {
2729
private int fileThreshold;
2830
private String githubToken;
2931
private String diffPath;
30-
private String coveragePath;
32+
private List<String> coveragePath;
3133
private String githubUrl;
3234
private String repo;
3335
private String diffType;

src/main/java/com/naver/nid/cover/util/ParameterParser.java

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.slf4j.LoggerFactory;
2222

2323
import java.io.PrintWriter;
24+
import java.util.Arrays;
2425

2526
public class ParameterParser {
2627
private static final Logger logger = LoggerFactory.getLogger(ParameterParser.class);
@@ -53,7 +54,7 @@ public Parameter getParam(String... commandArgs) {
5354
.fileThreshold(getFileThreshold(cmd))
5455
.githubToken(cmd.getOptionValue("g"))
5556
.diffPath(cmd.getOptionValue("d"))
56-
.coveragePath(cmd.getOptionValue("c"))
57+
.coveragePath(Arrays.asList(cmd.getOptionValues("c")))
5758
.githubUrl(cmd.getOptionValue("u", IGitHubConstants.HOST_API))
5859
.repo(cmd.getOptionValue("r"))
5960
.diffType(cmd.getOptionValue("diff-type"))
@@ -86,62 +87,66 @@ private String getPrNumber(CommandLine cmd) {
8687
private Options executeOption() {
8788
Options commandOptions = new Options();
8889

89-
Option diffPath = new Option("d", DIFF_OPTION, true, "diff file path(absolute recommend)");
90-
commandOptions.addOption(diffPath);
90+
commandOptions.addOption(Option.builder("d")
91+
.longOpt(DIFF_OPTION)
92+
.hasArg()
93+
.desc("diff file path(absolute recommend)")
94+
.build());
9195

92-
Option githubToken = new Option("g", GITHUB_TOKEN_OPTION, true, "github oauth token");
93-
githubToken.setRequired(true);
94-
commandOptions.addOption(githubToken);
96+
commandOptions.addOption(Option.builder("dt")
97+
.longOpt("diff-type")
98+
.hasArg()
99+
.desc("diff type (github | file)")
100+
.build());
101+
102+
commandOptions.addOption(Option.builder("g")
103+
.longOpt(GITHUB_TOKEN_OPTION)
104+
.required()
105+
.hasArg()
106+
.desc("github oauth token")
107+
.build());
95108

96-
Option githubUrl = Option.builder("u")
97-
.desc("The url when you working on github enterprise url. default is api.github.com").hasArg()
109+
commandOptions.addOption(Option.builder("u")
98110
.longOpt("github-url")
99-
.build();
100-
commandOptions.addOption(githubUrl);
111+
.hasArg()
112+
.desc("The url when you working on github enterprise url. default is api.github.com")
113+
.build());
101114

102-
Option githubPrNum = Option.builder("p")
103-
.desc("github pr number").hasArg()
115+
commandOptions.addOption(Option.builder("p")
104116
.longOpt("pr")
105-
.build();
106-
commandOptions.addOption(githubPrNum);
117+
.hasArg()
118+
.desc("github pr number")
119+
.build());
107120

108-
Option githubRepo = Option.builder("r").required()
109-
.desc("github repo").hasArg()
121+
commandOptions.addOption(Option.builder("r").required()
110122
.longOpt("repo")
111-
.build();
112-
commandOptions.addOption(githubRepo);
113-
114-
Option thresholdOption = Option.builder("t").required()
115-
.desc("coverage pass threshold").hasArg()
116-
.longOpt(THRESHOLD_OPTION).type(Integer.class)
117-
.build();
118-
commandOptions.addOption(thresholdOption);
123+
.hasArg()
124+
.desc("github repo")
125+
.build());
119126

120-
Option coverReportPath = Option.builder("c")
121-
.longOpt(COVERAGE_PATH_OPTION).hasArg()
127+
commandOptions.addOption(Option.builder("c")
128+
.longOpt(COVERAGE_PATH_OPTION)
129+
.hasArg()
122130
.required()
123-
.desc("coverage report path(absolute recommend)").build();
124-
commandOptions.addOption(coverReportPath);
131+
.desc("coverage report path(absolute recommend)")
132+
.build());
125133

126-
Option coverReportType = Option.builder(COVERAGE_TYPE_OPTION)
134+
commandOptions.addOption(Option.builder(COVERAGE_TYPE_OPTION)
127135
.hasArg()
128136
.desc("coverage report type (jacoco | cobertura) default is jacoco")
129-
.build();
130-
commandOptions.addOption(coverReportType);
137+
.build());
131138

132-
Option fileThresholdOption = Option.builder("ft")
133-
.longOpt("file-threshold")
139+
commandOptions.addOption(Option.builder("t").required()
140+
.longOpt(THRESHOLD_OPTION).type(Integer.class)
134141
.hasArg()
135-
.desc("coverage report type (jacoco | cobertura) default is jacoco")
136-
.build();
137-
commandOptions.addOption(fileThresholdOption);
142+
.desc("coverage pass threshold")
143+
.build());
138144

139-
Option diffType = Option.builder("dt")
140-
.longOpt("diff-type")
145+
commandOptions.addOption(Option.builder("ft")
146+
.longOpt("file-threshold")
141147
.hasArg()
142-
.desc("diff type (github | file)")
143-
.build();
144-
commandOptions.addOption(diffType);
148+
.desc("coverage report type (jacoco | cobertura) default is jacoco")
149+
.build());
145150

146151
return commandOptions;
147152
}

src/main/resources/logback.xml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8" ?>
22
<configuration>
3-
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
4-
<encoder>
5-
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level [%file:%line] %msg%n</pattern>
6-
</encoder>
7-
</appender>
3+
<include resource="pattern.xml" />
84

95
<logger name="com.naver.nid.cover.parser.diff" level="INFO" />
106
<logger name="com.naver.nid.cover.parser.coverage" level="INFO" />

src/main/resources/pattern.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<included>
3+
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
4+
<encoder>
5+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level \(%file:%line\) %msg%n</pattern>
6+
</encoder>
7+
</appender>
8+
</included>

0 commit comments

Comments
 (0)