Skip to content

Commit f5c10c3

Browse files
committed
Improve handling of working directory and add missing tests for main class
1 parent da7d592 commit f5c10c3

File tree

3 files changed

+75
-31
lines changed

3 files changed

+75
-31
lines changed

src/main/java/de/donnerbart/split/Arguments.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import org.jetbrains.annotations.Nullable;
77

88
import java.nio.file.Path;
9+
import java.nio.file.Paths;
910
import java.util.Arrays;
11+
import java.util.Objects;
1012

1113
class Arguments {
1214

@@ -49,7 +51,8 @@ class Arguments {
4951

5052
@Parameter(names = {"--working-directory", "-w"},
5153
description = "The working directory. Defaults to the current directory.")
52-
@Nullable Path workingDirectory;
54+
@SuppressWarnings("NotNullFieldNotInitialized")
55+
@NotNull Path workingDirectory;
5356

5457
@Parameter(names = {"--calculate-optimal-total-split", "-o"},
5558
description = "Calculates the optimal test split (only on the first split index). Logs a warning if --split-total does not match.")
@@ -62,6 +65,12 @@ class Arguments {
6265
@Parameter(names = {"--debug", "-d"}, description = "Enables debug logging.")
6366
boolean debug = false;
6467

68+
void init() {
69+
workingDirectory = Objects.requireNonNullElse(workingDirectory, Paths.get(System.getProperty("user.dir")))
70+
.toAbsolutePath()
71+
.normalize();
72+
}
73+
6574
public static class FormatOptionConverter implements IStringConverter<FormatOption> {
6675

6776
@Override

src/main/java/de/donnerbart/split/TestSplitMain.java

+22-16
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,9 @@
1111
import org.slf4j.LoggerFactory;
1212

1313
import java.nio.file.Files;
14-
import java.nio.file.Path;
15-
import java.nio.file.Paths;
1614
import java.text.SimpleDateFormat;
1715
import java.time.Instant;
1816
import java.util.Date;
19-
import java.util.Objects;
2017
import java.util.Properties;
2118
import java.util.Set;
2219
import java.util.function.Consumer;
@@ -27,39 +24,48 @@ public class TestSplitMain {
2724

2825
private static final @NotNull Logger LOG = LoggerFactory.getLogger(TestSplitMain.class);
2926

27+
private TestSplitMain() {
28+
}
29+
3030
public static void main(final @Nullable String @NotNull [] args) throws Exception {
31-
run(System::exit, args);
31+
final var arguments = init(System::exit, args);
32+
run(System::exit, arguments);
3233
}
3334

3435
@VisibleForTesting
35-
static @NotNull Splits run(final @NotNull Consumer<Integer> exitConsumer, final @Nullable String @NotNull [] args)
36-
throws Exception {
36+
static @NotNull Arguments init(
37+
final @NotNull Consumer<Integer> exitConsumer,
38+
final @Nullable String @NotNull [] args) {
3739
final var arguments = new Arguments();
3840
final var jCommander = JCommander.newBuilder().addObject(arguments).build();
3941
jCommander.parse(args);
42+
arguments.init();
4043
if (arguments.help) {
4144
jCommander.usage();
4245
exitConsumer.accept(0);
46+
return arguments;
4347
}
4448
if (arguments.debug) {
4549
final var root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
4650
root.setLevel(Level.DEBUG);
4751
}
48-
final var workingDirectory =
49-
Objects.requireNonNullElse(arguments.workingDirectory, Paths.get(System.getProperty("user.dir")))
50-
.toAbsolutePath()
51-
.normalize();
52-
if (!validateArguments(arguments, workingDirectory)) {
52+
if (!validateArguments(arguments)) {
5353
exitConsumer.accept(1);
5454
}
55+
return arguments;
56+
}
57+
58+
@VisibleForTesting
59+
static @NotNull Splits run(final @NotNull Consumer<Integer> exitConsumer, final @NotNull Arguments arguments)
60+
throws Exception {
5561
final var properties = readProperties("split-tests-java.properties");
5662
LOG.info("split-tests-java {} (commit: {} on branch: {}) built on {}",
5763
properties.getProperty("version", "unknown"),
5864
properties.getProperty("git.commit.id.abbrev", "unknown"),
5965
properties.getProperty("git.branch", "unknown"),
6066
getBuiltTime(properties.getProperty("git.commit.time", "unknown")));
6167
LOG.info("Split index {} (total: {})", arguments.splitIndex, arguments.splitTotal);
62-
LOG.info("Working directory: {}", workingDirectory);
68+
LOG.info("Working directory: {}", arguments.workingDirectory);
6369
LOG.info("Glob: {}", arguments.glob);
6470
if (arguments.excludeGlob != null) {
6571
LOG.info("Exclude glob: {}", arguments.excludeGlob);
@@ -72,8 +78,8 @@ public static void main(final @Nullable String @NotNull [] args) throws Exceptio
7278
arguments.excludeGlob,
7379
arguments.junitGlob,
7480
arguments.newTestTimeOption,
75-
workingDirectory,
76-
System::exit);
81+
arguments.workingDirectory,
82+
exitConsumer);
7783
final var testCases = testLoader.load();
7884
if (arguments.calculateOptimalTotalSplit) {
7985
calculateOptimalTotalSplit(arguments, testCases);
@@ -87,7 +93,7 @@ public static void main(final @Nullable String @NotNull [] args) throws Exceptio
8793
}
8894

8995
@VisibleForTesting
90-
static boolean validateArguments(final @NotNull Arguments arguments, final @NotNull Path workingDirectory) {
96+
static boolean validateArguments(final @NotNull Arguments arguments) {
9197
if (arguments.splitTotal < 1) {
9298
LOG.error("--split-total must be greater than 0");
9399
return false;
@@ -96,7 +102,7 @@ static boolean validateArguments(final @NotNull Arguments arguments, final @NotN
96102
LOG.error("--split-index must lesser than --split-total");
97103
return false;
98104
}
99-
if (!Files.exists(workingDirectory)) {
105+
if (!Files.exists(arguments.workingDirectory)) {
100106
LOG.error("Working directory does not exist: {}", arguments.workingDirectory);
101107
return false;
102108
}

src/test/java/de/donnerbart/split/TestSplitMainTest.java

+43-14
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static java.nio.file.attribute.PosixFilePermission.OWNER_READ;
2020
import static java.nio.file.attribute.PosixFilePermission.OWNER_WRITE;
2121
import static org.assertj.core.api.Assertions.assertThat;
22+
import static org.assertj.core.api.Assertions.assertThatNoException;
2223

2324
class TestSplitMainTest {
2425

@@ -64,20 +65,48 @@ void setUp() throws Exception {
6465
PERMISSIONS);
6566
}
6667

68+
@Test
69+
void main_fullLifecycle() {
70+
assertThatNoException().isThrownBy(() -> TestSplitMain.main(new String[]{
71+
"-i", "0", "-t", "2", "-g", "**/example-project/**/*Test.java", "-w", tmp.toString()}));
72+
}
73+
74+
@Test
75+
void init() {
76+
TestSplitMain.init(exitCode::set,
77+
new String[]{"-i", "0", "-t", "1", "-g", "**/*Test.java", "-w", tmp.toString()});
78+
assertThat(exitCode).hasNullValue();
79+
}
80+
81+
@Test
82+
void init_withHelp() {
83+
TestSplitMain.init(exitCode::set, new String[]{"-h"});
84+
assertThat(exitCode).hasValue(0);
85+
}
86+
87+
@Test
88+
void init_withInvalidArguments() {
89+
TestSplitMain.init(exitCode::set, new String[]{"-i", "0", "-t", "0", "-g", "**/*Test.java"});
90+
assertThat(exitCode).hasValue(1);
91+
}
92+
6793
@Test
6894
void run() throws Exception {
69-
final var splits = TestSplitMain.run(exitCode::set, new String[]{
70-
"-i",
95+
jCommander.parse("-i",
7196
"0",
7297
"-t",
7398
"2",
7499
"-g",
75100
"**/example-project/**/*Test.java",
101+
"-e",
102+
"**/example-project/**/*Abstract*.java",
76103
"-j",
77104
"**/junit-reports/*.xml",
78105
"-w",
79-
tmp.toAbsolutePath().toString(),
80-
"-d"});
106+
tmp.toString(),
107+
"-o",
108+
"-d");
109+
final var splits = TestSplitMain.run(exitCode::set, arguments);
81110
assertThat(exitCode).hasNullValue();
82111

83112
assertThat(splits.size()).isEqualTo(2);
@@ -89,32 +118,32 @@ void run() throws Exception {
89118

90119
@Test
91120
void validateArguments() {
92-
jCommander.parse("-i", "0", "-t", "1", "-g", "**/*Test.java");
93-
assertThat(TestSplitMain.validateArguments(arguments, tmp)).isTrue();
121+
jCommander.parse("-i", "0", "-t", "1", "-g", "**/*Test.java", "-w", tmp.toAbsolutePath().toString());
122+
assertThat(TestSplitMain.validateArguments(arguments)).isTrue();
94123
}
95124

96125
@Test
97126
void validateArguments_withZeroSplitTotal() {
98-
jCommander.parse("-i", "0", "-t", "0", "-g", "**/*Test.java");
99-
assertThat(TestSplitMain.validateArguments(arguments, tmp)).isFalse();
127+
jCommander.parse("-i", "0", "-t", "0", "-g", "**/*Test.java", "-w", tmp.toAbsolutePath().toString());
128+
assertThat(TestSplitMain.validateArguments(arguments)).isFalse();
100129
}
101130

102131
@Test
103132
void validateArguments_withNegativeSplitTotal() {
104-
jCommander.parse("-i", "0", "-t", "-1", "-g", "**/*Test.java");
105-
assertThat(TestSplitMain.validateArguments(arguments, tmp)).isFalse();
133+
jCommander.parse("-i", "0", "-t", "-1", "-g", "**/*Test.java", "-w", tmp.toAbsolutePath().toString());
134+
assertThat(TestSplitMain.validateArguments(arguments)).isFalse();
106135
}
107136

108137
@Test
109138
void validateArguments_withTooSmallSplitIndex() {
110-
jCommander.parse("-i", "1", "-t", "1", "-g", "**/*Test.java");
111-
assertThat(TestSplitMain.validateArguments(arguments, tmp)).isFalse();
139+
jCommander.parse("-i", "1", "-t", "1", "-g", "**/*Test.java", "-w", tmp.toAbsolutePath().toString());
140+
assertThat(TestSplitMain.validateArguments(arguments)).isFalse();
112141
}
113142

114143
@Test
115144
void validateArguments_withInvalidWorkingDirectory() {
116-
jCommander.parse("-i", "0", "-t", "1", "-g", "**/*Test.java");
117-
assertThat(TestSplitMain.validateArguments(arguments, tmp.resolve("does-not-exist"))).isFalse();
145+
jCommander.parse("-i", "0", "-t", "1", "-g", "**/*Test.java", "-w", tmp.resolve("does-not-exist").toString());
146+
assertThat(TestSplitMain.validateArguments(arguments)).isFalse();
118147
}
119148

120149
@Test

0 commit comments

Comments
 (0)