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 }