001 package org.apache.maven.scm;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements. See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership. The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License. You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied. See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022 import org.apache.maven.scm.manager.ScmManager;
023 import org.apache.maven.scm.repository.ScmRepository;
024 import org.codehaus.plexus.PlexusTestCase;
025 import org.codehaus.plexus.util.FileUtils;
026 import org.codehaus.plexus.util.IOUtil;
027 import org.codehaus.plexus.util.StringUtils;
028 import org.codehaus.plexus.util.cli.CommandLineUtils;
029 import org.codehaus.plexus.util.cli.CommandLineUtils.StringStreamConsumer;
030 import org.codehaus.plexus.util.cli.Commandline;
031
032 import java.io.File;
033 import java.io.FileWriter;
034 import java.io.IOException;
035 import java.util.Calendar;
036 import java.util.Date;
037 import java.util.TimeZone;
038
039 /**
040 * Base class for all scm tests. Consumers will typically
041 * extend this class while tck test would extend ScmTckTestCase.
042 * <br>
043 * This class basically defines default locations for the
044 * test environment and implements convenience methods.
045 *
046 * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
047 *
048 */
049 public abstract class ScmTestCase
050 extends PlexusTestCase
051 {
052 protected static final TimeZone GMT_TIME_ZONE = TimeZone.getTimeZone( "GMT" );
053
054 private static boolean debugExecute;
055
056 private ScmManager scmManager;
057
058 protected void setUp()
059 throws Exception
060 {
061 super.setUp();
062
063 FileUtils.deleteDirectory( getRepositoryRoot() );
064 assertFalse( getRepositoryRoot().exists() );
065 FileUtils.deleteDirectory( getWorkingCopy() );
066 assertFalse( getWorkingCopy().exists() );
067 FileUtils.deleteDirectory( getWorkingDirectory() );
068 assertFalse( getWorkingDirectory().exists() );
069 FileUtils.deleteDirectory( getAssertionCopy() );
070 assertFalse( getAssertionCopy().exists() );
071 FileUtils.deleteDirectory( getUpdatingCopy() );
072 assertFalse( getUpdatingCopy().exists() );
073
074 scmManager = null;
075 }
076
077 protected String getModule()
078 {
079 fail( "getModule() must be overridden." );
080
081 return null;
082 }
083
084 /**
085 * @return default location of the test read/write repository
086 */
087 protected File getRepositoryRoot()
088 {
089 return PlexusTestCase.getTestFile( "target/scm-test/repository" );
090 }
091
092 /**
093 * @return Location of the revisioned (read only) repository
094 */
095 protected File getRepository()
096 {
097 return PlexusTestCase.getTestFile( "/src/test/repository" );
098 }
099
100 /**
101 * @return location of the working copy (always checkout)
102 */
103 protected File getWorkingCopy()
104 {
105 return PlexusTestCase.getTestFile( "target/scm-test/working-copy" );
106 }
107
108 /**
109 * Legacy method - same as getWorkingCopy()
110 *
111 * @return location of the working copy (always checkout)
112 */
113 protected File getWorkingDirectory()
114 {
115 return getWorkingCopy();
116 }
117
118 /**
119 * @return default location for doing assertions on a working tree
120 */
121 protected File getAssertionCopy()
122 {
123 return PlexusTestCase.getTestFile( "target/scm-test/assertion-copy" );
124 }
125
126 /**
127 * @return default location for doing update operations on a working tree
128 */
129 protected File getUpdatingCopy()
130 {
131 return PlexusTestCase.getTestFile( "target/scm-test/updating-copy" );
132 }
133
134 protected ScmManager getScmManager()
135 throws Exception
136 {
137 if ( scmManager == null )
138 {
139 scmManager = (ScmManager) lookup( ScmManager.ROLE );
140 }
141
142 return scmManager;
143 }
144
145 protected ScmRepository makeScmRepository( String scmUrl )
146 throws Exception
147 {
148 return getScmManager().makeScmRepository( scmUrl );
149 }
150
151 /**
152 * TODO This method is bogus. ActualPatch is not used and if used, it breaks
153 * some unit tests.
154 */
155 public void assertPath( String expectedPath, String actualPath )
156 throws Exception
157 {
158 assertEquals( StringUtils.replace( expectedPath, "\\", "/" ), StringUtils.replace( expectedPath, "\\", "/" ) );
159 }
160
161 protected void assertFile( File root, String fileName )
162 throws Exception
163 {
164 File file = new File( root, fileName );
165
166 assertTrue( "Missing file: '" + file.getAbsolutePath() + "'.", file.exists() );
167
168 assertTrue( "File isn't a file: '" + file.getAbsolutePath() + "'.", file.isFile() );
169
170 String expected = fileName;
171
172 String actual = FileUtils.fileRead( file );
173
174 assertEquals( "The file doesn't contain the expected contents. File: " + file.getAbsolutePath(), expected,
175 actual );
176 }
177
178 protected void assertResultIsSuccess( ScmResult result )
179 {
180 if ( result.isSuccess() )
181 {
182 return;
183 }
184
185 printOutputError( result );
186
187 fail( "The check out result success flag was false." );
188 }
189
190 protected void printOutputError( ScmResult result )
191 {
192 System.err.println( "----------------------------------------------------------------------" );
193 System.err.println( "Provider message" );
194 System.err.println( "----------------------------------------------------------------------" );
195 System.err.println( result.getProviderMessage() );
196 System.err.println( "----------------------------------------------------------------------" );
197
198 System.err.println( "----------------------------------------------------------------------" );
199 System.err.println( "Command output" );
200 System.err.println( "----------------------------------------------------------------------" );
201 System.err.println( result.getCommandOutput() );
202 System.err.println( "----------------------------------------------------------------------" );
203 }
204
205 protected ScmFileSet getScmFileSet()
206 {
207 return new ScmFileSet( getWorkingCopy() );
208 }
209
210 protected static void setDebugExecute( boolean debugExecute )
211 {
212 ScmTestCase.debugExecute = debugExecute;
213 }
214
215 /**
216 * Execute the command line
217 *
218 * @param workingDirectory not null
219 * @param executable not null, should be a system command
220 * @param arguments not null
221 * @throws Exception if any
222 * @see CommandLineUtils#executeCommandLine(Commandline, org.codehaus.plexus.util.cli.StreamConsumer,
223 * org.codehaus.plexus.util.cli.StreamConsumer)
224 */
225 public static void execute( File workingDirectory, String executable, String arguments )
226 throws Exception
227 {
228 Commandline cl = new Commandline();
229
230 cl.setExecutable( executable );
231
232 cl.setWorkingDirectory( workingDirectory.getAbsolutePath() );
233
234 cl.addArguments( CommandLineUtils.translateCommandline( arguments ) );
235
236 StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
237
238 StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
239
240 System.out.println( "Test command line: " + cl );
241
242 int exitValue = CommandLineUtils.executeCommandLine( cl, stdout, stderr );
243
244 if ( debugExecute || exitValue != 0 )
245 {
246 System.err.println( "-----------------------------------------" );
247 System.err.println( "Command line: " + cl );
248 System.err.println( "Working directory: " + cl.getWorkingDirectory() );
249 System.err.println( "-----------------------------------------" );
250 System.err.println( "Standard output: " );
251 System.err.println( "-----------------------------------------" );
252 System.err.println( stdout.getOutput() );
253 System.err.println( "-----------------------------------------" );
254
255 System.err.println( "Standard error: " );
256 System.err.println( "-----------------------------------------" );
257 System.err.println( stderr.getOutput() );
258 System.err.println( "-----------------------------------------" );
259 }
260
261 if ( exitValue != 0 )
262 {
263 fail( "Exit value wasn't 0, was:" + exitValue );
264 }
265 }
266
267 protected static void makeDirectory( File basedir, String fileName )
268 {
269 File dir = new File( basedir, fileName );
270
271 if ( !dir.exists() )
272 {
273 assertTrue( dir.mkdirs() );
274 }
275 }
276
277 protected static void makeFile( File basedir, String fileName )
278 throws IOException
279 {
280 makeFile( basedir, fileName, fileName );
281 }
282
283 public static void makeFile( File basedir, String fileName, String contents )
284 throws IOException
285 {
286 File file = new File( basedir, fileName );
287
288 File parent = file.getParentFile();
289
290 if ( !parent.exists() )
291 {
292 assertTrue( parent.mkdirs() );
293 }
294
295 FileWriter writer = new FileWriter( file );
296 try
297 {
298 writer.write( contents );
299 }
300 finally
301 {
302 IOUtil.close( writer );
303 }
304 }
305
306 public static Date getDate( int year, int month, int day )
307 {
308 return getDate( year, month, day, 0, 0, 0, null );
309 }
310
311 protected static Date getDate( int year, int month, int day, TimeZone tz )
312 {
313 return getDate( year, month, day, 0, 0, 0, tz );
314 }
315
316 protected static Date getDate( int year, int month, int day, int hourOfDay, int minute, int second, TimeZone tz )
317 {
318 Calendar cal = Calendar.getInstance();
319
320 if ( tz != null )
321 {
322 cal.setTimeZone( tz );
323 }
324 cal.set( year, month, day, hourOfDay, minute, second );
325 cal.set( Calendar.MILLISECOND, 0 );
326
327 return cal.getTime();
328 }
329
330 public void assertCommandLine( String expectedCommand, File expectedWorkingDirectory, Commandline actualCommand )
331 throws IOException
332 {
333 Commandline cl = new Commandline( expectedCommand );
334 if ( expectedWorkingDirectory != null )
335 {
336 cl.setWorkingDirectory( expectedWorkingDirectory.getAbsolutePath() );
337 }
338 assertEquals( cl.toString(), actualCommand.toString() );
339 }
340
341 /**
342 * @param cmd the executable to run, not null.
343 * @return <code>true</code>
344 */
345 public static boolean isSystemCmd( String cmd )
346 {
347 try
348 {
349 Runtime.getRuntime().exec( cmd );
350
351 return true;
352 }
353 catch ( IOException e )
354 {
355 return false;
356 }
357 }
358 }