1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package nl.toolforge.karma.core.test;
20
21 import nl.toolforge.core.util.file.MyFileUtils;
22 import nl.toolforge.karma.core.Version;
23 import nl.toolforge.karma.core.cmd.CommandResponse;
24 import nl.toolforge.karma.core.module.Module;
25 import nl.toolforge.karma.core.module.SourceModule;
26 import nl.toolforge.karma.core.vc.AuthenticationException;
27 import nl.toolforge.karma.core.vc.Runner;
28 import nl.toolforge.karma.core.vc.cvsimpl.CVSException;
29 import nl.toolforge.karma.core.vc.cvsimpl.CVSRepository;
30 import nl.toolforge.karma.core.vc.cvsimpl.CVSRunner;
31 import org.apache.commons.io.FileUtils;
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
34 import org.apache.tools.ant.Project;
35 import org.apache.tools.ant.taskdefs.Copy;
36 import org.apache.tools.ant.types.FileSet;
37
38 import java.io.File;
39 import java.io.IOException;
40 import java.io.InputStream;
41 import java.util.Properties;
42 import java.util.Random;
43
44 /***
45 * <p>Initializes tests that need a local CVS repository. This local repository can be found as a <code>zip</code>-file
46 * and/or <code>tar</code> file in the <code>resources/test</code> directory of this packages' sources. It contains a
47 * CVS repository with predefined modules that can be used for testing purposes. If the CVS repository cannot be found
48 * (i.e. the user has not prepared his/her local environment with the CVSROOT), and you don't want your CVS stuff to
49 * be tested, make sure you ignore these testcases in your test-configuration.
50 *
51 * <p>Note the dependency of this class with {@link nl.toolforge.karma.core.location.Location} and
52 * {@link nl.toolforge.karma.core.vc.cvsimpl.CVSRepository}.
53 *
54 * <p>When performing operations on managed files, a randomize function is used to be able to repeatedly perform
55 * tests. Filenames and modulenames in the repository could be named like <code>bla_036548290.56437</code>.
56 *
57 * @author D.A. Smedes
58 * @version $Id:
59 */
60 public class LocalCVSInitializer extends BaseTest {
61
62 private static Log logger = LogFactory.getLog(LocalCVSInitializer.class);
63
64 /***
65 * The name of the a test module in the test repository
66 */
67 protected static final String DEFAULT_MODULE_1 = "CORE-test-module-1";
68
69 private static CVSRepository location = null;
70 private File localCVSRepository = null;
71
72 /***
73 * Can be used to access random <code>int</code>s.
74 */
75 protected static Random randomizer = new Random();
76
77 public void setUp() throws InitializationException {
78
79 super.setUp();
80
81 String localPath = null;
82
83 try {
84 Properties props = new Properties();
85 InputStream stream = getClass().getClassLoader().getResourceAsStream("test/test-cvs.properties");
86 if (stream == null) {
87
88
89 logger.error("could not find properties file: test-cvs.properties");
90 }
91 props.load(stream);
92 localPath = props.getProperty("cvs.local.path");
93
94
95
96
97 Copy copy = new Copy();
98 copy.setProject(new Project());
99
100 FileSet set = new FileSet();
101 set.setDir(new File(localPath));
102 set.setIncludes("**/*");
103
104 copy.addFileset(set);
105
106 localCVSRepository = MyFileUtils.createTempDirectory();
107
108 copy.setTodir(localCVSRepository);
109 copy.execute();
110
111 logger.debug("cvs.local.path = " + localPath);
112
113 location = new CVSRepository("test-id-1");
114 location.setProtocol(CVSRepository.LOCAL);
115 location.setRepository(localCVSRepository.getPath());
116
117 location.setWorkingContext(getWorkingContext());
118
119 } catch (Exception e) {
120 throw new InitializationException("Local CVS repository could not be initialized. Trying to initialize repository at : ".concat(localPath));
121 }
122
123 }
124
125 /***
126 * Deletes the temporary directory.
127 */
128 public void tearDown() {
129
130 super.tearDown();
131
132 try {
133 FileUtils.deleteDirectory(localCVSRepository);
134 } catch (IOException e) {
135 fail(e.getMessage());
136 }
137 }
138
139 /***
140 * Gets the <code>CVSRepository</code> that can be used for junit testing.
141 */
142 protected CVSRepository getTestLocation() {
143 return location;
144 }
145
146 /***
147 * Creates a randomly named test filename in the module directory (<code>TestModule</code>) for the test cvs
148 * repository. Names are of the form <code>test_<random-int></code>.
149 */
150 protected String getTestFileName() throws InitializationException {
151
152 int someInt = randomizer.nextInt();
153 someInt = (someInt < 0 ? someInt * -1 : someInt);
154
155 return "test_" + someInt + ".nobody.txt";
156 }
157
158 /***
159 * <p>Checks out {@link #DEFAULT_MODULE_1}, which can then be used to test against.
160 */
161 public final Module checkoutDefaultModule1() {
162
163 try {
164 Runner runner = getTestRunner();
165
166 Module module = new SourceModule(DEFAULT_MODULE_1, location);
167 module.setBaseDir(new File(getWorkingContext().getProjectBaseDirectory(), module.getName()));
168
169
170 runner.checkout(module);
171
172 return module;
173
174 } catch (Exception e) {
175 fail(e.getMessage());
176 }
177 return null;
178 }
179
180 public final Module checkoutDefaultModuleWithVersion() {
181
182 try {
183 Runner runner = getTestRunner();
184
185 Module module = new SourceModule(DEFAULT_MODULE_1, location, new Version("0-0"));
186 module.setBaseDir(new File(getWorkingContext().getProjectBaseDirectory(), module.getName()));
187
188
189 runner.checkout(module);
190
191 return module;
192
193 } catch (Exception e) {
194 fail(e.getMessage());
195 }
196 return null;
197 }
198
199 /***
200 * Initializes a Runner for test purposes.
201 *
202 * @return A Runner instance.
203 * @throws CVSException When initializing the runner failed.
204 */
205 protected final Runner getTestRunner() throws CVSException, AuthenticationException {
206 return getTestRunner(new CommandResponseFaker(null));
207 }
208
209 /***
210 * Initializes a Runner for test purposes, with an optional CommandResponse.
211 *
212 * @param response
213 * @return
214 * @throws CVSException When initializing the runner failed.
215 */
216 protected final Runner getTestRunner(CommandResponse response) throws CVSException, AuthenticationException {
217
218 CVSRunner runner = new CVSRunner(getTestLocation());
219
220 if (response != null) {
221 runner.setCommandResponse(response);
222 }
223
224 return runner;
225 }
226
227 /***
228 * When this class is run (it is a test class), it won't bother you with 'no tests found'.
229 */
230 public void testNothing() {
231 assertTrue(true);
232 }
233 }