Skip to content

Commit 9d5c59c

Browse files
committed
feat: log invalid search path roots (#4772)
1 parent 83b973c commit 9d5c59c

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

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

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,18 @@
2424
import static org.junit.platform.launcher.TagFilter.includeTags;
2525
import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request;
2626

27+
import java.nio.file.Files;
2728
import java.nio.file.Path;
29+
import java.util.HashSet;
2830
import java.util.LinkedHashSet;
2931
import java.util.List;
3032
import java.util.Objects;
3133
import java.util.Set;
3234
import java.util.regex.Pattern;
3335
import java.util.stream.Stream;
3436

37+
import org.junit.platform.commons.logging.Logger;
38+
import org.junit.platform.commons.logging.LoggerFactory;
3539
import org.junit.platform.commons.util.ModuleUtils;
3640
import org.junit.platform.commons.util.Preconditions;
3741
import org.junit.platform.commons.util.ReflectionUtils;
@@ -49,6 +53,8 @@
4953
*/
5054
class DiscoveryRequestCreator {
5155

56+
private static final Logger logger = LoggerFactory.getLogger(DiscoveryRequestCreator.class);
57+
5258
static LauncherDiscoveryRequestBuilder toDiscoveryRequestBuilder(TestDiscoveryOptions options) {
5359
LauncherDiscoveryRequestBuilder requestBuilder = request();
5460
List<? extends DiscoverySelector> selectors = createDiscoverySelectors(options);
@@ -87,9 +93,37 @@ private static Set<Path> determineClasspathRoots(TestDiscoveryOptions options) {
8793
if (selectedClasspathEntries.isEmpty()) {
8894
Set<Path> rootDirs = new LinkedHashSet<>(ReflectionUtils.getAllClasspathRootDirectories());
8995
rootDirs.addAll(options.getExistingAdditionalClasspathEntries());
90-
return rootDirs;
96+
return validateAndLogInvalidRoots(rootDirs);
97+
}
98+
return validateAndLogInvalidRoots(new LinkedHashSet<>(selectedClasspathEntries));
99+
}
100+
101+
private static Set<Path> validateAndLogInvalidRoots(Set<Path> roots) {
102+
LinkedHashSet<Path> valid = new LinkedHashSet<>();
103+
HashSet<Path> seen = new HashSet<>();
104+
105+
for (Path root : roots) {
106+
if (!seen.add(root))
107+
continue;
108+
109+
boolean exists = Files.exists(root);
110+
boolean readable = Files.isReadable(root);
111+
boolean dirOrJar = isDirOrJar(root);
112+
113+
if (!exists || !readable || !dirOrJar) {
114+
logger.info(
115+
() -> "Ignoring invalid search path root: %s (exists=%s, readable=%s, dirOrJar=%s)".formatted(root,
116+
exists, readable, dirOrJar));
117+
continue;
118+
}
119+
valid.add(root);
91120
}
92-
return new LinkedHashSet<>(selectedClasspathEntries);
121+
122+
return valid;
123+
}
124+
125+
private static boolean isDirOrJar(Path root) {
126+
return Files.isDirectory(root) || root.toString().endsWith(".jar");
93127
}
94128

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

platform-tests/src/test/java/org/junit/platform/console/tasks/DiscoveryRequestCreatorTests.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,16 @@
2828
import java.io.File;
2929
import java.net.URI;
3030
import java.nio.file.Path;
31+
import java.nio.file.Paths;
3132
import java.util.List;
3233
import java.util.Map;
3334
import java.util.Map.Entry;
3435
import java.util.stream.Stream;
3536

3637
import org.junit.jupiter.api.Test;
3738
import org.junit.platform.commons.PreconditionViolationException;
39+
import org.junit.platform.commons.logging.LogRecordListener;
40+
import org.junit.platform.commons.logging.LoggerFactory;
3841
import org.junit.platform.console.options.TestDiscoveryOptions;
3942
import org.junit.platform.engine.Filter;
4043
import org.junit.platform.engine.UniqueId;
@@ -372,6 +375,27 @@ void convertsConfigurationParametersResources() {
372375
assertThat(configurationParameters.get("com.example.prop.second")).contains("second value");
373376
}
374377

378+
@Test
379+
void logs_when_invalid_search_path_present() {
380+
LogRecordListener listener = new LogRecordListener();
381+
LoggerFactory.addListener(listener);
382+
try {
383+
var opts = new TestDiscoveryOptions();
384+
opts.setScanClasspath(true);
385+
opts.setSelectedClasspathEntries(List.of(Paths.get("/does/not/exist")));
386+
387+
DiscoveryRequestCreator.toDiscoveryRequestBuilder(opts);
388+
389+
boolean saw = listener.stream(DiscoveryRequestCreator.class).anyMatch(
390+
r -> String.valueOf(r.getMessage()).contains("/does/not/exist"));
391+
392+
assertThat(saw).as("should log about invalid search path root").isTrue();
393+
}
394+
finally {
395+
LoggerFactory.removeListener(listener);
396+
}
397+
}
398+
375399
private LauncherDiscoveryRequest convert() {
376400
return DiscoveryRequestCreator.toDiscoveryRequestBuilder(options).build();
377401
}

0 commit comments

Comments
 (0)