Skip to content

Commit 907cdd0

Browse files
committed
Enable NullAway in junit-platform-console
1 parent cea3c13 commit 907cdd0

15 files changed

+93
-24
lines changed

junit-platform-console/junit-platform-console.gradle.kts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import junitbuild.extensions.javaModuleName
22
import junitbuild.java.UpdateJarAction
3+
import net.ltgt.gradle.errorprone.errorprone
4+
import net.ltgt.gradle.nullaway.nullaway
35

46
plugins {
57
id("junitbuild.java-library-conventions")
8+
id("junitbuild.java-nullability-conventions")
69
id("junitbuild.shadow-conventions")
710
}
811

@@ -13,6 +16,7 @@ dependencies {
1316
api(projects.junitPlatformReporting)
1417

1518
compileOnlyApi(libs.apiguardian)
19+
compileOnly(libs.jspecify)
1620

1721
shadowed(libs.picocli)
1822

@@ -27,6 +31,13 @@ tasks {
2731
"--add-modules", "info.picocli",
2832
"--add-reads", "${javaModuleName}=info.picocli"
2933
))
34+
options.errorprone.nullaway {
35+
excludedFieldAnnotations.addAll(
36+
"picocli.CommandLine.ArgGroup",
37+
"picocli.CommandLine.Mixin",
38+
"picocli.CommandLine.Spec",
39+
)
40+
}
3041
}
3142
javadoc {
3243
(options as StandardJavadocDocletOptions).apply {

junit-platform-console/src/main/java/module-info.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88
* https://www.eclipse.org/legal/epl-v20.html
99
*/
1010

11+
import org.jspecify.annotations.NullMarked;
12+
1113
/**
1214
* Support for launching the JUnit Platform from the console.
1315
*
1416
* @since 1.0
1517
* @provides java.util.spi.ToolProvider
1618
*/
19+
@NullMarked
1720
module org.junit.platform.console {
1821
requires static org.apiguardian.api;
1922
requires org.junit.platform.commons;

junit-platform-console/src/main/java/org/junit/platform/console/options/CommandResult.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.Optional;
1616

1717
import org.apiguardian.api.API;
18+
import org.jspecify.annotations.Nullable;
1819

1920
/**
2021
* @since 1.10
@@ -40,14 +41,16 @@ public static <T> CommandResult<T> failure() {
4041
return create(FAILURE, null);
4142
}
4243

43-
public static <T> CommandResult<T> create(int exitCode, T value) {
44+
public static <T> CommandResult<T> create(int exitCode, @Nullable T value) {
4445
return new CommandResult<>(exitCode, value);
4546
}
4647

4748
private final int exitCode;
49+
50+
@Nullable
4851
private final T value;
4952

50-
private CommandResult(int exitCode, T value) {
53+
private CommandResult(int exitCode, @Nullable T value) {
5154
this.exitCode = exitCode;
5255
this.value = value;
5356
}

junit-platform-console/src/main/java/org/junit/platform/console/options/ExecuteTestsCommand.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
import java.nio.file.Path;
1717
import java.util.Optional;
1818

19+
import org.jspecify.annotations.Nullable;
1920
import org.junit.platform.console.tasks.ConsoleTestExecutor;
2021
import org.junit.platform.launcher.listeners.TestExecutionSummary;
2122

2223
import picocli.CommandLine;
2324
import picocli.CommandLine.ArgGroup;
2425
import picocli.CommandLine.Command;
2526
import picocli.CommandLine.Mixin;
27+
import picocli.CommandLine.Option;
2628

2729
@Command(//
2830
name = "execute", //
@@ -93,10 +95,11 @@ public int getExitCode() {
9395

9496
static class ReportingOptions {
9597

96-
@CommandLine.Option(names = "--fail-if-no-tests", description = "Fail and return exit status code 2 if no tests are found.")
98+
@Option(names = "--fail-if-no-tests", description = "Fail and return exit status code 2 if no tests are found.")
9799
private boolean failIfNoTests; // no single-dash equivalent: was introduced in 5.3-M1
98100

99-
@CommandLine.Option(names = "--reports-dir", paramLabel = "DIR", description = "Enable report output into a specified local directory (will be created if it does not exist).")
101+
@Nullable
102+
@Option(names = "--reports-dir", paramLabel = "DIR", description = "Enable report output into a specified local directory (will be created if it does not exist).")
100103
private Path reportsDir;
101104

102105
Optional<Path> getReportsDir() {

junit-platform-console/src/main/java/org/junit/platform/console/options/MainCommand.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@
1010

1111
package org.junit.platform.console.options;
1212

13+
import static java.util.Objects.requireNonNull;
14+
1315
import java.util.Optional;
1416

17+
import org.jspecify.annotations.Nullable;
1518
import org.junit.platform.console.tasks.ConsoleTestExecutor;
1619

1720
import picocli.CommandLine;
1821
import picocli.CommandLine.Command;
1922
import picocli.CommandLine.IExitCodeGenerator;
20-
import picocli.CommandLine.Mixin;
2123
import picocli.CommandLine.Model.CommandSpec;
2224
import picocli.CommandLine.Option;
2325
import picocli.CommandLine.ParameterException;
@@ -50,12 +52,10 @@ class MainCommand implements Runnable, IExitCodeGenerator {
5052
@Option(names = "--version", versionHelp = true, description = "Display version information.")
5153
private boolean versionRequested;
5254

53-
@Mixin
54-
AnsiColorOptionMixin ansiColorOption;
55-
5655
@Spec
5756
CommandSpec commandSpec;
5857

58+
@Nullable
5959
CommandResult<?> commandResult;
6060

6161
MainCommand(ConsoleTestExecutor.Factory consoleTestExecutorFactory) {
@@ -79,7 +79,7 @@ else if (versionRequested) {
7979

8080
@Override
8181
public int getExitCode() {
82-
return commandResult.getExitCode();
82+
return requireNonNull(commandResult).getExitCode();
8383
}
8484

8585
CommandResult<?> run(String[] args,

junit-platform-console/src/main/java/org/junit/platform/console/options/TestConsoleOutputOptions.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.Locale;
1717

1818
import org.apiguardian.api.API;
19+
import org.jspecify.annotations.Nullable;
1920

2021
/**
2122
* @since 1.10
@@ -28,11 +29,18 @@ public class TestConsoleOutputOptions {
2829
static final Theme DEFAULT_THEME = Theme.valueOf(ConsoleUtils.charset());
2930

3031
private boolean ansiColorOutputDisabled;
32+
33+
@Nullable
3134
private Path colorPalettePath;
35+
3236
private boolean isSingleColorPalette;
3337
private Details details = DEFAULT_DETAILS;
3438
private Theme theme = DEFAULT_THEME;
39+
40+
@Nullable
3541
private Path stdoutPath;
42+
43+
@Nullable
3644
private Path stderrPath;
3745

3846
public boolean isAnsiColorOutputDisabled() {
@@ -43,11 +51,12 @@ public void setAnsiColorOutputDisabled(boolean ansiColorOutputDisabled) {
4351
this.ansiColorOutputDisabled = ansiColorOutputDisabled;
4452
}
4553

54+
@Nullable
4655
public Path getColorPalettePath() {
4756
return colorPalettePath;
4857
}
4958

50-
public void setColorPalettePath(Path colorPalettePath) {
59+
public void setColorPalettePath(@Nullable Path colorPalettePath) {
5160
this.colorPalettePath = colorPalettePath;
5261
}
5362

@@ -76,22 +85,24 @@ public void setTheme(Theme theme) {
7685
}
7786

7887
@API(status = INTERNAL, since = "1.13")
88+
@Nullable
7989
public Path getStdoutPath() {
8090
return this.stdoutPath;
8191
}
8292

8393
@API(status = INTERNAL, since = "1.13")
84-
public void setStdoutPath(Path stdoutPath) {
94+
public void setStdoutPath(@Nullable Path stdoutPath) {
8595
this.stdoutPath = stdoutPath;
8696
}
8797

8898
@API(status = INTERNAL, since = "1.13")
99+
@Nullable
89100
public Path getStderrPath() {
90101
return this.stderrPath;
91102
}
92103

93104
@API(status = INTERNAL, since = "1.13")
94-
public void setStderrPath(Path stderrPath) {
105+
public void setStderrPath(@Nullable Path stderrPath) {
95106
this.stderrPath = stderrPath;
96107
}
97108

junit-platform-console/src/main/java/org/junit/platform/console/options/TestConsoleOutputOptionsMixin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
import java.nio.file.Path;
1818

19+
import org.jspecify.annotations.Nullable;
20+
1921
import picocli.CommandLine.ArgGroup;
2022
import picocli.CommandLine.Option;
2123

@@ -26,6 +28,7 @@ class TestConsoleOutputOptionsMixin {
2628

2729
static class ConsoleOutputOptions {
2830

31+
@Nullable
2932
@Option(names = "--color-palette", paramLabel = "FILE", description = "Specify a path to a properties file to customize ANSI style of output (not supported by all terminals).")
3033
private Path colorPalette;
3134

@@ -41,9 +44,11 @@ static class ConsoleOutputOptions {
4144
+ "Use one of: ${COMPLETION-CANDIDATES}. Default is detected based on default character encoding.")
4245
private final Theme theme = DEFAULT_THEME;
4346

47+
@Nullable
4448
@Option(names = "--redirect-stdout", paramLabel = "FILE", description = "Redirect test output to stdout to a file.")
4549
private Path stdout;
4650

51+
@Nullable
4752
@Option(names = "--redirect-stderr", paramLabel = "FILE", description = "Redirect test output to stderr to a file.")
4853
private Path stderr;
4954

junit-platform-console/src/main/java/org/junit/platform/console/options/TestDiscoveryOptions.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.Map;
2525

2626
import org.apiguardian.api.API;
27+
import org.jspecify.annotations.Nullable;
2728
import org.junit.platform.engine.DiscoverySelector;
2829
import org.junit.platform.engine.DiscoverySelectorIdentifier;
2930
import org.junit.platform.engine.discovery.ClassSelector;
@@ -46,6 +47,8 @@ public class TestDiscoveryOptions {
4647

4748
private boolean scanClasspath;
4849
private List<Path> additionalClasspathEntries = emptyList();
50+
51+
@Nullable
4952
private List<Path> selectedClasspathEntries = emptyList();
5053

5154
private boolean scanModulepath;
@@ -104,11 +107,12 @@ public void setAdditionalClasspathEntries(List<Path> additionalClasspathEntries)
104107
this.additionalClasspathEntries = additionalClasspathEntries;
105108
}
106109

110+
@Nullable
107111
public List<Path> getSelectedClasspathEntries() {
108112
return this.selectedClasspathEntries;
109113
}
110114

111-
public void setSelectedClasspathEntries(List<Path> selectedClasspathEntries) {
115+
public void setSelectedClasspathEntries(@Nullable List<Path> selectedClasspathEntries) {
112116
this.selectedClasspathEntries = selectedClasspathEntries;
113117
}
114118

junit-platform-console/src/main/java/org/junit/platform/console/options/TestDiscoveryOptionsMixin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.List;
1717
import java.util.Map;
1818

19+
import org.jspecify.annotations.Nullable;
1920
import org.junit.platform.engine.DiscoverySelectorIdentifier;
2021
import org.junit.platform.engine.discovery.ClassNameFilter;
2122
import org.junit.platform.engine.discovery.ClassSelector;
@@ -50,6 +51,7 @@ class TestDiscoveryOptionsMixin {
5051

5152
static class SelectorOptions {
5253

54+
@Nullable
5355
@Option(names = { "--scan-classpath",
5456
"--scan-class-path" }, converter = ClasspathEntriesConverter.class, paramLabel = "PATH", arity = "0..1", description = "Scan all directories on the classpath or explicit classpath roots. " //
5557
+ "Without arguments, only directories on the system classpath as well as additional classpath " //

junit-platform-console/src/main/java/org/junit/platform/console/tasks/DiscoveryRequestCreator.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,14 @@ private static List<ClasspathRootSelector> createClasspathRootSelectors(TestDisc
8282
}
8383

8484
private static Set<Path> determineClasspathRoots(TestDiscoveryOptions options) {
85-
if (options.getSelectedClasspathEntries().isEmpty()) {
85+
var selectedClasspathEntries = Preconditions.notNull(options.getSelectedClasspathEntries(),
86+
() -> "No classpath entries selected");
87+
if (selectedClasspathEntries.isEmpty()) {
8688
Set<Path> rootDirs = new LinkedHashSet<>(ReflectionUtils.getAllClasspathRootDirectories());
8789
rootDirs.addAll(options.getExistingAdditionalClasspathEntries());
8890
return rootDirs;
8991
}
90-
return new LinkedHashSet<>(options.getSelectedClasspathEntries());
92+
return new LinkedHashSet<>(selectedClasspathEntries);
9193
}
9294

9395
private static void addFilters(LauncherDiscoveryRequestBuilder requestBuilder, TestDiscoveryOptions options,

0 commit comments

Comments
 (0)