Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
PluginTestTool |
|
| 2.0;2 | ||||
PluginTestTool$1 |
|
| 2.0;2 |
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: PluginTestTool.java 1185951 2011-10-19 02:43:50Z ifedorenko $ | |
46 | */ | |
47 | @Component( role = PluginTestTool.class ) | |
48 | 0 | public class PluginTestTool |
49 | { | |
50 | /** Plexus role */ | |
51 | 0 | public static final String ROLE = PluginTestTool.class.getName(); |
52 | ||
53 | @Requirement | |
54 | private ProjectTool projectTool; | |
55 | ||
56 | @Requirement | |
57 | private RepositoryTool repositoryTool; | |
58 | ||
59 | /** | |
60 | * Stage the plugin, using a stable version, into a temporary local-repository directory that is | |
61 | * generated by this method. When the plugin is staged, return the local repository base directory | |
62 | * for use in test builds. | |
63 | * | |
64 | * @param pomFile current POM file | |
65 | * @param testVersion The test version for the plugin, used for reference in test-build POMs and | |
66 | * fully-qualified goals | |
67 | * @return The base-directory location of the generated local repository | |
68 | * @throws TestToolsException if any | |
69 | */ | |
70 | public File preparePluginForIntegrationTesting( File pomFile, String testVersion ) | |
71 | throws TestToolsException | |
72 | { | |
73 | 0 | return prepareForTesting( pomFile, testVersion, false, null ); |
74 | } | |
75 | ||
76 | /** | |
77 | * Stage the plugin, using a stable version, into a temporary local-repository directory that is | |
78 | * generated by this method. When the plugin is staged, return the local repository base directory | |
79 | * for use in test builds. This method also skips unit testing during plugin jar production, | |
80 | * since it is assumed that executing these tests would lead to a recursive test-and-build loop. | |
81 | * | |
82 | * @param pomFile current POM file | |
83 | * @param testVersion The test version for the plugin, used for reference in test-build POMs and | |
84 | * fully-qualified goals | |
85 | * @return The base-directory location of the generated local repository | |
86 | * @throws TestToolsException if any | |
87 | */ | |
88 | public File preparePluginForUnitTestingWithMavenBuilds( File pomFile, String testVersion ) | |
89 | throws TestToolsException | |
90 | { | |
91 | 0 | return prepareForTesting( pomFile, testVersion, true, null ); |
92 | } | |
93 | ||
94 | /** | |
95 | * Stage the plugin, using a stable version, into the specified local-repository directory. | |
96 | * When the plugin is staged, return the local repository base directory for verification. | |
97 | * | |
98 | * @param pomFile current POM file | |
99 | * @param testVersion The test version for the plugin, used for reference in test-build POMs and | |
100 | * fully-qualified goals | |
101 | * @param localRepositoryDir The base-directory location of the test local repository, into which | |
102 | * the plugin's test version should be staged. | |
103 | * @return The base-directory location of the generated local repository | |
104 | * @throws TestToolsException if any | |
105 | */ | |
106 | public File preparePluginForIntegrationTesting( File pomFile, String testVersion, File localRepositoryDir ) | |
107 | throws TestToolsException | |
108 | { | |
109 | 0 | return prepareForTesting( pomFile, testVersion, false, localRepositoryDir ); |
110 | } | |
111 | ||
112 | /** | |
113 | * Stage the plugin, using a stable version, into the specified local-repository directory. | |
114 | * When the plugin is staged, return the local repository base directory for verification. This | |
115 | * method also skips unit testing during plugin jar production, since it is assumed that | |
116 | * executing these tests would lead to a recursive test-and-build loop. | |
117 | * | |
118 | * @param pomFile current POM file | |
119 | * @param testVersion The test version for the plugin, used for reference in test-build POMs and | |
120 | * fully-qualified goals | |
121 | * @param localRepositoryDir The base-directory location of the test local repository, into which | |
122 | * the plugin's test version should be staged. | |
123 | * @return The base-directory location of the generated local repository | |
124 | * @throws TestToolsException if any | |
125 | */ | |
126 | public File preparePluginForUnitTestingWithMavenBuilds( File pomFile, String testVersion, File localRepositoryDir ) | |
127 | throws TestToolsException | |
128 | { | |
129 | 0 | return prepareForTesting( pomFile, testVersion, true, localRepositoryDir ); |
130 | } | |
131 | ||
132 | private File prepareForTesting( File pomFile, String testVersion, boolean skipUnitTests, File localRepositoryDir ) | |
133 | throws TestToolsException | |
134 | { | |
135 | 0 | File realProjectDir = pomFile.getParentFile(); |
136 | ||
137 | try | |
138 | { | |
139 | 0 | realProjectDir = realProjectDir.getCanonicalFile(); |
140 | } | |
141 | 0 | catch ( IOException e ) |
142 | { | |
143 | 0 | throw new TestToolsException( "Failed to stage plugin for testing.", e ); |
144 | 0 | } |
145 | ||
146 | try | |
147 | { | |
148 | 0 | final File tmpDir = File.createTempFile( "plugin-IT-staging-project", "" ); |
149 | ||
150 | 0 | tmpDir.delete(); |
151 | ||
152 | 0 | tmpDir.mkdirs(); |
153 | ||
154 | 0 | Runtime.getRuntime().addShutdownHook( new Thread( new Runnable() |
155 | 0 | { |
156 | ||
157 | public void run() | |
158 | { | |
159 | try | |
160 | { | |
161 | 0 | FileUtils.deleteDirectory( tmpDir ); |
162 | } | |
163 | 0 | catch ( IOException e ) |
164 | { | |
165 | // it'll get cleaned up when the temp dir is purged next... | |
166 | 0 | } |
167 | 0 | } |
168 | ||
169 | } ) ); | |
170 | ||
171 | 0 | FileUtils.copyDirectoryStructure( realProjectDir, tmpDir ); |
172 | } | |
173 | 0 | catch ( IOException e ) |
174 | { | |
175 | 0 | throw new TestToolsException( "Failed to create temporary staging directory for plugin project.", e ); |
176 | 0 | } |
177 | ||
178 | 0 | File buildLog = new File( "target/test-build-logs/setup.build.log" ); |
179 | ||
180 | 0 | buildLog.getParentFile().mkdirs(); |
181 | ||
182 | 0 | File localRepoDir = localRepositoryDir; |
183 | ||
184 | 0 | if ( localRepoDir == null ) |
185 | { | |
186 | 0 | localRepoDir = new File( "target/test-local-repository" ); |
187 | } | |
188 | ||
189 | 0 | MavenProject project = projectTool.packageProjectArtifact( pomFile, testVersion, skipUnitTests, buildLog ); |
190 | ||
191 | 0 | repositoryTool.createLocalRepositoryFromComponentProject( project, new File( realProjectDir, "pom.xml" ), |
192 | localRepoDir ); | |
193 | ||
194 | 0 | return localRepoDir; |
195 | } | |
196 | ||
197 | } |