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