1 package org.apache.maven.shared.test.plugin; 2 3 /* 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 22 import org.apache.maven.project.MavenProject; 23 import org.codehaus.plexus.component.annotations.Component; 24 import org.codehaus.plexus.component.annotations.Requirement; 25 import org.codehaus.plexus.util.FileUtils; 26 27 import java.io.File; 28 import java.io.IOException; 29 30 /** 31 * Test tool that provides a single point of access for staging a plugin artifact - along with its 32 * POM lineage - into a clean test-time local repository. This involves modifying the plugin POM to 33 * provide a stable test-time version for test-build POMs to reference, then installing the plugin 34 * jar and associated POMs (including those ancestors that are reachable using <relativePath>) 35 * into the test local repository. 36 * 37 * <p> 38 * <b>WARNING:</b> Currently, the <code>RepositoryTool</code> will not 39 * resolve parent POMs that exist <b>only</b> in your normal local repository, and are not reachable 40 * using the relativePath element. This may result in failed test builds, as one or more of the 41 * plugin's ancestor POMs cannot be resolved. 42 * </p> 43 * 44 * @author jdcasey 45 * @version $Id$ 46 */ 47 @Deprecated 48 @Component( role = PluginTestTool.class ) 49 public class PluginTestTool 50 { 51 /** Plexus role */ 52 public static final String ROLE = PluginTestTool.class.getName(); 53 54 @Requirement 55 private ProjectTool projectTool; 56 57 @Requirement 58 private RepositoryTool repositoryTool; 59 60 /** 61 * Stage the plugin, using a stable version, into a temporary local-repository directory that is 62 * generated by this method. When the plugin is staged, return the local repository base directory 63 * for use in test builds. 64 * 65 * @param pomFile current POM file 66 * @param testVersion The test version for the plugin, used for reference in test-build POMs and 67 * fully-qualified goals 68 * @return The base-directory location of the generated local repository 69 * @throws TestToolsException if any 70 */ 71 public File preparePluginForIntegrationTesting( File pomFile, String testVersion ) 72 throws TestToolsException 73 { 74 return prepareForTesting( pomFile, testVersion, false, null ); 75 } 76 77 /** 78 * Stage the plugin, using a stable version, into a temporary local-repository directory that is 79 * generated by this method. When the plugin is staged, return the local repository base directory 80 * for use in test builds. This method also skips unit testing during plugin jar production, 81 * since it is assumed that executing these tests would lead to a recursive test-and-build loop. 82 * 83 * @param pomFile current POM file 84 * @param testVersion The test version for the plugin, used for reference in test-build POMs and 85 * fully-qualified goals 86 * @return The base-directory location of the generated local repository 87 * @throws TestToolsException if any 88 */ 89 public File preparePluginForUnitTestingWithMavenBuilds( File pomFile, String testVersion ) 90 throws TestToolsException 91 { 92 return prepareForTesting( pomFile, testVersion, true, null ); 93 } 94 95 /** 96 * Stage the plugin, using a stable version, into the specified local-repository directory. 97 * When the plugin is staged, return the local repository base directory for verification. 98 * 99 * @param pomFile current POM file 100 * @param testVersion The test version for the plugin, used for reference in test-build POMs and 101 * fully-qualified goals 102 * @param localRepositoryDir The base-directory location of the test local repository, into which 103 * the plugin's test version should be staged. 104 * @return The base-directory location of the generated local repository 105 * @throws TestToolsException if any 106 */ 107 public File preparePluginForIntegrationTesting( File pomFile, String testVersion, File localRepositoryDir ) 108 throws TestToolsException 109 { 110 return prepareForTesting( pomFile, testVersion, false, localRepositoryDir ); 111 } 112 113 /** 114 * Stage the plugin, using a stable version, into the specified local-repository directory. 115 * When the plugin is staged, return the local repository base directory for verification. This 116 * method also skips unit testing during plugin jar production, since it is assumed that 117 * executing these tests would lead to a recursive test-and-build loop. 118 * 119 * @param pomFile current POM file 120 * @param testVersion The test version for the plugin, used for reference in test-build POMs and 121 * fully-qualified goals 122 * @param localRepositoryDir The base-directory location of the test local repository, into which 123 * the plugin's test version should be staged. 124 * @return The base-directory location of the generated local repository 125 * @throws TestToolsException if any 126 */ 127 public File preparePluginForUnitTestingWithMavenBuilds( File pomFile, String testVersion, File localRepositoryDir ) 128 throws TestToolsException 129 { 130 return prepareForTesting( pomFile, testVersion, true, localRepositoryDir ); 131 } 132 133 private File prepareForTesting( File pomFile, String testVersion, boolean skipUnitTests, File localRepositoryDir ) 134 throws TestToolsException 135 { 136 File realProjectDir = pomFile.getParentFile(); 137 138 try 139 { 140 realProjectDir = realProjectDir.getCanonicalFile(); 141 } 142 catch ( IOException e ) 143 { 144 throw new TestToolsException( "Failed to stage plugin for testing.", e ); 145 } 146 147 try 148 { 149 final File tmpDir = File.createTempFile( "plugin-IT-staging-project", "" ); 150 151 tmpDir.delete(); 152 153 tmpDir.mkdirs(); 154 155 Runtime.getRuntime().addShutdownHook( new Thread( new Runnable() 156 { 157 158 public void run() 159 { 160 try 161 { 162 FileUtils.deleteDirectory( tmpDir ); 163 } 164 catch ( IOException e ) 165 { 166 // it'll get cleaned up when the temp dir is purged next... 167 } 168 } 169 170 } ) ); 171 172 FileUtils.copyDirectoryStructure( realProjectDir, tmpDir ); 173 } 174 catch ( IOException e ) 175 { 176 throw new TestToolsException( "Failed to create temporary staging directory for plugin project.", e ); 177 } 178 179 File buildLog = new File( "target/test-build-logs/setup.build.log" ); 180 181 buildLog.getParentFile().mkdirs(); 182 183 File localRepoDir = localRepositoryDir; 184 185 if ( localRepoDir == null ) 186 { 187 localRepoDir = new File( "target/test-local-repository" ); 188 } 189 190 MavenProject project = projectTool.packageProjectArtifact( pomFile, testVersion, skipUnitTests, buildLog ); 191 192 repositoryTool.createLocalRepositoryFromComponentProject( project, new File( realProjectDir, "pom.xml" ), 193 localRepoDir ); 194 195 return localRepoDir; 196 } 197 198 }