package org.codehaus.mojo.sql;
/*
* Copyright 2006 The Codehaus
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
import junit.framework.TestCase;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import org.apache.maven.settings.Server;
import org.apache.maven.settings.Settings;
import org.apache.maven.shared.filtering.MavenFileFilter;
import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
/**
* Unit test for simple SqlExecMojo.
*/
public class SqlExecMojoTest
extends AbstractMojoTestCase
{
private SqlExecMojo mojo;
private Properties p;
public void setUp()
throws Exception
{
super.setUp();
p = new Properties();
p.load( getClass().getResourceAsStream( "/test.properties" ) );
mojo = new SqlExecMojo();
// populate parameters
mojo.setDriver( p.getProperty( "driver" ) );
mojo.setUsername( p.getProperty( "user" ) );
mojo.setPassword( p.getProperty( "password" ) );
mojo.setUrl( p.getProperty( "url" ) );
mojo.setDriverProperties( p.getProperty( "driverProperties" ) );
MavenFileFilter filter = (MavenFileFilter) lookup( "org.apache.maven.shared.filtering.MavenFileFilter", "default" );
mojo.setFileFilter(filter);
SecDispatcher securityDispatcher = (SecDispatcher) lookup( "org.sonatype.plexus.components.sec.dispatcher.SecDispatcher", "default" );
mojo.setSecurityDispatcher( securityDispatcher );
}
/**
* No error when there is no input
*/
public void testNoCommandMojo()
throws MojoExecutionException
{
mojo.execute();
assertEquals( 0, mojo.getSuccessfulStatements() );
}
public void testCreateCommandMojo()
throws MojoExecutionException
{
String command = "create table PERSON ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
mojo.addText( command );
mojo.execute();
assertEquals( 1, mojo.getSuccessfulStatements() );
}
public void testDropCommandMojo()
throws MojoExecutionException
{
String command = "drop table PERSON";
mojo.addText( command );
mojo.execute();
assertEquals( 1, mojo.getSuccessfulStatements() );
}
public void testFileSetMojo()
throws MojoExecutionException
{
Fileset ds = new Fileset();
ds.setBasedir( "src/test" );
ds.setIncludes( new String[] { "**/create*.sql" } );
ds.scan();
assert ( ds.getIncludedFiles().length == 1 );
mojo.setFileset( ds );
mojo.execute();
assertEquals( 3, mojo.getSuccessfulStatements() );
}
public void testFileArrayMojo()
throws MojoExecutionException
{
File[] srcFiles = new File[1];
srcFiles[0] = new File( "src/test/data/drop-test-tables.sql" );
mojo.setSrcFiles( srcFiles );
mojo.execute();
assertEquals( 3, mojo.getSuccessfulStatements() );
}
/**
* Ensure srcFiles always execute first
*
*/
public void testAllMojo()
throws MojoExecutionException
{
String command = "create table PERSON2 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
mojo.addText( command );
File[] srcFiles = new File[1];
srcFiles[0] = new File( "src/test/data/create-test-tables.sql" );
mojo.setSrcFiles( srcFiles );
Fileset ds = new Fileset();
ds.setBasedir( "src/test" );
ds.setIncludes( new String[] { "**/drop*.sql" } );
ds.scan();
mojo.setFileset( ds );
mojo.execute();
assertEquals( 7, mojo.getSuccessfulStatements() );
}
public void testOrderFile()
throws MojoExecutionException
{
Fileset ds = new Fileset();
ds.setBasedir( "src/test" );
ds.setIncludes( new String[] { "**/drop*.sql", "**/create*.sql" } );
ds.scan();
mojo.setFileset( ds );
mojo.setOrderFile( SqlExecMojo.FILE_SORTING_ASC );
mojo.execute();
assertEquals( 6, mojo.getSuccessfulStatements() );
try
{
mojo.setOrderFile( SqlExecMojo.FILE_SORTING_DSC );
mojo.execute();
fail( "Execution is not aborted on error." );
}
catch ( MojoExecutionException e )
{
}
}
public void testOnErrorContinueMojo()
throws MojoExecutionException
{
String command = "create table BOGUS"; //bad syntax
mojo.addText( command );
mojo.setOnError( "continue" );
mojo.execute();
assertEquals( 0, mojo.getSuccessfulStatements() );
}
public void testOnErrorAbortMojo()
throws MojoExecutionException
{
String command = "create table BOGUS"; //bad syntax
mojo.addText( command );
try
{
mojo.execute();
fail( "Execution is not aborted on error." );
}
catch ( MojoExecutionException e )
{
}
assertEquals( 0, mojo.getSuccessfulStatements() );
}
public void testOnErrorAbortAfterMojo()
throws MojoExecutionException
{
String commands = "create table BOGUS"; //bad syntax
mojo.addText( commands );
File[] srcFiles = new File[1];
srcFiles[0] = new File( "src/test/data/invalid-syntax.sql" );
assertTrue( srcFiles[0].exists() );
mojo.setSrcFiles( srcFiles );
mojo.setOnError( "abortAfter" );
try
{
mojo.execute();
fail( "Execution is not aborted on error." );
}
catch ( MojoExecutionException e )
{
//expected
}
assertEquals( 0, mojo.getSuccessfulStatements() );
assertEquals( 2, mojo.getTotalStatements() );
}
public void testDefaultUsernamePassword()
throws MojoExecutionException
{
Settings settings = new Settings();
Server server = new Server();
settings.addServer( server );
mojo.setSettings( settings );
//force a lookup of username
mojo.setUsername( null );
mojo.setPassword( null );
mojo.execute();
assertEquals( "", mojo.getUsername() );
assertEquals( "", mojo.getPassword() );
}
public void testUsernamePasswordLookup()
throws MojoExecutionException
{
Settings settings = new Settings();
Server server = new Server();
server.setId( "somekey" );
server.setUsername( "username" );
server.setPassword( "password" );
settings.addServer( server );
mojo.setSettings( settings );
//force a lookup of username
mojo.setSettingsKey( "somekey" );
mojo.setUsername( null );
mojo.setPassword( null );
mojo.execute();
assertEquals( "username", mojo.getUsername() );
assertEquals( "password", mojo.getPassword() );
}
public void testBadDriver()
{
mojo.setDriver( "bad-driver" );
try
{
mojo.execute();
fail( "Bad driver is not detected" );
}
catch ( MojoExecutionException e )
{
}
}
public void testBadUrl()
{
mojo.setUrl( "bad-url" );
try
{
mojo.execute();
fail( "Bad URL is not detected" );
}
catch ( MojoExecutionException e )
{
}
}
public void testBadFile()
{
File[] srcFiles = new File[1];
srcFiles[0] = new File( "a-every-bogus-file-that-does-not-exist" );
mojo.setSrcFiles( srcFiles );
try
{
mojo.execute();
fail( "Bad files is not detected" );
}
catch ( MojoExecutionException e )
{
}
}
public void testOnError()
{
mojo.setOnError( "AbOrT" );
assertEquals( SqlExecMojo.ON_ERROR_ABORT, mojo.getOnError() );
mojo.setOnError( "cOnTiNuE" );
assertEquals( SqlExecMojo.ON_ERROR_CONTINUE, mojo.getOnError() );
try
{
mojo.setOnError( "bad" );
fail( IllegalArgumentException.class.getName() + " was not thrown." );
}
catch ( IllegalArgumentException e )
{
//expected
}
try
{
mojo.setOnError( null );
fail( IllegalArgumentException.class.getName() + " was not thrown." );
}
catch ( IllegalArgumentException e )
{
//expected
}
}
public void testSkip()
throws MojoExecutionException
{
String command = "create table PERSON ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
mojo.addText( command );
mojo.setSkip( true );
mojo.execute();
//no command was executed due to skip is on
assertEquals( 0, mojo.getSuccessfulStatements() );
}
public void testDriverProperties()
throws MojoExecutionException
{
Properties driverProperties = this.mojo.getDriverProperties();
assertEquals( 2, driverProperties.size() );
assertEquals( "value1", driverProperties.get( "key1" ) );
assertEquals( "value2", driverProperties.get( "key2" ) );
mojo.setDriverProperties( "key1=value1,key2" );
try
{
driverProperties = this.mojo.getDriverProperties();
}
catch ( MojoExecutionException e )
{
}
}
public void testBlockMode()
throws MojoExecutionException
{
String command = "create table BLOCKTABLE ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
mojo.addText( command );
mojo.setEnableBlockMode( true );
mojo.execute();
assertEquals( 1, mojo.getSuccessfulStatements() );
mojo.setSqlCommand( "" );
mojo.getTransactions().clear();
command = "drop table BLOCKTABLE";
mojo.addText( command );
mojo.execute();
assertEquals( 1, mojo.getSuccessfulStatements() );
}
public void testKeepFormat()
throws MojoExecutionException
{
// Normally a line starting in -- would be ignored, but with keepformat mode
// on it will not.
String command = "--create table PERSON ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
mojo.addText( command );
mojo.setKeepFormat( true );
try
{
mojo.execute();
fail( "-- at the start of the SQL command is ignored." );
}
catch ( MojoExecutionException e )
{
}
assertEquals( 0, mojo.getSuccessfulStatements() );
}
public void testBadDelimiter()
throws Exception
{
String command = "create table SEPARATOR ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar):"
+ "create table SEPARATOR2 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
mojo.addText( command );
mojo.setDelimiter( ":" );
try
{
mojo.execute();
fail( "Expected parser error." );
}
catch ( MojoExecutionException e )
{
}
}
public void testGoodDelimiter()
throws Exception
{
String command = "create table SEPARATOR ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)\n:\n"
+ "create table SEPARATOR2 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
mojo.addText( command );
mojo.setDelimiter( ":" );
mojo.execute();
assertEquals( 2, mojo.getSuccessfulStatements() );
}
public void testBadDelimiterType()
throws Exception
{
String command = "create table BADDELIMTYPE ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)" + "\n:"
+ "create table BADDELIMTYPE2 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
mojo.addText( command );
mojo.setDelimiter( ":" );
mojo.setDelimiterType( DelimiterType.ROW );
try
{
mojo.execute();
fail( "Expected parser error." );
}
catch ( MojoExecutionException e )
{
}
}
public void testGoodDelimiterType()
throws Exception
{
String command = "create table GOODDELIMTYPE ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)"
+ "\n: \n" + "create table GOODDELIMTYPE2 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
mojo.addText( command );
mojo.setDelimiter( ":" );
mojo.setDelimiterType( DelimiterType.ROW );
mojo.execute();
assertEquals( 2, mojo.getSuccessfulStatements() );
}
public void testOutputFile()
throws Exception
{
String command = "create table GOODDELIMTYPE3 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)"
+ "\n: \n" + "create table GOODDELIMTYPE4 ( PERSON_ID integer, FIRSTNAME varchar, LASTNAME varchar)";
mojo.addText( command );
mojo.setDelimiter( ":" );
mojo.setDelimiterType( DelimiterType.ROW );
String basedir = System.getProperty( "basedir", "." );
File outputFile = new File( basedir, "target/sql.out" );
outputFile.delete();
mojo.setOutputFile( outputFile );
mojo.setPrintResutlSet( true );
mojo.execute();
assertTrue( "Output file: " + outputFile + " not found.", outputFile.exists() );
assertTrue( "Unexpected empty output file. ", outputFile.length() > 0 );
//makesure we can remote the file, it is not locked
//assertTrue( outputFile.delete() );
}
}