NORTHSET
Proof-of-Pass Receipt — M-007
CONTRIBUTOR SELF-RUN — NOT MAINTAINER VERIFICATION
Project
Work
`BytecodeClasses.toString()` and `root()` throw `NullPointerException` when `input` is null while `classes()` provides a descriptive error · PR #1573
Verification execution
runtime: northset-oss executor v0
human operator: aeziz
Code
- base
5e770723809effb4db5fba8b8e1f372da5318b62- recorded patch commit
c8f904b93482c66ecab3cc7954be87d9cd170979
declared metadata; not execution-bound- patch diff SHA-256
sha256:166dfda67801f85169b655791fc9b7590e1ac880887252aad3ef55488b8e70a2
bound to executed patch bytes
Environment
- image reference
- maven:3.9-eclipse-temurin-11
- repository digest
maven@sha256:1fee93ca227db7e8b8c7c72752ada0f03da6ebab40addd6fe48ac6293424186c- network
- phaseA:bridge,phaseB:none
Declared checks
Execution summary
2/2 declared commands returned exit 0 in the recorded environment
mvn -o -Dmaven.repo.local=/workspace/.m2 test -ntp --errors --batch-mode -Dtest=BytecodeClassesTestexit 0 · 7s
mvn -o -Dmaven.repo.local=/workspace/.m2 qulice:check -Pqulice -ntp --errors --batch-modeexit 0 · 34.9s
unclassified executor time (derived residual) 5m14s
run wall (derived from recorded timestamps) 5m55s
PASS — 2/2 declared commands
Every command listed returned exit 0 in the declared environment. Only the listed commands are in scope. Unlisted test, lint, typecheck, build, coverage, compiler, full-suite, and CI gates are not implied or recorded.
Public scope interpretation
Declared network-off checks cover this change's regression tests plus the repository's full Qulice static-quality gate on JDK 11; the repository's complete canonical gate (mvn clean install -Pqulice) cannot run offline because its test suite downloads an XSD from eolang.org at test time, so it ran online on the same patched tree as the disclosed phase-A install commands; upstream CI additionally tests JDK 23 and more platforms.
Record details
- payment
- none · not merge-contingent
- redactions
- 1 jwt
- Bundle contents digest
sha256:2b9d2cce359df63c089cb5f0b0b4ac8b5d71cf2980b486141f313f16b0fce4d1- Signed asset SHA-256
sha256:eba4d0fc7e3b20e39a0cd272c6c44b05ba71dff174a30ee39d64330aa948f522- Signed provenance recorded
- verified 2026-07-14T14:21:48Z
NOT INCLUDED
- Does not prove code quality
- Does not prove security
- Contributor self-run record of Northset's own contribution; not the maintainer's verification.
- Declared network-off checks cover this change's regression tests plus the repository's full Qulice static-quality gate on JDK 11; the repository's complete canonical gate (mvn clean install -Pqulice) cannot run offline because its test suite downloads an XSD from eolang.org at test time, so it ran online on the same patched tree as the disclosed phase-A install commands; upstream CI additionally tests JDK 23 and more platforms.
Signed bundle
Verify this receipt
gh attestation verify run-record-M-007.tar.gz --repo northset-oss/verification-pilot --signer-workflow northset-oss/verification-pilot/.github/workflows/attest-bundle.ymlAttestation confirms that Northset's signing workflow produced this exact bundle. The signer does not witness the recorded run, and verification does not turn it into maintainer verification.
QR → receipt pageCommitted patch.diff
diff --git a/src/main/java/org/eolang/jeo/BytecodeClasses.java b/src/main/java/org/eolang/jeo/BytecodeClasses.java
index 435b708d1d9ac5ff03dfbd4df2352b6b769f652d..7c1dde6db3957c958860e0c4b3e4c281c3682215 100644
--- a/src/main/java/org/eolang/jeo/BytecodeClasses.java
+++ b/src/main/java/org/eolang/jeo/BytecodeClasses.java
@@ -40,7 +40,7 @@ final class BytecodeClasses implements Classes {
@Override
public String toString() {
- return this.input.toString();
+ return this.checked().toString();
}
@Override
@@ -50,7 +50,7 @@ final class BytecodeClasses implements Classes {
@Override
public Path root() {
- return this.input;
+ return this.checked();
}
@Override
@@ -76,19 +76,28 @@ final class BytecodeClasses implements Classes {
}
/**
- * Find all bytecode files.
- * @return Collection of bytecode files
- * @throws IOException If some I/O problem arises
+ * Check that the classes directory is set.
+ * @return Classes directory
*/
- private Collection<Path> classes() throws IOException {
+ private Path checked() {
if (Objects.isNull(this.input)) {
throw new IllegalStateException(
"The classes directory is not set, jeo-maven-plugin does not know where to look for classes."
);
}
+ return this.input;
+ }
+
+ /**
+ * Find all bytecode files.
+ * @return Collection of bytecode files
+ * @throws IOException If some I/O problem arises
+ */
+ private Collection<Path> classes() throws IOException {
+ final Path directory = this.checked();
final Collection<Path> result;
- if (Files.exists(this.input)) {
- try (Stream<Path> walk = Files.walk(this.input)) {
+ if (Files.exists(directory)) {
+ try (Stream<Path> walk = Files.walk(directory)) {
result = walk
.filter(Files::isRegularFile)
.filter(path -> path.toString().endsWith(".class"))
@@ -99,7 +108,7 @@ final class BytecodeClasses implements Classes {
this,
String.format(
"The classes directory '%s' does not exist, jeo-maven-plugin does not know where to look for classes.",
- this.input
+ directory
)
);
result = Collections.emptyList();
diff --git a/src/test/java/org/eolang/jeo/BytecodeClassesTest.java b/src/test/java/org/eolang/jeo/BytecodeClassesTest.java
index 73621ac576b2f8eabe702ed8e59bb859eb64f925..ce84e8603743a9268810249cca6cfb5d64ff401e 100644
--- a/src/test/java/org/eolang/jeo/BytecodeClassesTest.java
+++ b/src/test/java/org/eolang/jeo/BytecodeClassesTest.java
@@ -8,6 +8,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
/**
@@ -26,6 +27,32 @@ final class BytecodeClassesTest {
);
}
+ @Test
+ void throwsDescriptiveExceptionWhenConvertingNullInputToString() {
+ final IllegalStateException exception = Assertions.assertThrows(
+ IllegalStateException.class,
+ () -> new BytecodeClasses(null).toString()
+ );
+ MatcherAssert.assertThat(
+ "BytecodeClasses toString() should describe the missing classes directory",
+ exception.getMessage(),
+ Matchers.containsString("The classes directory is not set")
+ );
+ }
+
+ @Test
+ void throwsDescriptiveExceptionWhenGettingRootFromNullInput() {
+ final IllegalStateException exception = Assertions.assertThrows(
+ IllegalStateException.class,
+ () -> new BytecodeClasses(null).root()
+ );
+ MatcherAssert.assertThat(
+ "BytecodeClasses root() should describe the missing classes directory",
+ exception.getMessage(),
+ Matchers.containsString("The classes directory is not set")
+ );
+ }
+
@Test
void doesNotThrowExceptionOnAbsentDirectory() {
final Path path = Paths.get("/dev/null/absent");
Redacted stdout
=== cmd 1: mvn -o -Dmaven.repo.local=/workspace/.m2 test -ntp --errors --batch-mode -Dtest=BytecodeClassesTest ===
Can not write to /root/.m2/copy_reference_file.log. Wrong volume permissions? Carrying on ...
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< org.eolang:jeo-maven-plugin >---------------------
[INFO] Building jeo 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- enforcer:3.6.1:enforce (enforce-maven) @ jeo-maven-plugin ---
[INFO] Rule 0: org.apache.maven.enforcer.rules.version.RequireMavenVersion passed
[INFO]
[INFO] --- buildnumber:3.2.1:create (jcabi-build-number) @ jeo-maven-plugin ---
[INFO] maven is executed in offline mode, Updating project files from SCM: skipped.
[INFO] ShortRevision tag detected. The value is '7'.
[INFO] Executing: /bin/sh -c cd '/workspace' && 'git' 'log' '-1' '--no-merges' '--format=format:%H %aI %aE %aN'
[INFO] Working directory: /workspace
[INFO] Storing buildNumber: 4d033aa at timestamp: 2026-07-11T23:13:08
[INFO] Executing: /bin/sh -c cd '/workspace' && 'git' 'symbolic-ref' 'HEAD'
[INFO] Working directory: /workspace
[WARNING] Cannot get the branch information from the git repository:
Detecting the current branch failed: fatal: ref HEAD is not a symbolic ref
[INFO] ShortRevision tag detected. The value is '7'.
[INFO] Executing: /bin/sh -c cd '/workspace' && 'git' 'log' '-1' '--no-merges' '--format=format:%H %aI %aE %aN'
[INFO] Working directory: /workspace
[INFO] Storing scmBranch: UNKNOWN
[INFO]
[INFO] --- buildnumber:3.2.1:create-timestamp (jcabi-build-number) @ jeo-maven-plugin ---
[INFO] Skipping because we are not in root module.
[INFO]
[INFO] --- plugin:3.15.1:helpmojo (default) @ jeo-maven-plugin ---
[INFO]
[INFO] --- resources:3.5.0:resources (default-resources) @ jeo-maven-plugin ---
[INFO] Copying 7 resources from src/main/resources to target/classes
[INFO]
[INFO] --- resources:3.5.0:copy-resources (copy-resources) @ jeo-maven-plugin ---
[INFO] Copying 1 resource from . to target/classes
[INFO]
[INFO] --- compiler:3.14.0:compile (java-compile) @ jeo-maven-plugin ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] --- compiler:3.14.0:compile (compile-helpmojo) @ jeo-maven-plugin ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] --- plugin:3.15.1:descriptor (default-descriptor) @ jeo-maven-plugin ---
[INFO] Using 'UTF-8' encoding to read mojo source files.
[INFO] java-annotations mojo extractor found 3 mojo descriptors.
[INFO] java-javadoc mojo extractor found 0 mojo descriptor.
[INFO] ant mojo extractor found 0 mojo descriptor.
[INFO] bsh mojo extractor found 0 mojo descriptor.
[INFO]
[INFO] --- plugin:3.15.1:descriptor (default) @ jeo-maven-plugin ---
[INFO] Using 'UTF-8' encoding to read mojo source files.
[INFO] java-annotations mojo extractor found 3 mojo descriptors.
[INFO] java-javadoc mojo extractor found 0 mojo descriptor.
[INFO] ant mojo extractor found 0 mojo descriptor.
[INFO] bsh mojo extractor found 0 mojo descriptor.
[INFO]
[INFO] --- plugin:3.15.1:descriptor (mojo-descriptor) @ jeo-maven-plugin ---
[INFO] Using 'UTF-8' encoding to read mojo source files.
[INFO] java-annotations mojo extractor found 3 mojo descriptors.
[INFO] java-javadoc mojo extractor found 0 mojo descriptor.
[INFO] ant mojo extractor found 0 mojo descriptor.
[INFO] bsh mojo extractor found 0 mojo descriptor.
[INFO]
[INFO] --- resources:3.5.0:testResources (default-testResources) @ jeo-maven-plugin ---
[INFO] Copying 22 resources from src/test/resources to target/test-classes
[INFO]
[INFO] --- compiler:3.14.0:testCompile (java-test-compile) @ jeo-maven-plugin ---
[INFO] Nothing to compile - all classes are up to date.
[INFO]
[INFO] --- surefire:3.5.4:test (default-test) @ jeo-maven-plugin ---
[INFO] Tests will run in random order. To reproduce ordering use flag -Dsurefire.runOrder.random.seed=409379750479709
[INFO] Surefire report directory: /workspace/target/surefire-reports
[INFO] Using auto detected provider org.apache.maven.[REDACTED:jwt]
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.eolang.jeo.BytecodeClassesTest
23:13:13 [WARN] org.eolang.jeo.BytecodeClasses: The classes directory '/dev/null/absent' does not exist, jeo-maven-plugin does not know where to look for classes.
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.105 s -- in org.eolang.jeo.BytecodeClassesTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.196 s
[INFO] Finished at: 2026-07-11T23:13:13Z
[INFO] ------------------------------------------------------------------------
=== cmd 2: mvn -o -Dmaven.repo.local=/workspace/.m2 qulice:check -Pqulice -ntp --errors --batch-mode ===
Can not write to /root/.m2/copy_reference_file.log. Wrong volume permissions? Carrying on ...
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< org.eolang:jeo-maven-plugin >---------------------
[INFO] Building jeo 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- qulice:0.24.0:check (default-cli) @ jeo-maven-plugin ---
[INFO] Calling org.apache.maven.plugins:maven-enforcer-plugin:3.1.0:enforce...
[INFO] This is not an SVN project
[INFO] Dependency analysis suppressed in the project via pom.xml
[INFO] Qulice quality check completed in 33s
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 33.984 s
[INFO] Finished at: 2026-07-11T23:13:48Z
[INFO] ------------------------------------------------------------------------
Redacted stderr
=== cmd 1: mvn -o -Dmaven.repo.local=/workspace/.m2 test -ntp --errors --batch-mode -Dtest=BytecodeClassesTest ===
mkdir: cannot create directory ‘/root’: Permission denied
Failed to load native library:jansi-2.4.3-2fd31c368bd5a2fe-libjansi.so. The native library file at /tmp/jansi-2.4.3-2fd31c368bd5a2fe-libjansi.so is not executable, make sure that the directory is mounted on a partition without the noexec flag, or set the jansi.tmpdir system property to point to a proper location. osinfo: Linux/arm64
java.lang.UnsatisfiedLinkError: /tmp/jansi-2.4.3-2fd31c368bd5a2fe-libjansi.so: /tmp/jansi-2.4.3-2fd31c368bd5a2fe-libjansi.so: failed to map segment from shared object
SLF4J(W): Class path contains multiple SLF4J providers.
SLF4J(W): Found provider [org.slf4j.reload4j.Reload4jServiceProvider@6c130c45]
SLF4J(W): Found provider [ch.qos.logback.classic.spi.LogbackServiceProvider@50ad3bc1]
SLF4J(W): Found provider [org.slf4j.simple.SimpleServiceProvider@223aa2f7]
SLF4J(W): See https://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J(I): Actual provider is of type [org.slf4j.reload4j.Reload4jServiceProvider@6c130c45]
=== cmd 2: mvn -o -Dmaven.repo.local=/workspace/.m2 qulice:check -Pqulice -ntp --errors --batch-mode ===
mkdir: cannot create directory ‘/root’: Permission denied
Failed to load native library:jansi-2.4.3-8331c5d90999722e-libjansi.so. The native library file at /tmp/jansi-2.4.3-8331c5d90999722e-libjansi.so is not executable, make sure that the directory is mounted on a partition without the noexec flag, or set the jansi.tmpdir system property to point to a proper location. osinfo: Linux/arm64
java.lang.UnsatisfiedLinkError: /tmp/jansi-2.4.3-8331c5d90999722e-libjansi.so: /tmp/jansi-2.4.3-8331c5d90999722e-libjansi.so: failed to map segment from shared object