| /* |
| * 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)); |
| } |
| } |