Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions experiments/unit-tests/2/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/mods/
/target-test/
/src/module-info.java
/test/module-info.java
28 changes: 28 additions & 0 deletions experiments/unit-tests/2/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
jarfile := junit-platform-console-standalone-1.6.2.jar

.PHONY: test

test: mods/$(jarfile) target-test/one.jar
javahms -p mods/$(jarfile):target-test/one.jar \
-m org.junit.platform.console.standalone/org.junit.platform.console.ConsoleLauncher \
-o one

target-test/one.jar: mods/$(jarfile)
cp module-info-src.java src/module-info.java
modulec src

rm -rf target-test/classes
mkdir -p target-test
cp -r target/classes target-test/classes
rm src/module-info.java
cp module-info-test.java test/module-info.java
modulec -p mods/$(jarfile) -o target-test test

mods/$(jarfile): mods
cp ../junit-jupiter/target/$(jarfile) $@

mods:
mkdir mods

clean:
rm -rf mods src/module-info.java test/module-info.java target target-test
9 changes: 9 additions & 0 deletions experiments/unit-tests/2/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
This experiment tries to run unit test with JUnit 5 using the "standard" or
"naive" approach to whitebox unit testing with hybrid modules:

1. The modular JAR contains both the module and the unit tests, with a
module-info.class containing the union (module-info-test.java).

2. The console launcher non-modular JAR has been changed into a modular JAR.

3. (2) must require (1) in order to observe that module.
3 changes: 3 additions & 0 deletions experiments/unit-tests/2/module-info-src.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module one {
exports one.exported;
}
9 changes: 9 additions & 0 deletions experiments/unit-tests/2/module-info-test.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// JUnit 5 needs reflective access to package-private test classes and methods,
// which is typical of JUnit 5, so open the test module.
open module one {
// Module requirements:
exports one.exported;

// Additional unit test requirements:
requires org.junit.platform.console.standalone;
}
7 changes: 7 additions & 0 deletions experiments/unit-tests/2/src/one/exported/PackagePrivate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package one.exported;

class PackagePrivate {
public static final int PUBLIC = 10;
static final int PACKAGE_PRIVATE = 11;
private static final int PRIVATE = 12;
}
7 changes: 7 additions & 0 deletions experiments/unit-tests/2/src/one/exported/Public.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package one.exported;

public class Public {
public static final int PUBLIC = 1;
static final int PACKAGE_PRIVATE = 2;
private static final int PRIVATE = 3;
}
7 changes: 7 additions & 0 deletions experiments/unit-tests/2/src/one/internal/PackagePrivate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package one.internal;

class PackagePrivate {
public static final int PUBLIC = 10;
static final int PACKAGE_PRIVATE = 11;
private static final int PRIVATE = 12;
}
7 changes: 7 additions & 0 deletions experiments/unit-tests/2/src/one/internal/Public.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package one.internal;

public class Public {
public static final int PUBLIC = 21;
static final int PACKAGE_PRIVATE = 22;
private static final int PRIVATE = 23;
}
13 changes: 13 additions & 0 deletions experiments/unit-tests/2/test/one/exported/PackagePrivateTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package one.exported;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

public class PackagePrivateTest {
@Test
void verify() {
assertEquals(11, PackagePrivate.PACKAGE_PRIVATE);
}
}
5 changes: 5 additions & 0 deletions experiments/unit-tests/2/test/one/exported/PublicTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package one.exported;

public class PublicTest {

}
13 changes: 13 additions & 0 deletions experiments/unit-tests/2/test/one/internal/PublicTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package one.internal;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

public class PublicTest {
@Test
void willPass() {
assertEquals(11, PackagePrivate.PACKAGE_PRIVATE);
}
}
37 changes: 37 additions & 0 deletions experiments/unit-tests/3/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
LIBS := mods/junit-jupiter-api-5.6.2.jar
MODULE_PATH_TEST_WO_DRIVER := target-test/one.jar:mods/junit-jupiter-api-5.6.2.jar:mods/junit-platform-commons-1.6.2.jar:mods/apiguardian-api-1.1.0.jar:mods/opentest4j-1.2.0.jar:mods/junit-platform-launcher-1.6.2.jar:mods/junit-platform-engine-1.6.2.jar
MODULE_PATH_TEST := mods/junit-jupiter-api-5.6.2.jar:mods/junit-platform-commons-1.6.2.jar:mods/apiguardian-api-1.1.0.jar:mods/opentest4j-1.2.0.jar:mods/junit-platform-launcher-1.6.2.jar:mods/junit-platform-engine-1.6.2.jar:lib/junit-jupiter-engine-5.6.2.jar

unit-tests: compile-test
javahms -p $(MODULE_PATH_TEST) -p target-test/one.jar -m \
one/no.ion.jhms.junit.jupiter.driver.Main

compile-src:
rm -rf target/classes
mkdir -p target
cp module-info-src.java src/module-info.java
modulec src

compile-test: compile-src lib/junit-jupiter-engine-5.6.2.jar
rm -rf target-test/classes
mkdir -p target-test
cp -r target/classes target-test/classes

rm src/module-info.java
rm -f test/module-info.java
ln -s ../module-info-test.java test/module-info.java
modulec -p $(MODULE_PATH_TEST) -o target-test test

modularize:
org.junit.jupiter.api@5.6.2 org.junit.platform.commons@


lib/junit-jupiter-engine-5.6.2.jar: mods/junit-jupiter-engine-5.6.2.jar lib
cp $< $@
modularize-jar -u --module-version 5.6.2 -I junit-jupiter-engine/module-info.java -f lib/junit-jupiter-engine-5.6.2.jar -p mods/apiguardian-api-1.1.0.jar -p mods/junit-jupiter-api-5.6.2.jar -p mods/junit-platform-commons-1.6.2.jar -p mods/junit-platform-engine-1.6.2.jar -p mods/opentest4j-1.2.0.jar

lib:
mkdir $@

clean:
rm -rf lib src/module-info.java test/module-info.java target target-test
45 changes: 45 additions & 0 deletions experiments/unit-tests/3/junit-jupiter-engine/module-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
module org.junit.jupiter.engine {
requires org.apiguardian.api;
requires org.junit.jupiter.api;
requires org.junit.platform.commons;
requires org.junit.platform.engine;
requires org.opentest4j;

// Need access to JupiterTestEngine
exports org.junit.jupiter.engine;

uses org.junit.jupiter.api.extension.Extension;

provides org.junit.platform.engine.TestEngine
with org.junit.jupiter.engine.JupiterTestEngine;

opens org.junit.jupiter.engine.extension to org.junit.platform.commons;
}

// Original:
/*
* Copyright 2015-2020 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
*/
// ...
// module org.junit.jupiter.engine {
// requires org.apiguardian.api;
// requires org.junit.jupiter.api;
// requires org.junit.platform.commons;
// requires org.junit.platform.engine;
// requires org.opentest4j;

// // exports org.junit.jupiter.engine; // Constants...

// uses org.junit.jupiter.api.extension.Extension;

// provides org.junit.platform.engine.TestEngine
// with org.junit.jupiter.engine.JupiterTestEngine;

// opens org.junit.jupiter.engine.extension to org.junit.platform.commons;
// }
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
3 changes: 3 additions & 0 deletions experiments/unit-tests/3/module-info-src.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module one {
exports one.exported;
}
27 changes: 27 additions & 0 deletions experiments/unit-tests/3/module-info-test.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// JUnit 5 needs reflective access to package-private test classes and methods,
// which is typical of JUnit 5, so open the test module.
open module one {
// Module requirements:
exports one.exported;

// even internal packages must be exported in the standard unit tests.
exports one.internal;

// Additional unit test requirements:
requires org.junit.jupiter.api;
// Transitive requires:
// requires transitive org.apiguardian.api;
// requires transitive org.junit.platform.commons;
// requires transitive org.opentest4j;

// Additional unit test driver requirements:
requires org.junit.platform.launcher;
// Transitive requires:
// requires transitive java.logging;
// requires transitive org.apiguardian.api;
// requires transitive org.junit.platform.commons;
// requires transitive org.junit.platform.engine;

// Pulls in JupiterTestEngine
requires org.junit.jupiter.engine;
}
7 changes: 7 additions & 0 deletions experiments/unit-tests/3/src/one/exported/PackagePrivate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package one.exported;

class PackagePrivate {
public static final int PUBLIC = 10;
static final int PACKAGE_PRIVATE = 11;
private static final int PRIVATE = 12;
}
7 changes: 7 additions & 0 deletions experiments/unit-tests/3/src/one/exported/Public.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package one.exported;

public class Public {
public static final int PUBLIC = 1;
static final int PACKAGE_PRIVATE = 2;
private static final int PRIVATE = 3;
}
7 changes: 7 additions & 0 deletions experiments/unit-tests/3/src/one/internal/PackagePrivate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package one.internal;

class PackagePrivate {
public static final int PUBLIC = 10;
static final int PACKAGE_PRIVATE = 11;
private static final int PRIVATE = 12;
}
7 changes: 7 additions & 0 deletions experiments/unit-tests/3/src/one/internal/Public.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package one.internal;

public class Public {
public static final int PUBLIC = 21;
static final int PACKAGE_PRIVATE = 22;
private static final int PRIVATE = 23;
}
Binary file added experiments/unit-tests/3/target-test/one.jar
Binary file not shown.
1 change: 1 addition & 0 deletions experiments/unit-tests/3/test/module-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package no.ion.jhms.junit.jupiter.driver;

import org.junit.jupiter.engine.JupiterTestEngine;
import org.junit.platform.engine.discovery.ClassSelector;
import org.junit.platform.engine.discovery.DiscoverySelectors;
import org.junit.platform.launcher.Launcher;
import org.junit.platform.launcher.LauncherDiscoveryRequest;
import org.junit.platform.launcher.core.LauncherConfig;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
import org.junit.platform.launcher.listeners.TestExecutionSummary;

import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
public static void main(String... args) {

var config = LauncherConfig.builder();
config.addTestEngines(new JupiterTestEngine());
Launcher factory = LauncherFactory.create(config.build());

LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder
.request()
//.selectors(DiscoverySelectors.selectClass(one.exported.PublicTest.class))
.selectors(ofClasses("one.exported.PublicTest", "one.exported.PackagePrivateTest", "one.internal.PublicTest"))
.build();

// Jupiter use context class loader if set, or otherwise the app/system class loader.
// Instead, it should use the hybrid module class loader. Hope threads are not crossed...
Thread.currentThread().setContextClassLoader(Main.class.getClassLoader());

var listener = new SummaryGeneratingListener();
factory.registerTestExecutionListeners(listener);
factory.execute(request);

TestExecutionSummary summary = listener.getSummary();
summary.printTo(new PrintWriter(System.out));
summary.getFailures().forEach(failure -> {
System.out.println(failure.getTestIdentifier());
failure.getException().printStackTrace();
});
}

private static List<ClassSelector> ofClasses(String... classNames) {
return Arrays.stream(classNames).map(Main::ofClass).collect(Collectors.toList());
}

private static ClassSelector ofClass(String className) {
return DiscoverySelectors.selectClass(findClass(className));
}

private static Class<?> findClass(String binaryClassName) {
ClassLoader classLoader = Main.class.getClassLoader();
try {
return classLoader.loadClass(binaryClassName);
} catch (ClassNotFoundException e) {
throw new NoClassDefFoundError(binaryClassName);
}
}
}
13 changes: 13 additions & 0 deletions experiments/unit-tests/3/test/one/exported/PackagePrivateTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package one.exported;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

public class PackagePrivateTest {
@Test
void willFail() {
assertEquals(-1, PackagePrivate.PACKAGE_PRIVATE);
}
}
12 changes: 12 additions & 0 deletions experiments/unit-tests/3/test/one/exported/PublicTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package one.exported;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class PublicTest {
@Test
void willPass() {
assertEquals(1, Public.PUBLIC);
}
}
12 changes: 12 additions & 0 deletions experiments/unit-tests/3/test/one/internal/PublicTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package one.internal;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class PublicTest {
@Test
void willPass() {
assertEquals(11, PackagePrivate.PACKAGE_PRIVATE);
}
}
Loading