Skip to content

Commit

Permalink
Fix package name comparison on Java 8 (#4077)
Browse files Browse the repository at this point in the history
`Class.getPackage()` returns `null` for the default package on Java 8.
This is now handled by inspecting the fully qualified class name rather
than throwing a `NullPointerException`.

Fixes #4076.
  • Loading branch information
marcphilipp authored Oct 17, 2024
1 parent 061fb41 commit 35d3dd7
Show file tree
Hide file tree
Showing 7 changed files with 98 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ on GitHub.
[[release-notes-5.11.3-junit-platform-bug-fixes]]
==== Bug Fixes

* ❓
* Fixed a regression in method search algorithms introduced in 5.11.0 when classes reside
in the default package and using a Java 8 runtime.

[[release-notes-5.11.3-junit-platform-deprecations-and-breaking-changes]]
==== Deprecations and Breaking Changes
Expand Down
1 change: 1 addition & 0 deletions junit-platform-commons/junit-platform-commons.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ tasks.jar {

tasks.codeCoverageClassesJar {
exclude("org/junit/platform/commons/util/ModuleUtils.class")
exclude("org/junit/platform/commons/util/PackageNameUtils.class")
}

eclipse {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Copyright 2015-2024 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 org.junit.platform.commons.util;

import static org.junit.platform.commons.util.PackageUtils.DEFAULT_PACKAGE_NAME;

/**
* Collection of utilities for working with package names.
*
* <h2>DISCLAIMER</h2>
*
* <p>These utilities are intended solely for usage within the JUnit framework
* itself. <strong>Any usage by external parties is not supported.</strong>
* Use at your own risk!
*
* @since 1.11.3
*/
class PackageNameUtils {

static String getPackageName(Class<?> clazz) {
Package p = clazz.getPackage();
if (p != null) {
return p.getName();
}
String className = clazz.getName();
int index = className.lastIndexOf('.');
return index == -1 ? DEFAULT_PACKAGE_NAME : className.substring(0, index);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import static org.apiguardian.api.API.Status.INTERNAL;
import static org.apiguardian.api.API.Status.STABLE;
import static org.junit.platform.commons.util.CollectionUtils.toUnmodifiableList;
import static org.junit.platform.commons.util.PackageNameUtils.getPackageName;
import static org.junit.platform.commons.util.ReflectionUtils.HierarchyTraversalMode.BOTTOM_UP;
import static org.junit.platform.commons.util.ReflectionUtils.HierarchyTraversalMode.TOP_DOWN;

Expand Down Expand Up @@ -1903,7 +1904,7 @@ private static boolean isPackagePrivate(Member member) {
}

private static boolean declaredInSamePackage(Method m1, Method m2) {
return m1.getDeclaringClass().getPackage().getName().equals(m2.getDeclaringClass().getPackage().getName());
return getPackageName(m1.getDeclaringClass()).equals(getPackageName(m2.getDeclaringClass()));
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright 2015-2024 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 org.junit.platform.commons.util;

/**
* Collection of utilities for working with package names.
*
* <h2>DISCLAIMER</h2>
*
* <p>These utilities are intended solely for usage within the JUnit framework
* itself. <strong>Any usage by external parties is not supported.</strong>
* Use at your own risk!
*
* @since 1.11.3
*/
class PackageNameUtils {

static String getPackageName(Class<?> clazz) {
return clazz.getPackageName();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@

/*
* Copyright 2015-2024 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
*/
import com.example.vintage.VintageTest;

import org.junit.Ignore;

/**
* Reproducer for https://github.com/junit-team/junit5/issues/4076
*/
@Ignore
public class DefaultPackageTest extends VintageTest {
void packagePrivateMethod() {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
import org.junit.Test;

public class VintageTest {
void packagePrivateMethod() {
}

@Test
public void success() {
// pass
Expand Down

0 comments on commit 35d3dd7

Please sign in to comment.