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    }