blob: dda3272aa249f823b2469b48c038784e61f0149f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.modules;
import java.io.BufferedReader;
import java.io.StringReader;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.spi.ToolProvider;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.BuildFileRule;
/**
* Tests the {@link Jmod} task.
*/
public class JmodTest {
@Rule
public final BuildFileRule buildRule = new BuildFileRule();
@Rule
public final ExpectedException expected = ExpectedException.none();
@Before
public void setUp() {
buildRule.configureProject("src/etc/testcases/taskdefs/jmod.xml");
buildRule.executeTarget("setUp");
}
@Test
public void testDestAndClasspathNoJmod() {
buildRule.executeTarget("destAndClasspathNoJmod");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
}
@Test
public void testDestAndNestedClasspath() {
buildRule.executeTarget("classpath-nested");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
}
@Test
public void testDestAndClasspathOlderThanJmod()
throws IOException {
buildRule.executeTarget("destAndClasspathOlderThanJmod");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
File jar = new File(buildRule.getProject().getProperty("hello.jar"));
Assert.assertTrue("Checking that newer jmod was not written "
+ "when source files are older.",
Files.getLastModifiedTime(jmod.toPath()).toInstant().isAfter(
Instant.now().plus(30, ChronoUnit.MINUTES)));
}
@Test
public void testNoDestFile() {
expected.expect(BuildException.class);
buildRule.executeTarget("noDestFile");
}
@Test
public void testNoClasspath() {
expected.expect(BuildException.class);
buildRule.executeTarget("noClasspath");
}
@Test
public void testEmptyClasspath() {
expected.expect(BuildException.class);
buildRule.executeTarget("emptyClasspath");
}
@Test
public void testClasspathEntirelyNonexistent() {
expected.expect(BuildException.class);
buildRule.executeTarget("nonexistentClasspath");
}
@Test
public void testClasspathref() {
buildRule.executeTarget("classpathref");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
}
@Test
public void testClasspathAttributeAndChildElement() {
buildRule.executeTarget("classpath-both");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
}
@Test
public void testModulepath() {
buildRule.executeTarget("modulepath");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
}
@Test
public void testModulepathref() {
buildRule.executeTarget("modulepathref");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
}
@Test
public void testModulepathNested() {
buildRule.executeTarget("modulepath-nested");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
}
@Test
public void testModulepathNonDir() {
expected.expect(BuildException.class);
buildRule.executeTarget("modulepathnondir");
}
@Test
public void testModulepathAttributeAndChildElement() {
buildRule.executeTarget("modulepath-both");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
}
@Test
public void testCommandPath() {
buildRule.executeTarget("commandpath");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains command.",
containsLine(output, l -> l.equals("bin/command1")));
}
@Test
public void testCommandPathref() {
buildRule.executeTarget("commandpathref");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains command.",
containsLine(output, l -> l.equals("bin/command2")));
}
@Test
public void testCommandPathNested() {
buildRule.executeTarget("commandpath-nested");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains command.",
containsLine(output, l -> l.equals("bin/command3")));
}
@Test
public void testCommandPathAttributeAndChildElement() {
buildRule.executeTarget("commandpath-both");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains commands "
+ "from both attribute and child element.",
containsAll(output,
l -> l.equals("bin/command4"),
l -> l.equals("bin/command5")));
}
@Test
public void testHeaderPath() {
buildRule.executeTarget("headerpath");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains header file.",
containsLine(output, l -> l.equals("include/header1.h")));
}
@Test
public void testHeaderPathref() {
buildRule.executeTarget("headerpathref");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains header file.",
containsLine(output, l -> l.equals("include/header2.h")));
}
@Test
public void testHeaderPathNested() {
buildRule.executeTarget("headerpath-nested");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains header file.",
containsLine(output, l -> l.equals("include/header3.h")));
}
@Test
public void testHeaderPathAttributeAndChildElement() {
buildRule.executeTarget("headerpath-both");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains header files "
+ "from both attribute and child element.",
containsAll(output,
l -> l.equals("include/header4.h"),
l -> l.equals("include/header5.h")));
}
@Test
public void testConfigPath() {
buildRule.executeTarget("configpath");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains config file.",
containsLine(output, l -> l.equals("conf/config1.properties")));
}
@Test
public void testConfigPathref() {
buildRule.executeTarget("configpathref");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains config file.",
containsLine(output, l -> l.equals("conf/config2.properties")));
}
@Test
public void testConfigPathNested() {
buildRule.executeTarget("configpath-nested");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains config file.",
containsLine(output, l -> l.equals("conf/config3.properties")));
}
@Test
public void testConfigPathAttributeAndChildElement() {
buildRule.executeTarget("configpath-both");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains config files "
+ "from both attribute and child element.",
containsAll(output,
l -> l.equals("conf/config4.properties"),
l -> l.equals("conf/config5.properties")));
}
@Test
public void testLegalPath() {
buildRule.executeTarget("legalpath");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains license file.",
containsLine(output, l -> l.equals("legal/legal1.txt")));
}
@Test
public void testLegalPathref() {
buildRule.executeTarget("legalpathref");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains license file.",
containsLine(output, l -> l.equals("legal/legal2.txt")));
}
@Test
public void testLegalPathNested() {
buildRule.executeTarget("legalpath-nested");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains license file.",
containsLine(output, l -> l.equals("legal/legal3.txt")));
}
@Test
public void testLegalPathAttributeAndChildElement() {
buildRule.executeTarget("legalpath-both");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains legal files "
+ "from both attribute and child element.",
containsAll(output,
l -> l.equals("legal/legal4.txt"),
l -> l.equals("legal/legal5.txt")));
}
@Test
public void testManPath() {
buildRule.executeTarget("manpath");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains man page.",
containsLine(output, l -> l.equals("man/man1.1")));
}
@Test
public void testManPathref() {
buildRule.executeTarget("manpathref");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains man page.",
containsLine(output, l -> l.equals("man/man2.1")));
}
@Test
public void testManPathNested() {
buildRule.executeTarget("manpath-nested");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains man page.",
containsLine(output, l -> l.equals("man/man3.1")));
}
@Test
public void testManPathAttributeAndChildElement() {
buildRule.executeTarget("manpath-both");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains man pages "
+ "from both attribute and child element.",
containsAll(output,
l -> l.equals("man/man4.1"),
l -> l.equals("man/man5.1")));
}
@Test
public void testNativeLibPath() {
buildRule.executeTarget("nativelibpath");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains native library.",
containsLine(output, l -> l.matches("lib/[^/]+\\.(dll|dylib|so)")));
}
@Test
public void testNativeLibPathref() {
buildRule.executeTarget("nativelibpathref");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains native library.",
containsLine(output, l -> l.matches("lib/[^/]+\\.(dll|dylib|so)")));
}
@Test
public void testNativeLibPathNested() {
buildRule.executeTarget("nativelibpath-nested");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains native library.",
containsLine(output, l -> l.matches("lib/[^/]+\\.(dll|dylib|so)")));
}
@Test
public void testNativeLibPathAttributeAndChildElement() {
buildRule.executeTarget("nativelibpath-both");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("list", jmod.toString());
Assert.assertTrue("Checking that jmod contains native libraries "
+ "from both attribute and child element.",
containsAll(output,
l -> l.matches("lib/(lib)?zip\\.(dll|dylib|so)"),
l -> l.matches("lib/(lib)?jvm\\.(dll|dylib|so)")));
}
@Test
public void testVersion() {
buildRule.executeTarget("version");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String version = buildRule.getProject().getProperty("version");
Assert.assertNotNull("Checking that 'version' property is set",
version);
Assert.assertFalse("Checking that 'version' property is not empty",
version.isEmpty());
String output = runJmod("describe", jmod.toString());
Assert.assertTrue("Checking that jmod has correct version.",
containsLine(output, l -> l.endsWith("@" + version)));
}
@Test
public void testNestedVersion() {
buildRule.executeTarget("version-nested");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("describe", jmod.toString());
Assert.assertTrue("Checking that jmod has correct version.",
containsLine(output, l -> l.matches(".*@1\\.0\\.1[-+]+99")));
}
@Test
public void testNestedVersionNumberOnly() {
buildRule.executeTarget("version-nested-number");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("describe", jmod.toString());
Assert.assertTrue("Checking that jmod has correct version.",
containsLine(output, l -> l.endsWith("@1.0.1")));
}
@Test
public void testNestedVersionNoNumber() {
expected.expect(BuildException.class);
buildRule.executeTarget("version-nested-no-number");
}
@Test
public void testNestedVersionInvalidNumber() {
expected.expect(BuildException.class);
buildRule.executeTarget("version-nested-invalid-number");
}
@Test
public void testNestedVersionInvalidPreRelease() {
expected.expect(BuildException.class);
buildRule.executeTarget("version-nested-invalid-prerelease");
}
@Test
public void testVersionAttributeAndChildElement() {
expected.expect(BuildException.class);
buildRule.executeTarget("version-both");
}
@Test
public void testMainClass() {
buildRule.executeTarget("mainclass");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String mainClass =
buildRule.getProject().getProperty("hello.main-class");
Assert.assertNotNull("Checking that 'main-class' property is set",
mainClass);
Assert.assertFalse("Checking that 'main-class' property is not empty",
mainClass.isEmpty());
String output = runJmod("describe", jmod.toString());
String mainClassPattern = "main-class\\s+" + Pattern.quote(mainClass);
Assert.assertTrue("Checking that jmod has correct main class.",
containsLine(output, l -> l.matches(mainClassPattern)));
}
@Test
public void testPlatform() {
buildRule.executeTarget("platform");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String platform = buildRule.getProject().getProperty("target-platform");
Assert.assertNotNull("Checking that 'target-platform' property is set",
platform);
Assert.assertFalse("Checking that 'target-platform' property "
+ "is not empty", platform.isEmpty());
String output = runJmod("describe", jmod.toString());
String platformPattern = "platform\\s+" + Pattern.quote(platform);
Assert.assertTrue("Checking that jmod has correct main class.",
containsLine(output, l -> l.matches(platformPattern)));
}
@Test
public void testHashing() {
buildRule.executeTarget("hashing");
File jmod = new File(buildRule.getProject().getProperty("jmod"));
Assert.assertTrue("Checking that jmod was successfully created.",
jmod.exists());
String output = runJmod("describe", jmod.toString());
Assert.assertTrue("Checking that jmod has module hashes.",
containsLine(output, l -> l.startsWith("hashes")));
}
private String runJmod(final String... args) {
ToolProvider jmod = ToolProvider.findFirst("jmod").orElseThrow(
() -> new RuntimeException("jmod tool not found in JDK."));
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
ByteArrayOutputStream stderr = new ByteArrayOutputStream();
int exitCode;
try (PrintStream out = new PrintStream(stdout);
PrintStream err = new PrintStream(stderr)) {
exitCode = jmod.run(out, err, args);
}
if (exitCode != 0) {
throw new RuntimeException(
"jmod failed, output is: " + stdout + ", error is: " + stderr);
}
return stdout.toString();
}
private boolean containsLine(final String lines,
final Predicate<? super String> test) {
try (BufferedReader reader =
new BufferedReader(new StringReader(lines))) {
return reader.lines().anyMatch(test);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private boolean containsAll(final String lines,
final Predicate<? super String> test1,
final Predicate<? super String> test2) {
try (BufferedReader reader =
new BufferedReader(new StringReader(lines))) {
boolean test1Matched = false;
boolean test2Matched = false;
String line;
while ((line = reader.readLine()) != null) {
test1Matched |= test1.test(line);
test2Matched |= test2.test(line);
}
return test1Matched && test2Matched;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}