blob: 4e8f160a3175284237dcbcb23a260b7408d32570 [file] [log] [blame]
/*
* Copyright 2015-2022 the original author or authors.
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v2.0 which
* accompanies this distribution and is available at
*
* https://www.eclipse.org/legal/epl-v20.html
*/
package platform.tooling.support.tests;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertLinesMatch;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.module.ModuleDescriptor;
import java.lang.module.ModuleFinder;
import java.lang.module.ModuleReference;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;
import java.util.Set;
import java.util.spi.ToolProvider;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import platform.tooling.support.Helper;
import platform.tooling.support.MavenRepo;
import platform.tooling.support.Request;
import platform.tooling.support.ThirdPartyJars;
/**
* @since 1.6
*/
class ToolProviderTests {
private static final Path LIB = Request.WORKSPACE.resolve("tool-provider-tests/lib");
@BeforeAll
static void prepareLocalLibraryDirectoryWithJUnitPlatformModules() {
try {
var lib = Files.createDirectories(LIB);
try (var directoryStream = Files.newDirectoryStream(lib, "*.jar")) {
for (Path jarFile : directoryStream) {
Files.delete(jarFile);
}
}
for (var module : Helper.loadModuleDirectoryNames()) {
if (module.startsWith("junit-platform")) {
var jar = MavenRepo.jar(module);
Files.copy(jar, lib.resolve(module + ".jar"));
}
}
ThirdPartyJars.copy(lib, "org.apiguardian", "apiguardian-api");
ThirdPartyJars.copy(lib, "org.opentest4j", "opentest4j");
}
catch (Exception e) {
throw new AssertionError("Preparing local library folder failed", e);
}
}
@Test
void findAndRunJUnitOnTheClassPath() {
try (var loader = new URLClassLoader("junit", urls(LIB), ClassLoader.getPlatformClassLoader())) {
var sl = ServiceLoader.load(ToolProvider.class, loader);
var junit = StreamSupport.stream(sl.spliterator(), false).filter(p -> p.name().equals("junit")).findFirst();
assertTrue(junit.isPresent(), "Tool 'junit' not found in: " + LIB);
assertJUnitPrintsHelpMessage(junit.get());
}
catch (IOException e) {
throw new AssertionError("Closing URLClassLoader failed: " + e, e);
}
}
@Test
void findAndRunJUnitOnTheModulePath() {
var finder = ModuleFinder.of(LIB);
var modules = finder.findAll().stream() //
.map(ModuleReference::descriptor) //
.map(ModuleDescriptor::toNameAndVersion) //
.sorted() //
.collect(Collectors.toList());
// modules.forEach(System.out::println);
var bootLayer = ModuleLayer.boot();
var configuration = bootLayer.configuration().resolveAndBind(finder, ModuleFinder.of(), Set.of());
var layer = bootLayer.defineModulesWithOneLoader(configuration, ClassLoader.getPlatformClassLoader());
var sl = ServiceLoader.load(layer, ToolProvider.class);
var junit = StreamSupport.stream(sl.spliterator(), false).filter(p -> p.name().equals("junit")).findFirst();
assertTrue(junit.isPresent(), "Tool 'junit' not found in modules: " + modules);
assertJUnitPrintsHelpMessage(junit.get());
}
private static URL[] urls(Path directory) {
try (var stream = Files.newDirectoryStream(directory, "*.jar")) {
var paths = new ArrayList<URL>();
stream.forEach(path -> paths.add(url(path)));
return paths.toArray(URL[]::new);
}
catch (Exception e) {
throw new AssertionError("Creating URL[] failed: " + e, e);
}
}
private static URL url(Path path) {
try {
return path.toUri().toURL();
}
catch (MalformedURLException e) {
throw new AssertionError("Converting path to URL failed: " + e, e);
}
}
private static void assertJUnitPrintsHelpMessage(ToolProvider junit) {
var out = new StringWriter();
var err = new StringWriter();
var code = junit.run(new PrintWriter(out), new PrintWriter(err), "--help");
assertAll(() -> assertLinesMatch(List.of( //
">> USAGE >>", //
"Launches the JUnit Platform from the console.", //
">> OPTIONS >>"), //
out.toString().lines().collect(Collectors.toList())), //
() -> assertEquals("", err.toString()), //
() -> assertEquals(0, code, "Expected exit of 0, but got: " + code) //
);
}
}