001 package org.codehaus.mojo.sql;
002
003 /*
004 * Copyright 2006 The Codehaus
005 *
006 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
007 * in compliance with the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software distributed under the License
012 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
013 * or implied. See the License for the specific language governing permissions and limitations under
014 * the License.
015 */
016
017
018 import java.io.File;
019 import java.util.Properties;
020
021 import org.apache.maven.plugin.MojoExecutionException;
022 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
023 import org.apache.maven.settings.Server;
024 import org.apache.maven.settings.Settings;
025 import org.apache.maven.shared.filtering.MavenFileFilter;
026
027 /**
028 * Unit test for simple SqlExecMojo.
029 */
030 public class SqlExecMojoTest extends AbstractMojoTestCase {
031 private SqlExecMojo mojo;
032
033 private Properties p;
034
035 public void setUp() throws Exception {
036 super.setUp();
037 p = new Properties();
038 p.load(getClass().getResourceAsStream("/test.properties"));
039
040 mojo = new SqlExecMojo();
041
042 // populate parameters
043 mojo.setDriver(p.getProperty("driver"));
044 mojo.setUsername(p.getProperty("user"));
045 mojo.setPassword(p.getProperty("password"));
046 mojo.setUrl(p.getProperty("url"));
047 mojo.setDriverProperties(p.getProperty("driverProperties"));
048
049 MavenFileFilter filter = (MavenFileFilter) lookup("org.apache.maven.shared.filtering.MavenFileFilter",
050 "default");
051 mojo.setFileFilter(filter);
052
053 }
054
055 /**
056 * No error when there is no input
057 */
058 public void testNoCommandMojo() throws MojoExecutionException {
059 mojo.execute();
060
061 assertEquals(0, mojo.getSuccessfulStatements());
062 }
063
064 public void testCreateCommandMojo() throws MojoExecutionException {
065 String command = "create table PERSON ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
066 mojo.addText(command);
067 mojo.execute();
068
069 assertEquals(1, mojo.getSuccessfulStatements());
070 }
071
072 public void testDropCommandMojo() throws MojoExecutionException {
073 String command = "drop table PERSON";
074 mojo.addText(command);
075 mojo.execute();
076 assertEquals(1, mojo.getSuccessfulStatements());
077 }
078
079 public void testFileSetMojo() throws MojoExecutionException {
080
081 Fileset ds = new Fileset();
082 ds.setBasedir("src/test");
083 ds.setIncludes(new String[] { "**/create*.sql" });
084 ds.scan();
085 assert (ds.getIncludedFiles().length == 1);
086
087 mojo.setFileset(ds);
088
089 mojo.execute();
090
091 assertEquals(3, mojo.getSuccessfulStatements());
092
093 }
094
095 public void testFileArrayMojo() throws MojoExecutionException {
096 File[] srcFiles = new File[1];
097 srcFiles[0] = new File("src/test/data/drop-test-tables.sql");
098
099 mojo.setSrcFiles(srcFiles);
100 mojo.execute();
101
102 assertEquals(3, mojo.getSuccessfulStatements());
103
104 }
105
106 /**
107 * Ensure srcFiles always execute first
108 *
109 */
110 public void testAllMojo() throws MojoExecutionException {
111
112 String command = "create table PERSON2 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
113 mojo.addText(command);
114
115 File[] srcFiles = new File[1];
116 srcFiles[0] = new File("src/test/data/create-test-tables.sql");
117 mojo.setSrcFiles(srcFiles);
118
119 Fileset ds = new Fileset();
120 ds.setBasedir("src/test");
121 ds.setIncludes(new String[] { "**/drop*.sql" });
122 ds.scan();
123 mojo.setFileset(ds);
124 mojo.execute();
125
126 assertEquals(7, mojo.getSuccessfulStatements());
127 }
128
129 public void testOrderFile() throws MojoExecutionException {
130 Fileset ds = new Fileset();
131 ds.setBasedir("src/test");
132 ds.setIncludes(new String[] { "**/drop*.sql", "**/create*.sql" });
133 ds.scan();
134 mojo.setFileset(ds);
135
136 mojo.setOrderFile(SqlExecMojo.FILE_SORTING_ASC);
137 mojo.execute();
138
139 assertEquals(6, mojo.getSuccessfulStatements());
140
141 try {
142 mojo.setOrderFile(SqlExecMojo.FILE_SORTING_DSC);
143 mojo.execute();
144 fail("Execution is not aborted on error.");
145 } catch (MojoExecutionException e) {
146 }
147 }
148
149 public void testOnErrorContinueMojo() throws MojoExecutionException {
150 String command = "create table BOGUS"; // bad syntax
151 mojo.addText(command);
152 mojo.setOnError("continue");
153 mojo.execute();
154 assertEquals(0, mojo.getSuccessfulStatements());
155 }
156
157 public void testOnErrorAbortMojo() throws MojoExecutionException {
158 String command = "create table BOGUS"; // bad syntax
159 mojo.addText(command);
160
161 try {
162 mojo.execute();
163 fail("Execution is not aborted on error.");
164
165 } catch (MojoExecutionException e) {
166
167 }
168
169 assertEquals(0, mojo.getSuccessfulStatements());
170 }
171
172 public void testOnErrorAbortAfterMojo() throws MojoExecutionException {
173 String commands = "create table BOGUS"; // bad syntax
174
175 mojo.addText(commands);
176
177 File[] srcFiles = new File[1];
178 srcFiles[0] = new File("src/test/data/invalid-syntax.sql");
179
180 assertTrue(srcFiles[0].exists());
181
182 mojo.setSrcFiles(srcFiles);
183 mojo.setOnError("abortAfter");
184
185 try {
186 mojo.execute();
187 fail("Execution is not aborted on error.");
188
189 } catch (MojoExecutionException e) {
190 // expected
191 }
192
193 assertEquals(0, mojo.getSuccessfulStatements());
194 assertEquals(2, mojo.getTotalStatements());
195 }
196
197 public void testDefaultUsernamePassword() throws MojoExecutionException {
198
199 Settings settings = new Settings();
200 Server server = new Server();
201 settings.addServer(server);
202
203 mojo.setSettings(settings);
204
205 // force a lookup of username
206 mojo.setUsername(null);
207 mojo.setPassword(null);
208
209 mojo.execute();
210
211 assertEquals("", mojo.getUsername());
212 assertEquals("", mojo.getPassword());
213
214 }
215
216 public void testUsernamePasswordLookup() throws MojoExecutionException {
217
218 Settings settings = new Settings();
219 Server server = new Server();
220 server.setId("somekey");
221 server.setUsername("username");
222 server.setPassword("password");
223 settings.addServer(server);
224
225 mojo.setSettings(settings);
226
227 // force a lookup of username
228 mojo.setSettingsKey("somekey");
229 mojo.setUsername(null);
230 mojo.setPassword(null);
231
232 mojo.execute();
233
234 assertEquals("username", mojo.getUsername());
235 assertEquals("password", mojo.getPassword());
236
237 }
238
239 public void testBadDriver() {
240 mojo.setDriver("bad-driver");
241 try {
242 mojo.execute();
243
244 fail("Bad driver is not detected");
245 } catch (MojoExecutionException e) {
246
247 }
248 }
249
250 public void testBadUrl() {
251 mojo.setUrl("bad-url");
252 try {
253 mojo.execute();
254
255 fail("Bad URL is not detected");
256 } catch (MojoExecutionException e) {
257
258 }
259 }
260
261 public void testBadFile() {
262 File[] srcFiles = new File[1];
263 srcFiles[0] = new File("a-every-bogus-file-that-does-not-exist");
264
265 mojo.setSrcFiles(srcFiles);
266 try {
267 mojo.execute();
268
269 fail("Bad files is not detected");
270 } catch (MojoExecutionException e) {
271
272 }
273 }
274
275 public void testOnError() {
276 mojo.setOnError("AbOrT");
277 assertEquals(SqlExecMojo.ON_ERROR_ABORT, mojo.getOnError());
278 mojo.setOnError("cOnTiNuE");
279 assertEquals(SqlExecMojo.ON_ERROR_CONTINUE, mojo.getOnError());
280 try {
281 mojo.setOnError("bad");
282 fail(IllegalArgumentException.class.getName() + " was not thrown.");
283 } catch (IllegalArgumentException e) {
284 // expected
285 }
286 try {
287 mojo.setOnError(null);
288 fail(IllegalArgumentException.class.getName() + " was not thrown.");
289 } catch (IllegalArgumentException e) {
290 // expected
291 }
292 }
293
294 public void testSkip() throws MojoExecutionException {
295 String command = "create table PERSON ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
296 mojo.addText(command);
297 mojo.setSkip(true);
298 mojo.execute();
299
300 // no command was executed due to skip is on
301 assertEquals(0, mojo.getSuccessfulStatements());
302 }
303
304 public void testDriverProperties() throws MojoExecutionException {
305 Properties driverProperties = this.mojo.getDriverProperties();
306 assertEquals(2, driverProperties.size());
307 assertEquals("value1", driverProperties.get("key1"));
308 assertEquals("value2", driverProperties.get("key2"));
309
310 mojo.setDriverProperties("key1=value1,key2");
311 try {
312 driverProperties = this.mojo.getDriverProperties();
313 } catch (MojoExecutionException e) {
314 }
315
316 }
317
318 public void testBlockMode() throws MojoExecutionException {
319 String command = "create table BLOCKTABLE ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
320 mojo.addText(command);
321 mojo.setEnableBlockMode(true);
322 mojo.execute();
323 assertEquals(1, mojo.getSuccessfulStatements());
324
325 mojo.setSqlCommand("");
326 mojo.getTransactions().clear();
327 command = "drop table BLOCKTABLE";
328 mojo.addText(command);
329 mojo.execute();
330 assertEquals(1, mojo.getSuccessfulStatements());
331 }
332
333 public void testKeepFormat() throws MojoExecutionException {
334 // Normally a line starting in -- would be ignored, but with keepformat
335 // mode
336 // on it will not.
337 String command = "--create table PERSON ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
338 mojo.addText(command);
339 mojo.setKeepFormat(true);
340
341 try {
342 mojo.execute();
343 fail("-- at the start of the SQL command is ignored.");
344 } catch (MojoExecutionException e) {
345 }
346
347 assertEquals(0, mojo.getSuccessfulStatements());
348
349 }
350
351 public void testBadDelimiter() throws Exception {
352 String command = "create table SEPARATOR ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar):"
353 + "create table SEPARATOR2 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
354
355 mojo.addText(command);
356 mojo.setDelimiter(":");
357
358 try {
359 mojo.execute();
360 fail("Expected parser error.");
361 } catch (MojoExecutionException e) {
362 }
363 }
364
365 public void testGoodDelimiter() throws Exception {
366 String command = "create table SEPARATOR ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)\n:\n"
367 + "create table SEPARATOR2 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
368
369 mojo.addText(command);
370 mojo.setDelimiter(":");
371
372 mojo.execute();
373
374 assertEquals(2, mojo.getSuccessfulStatements());
375 }
376
377 public void testBadDelimiterType() throws Exception {
378 String command = "create table BADDELIMTYPE ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)" + "\n:"
379 + "create table BADDELIMTYPE2 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
380
381 mojo.addText(command);
382 mojo.setDelimiter(":");
383 mojo.setDelimiterType(DelimiterType.ROW);
384
385 try {
386 mojo.execute();
387 fail("Expected parser error.");
388 } catch (MojoExecutionException e) {
389 }
390 }
391
392 public void testGoodDelimiterType() throws Exception {
393 String command = "create table GOODDELIMTYPE ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)"
394 + "\n: \n" + "create table GOODDELIMTYPE2 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
395
396 mojo.addText(command);
397 mojo.setDelimiter(":");
398 mojo.setDelimiterType(DelimiterType.ROW);
399
400 mojo.execute();
401 assertEquals(2, mojo.getSuccessfulStatements());
402 }
403
404 @SuppressWarnings("deprecation")
405 public void testOutputFile() throws Exception {
406 String command = "create table GOODDELIMTYPE3 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)"
407 + "\n: \n" + "create table GOODDELIMTYPE4 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
408
409 mojo.addText(command);
410 mojo.setDelimiter(":");
411 mojo.setDelimiterType(DelimiterType.ROW);
412
413 String basedir = System.getProperty("basedir", ".");
414 File outputFile = new File(basedir, "target/sql.out");
415 outputFile.delete();
416 mojo.setOutputFile(outputFile);
417 mojo.setPrintResutlSet(true);
418
419 mojo.execute();
420
421 assertTrue("Output file: " + outputFile + " not found.", outputFile.exists());
422
423 assertTrue("Unexpected empty output file. ", outputFile.length() > 0);
424
425 // makesure we can remote the file, it is not locked
426 // assertTrue( outputFile.delete() );
427
428 }
429 }