/*
* Copyright 2013 The Sculptor Project Team, including the original
* author or authors.
*
* 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.
*/
package org.sculptor.maven.plugin;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.spy;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import junit.framework.AssertionFailedError;
import org.apache.maven.project.MavenProject;
import org.mockito.ArgumentCaptor;
public class GeneratorMojoTest extends AbstractGeneratorMojoTestCase<GeneratorMojo> {
private static final String ONE_SHOT_GENERATED_FILE = "src/main/java/com/acme/test/domain/Foo.java";
private static final String GENERATED_FILE = "src/generated/java/com/acme/test/domain/Bar.java";
public void testChangedFilesNoStatusFile() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test1"));
Set<String> changedFiles = mojo.getChangedFiles();
assertNull(changedFiles);
}
public void testChangedFilesNoUpdatedFiles() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test2"));
mojo.getStatusFile().setLastModified(System.currentTimeMillis() + 1000);
Set<String> changedFiles = mojo.getChangedFiles();
assertNotNull(changedFiles);
assertEquals(0, changedFiles.size());
}
public void testChangedFilesOutdatedStatusFile() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test2"));
mojo.getStatusFile().setLastModified(0);
Set<String> changedFiles = mojo.getChangedFiles();
assertNotNull(changedFiles);
assertEquals(5, changedFiles.size());
}
public void testChangedFilesUpdatedWorkflowDescriptor() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test2"));
mojo.getStatusFile().setLastModified(System.currentTimeMillis() + 1000);
mojo.getModelFile().setLastModified(System.currentTimeMillis() + 2000);
Set<String> changedFiles = mojo.getChangedFiles();
assertNotNull(changedFiles);
assertEquals(1, changedFiles.size());
}
public void testChangedFilesUpdatedGeneratorConfigFiles() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test2"));
mojo.getStatusFile().setLastModified(System.currentTimeMillis() + 1000);
new File(mojo.getProject().getBasedir(), "/src/main/resources/generator/java-code-formatter.properties")
.setLastModified(System.currentTimeMillis() + 2000);
new File(mojo.getProject().getBasedir(), "/src/main/resources/generator/sculptor-generator.properties")
.setLastModified(System.currentTimeMillis() + 2000);
Set<String> changedFiles = mojo.getChangedFiles();
assertNotNull(changedFiles);
assertEquals(2, changedFiles.size());
}
public void testUpdateStatusFile() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test2"));
List<File> files = new ArrayList<File>();
files.add(new File(mojo.getProject().getBasedir(), ONE_SHOT_GENERATED_FILE));
files.add(new File(mojo.getProject().getBasedir(), GENERATED_FILE));
assertTrue(mojo.updateStatusFile(files));
Properties statusFileProps = new Properties();
statusFileProps.load(new FileReader(mojo.getStatusFile()));
assertEquals(2, statusFileProps.size());
assertEquals("e747f800870423a6c554ae2ec80aeeb6", statusFileProps.getProperty(ONE_SHOT_GENERATED_FILE));
assertEquals("7d436134142a2e69dfc98eb9f22f5907", statusFileProps.getProperty(GENERATED_FILE));
}
public void testExecuteSkip() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test1"));
doThrow(AssertionFailedError.class).when(mojo).executeGenerator();
setVariableValueToObject(mojo, "skip", true);
mojo.execute();
}
public void testExecuteForce() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test2"));
doThrow(new RuntimeException("testExecuteForce")).when(mojo).doRunGenerator(any(Properties.class));
setVariableValueToObject(mojo, "force", true);
try {
mojo.execute();
} catch (RuntimeException e) {
if (e.getMessage().equals("testExecuteForce")) {
return;
}
}
fail();
}
public void testExecuteWithClean() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test2"));
doThrow(new RuntimeException("testExecuteWithClean")).when(mojo).doRunGenerator(any(Properties.class));
mojo.getStatusFile().setLastModified(System.currentTimeMillis() + 1000);
mojo.getModelFile().setLastModified(System.currentTimeMillis() + 2000);
setVariableValueToObject(mojo, "clean", true);
try {
mojo.execute();
} catch (RuntimeException e) {
if (e.getMessage().equals("testExecuteWithClean")) {
assertFalse(new File(mojo.getProject().getBasedir(), ONE_SHOT_GENERATED_FILE).exists());
assertFalse(new File(mojo.getProject().getBasedir(), GENERATED_FILE).exists());
}
return;
}
fail();
}
public void testExecuteWithoutClean() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test2"));
doThrow(new RuntimeException("testExecuteWithoutClean")).when(mojo).doRunGenerator(any(Properties.class));
mojo.getStatusFile().setLastModified(System.currentTimeMillis() + 1000);
mojo.getModelFile().setLastModified(System.currentTimeMillis() + 2000);
setVariableValueToObject(mojo, "clean", false);
try {
mojo.execute();
} catch (RuntimeException e) {
if (e.getMessage().equals("testExecuteWithoutClean")) {
assertTrue(new File(mojo.getProject().getBasedir(), ONE_SHOT_GENERATED_FILE).exists());
assertTrue(new File(mojo.getProject().getBasedir(), GENERATED_FILE).exists());
}
return;
}
fail();
}
public void testExecuteWithProperties() throws Exception {
GeneratorMojo mojo = createMojo(createProject("test2"));
ArgumentCaptor<Properties> argument = ArgumentCaptor.forClass(Properties.class);
doReturn(Collections.emptyList()).when(mojo).doRunGenerator(argument.capture());
Map<String, String> properties = new HashMap<String, String>();
properties.put("testExecuteWithProperties", "testExecuteWithProperties-value");
setVariableValueToObject(mojo, "properties", properties);
setVariableValueToObject(mojo, "force", true);
mojo.execute();
assertEquals("testExecuteWithProperties-value", argument.getValue().getProperty("testExecuteWithProperties"));
}
/**
* Returns Mojo instance initialized with a {@link MavenProject} created
* from the test projects in <code>"src/test/projects/"</code> by given
* project name.
*/
protected GeneratorMojo createMojo(MavenProject project) throws Exception {
// Create mojo
GeneratorMojo mojo = spy(super.createMojo(project, "generate"));
doReturn(Collections.emptyList()).when(mojo).doRunGenerator(any(Properties.class));
// Set default values on mojo
setVariableValueToObject(mojo, "model", "src/main/resources/model.btdesign");
setVariableValueToObject(mojo, "clean", true);
// Set defaults for multi-value parameters in mojo
mojo.initMojoMultiValueParameters();
return mojo;
}
}