Compare commits

...
Sign in to create a new pull request.

22 commits

Author SHA1 Message Date
Mikolaj Izdebski
261e44c3fa Add deprecation notice to README.md 2025-03-24 08:47:41 +01:00
Mikolaj Izdebski
0999df51b8 Fix a typo in maven4 package name 2025-02-26 23:24:09 +01:00
Mikolaj Izdebski
26792c770b Increase generic package size limit 2025-02-26 23:09:58 +01:00
Mikolaj Izdebski
13f9485252 Configure files for maven4 2025-02-26 23:06:06 +01:00
Mikolaj Izdebski
d5d139af27 Increase allowed size for javapackages-bootstrap 2025-02-26 20:43:17 +01:00
Mikolaj Izdebski
5db07614a8 Add files whiletists for jline 2025-02-26 20:41:03 +01:00
Marian Koncek
4758ee4fda Allow junit5 to install executables 2025-02-25 10:48:31 +01:00
Mikolaj Izdebski
25bf954aac Allow public domain for plexus-utils4 2025-02-16 18:06:31 +01:00
Mikolaj Izdebski
af194b6641 Skip ExclusiveArch validation for known non-Java packages 2024-12-11 16:31:34 +01:00
Mikolaj Izdebski
75adec844b Use unnamed variables (JEP 456)
See https://openjdk.org/jeps/456
2024-12-11 07:10:11 +01:00
Mikolaj Izdebski
0cd1370868 Skip file check for javapackages-tools and javapackages-bootstrap 2024-12-02 17:57:42 +01:00
Mikolaj Izdebski
745343f757 Update to RUnit version 1.0.0
The Sonatype snapshot repository is no longer needed as RUnit 1.0.0 is
available on Maven Central, but keep it commented out in case we want
to start using RUnit snapshots again.

The list of dependencies was generated with Maven and jq:

    mvn -f ~/.m2/repository/io/kojan/runit-validator/1.0.0/runit-validator-1.0.0.pom \
            dependency:tree -Dscope=runtime -DoutputType=json -DoutputFile=/dev/fd/3 3>&1 1>&2 |
	jq -r 'recurse(.children[]?) | ("  " + .groupId + ":" + .artifactId + ":" + .version + " \\")' |
	sort
2024-11-30 10:26:48 +01:00
Mikolaj Izdebski
50e2e10695 Drop unneeded imports 2024-11-29 09:50:19 +01:00
Mikolaj Izdebski
c9fe403c5e Allow versioned apache-commons JPMS provides 2024-11-29 09:38:17 +01:00
Mikolaj Izdebski
27b31452b9 Use RUnitMatchers for matching apache-commons JPMS provides 2024-11-29 09:24:43 +01:00
Mikolaj Izdebski
1433c52224 Enable apache-commons JPMS provides check 2024-11-29 07:33:03 +01:00
Mikolaj Izdebski
4d05ece41c Use RUnitMatchers for matching bundled provides 2024-11-29 07:28:59 +01:00
Mikolaj Izdebski
5f09737c33 Add check for Conflicts 2024-11-29 07:28:19 +01:00
Mikolaj Izdebski
cfa4787b3b Remove duplitcate checks irrelevant for Fedora 42+ 2024-11-29 07:17:24 +01:00
Mikolaj Izdebski
d633634528 Fix jpackage_script check 2024-11-29 07:07:02 +01:00
Mikolaj Izdebski
ed92ce4e3b Allow duplicate files in ant-openjdk* 2024-11-24 19:22:41 +01:00
Mikolaj Izdebski
b86f2bd711 Add /jpackage_script check 2024-11-23 18:47:02 +00:00
11 changed files with 117 additions and 60 deletions

View file

@ -1,23 +1,5 @@
# javapackages-validator-tests
# Deprecated
This repository contains the `.fmf` test files referenced by packages that are tested by _javapackages-validator_ tool.
This repository is deprecated.
## Versioning
The version scheme is based on Fedora versions (`f<NUM>`).
Changes made to a single branch must be backwards compatible or fix a bug.
Breaking changes can be made to a branch that corresponds to the Rawhide branch at the time of submission.
Packages then explicitly update their git reference and new versions of the package will be tested with the new tests.
This approach ensures that changes to old versions of packages will not be tested with possibly incompatible tests.
## Forking
If you wish to fork this project and add your own tests, you should follow these steps:
1. Add a source directory (e.g. `src`) with your own validators.
2. Add a text [service file](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/ServiceLoader.html) named `org.fedoraproject.javapackages.validator.Validator` into the same directory.
This file contains fully-qualified class names of validators which you want to use, one name per line.
Javapackages-validator will run all the validators listed in the service file, unless they have been explicitly filtered using per-package configuration.
This is explained in the project documentation.
Javapackages tests were moved to https://gitlab.com/redhat/centos-stream/tests/javapackages

View file

@ -25,16 +25,6 @@ public class DuplicateFileValidatorJP extends DefaultDuplicateFileValidator {
return providerRpms.stream().map(Common::getPackageName).distinct().count() == 1;
}
// FIXME this only applies to Fedora < 42
if (providerRpms.stream().allMatch(rpm -> rpm.getName().startsWith("maven-openjdk"))) {
return true;
}
// FIXME this only applies to Fedora < 42
if (providerRpms.stream().allMatch(rpm -> rpm.getName().startsWith("maven-local-openjdk"))) {
return true;
}
return false;
}
}

View file

@ -2,16 +2,20 @@ package org.fedoraproject.javapackages.validator.validators.jp;
import java.nio.file.Path;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.fedoraproject.javapackages.validator.spi.Decorated;
import org.fedoraproject.javapackages.validator.util.Common;
import org.fedoraproject.javapackages.validator.util.FilesValidator;
import io.kojan.javadeptools.rpm.RpmInfo;
import io.kojan.javadeptools.rpm.RpmPackage;
public class FilesValidatorJP extends FilesValidator {
@Override
@ -36,6 +40,12 @@ public class FilesValidatorJP extends FilesValidator {
static final String USR_LIB_BUILD_ID = "/usr/lib/.build-id";
}
private static Set<String> ignoredComponents = new LinkedHashSet<>();
static {
ignoredComponents.add("javapackages-bootstrap");
ignoredComponents.add("javapackages-tools");
}
private static Map<String, List<String>> nameAliases = new TreeMap<>();
static {
nameAliases.put("maven-resolver", List.of("aether"));
@ -57,9 +67,11 @@ public class FilesValidatorJP extends FilesValidator {
prefixes.put("jansi", List.of(Prefix.USR_LIB_BUILD_ID));
prefixes.put("javacc", List.of(Prefix.USR_BIN));
prefixes.put("java_cup", List.of(Prefix.USR_BIN));
prefixes.put("javapackages-bootstrap", List.of("/usr/lib/java/javapackages-bootstrap", "/usr/lib/javapackages-bootstrap", "/usr/lib/rpm", "/etc/rpm", "/usr/libexec/javapackages-bootstrap"));
prefixes.put("jflex", List.of(Prefix.USR_BIN));
prefixes.put("jline", List.of(Prefix.USR_LIB_BUILD_ID));
prefixes.put("junit5", List.of(Prefix.USR_BIN));
prefixes.put("maven", List.of(Prefix.ETC_PKG, Prefix.ETC_JAVA, Prefix.JPBINDING, Prefix.USR_BIN));
prefixes.put("maven4", List.of(Prefix.ETC_PKG, Prefix.ETC_JAVA, Prefix.JPBINDING, Prefix.USR_BIN));
prefixes.put("modello", List.of(Prefix.USR_BIN));
prefixes.put("objectweb-asm", List.of(Prefix.USR_BIN));
prefixes.put("xerces-j2", List.of(Prefix.USR_BIN));
@ -72,7 +84,9 @@ public class FilesValidatorJP extends FilesValidator {
static {
exceptionalFiles.put("aqute-bnd", List.of("/etc/ant.d/aqute-bnd"));
exceptionalFiles.put("maven", List.of("/etc/m2.conf"));
exceptionalFiles.put("maven4", List.of("/etc/m24.conf"));
exceptionalFiles.put("jansi", List.of("/usr/lib/jansi", "/usr/lib/jansi/libjansi.so", "/usr/lib/java/jansi"));
exceptionalFiles.put("jline", List.of("/usr/lib/jline", "/usr/lib/jline/libjlinenative.so", "/usr/lib/java/jline"));
}
private static boolean namesRelated(String lhs, String rhs) {
@ -155,7 +169,7 @@ public class FilesValidatorJP extends FilesValidator {
}
if (patternsCache.computeIfAbsent(Common.getPackageName(rpm) + "/javadoc",
p -> Pattern.compile("/usr/share/javadoc/" + Common.getPackageName(rpm) + "(:?/.*)?"))
_ -> Pattern.compile("/usr/share/javadoc/" + Common.getPackageName(rpm) + "(:?/.*)?"))
.matcher(filename).matches()) {
return true;
}
@ -317,6 +331,16 @@ public class FilesValidatorJP extends FilesValidator {
return false;
}
@Override
public void validate(RpmPackage rpm) throws Exception {
if (ignoredComponents.contains(rpm.getInfo().getSourceName())) {
skip("{0}: the component {1} is ignored", Decorated.rpm(rpm),
Decorated.actual(rpm.getInfo().getSourceName()));
} else {
super.validate(rpm);
}
}
@Override
public boolean allowedFile(RpmInfo rpm, Path path) {
if (rpm.isSourcePackage()) {
@ -324,11 +348,6 @@ public class FilesValidatorJP extends FilesValidator {
return true;
}
// if (Common.getPackageName(rpm).equals("javapackages-bootstrap")) {
// // TODO
// return true;
// }
String filename = path.toString();
if (rpm.getName().equals(Common.getPackageName(rpm) + "-javadoc") || rpm.getName().equals(Common.getPackageName(rpm) + "-javadocs")) {

View file

@ -0,0 +1,27 @@
package org.fedoraproject.javapackages.validator.validators.jp;
import java.util.Set;
import org.fedoraproject.javapackages.validator.spi.Decorated;
import org.fedoraproject.javapackages.validator.validators.JavaExclusiveArchValidator;
import io.kojan.javadeptools.rpm.RpmPackage;
public class JavaExclusiveArchValidatorJP extends JavaExclusiveArchValidator {
@Override
public String getTestName() {
return "/java/jp/exclusive_arch";
}
private static final Set<String> SKIPPED = Set.of("javapackages-tools", "byaccj", "jurand");
@Override
public void validate(RpmPackage rpm) throws Exception {
String component = rpm.getInfo().getSourceName();
if (SKIPPED.contains(component)) {
skip("Skipping rpm {0}", Decorated.rpm(rpm));
return;
}
super.validate(rpm);
}
}

View file

@ -18,7 +18,7 @@ public class RpmFilesizeValidatorJP extends RpmFilesizeValidator {
}
if (Common.getPackageName(rpm).equals("javapackages-bootstrap")) {
return sizeBytes <= 40_000_000;
return sizeBytes <= 60_000_000;
}
// javadoc rpms
@ -33,6 +33,6 @@ public class RpmFilesizeValidatorJP extends RpmFilesizeValidator {
}
}
return sizeBytes <= 3_500_000;
return sizeBytes <= 4_000_000;
}
}

View file

@ -12,7 +12,7 @@ public class ValidatorFactoryGeneric implements ValidatorFactory {
return List.of(new Validator[] {
new AttributeProvidesValidator(),
new JavadocNoarchValidator(),
new JavaExclusiveArchValidator(),
new JavaExclusiveArchValidatorJP(),
new MavenMetadataValidator(),
new NoBootstrapValidator(),
});

View file

@ -1,13 +1,13 @@
compiler.release=22
repositories=https://s01.oss.sonatype.org/content/repositories/snapshots
#repositories=https://s01.oss.sonatype.org/content/repositories/snapshots
dependencies=\
io.kojan:runit-api:1.0.0-SNAPSHOT \
io.kojan:runit-validator:1.0.0-SNAPSHOT \
io.kojan:runit-api:1.0.0 \
io.kojan:runit-validator:1.0.0 \
org.apiguardian:apiguardian-api:1.1.2 \
org.hamcrest:hamcrest:2.2 \
org.junit.jupiter:junit-jupiter-api:5.10.0 \
org.junit.jupiter:junit-jupiter-engine:5.10.0 \
org.junit.platform:junit-platform-commons:1.10.0 \
org.junit.platform:junit-platform-engine:1.10.0 \
org.junit.platform:junit-platform-launcher:1.10.0 \
org.hamcrest:hamcrest:3.0 \
org.junit.jupiter:junit-jupiter-api:5.11.3 \
org.junit.jupiter:junit-jupiter-engine:5.11.3 \
org.junit.platform:junit-platform-commons:1.11.3 \
org.junit.platform:junit-platform-engine:1.11.3 \
org.junit.platform:junit-platform-launcher:1.11.3 \
org.opentest4j:opentest4j:1.3.0 \

View file

@ -1,12 +1,9 @@
package tests;
import static io.kojan.runit.api.RUnit.*;
import static io.kojan.runit.api.matcher.RUnitMatchers.*;
import static org.hamcrest.Matchers.*;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;
import io.kojan.javadeptools.rpm.*;
@ -26,12 +23,10 @@ public class ApacheCommonsCheck {
@PackageTest
@IncludeBinary("apache-commons-[a-z][a-z0-9]+")
@ExcludeBinary("apache-commons-parent") // Parent POM, no Java code
@Disabled("JPMS provides are not generated for now")
public void jpmsProvides(RpmInfo rpm) {
String id = rpm.getName().substring("apache-commons-".length());
List<String> prov = rpm.getProvides().stream().map(RpmDependency::getName).collect(Collectors.toList());
assertThat("Apache Commons packages should have jpms provides", prov,
hasItem("jpms(org.apache.commons." + id + ")"));
assertThat("Apache Commons packages should have jpms provides", rpm,
provides("jpms\\(org.apache.commons." + id + "\\)( = .*)?"));
}
@PackageTest

View file

@ -1,6 +1,7 @@
package tests;
import static io.kojan.runit.api.RUnit.*;
import static io.kojan.runit.api.matcher.RUnitMatchers.*;
import static org.hamcrest.Matchers.*;
import java.util.regex.Matcher;
@ -34,8 +35,7 @@ public class BasicCheck {
@ExcludeBinary("sisu")
@ExcludeBinary("javapackages-bootstrap")
public void bundledProvides(RpmInfo rpm) {
assertThat("No bundled(*) provides", () -> rpm.getProvides().stream().map(RpmDependency::getName).iterator(),
everyItem(not(startsWith("bundled("))));
assertThat("No bundled(*) provides", rpm, not(provides("bundled\\(.*\\)")));
}
@PackageTest
@ -48,4 +48,10 @@ public class BasicCheck {
assertThat("Binary package Release matches SRPM Release", rpm.getRelease(), is(matcher.group(3)));
}
@PackageTest
@IncludeBinary
public void noConflicts(RpmInfo rpm) {
assertThat("Packages have no explicit Conflicts", rpm, not(conflicts(".*")));
}
}

View file

@ -0,0 +1,37 @@
package tests;
import static io.kojan.runit.api.RUnit.*;
import static io.kojan.runit.api.matcher.RUnitMatchers.*;
import static org.hamcrest.Matchers.*;
import java.nio.charset.StandardCharsets;
import org.junit.jupiter.api.DisplayName;
import io.kojan.javadeptools.rpm.RpmInfo;
import io.kojan.runit.api.ExcludeFileName;
import io.kojan.runit.api.ExcludeSource;
import io.kojan.runit.api.ExcludeSymlink;
import io.kojan.runit.api.FileTest;
import io.kojan.runit.api.IncludeFileName;
@DisplayName("/jpackage_script")
public class JPackageScriptCheck {
@FileTest
@IncludeFileName("/usr/bin/.*")
@ExcludeSource
@ExcludeSymlink
@ExcludeFileName("/usr/bin/ant")
public void testJPackageScript(RpmInfo rpm, byte[] bytes) {
assumeThat("The binary is a script with a shebang", bytes.length, greaterThan(1));
assumeThat("The binary is a script with a shebang", bytes[0], is((byte)'#'));
assumeThat("The binary is a script with a shebang", bytes[1], is((byte)'!'));
String content = new String(bytes, StandardCharsets.UTF_8);
assumeThat("The script was generated with %jpackage_script", content,
containsString(". /usr/share/java-utils/java-functions\n"));
assertThat("The script explicitly sets JAVA_HOME to Java 21", content,
containsString("\nJAVA_HOME=\"${JAVA_HOME:-/usr/lib/jvm/jre-21-openjdk}\"\n"));
assertThat("Requires on java-21-openjdk-headless are present", rpm, requires("java-21-openjdk-headless"));
assertThat("Requires on javapackages-tools are present", rpm, requires("javapackages-tools"));
}
}

View file

@ -56,6 +56,7 @@ public class LicenseCheck {
private static final Set<String> PUBLIC_DOMAIN_PACKAGES = Set.of( //
"aopalliance", //
"plexus-utils", //
"plexus-utils4", //
"xz-java", //
"javapackages-bootstrap" // special case, as it it bundles all the above
);