package org.codehaus.mojo.castor;
/*
* Copyright 2001-2005 The Apache Software Foundation.
*
* 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 java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.maven.model.Model;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.PlexusTestCase;
import org.exolab.castor.util.Version;
public class GenerateMojoTest
extends PlexusTestCase
{
private static final String TIMESTAMP_DIR = getBasedir() + "/target/test/resources/timestamp";
private static final String GENERATED_DIR = getBasedir() + "/target/generated-sources/castor";
private static final String GENERATED_RESOURCES_DIR = getBasedir() + "/target/generated-resources/castor";
private static final String MAPPING_XSD = getBasedir() + "/src/test/resources/mapping.xml";
GenerateMojo generateMojo;
private File aClassFile;
private File aDescriptorClassFile;
private double castorVersion;
public void setUp()
throws IOException
{
// FileUtils.deleteDirectory( new File( getBasedir() + "/target/test" ) );
FileUtils.deleteDirectory( new File( GENERATED_DIR ) );
FileUtils.deleteDirectory( new File( GENERATED_RESOURCES_DIR ) );
FileUtils.deleteDirectory( new File( TIMESTAMP_DIR ) );
aClassFile = new File( GENERATED_DIR, "org/codehaus/mojo/castor/A.java" );
aDescriptorClassFile = new File( GENERATED_DIR, "org/codehaus/mojo/castor/descriptors/ADescriptor.java" );
this.generateMojo = new GenerateMojo();
this.generateMojo.setProject( new MavenProject( new Model() ) );
this.generateMojo.setDest( new File ( GENERATED_DIR ) );
this.generateMojo.setResourceDestination( new File ( GENERATED_RESOURCES_DIR ) );
this.generateMojo.setTstamp( new File ( TIMESTAMP_DIR ) );
this.castorVersion = getCastorVersion();
}
public void tearDown()
throws IOException
{
generateMojo = null;
}
public void testExecute()
throws MojoExecutionException
{
generateMojo.setPackaging( "org.codehaus.mojo.castor" );
generateMojo.setSchema( new File (MAPPING_XSD ) );
generateMojo.execute();
assertTrue( aClassFile.exists() );
assertTrue( aDescriptorClassFile.exists() );
}
// MCASTOR-5 issue
public void testForGetContent() throws Exception {
generateMojo.setSchema( new File (getPathTo( "src/test/resources/availability_report.xsd" ) ) );
generateMojo.setProperties( new File (getPathTo( "src/test/resources/castorbuilder.properties" ) ) );
generateMojo.setTypes("arraylist");
generateMojo.execute();
File generatedClass = new File( GENERATED_DIR + "/org/opennms/report/availability", "Created.java" );
assertTrue( "Expected " + generatedClass + " to exist.", generatedClass.exists() );
assertFileContains( generatedClass, "getContent" );
}
private void assertFileContains( File file, String string ) throws IOException {
String contents = FileUtils.readFileToString( file, "ISO-8859-1" );
boolean contains = (contents.indexOf(string) > -1);
assertTrue( "Expected " + file + " to contain string " + string, contains );
}
public void testEmptyPackage()
throws MojoExecutionException
{
generateMojo.setSchema( new File (getPathTo( "src/test/resources/vacuumd-configuration.xsd" ) ) );
generateMojo.setProperties( new File ( getPathTo( "src/test/resources/castorbuilder.properties" ) ) );
generateMojo.setTypes("arraylist");
generateMojo.execute();
assertTrue( new File( GENERATED_DIR, "Actions.java" ).exists() );
}
// public void testGenerateImportedSchemasDisabled()
// throws MojoExecutionException
// {
//
// generateMojo.setSchema( getPathTo( "src/test/resources/main.xsd" ) );
// generateMojo.setProperties( getPathTo( "src/test/resources/castorbuilder.properties" ) );
// generateMojo.setTypes("arraylist");
// generateMojo.setGenerateImportedSchemas(false);
// generateMojo.execute();
//
// assertTrue( new File( GENERATED_DIR, "Main.java" ).exists() );
//// assertFalse( new File( GENERATED_DIR, "MainType.java" ).exists() );
// }
public void testGenerateImportedSchemasEnabled()
throws MojoExecutionException
{
generateMojo.setSchema( new File ( getPathTo("src/test/resources/main.xsd") ) );
generateMojo.setProperties( new File ( getPathTo("src/test/resources/castorbuilder.properties") ) );
generateMojo.setTypes("arraylist");
generateMojo.setGenerateImportedSchemas(true);
generateMojo.execute();
assertTrue(new File(GENERATED_DIR, "Main.java").exists());
assertTrue(new File(GENERATED_DIR, "MainType.java").exists());
}
public void testGenerateWithVelocity()
throws MojoExecutionException
{
generateMojo.setSchema( new File ( getPathTo("src/test/resources/main.xsd") ) );
generateMojo.setProperties( new File ( getPathTo("src/test/resources/castorbuilder.properties") ) );
generateMojo.setTypes("arraylist");
generateMojo.setGenerateImportedSchemas(true);
generateMojo.setClassGenerationMode("velocity");
generateMojo.setPackaging("org.codehaus.mojo.castor.velocity");
generateMojo.execute();
assertTrue(new File(GENERATED_DIR, "org/codehaus/mojo/castor/velocity/Main.java").exists());
assertTrue(new File(GENERATED_DIR, "org/codehaus/mojo/castor/velocity/MainType.java").exists());
}
public void testGenerateWithSeparateResourceDirectory()
throws MojoExecutionException
{
// configure MOJO
generateMojo.setSchema( new File ( getPathTo("src/test/resources/main.xsd") ) );
generateMojo.setProperties( new File ( getPathTo("src/test/resources/castorbuilder.properties") ) );
generateMojo.setTypes("arraylist");
generateMojo.setGenerateImportedSchemas(true);
generateMojo.setPackaging("org.codehaus.mojo.castor.velocity");
generateMojo.setResourceDestination( new File ( GENERATED_RESOURCES_DIR ));
// execute MOJO
generateMojo.execute();
// test assertions
String packagePath = "org/codehaus/mojo/castor/velocity/";
assertTrue(new File(GENERATED_DIR, packagePath + "Main.java").exists());
assertTrue(new File(GENERATED_DIR, packagePath + "MainType.java").exists());
if (this.castorVersion > 1.301) {
assertTrue(new File(GENERATED_RESOURCES_DIR, packagePath + "/.castor.cdr").exists());
} else {
assertFalse(new File(GENERATED_RESOURCES_DIR, packagePath + "/.castor.cdr").exists());
}
}
private double getCastorVersion() {
String text = Version.VERSION;
int firstPoint = text.indexOf(".");
double version = Double.valueOf(text.substring(0, firstPoint));
String[] tokens = text.substring(firstPoint + 1).split("\\.");
int i = 10;
for (String token: tokens) {
version = version + Double.valueOf(token)/i;
i = i * 10;
}
return version;
}
public void testGenerateWithMappings()
throws MojoExecutionException
{
generateMojo.setSchema( new File ( getPathTo("src/test/resources/main.xsd") ) );
generateMojo.setProperties( new File ( getPathTo("src/test/resources/castorbuilder.properties") ) );
generateMojo.setTypes( "arraylist" );
generateMojo.setGenerateMappings( true );
generateMojo.execute();
assertTrue( new File ( GENERATED_DIR, "Main.java" ).exists());
assertTrue( new File ( getBasedir() , "mapping.xml" ).exists());
FileUtils.deleteQuietly( new File( "target/test-classes", "mapping.xml" ) );
}
private File getTimeStampFile()
{
return new File( TIMESTAMP_DIR, "mapping.xml" );
}
public void testCreateTimeStamp()
throws MojoExecutionException
{
File timeStampFile = getTimeStampFile();
generateMojo.setPackaging( "org.codehaus.mojo.castor" );
generateMojo.setSchema( new File ( MAPPING_XSD ) );
generateMojo.execute();
assertTrue( aClassFile.exists() );
assertTrue( aDescriptorClassFile.exists() );
assertTrue( timeStampFile.exists() );
}
public void testCreateTimeStampFolder()
throws MojoExecutionException
{
File timeStampFile = getTimeStampFile();
generateMojo.setPackaging( "org.codehaus.mojo.castor" );
generateMojo.setSchema( new File ( MAPPING_XSD ) );
generateMojo.execute();
assertTrue( aClassFile.exists() );
assertTrue( aDescriptorClassFile.exists() );
assertTrue( timeStampFile.exists() );
}
// // timestamp exist but not updated
// public void testCreateTimeStampOld()
// throws MojoExecutionException, IOException
// {
// File timeStampFile = createTimeStampWithTime( timestampOf( MAPPING_XSD ) - 1 );
//
// generateMojo.setPackaging( "org.codehaus.mojo.castor" );
// generateMojo.setSchema( MAPPING_XSD );
// generateMojo.execute();
//
// assertTrue( aClassFile.exists() );
// assertTrue( aDescriptorClassFile.exists() );
// assertTrue( timeStampFile.exists() );
//
// }
private File createTimeStampWithTime( long time )
throws IOException
{
File timeStampFolder = new File( TIMESTAMP_DIR );
File timeStampFile = getTimeStampFile();
if ( !timeStampFolder.exists() )
{
timeStampFolder.mkdirs();
}
if ( !timeStampFile.exists() )
{
FileUtils.touch( timeStampFile );
timeStampFile.setLastModified( time );
}
return timeStampFile;
}
public void testCreateTimeStampLatest()
throws MojoExecutionException, IOException
{
File timeStampFile = createTimeStampWithTime( timestampOf( MAPPING_XSD ) + 1 );
generateMojo.setPackaging( "org.codehaus.mojo.castor" );
generateMojo.setSchema( new File ( MAPPING_XSD ) );
generateMojo.execute();
assertTrue( !aClassFile.exists() );
assertTrue( !aDescriptorClassFile.exists() );
assertTrue( timeStampFile.exists() );
}
private long timestampOf( String file )
{
File sourcefile = new File( file );
long time = sourcefile.lastModified();
return time;
}
public void testDestProperty()
{
generateMojo.setDest( new File ( "testString" ) );
assertEquals( "testString", generateMojo.getDest().toString() );
}
public void testTStampProperty()
{
generateMojo.setTstamp( new File ( "testString" ) );
assertEquals( "testString", generateMojo.getTstamp().toString() );
}
public void testSchemaProperty()
{
generateMojo.setSchema( new File ( "teststring" ) );
assertEquals( "teststring", generateMojo.getSchema().toString() );
}
public void testPackagingProperty()
{
generateMojo.setPackaging( "teststring" );
assertEquals( "teststring", generateMojo.getPackaging() );
}
public void testTypesProperty()
{
generateMojo.setTypes( "teststring" );
assertEquals( "teststring", generateMojo.getTypes() );
}
public void testMarshalProperty()
{
generateMojo.setMarshal( true );
assertTrue( generateMojo.getMarshal() );
}
private String getPathTo( String relativePath )
{
return getBasedir() + '/' + relativePath;
}
}