Skip to content

Commit

Permalink
Adds tests to verify module-info.class files in releasable artifacts
Browse files Browse the repository at this point in the history
  • Loading branch information
jqno committed Jan 19, 2025
1 parent 383c34e commit 648b518
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 1 deletion.
7 changes: 6 additions & 1 deletion equalsverifier-release-verify/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<name>EqualsVerifier | release verify</name>

<properties>
<maven.compiler.release>17</maven.compiler.release>
<maven.compiler.release>21</maven.compiler.release>

<artifact.src.main>${project.basedir}/../equalsverifier-release-main/target</artifact.src.main>
<artifact.src.nodep>${project.basedir}/../equalsverifier-release-nodep/target</artifact.src.nodep>
Expand Down Expand Up @@ -108,6 +108,11 @@
<version>${version.assertj}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>${version.bytebuddy}</version>
</dependency>
</dependencies>
</profile>
</profiles>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,9 @@ void contentOfManifest() {
void versionsOfClassFiles() {
jar.assertVersionsOfClassFiles();
}

@Test
void presenceOfModuleInfoWithDependencies() {
jar.assertModuleInfoWithDependencies();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,9 @@ void versionsOfClassFiles() {
void versionsOfEmbeddedDependencies() {
jar.assertVersionsOfEmbeddedClassFiles();
}

@Test
void presenceOfModuleInfoWithoutDependencies() {
jar.assertModuleInfoWithoutDependencies();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,26 @@ private void assertVersionOfClassFile(int expectedVersion, String innerFilename)
+ actualVersion;
assertThat(actualVersion).as(description).isEqualTo((byte) expectedVersion);
}

public void assertModuleInfoWithDependencies() {
var moduleinfo = reader.getContentOf("module-info.class");
var module = ModuleInfoAsserter.parse(moduleinfo);
assertThat(module)
.satisfies(
m -> m.assertName("nl.jqno.equalsverifier"),
m -> m.assertExports("nl/jqno/equalsverifier", "nl/jqno/equalsverifier/api"),
m -> m.assertRequires("net.bytebuddy", ""),
m -> m.assertRequires("org.objenesis", ""));
}

public void assertModuleInfoWithoutDependencies() {
var moduleinfo = reader.getContentOf("module-info.class");
var module = ModuleInfoAsserter.parse(moduleinfo);
assertThat(module)
.satisfies(
m -> m.assertName("nl.jqno.equalsverifier"),
m -> m.assertExports("nl/jqno/equalsverifier", "nl/jqno/equalsverifier/api"),
m -> m.assertDoesNotRequire("net.bytebuddy"),
m -> m.assertDoesNotRequire("org.objenesis"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package nl.jqno.equalsverifier.verify_release.jar.helper;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.*;

import net.bytebuddy.jar.asm.*;

public class ModuleInfoAsserter {

private String moduleName;
private final Set<String> exports = new HashSet<>();
private final Map<String, String> requires = new HashMap<>();

public static ModuleInfoAsserter parse(byte[] moduleinfo) {
var result = new ModuleInfoAsserter();

new ClassReader(moduleinfo).accept(new ClassVisitor(Opcodes.ASM9) {
@Override
public ModuleVisitor visitModule(String name, int access, String version) {
result.moduleName = name;
return new ModuleVisitor(Opcodes.ASM9) {
@Override
public void visitExport(String packaze, int access, String... modules) {
result.exports.add(packaze);
}

@Override
public void visitRequire(String module, int access, String version) {
var modifiers = "";
if ((access & Opcodes.ACC_TRANSITIVE) != 0)
modifiers += "transitive";
result.requires.put(module, modifiers);
}
};
}
}, 0);

return result;
}

public void assertName(String name) {
assertThat(moduleName).isEqualTo(name);
}

public void assertExports(String... names) {
assertThat(exports).containsOnly(names);
}

public void assertRequires(String require, String modifier) {
assertThat(requires).containsEntry(require, modifier);
}

public void assertDoesNotRequire(String require) {
assertThat(requires).doesNotContainKey(require);
}

}

0 comments on commit 648b518

Please sign in to comment.