blob: 4d0f4e80421c174b49a1d9d9eb643b3dd2edffbb [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
*
* http://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.maven.it;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties;
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
import org.apache.maven.shared.verifier.Verifier;
import org.apache.maven.shared.verifier.util.ResourceExtractor;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.junit.jupiter.api.Test;
public class MavenITmng6754TimestampInMultimoduleProject extends AbstractMavenIntegrationTestCase {
private static final String RESOURCE_PATH = "/mng-6754-version-timestamp-in-multimodule-build";
private static final String VERSION = "1.0-SNAPSHOT";
public MavenITmng6754TimestampInMultimoduleProject() {
super("[3.8.2,)");
}
@Test
public void testArtifactsHaveSameTimestamp() throws Exception {
final File testDir = ResourceExtractor.simpleExtractResources(getClass(), RESOURCE_PATH);
final Verifier verifier = newVerifier(testDir.getAbsolutePath());
final Path localRepoDir = Paths.get(verifier.getLocalRepository());
final Path remoteRepoDir = Paths.get(verifier.getBasedir(), "repo");
verifier.deleteDirectory("repo");
verifier.deleteArtifacts("org.apache.maven.its.mng6754");
verifier.addCliArgument("-Drepodir=" + remoteRepoDir);
verifier.addCliArgument("deploy");
verifier.execute();
verifier.verifyErrorFreeLog();
final Properties props = verifier.loadProperties("target/timestamp.properties");
// Reference timestamp
final String mavenBuildTimestamp = props.getProperty("project.properties.timestamp");
final Metadata parentMetadataLocal = getMetadata(getLocalMetadataPath(localRepoDir, "parent", null));
final Metadata aMetadataLocal = getMetadata(getLocalMetadataPath(localRepoDir, "child-a", null));
final Metadata bMetadataLocal = getMetadata(getLocalMetadataPath(localRepoDir, "child-b", null));
final String parentLastUpdatedLocal =
parentMetadataLocal.getVersioning().getLastUpdated();
final String aLastUpdatedLocal = aMetadataLocal.getVersioning().getLastUpdated();
final String bLastUpdatedLocal = bMetadataLocal.getVersioning().getLastUpdated();
assertEquals("parent", "local", "lastUpdated", mavenBuildTimestamp, parentLastUpdatedLocal);
assertEquals("child-a", "local", "lastUpdated", mavenBuildTimestamp, aLastUpdatedLocal);
assertEquals("child-b", "local", "lastUpdated", mavenBuildTimestamp, bLastUpdatedLocal);
final Metadata parentVersionedMetadataLocal =
getMetadata(getLocalMetadataPath(localRepoDir, "parent", VERSION));
final Metadata aVersionedMetadataLocal = getMetadata(getLocalMetadataPath(localRepoDir, "child-a", VERSION));
final Metadata bVersionedMetadataLocal = getMetadata(getLocalMetadataPath(localRepoDir, "child-b", VERSION));
final String parentVersionedLastUpdatedLocal =
parentVersionedMetadataLocal.getVersioning().getLastUpdated();
final String parentVersionedSnapshotVersionUpdatedLocal = parentVersionedMetadataLocal
.getVersioning()
.getSnapshotVersions()
.get(0)
.getUpdated();
final String aLastVersionedUpdatedLocal =
aVersionedMetadataLocal.getVersioning().getLastUpdated();
final String aVersionedSnapshotVersionUpdated1Local = aVersionedMetadataLocal
.getVersioning()
.getSnapshotVersions()
.get(0)
.getUpdated();
final String aVersionedSnapshotVersionUpdated2Local = aVersionedMetadataLocal
.getVersioning()
.getSnapshotVersions()
.get(1)
.getUpdated();
final String bLastVersionedUpdatedLocal =
bVersionedMetadataLocal.getVersioning().getLastUpdated();
final String bVersionedSnapshotVersionUpdated1Local = bVersionedMetadataLocal
.getVersioning()
.getSnapshotVersions()
.get(0)
.getUpdated();
final String bVersionedSnapshotVersionUpdated2Local = bVersionedMetadataLocal
.getVersioning()
.getSnapshotVersions()
.get(1)
.getUpdated();
assertEquals("parent", "local", "lastUpdated", mavenBuildTimestamp, parentVersionedLastUpdatedLocal);
assertEquals(
"parent",
"local",
"snapshotVersion[0]/updated",
mavenBuildTimestamp,
parentVersionedSnapshotVersionUpdatedLocal);
assertEquals("child-a", "local", "lastUpdated", mavenBuildTimestamp, aLastVersionedUpdatedLocal);
assertEquals(
"child-a",
"local",
"snapshotVersion[0]/updated",
mavenBuildTimestamp,
aVersionedSnapshotVersionUpdated1Local);
assertEquals(
"child-a",
"local",
"snapshotVersion[1]/updated",
mavenBuildTimestamp,
aVersionedSnapshotVersionUpdated2Local);
assertEquals("child-b", "local", "lastUpdated", mavenBuildTimestamp, bLastVersionedUpdatedLocal);
assertEquals(
"child-b",
"local",
"snapshotVersion[0]/updated",
mavenBuildTimestamp,
bVersionedSnapshotVersionUpdated1Local);
assertEquals(
"child-b",
"local",
"snapshotVersion[1]/updated",
mavenBuildTimestamp,
bVersionedSnapshotVersionUpdated2Local);
final Metadata parentMetadataRemote = getMetadata(getRemoteMetadataPath(remoteRepoDir, "parent", null));
final Metadata aMetadataRemote = getMetadata(getRemoteMetadataPath(remoteRepoDir, "child-a", null));
final Metadata bMetadataRemote = getMetadata(getRemoteMetadataPath(remoteRepoDir, "child-b", null));
final String parentLastUpdatedRemote =
parentMetadataRemote.getVersioning().getLastUpdated();
final String aLastUpdatedRemote = aMetadataRemote.getVersioning().getLastUpdated();
final String bLastUpdatedRemote = bMetadataRemote.getVersioning().getLastUpdated();
assertEquals("parent", "remote", "lastUpdated", mavenBuildTimestamp, parentLastUpdatedRemote);
assertEquals("child-a", "remote", "lastUpdated", mavenBuildTimestamp, aLastUpdatedRemote);
assertEquals("child-b", "remote", "lastUpdated", mavenBuildTimestamp, bLastUpdatedRemote);
final Metadata parentVersionedMetadataRemote =
getMetadata(getRemoteMetadataPath(remoteRepoDir, "parent", VERSION));
final Metadata aVersionedMetadataRemote = getMetadata(getRemoteMetadataPath(remoteRepoDir, "child-a", VERSION));
final Metadata bVersionedMetadataRemote = getMetadata(getRemoteMetadataPath(remoteRepoDir, "child-b", VERSION));
final String parentVersionedLastUpdatedRemote =
parentVersionedMetadataRemote.getVersioning().getLastUpdated();
final String parentVersionedSnapshotTimestamp = parentVersionedMetadataRemote
.getVersioning()
.getSnapshot()
.getTimestamp()
.replace(".", "");
final String parentVersionedSnapshotVersionUpdatedRemote = parentVersionedMetadataRemote
.getVersioning()
.getSnapshotVersions()
.get(0)
.getUpdated();
final String parentVersionedSnapshotVersionValueRemote = parentVersionedMetadataRemote
.getVersioning()
.getSnapshotVersions()
.get(0)
.getVersion();
final String aLastVersionedUpdatedRemote =
aVersionedMetadataRemote.getVersioning().getLastUpdated();
final String aVersionedSnapshotTimestamp = aVersionedMetadataRemote
.getVersioning()
.getSnapshot()
.getTimestamp()
.replace(".", "");
final String aVersionedSnapshotVersionUpdated1Remote = aVersionedMetadataRemote
.getVersioning()
.getSnapshotVersions()
.get(0)
.getUpdated();
final String aVersionedSnapshotVersionValue1Remote = aVersionedMetadataRemote
.getVersioning()
.getSnapshotVersions()
.get(0)
.getVersion();
final String aVersionedSnapshotVersionUpdated2Remote = aVersionedMetadataRemote
.getVersioning()
.getSnapshotVersions()
.get(1)
.getUpdated();
final String aVersionedSnapshotVersionValue2Remote = aVersionedMetadataRemote
.getVersioning()
.getSnapshotVersions()
.get(1)
.getVersion();
final String bLastVersionedUpdatedRemote =
bVersionedMetadataRemote.getVersioning().getLastUpdated();
final String bVersionedSnapshotTimestamp = bVersionedMetadataRemote
.getVersioning()
.getSnapshot()
.getTimestamp()
.replace(".", "");
final String bVersionedSnapshotVersionUpdated1Remote = bVersionedMetadataRemote
.getVersioning()
.getSnapshotVersions()
.get(0)
.getUpdated();
final String bVersionedSnapshotVersionValue1Remote = bVersionedMetadataRemote
.getVersioning()
.getSnapshotVersions()
.get(0)
.getVersion();
final String bVersionedSnapshotVersionUpdated2Remote = bVersionedMetadataRemote
.getVersioning()
.getSnapshotVersions()
.get(1)
.getUpdated();
final String bVersionedSnapshotVersionValue2Remote = bVersionedMetadataRemote
.getVersioning()
.getSnapshotVersions()
.get(1)
.getVersion();
assertEquals("parent", "remote", "lastUpdated", mavenBuildTimestamp, parentVersionedLastUpdatedRemote);
assertEquals("parent", "remote", "snapshot/timestamp", mavenBuildTimestamp, parentVersionedSnapshotTimestamp);
assertEquals(
"parent",
"remote",
"snapshotVersion[0]/updated",
mavenBuildTimestamp,
parentVersionedSnapshotVersionUpdatedRemote);
assertEquals(
"parent",
"remote",
"snapshotVersion[0]/value",
mavenBuildTimestamp,
parentVersionedSnapshotVersionValueRemote.substring(4, 19).replace(".", ""));
assertEquals("child-a", "remote", "lastUpdated", mavenBuildTimestamp, aLastVersionedUpdatedRemote);
assertEquals("child-a", "remote", "snapshot/timestamp", mavenBuildTimestamp, aVersionedSnapshotTimestamp);
assertEquals(
"child-a",
"remote",
"snapshotVersion[0]/updated",
mavenBuildTimestamp,
aVersionedSnapshotVersionUpdated1Remote);
assertEquals(
"child-a",
"remote",
"snapshotVersion[0]/value",
mavenBuildTimestamp,
aVersionedSnapshotVersionValue1Remote.substring(4, 19).replace(".", ""));
assertEquals(
"child-a",
"remote",
"snapshotVersion[1]/updated",
mavenBuildTimestamp,
aVersionedSnapshotVersionUpdated2Remote);
assertEquals(
"child-a",
"remote",
"snapshotVersion[1]/value",
mavenBuildTimestamp,
aVersionedSnapshotVersionValue2Remote.substring(4, 19).replace(".", ""));
assertEquals("child-b", "remote", "lastUpdated", mavenBuildTimestamp, bLastVersionedUpdatedRemote);
assertEquals("child-b", "remote", "snapshot/timestamp", mavenBuildTimestamp, bVersionedSnapshotTimestamp);
assertEquals(
"child-b",
"remote",
"snapshotVersion[0]/updated",
mavenBuildTimestamp,
bVersionedSnapshotVersionUpdated1Remote);
assertEquals(
"child-b",
"remote",
"snapshotVersion[0]/value",
mavenBuildTimestamp,
bVersionedSnapshotVersionValue1Remote.substring(4, 19).replace(".", ""));
assertEquals(
"child-b",
"remote",
"snapshotVersion[1]/updated",
mavenBuildTimestamp,
bVersionedSnapshotVersionUpdated2Remote);
assertEquals(
"child-b",
"remote",
"snapshotVersion[1]/value",
mavenBuildTimestamp,
bVersionedSnapshotVersionValue2Remote.substring(4, 19).replace(".", ""));
assertPathExists(
remoteRepoDir,
"parent",
"remote",
VERSION,
"parent-" + parentVersionedSnapshotVersionValueRemote + ".pom");
assertPathExists(
remoteRepoDir,
"child-a",
"remote",
VERSION,
"child-a-" + aVersionedSnapshotVersionValue1Remote + ".pom");
assertPathExists(
remoteRepoDir,
"child-a",
"remote",
VERSION,
"child-a-" + aVersionedSnapshotVersionValue2Remote + ".jar");
assertPathExists(
remoteRepoDir,
"child-b",
"remote",
VERSION,
"child-b-" + bVersionedSnapshotVersionValue1Remote + ".pom");
assertPathExists(
remoteRepoDir,
"child-b",
"remote",
VERSION,
"child-b-" + bVersionedSnapshotVersionValue2Remote + ".jar");
}
private Path getLocalMetadataPath(final Path repoDir, final String moduleName, String version) {
return getRepoFile(repoDir, moduleName, version, "maven-metadata-local.xml");
}
private Path getRemoteMetadataPath(final Path repoDir, final String moduleName, String version) {
return getRepoFile(repoDir, moduleName, version, "maven-metadata.xml");
}
private Path getRepoFile(final Path repoDir, final String moduleName, String version, String fileName) {
final Path mng6754Path = Paths.get("org", "apache", "maven", "its", "mng6754");
Path modulePath = repoDir.resolve(mng6754Path.resolve(moduleName));
if (version != null) {
modulePath = modulePath.resolve(version);
}
return modulePath.resolve(fileName);
}
private Metadata getMetadata(final Path metadataFile) throws IOException, XmlPullParserException {
MetadataXpp3Reader r = new MetadataXpp3Reader();
try (InputStream is = Files.newInputStream(metadataFile)) {
return r.read(is);
}
}
private void assertEquals(String moduleName, String location, String field, String expected, String actual) {
String phase = null;
switch (location) {
case "local":
phase = "Installed";
break;
case "remote":
phase = "Deployed";
break;
}
assertEquals(
String.format(
"%s %s module should have equal %s %s with the Maven build timestamp",
phase, moduleName, location, field),
expected,
actual);
}
private void assertPathExists(Path repoDir, String moduleName, String location, String version, String fileName) {
String phase = null;
switch (location) {
case "local":
phase = "Installed";
break;
case "remote":
phase = "Deployed";
break;
}
Path file = getRepoFile(repoDir, moduleName, version, fileName);
assertTrue(
String.format("%s %s module %s file %s should exist", phase, moduleName, location, file),
Files.exists(file));
}
}