blob: e92b2d27d7f2ce0c45ea6e4605e8017f979f6e15 [file] [log] [blame]
package org.apache.maven.it;
/*
* 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.
*/
import org.apache.maven.it.util.ResourceExtractor;
import org.apache.maven.shared.utils.io.FileUtils;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.NetworkConnector;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Deque;
import java.util.Properties;
import java.util.concurrent.ConcurrentLinkedDeque;
/**
* This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-3415">MNG-3415</a>.
*
*
*/
public class MavenITmng3415JunkRepositoryMetadataTest
extends AbstractMavenIntegrationTestCase
{
private static final String RESOURCE_BASE = "/mng-3415";
public MavenITmng3415JunkRepositoryMetadataTest()
{
// we're going to control the test execution according to the maven version present within each test method.
// all methods should execute as long as we're using maven 2.0.9+, but the specific tests may vary a little
// depending on which version we're using above 2.0.8.
super( "(2.0.8,)" ); // only test in 2.0.9+
}
/**
* This test simply verifies that when a metadata transfer fails (network error, etc.)
* no metadata file is written to the local repository.
* <p/>
* Steps executed to verify this test:
* <p/>
* 0. Find the local repository directory:
* a. build the maven-find-local-repo-plugin, then run it, to spit out the path of the
* local repository in use by default. Read the output file to get this path.
* (Yes, it's heavy, but it's reliable.)
* 1. Setup the test:
* a. Make sure the metadata for the test-repo is NOT in the local repository.
* b. Make sure the dependency POM IS in the local repository, so we're not
* distracted by failed builds that are unrelated.
* c. Create the settings file for use in this test, which contains the invalid
* remote repository entry.
* 2. Build the test project the first time
* a. Verify that a TransferFailedException is in the build output for the test-repo
* b. Verify that the metadata for the dependency POM is NOT in the local
* repository afterwards.
* 3. Build the test project the second time
* a. See (2.a) and (2.b) above; the same criteria applies here.
*/
public void testitTransferFailed()
throws Exception
{
String methodName = getMethodName();
File testDir = ResourceExtractor.simpleExtractResources( getClass(), RESOURCE_BASE );
Verifier verifier;
verifier = newVerifier( testDir.getAbsolutePath() );
verifier.setAutoclean( false );
verifier.deleteArtifacts( "org.apache.maven.its.mng3415" );
setupDummyDependency( verifier, testDir, true );
Properties filterProps = verifier.newDefaultFilterProperties();
filterProps.put( "@protocol@", "invalid" );
filterProps.put( "@port@", "0" );
File settings = verifier.filterFile( "settings-template.xml", "settings-a.xml", "UTF-8", filterProps );
verifier.addCliOption( "-X" );
verifier.addCliOption( "-s" );
verifier.addCliOption( settings.getName() );
verifier.setLogFileName( "log-" + methodName + "-firstBuild.txt" );
verifier.executeGoal( "validate" );
verifier.verifyErrorFreeLog();
assertMetadataMissing( verifier );
setupDummyDependency( verifier, testDir, true );
verifier.setLogFileName( "log-" + methodName + "-secondBuild.txt" );
verifier.executeGoal( "validate" );
verifier.verifyErrorFreeLog();
verifier.resetStreams();
assertMetadataMissing( verifier );
}
private String getMethodName()
{
return new Throwable().getStackTrace()[1].getMethodName();
}
/**
* This test simply verifies that when metadata doesn't exist on the remote
* repository, a basic metadata file is written to the local repository.
* <p/>
* Steps executed to verify this test:
* <p/>
* 0. Find the local repository directory:
* a. build the maven-find-local-repo-plugin, then run it, to spit out the path of the
* local repository in use by default. Read the output file to get this path.
* (Yes, it's heavy, but it's reliable.)
* 1. Setup the test:
* a. Make sure the metadata for the test-repo is NOT in the local repository.
* b. Make sure the dependency POM IS in the local repository, so we're not
* distracted by failed builds that are unrelated.
* c. Create the settings file for use in this test, which contains the VALID
* remote repository entry.
* 2. Build the test project the first time
* a. Verify that the remote repository is checked for the metadata file
* 3. Build the test project the second time
* a. Verify that the remote repository is NOT checked for the metadata file again
* b. Verify that the file used for updateInterval calculations was NOT changed from
* the first build.
*/
public void testShouldNotRepeatedlyUpdateOnResourceNotFoundException()
throws Exception
{
String methodName = getMethodName();
File testDir = ResourceExtractor.simpleExtractResources( getClass(), RESOURCE_BASE );
Verifier verifier;
verifier = newVerifier( testDir.getAbsolutePath() );
verifier.setAutoclean( false );
verifier.deleteArtifacts( "org.apache.maven.its.mng3415" );
final Deque<String> requestUris = new ConcurrentLinkedDeque<>();
Handler repoHandler = new AbstractHandler()
{
@Override
public void handle( String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response )
{
System.out.println( "Handling " + request.getMethod() + " " + request.getRequestURL() );
requestUris.add( request.getRequestURI() );
response.setStatus( HttpServletResponse.SC_NOT_FOUND );
( (Request) request ).setHandled( true );
}
};
Server server = new Server( 0 );
server.setHandler( repoHandler );
try
{
server.start();
if ( server.isFailed() )
{
fail( "Couldn't bind the server socket to a free port!" );
}
int port = ( (NetworkConnector) server.getConnectors()[0] ).getLocalPort();
System.out.println( "Bound server socket to the port " + port );
Properties filterProps = verifier.newDefaultFilterProperties();
filterProps.put( "@protocol@", "http" );
filterProps.put( "@port@", Integer.toString( port ) );
File settings = verifier.filterFile( "settings-template.xml", "settings-b.xml", "UTF-8", filterProps );
verifier.addCliOption( "-X" );
verifier.addCliOption( "-s" );
verifier.addCliOption( settings.getName() );
setupDummyDependency( verifier, testDir, true );
verifier.setLogFileName( "log-" + methodName + "-firstBuild.txt" );
verifier.executeGoal( "validate" );
verifier.verifyErrorFreeLog();
assertTrue( requestUris.toString(), requestUris.contains(
"/org/apache/maven/its/mng3415/missing/1.0-SNAPSHOT/maven-metadata.xml" ) );
requestUris.clear();
File updateCheckFile = getUpdateCheckFile( verifier );
long firstLastMod = updateCheckFile.lastModified();
setupDummyDependency( verifier, testDir, false );
verifier.setLogFileName( "log-" + methodName + "-secondBuild.txt" );
verifier.executeGoal( "validate" );
verifier.verifyErrorFreeLog();
verifier.resetStreams();
assertFalse( requestUris.toString(), requestUris.contains(
"/org/apache/maven/its/mng3415/missing/1.0-SNAPSHOT/maven-metadata.xml" ) );
assertEquals(
"Last-modified time should be unchanged from first build through second build for the file we use for"
+ " updateInterval checks.",
firstLastMod, updateCheckFile.lastModified() );
}
finally
{
server.stop();
server.join();
}
}
private void assertMetadataMissing( Verifier verifier )
{
File metadata = getMetadataFile( verifier );
assertFalse( "Metadata file should NOT be present in local repository: " + metadata.getAbsolutePath(),
metadata.exists() );
}
private void setupDummyDependency( Verifier verifier, File testDir, boolean resetUpdateInterval )
throws IOException
{
String gid = "org.apache.maven.its.mng3415";
String aid = "missing";
String version = "1.0-SNAPSHOT";
if ( resetUpdateInterval )
{
verifier.deleteArtifacts( gid );
}
File pom = new File( verifier.getArtifactPath( gid, aid, version, "pom" ) );
File pomSrc = new File( testDir, "dependency-pom.xml" );
System.out.println( "Copying dependency POM\nfrom: " + pomSrc + "\nto: " + pom );
FileUtils.copyFile( pomSrc, pom );
}
private File getMetadataFile( Verifier verifier )
{
String gid = "org.apache.maven.its.mng3415";
String aid = "missing";
String version = "1.0-SNAPSHOT";
String name = "maven-metadata-testing-repo.xml";
return new File( verifier.getArtifactMetadataPath( gid, aid, version, name ) );
}
/**
* If the current maven version is < 3.0, we'll use the metadata file itself (old maven-artifact code)...
* otherwise, use the new resolver-status.properties file (new artifact code).
*/
private File getUpdateCheckFile( Verifier verifier )
{
String gid = "org.apache.maven.its.mng3415";
String aid = "missing";
String version = "1.0-SNAPSHOT";
String name;
// < 3.0 (including snapshots)
if ( matchesVersionRange( "(2.0.8,3.0-alpha-1)" ) )
{
name = "maven-metadata-testing-repo.xml";
}
else
{
name = "resolver-status.properties";
}
return new File( verifier.getArtifactMetadataPath( gid, aid, version, name ) );
}
}