/** * Copyright Alex Objelean */ package ro.isdc.wro.maven.plugin; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.net.URISyntaxException; import java.net.URL; import java.util.Collection; import java.util.concurrent.Callable; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.io.FileUtils; import org.apache.maven.model.Build; import org.apache.maven.model.Model; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.testing.SilentLog; import org.apache.maven.project.MavenProject; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import ro.isdc.wro.WroRuntimeException; import ro.isdc.wro.manager.factory.standalone.DefaultStandaloneContextAwareManagerFactory; import ro.isdc.wro.model.WroModel; import ro.isdc.wro.model.factory.WroModelFactory; import ro.isdc.wro.model.group.Group; import ro.isdc.wro.model.resource.processor.factory.ProcessorsFactory; import ro.isdc.wro.util.concurrent.TaskExecutor; /** * Test class for {@link JsHintMojo} * * @author Alex Objelean */ public abstract class AbstractTestLinterMojo { private AbstractLinterMojo<?> mojo; @Before public void setUp() throws Exception { mojo = newLinterMojo(); initializeMojo(mojo); } /** * perform default initialization of provided mojo. */ private void initializeMojo(final AbstractLinterMojo<?> mojo) throws Exception { mojo.setLog(new SilentLog()); mojo.setIgnoreMissingResources(Boolean.FALSE.toString()); setWroWithValidResources(); mojo.setTargetGroups("g1"); MavenProject mockMavenProject = Mockito.mock(MavenProject.class); Model mockMavenModel = Mockito.mock(Model.class); Build mockBuild = Mockito.mock(Build.class); Mockito.when(mockMavenProject.getModel()).thenReturn(mockMavenModel); Mockito.when(mockMavenModel.getBuild()).thenReturn(mockBuild); Mockito.when(mockBuild.getDirectory()).thenReturn(FileUtils.getTempDirectoryPath()); mojo.setMavenProject(mockMavenProject); } protected final AbstractLinterMojo<?> getMojo() { return mojo; } /** * @return Mojo to test. */ protected abstract AbstractLinterMojo<?> newLinterMojo(); private void setWroFile(final String classpathResourceName) throws URISyntaxException { final URL url = getClass().getClassLoader().getResource(classpathResourceName); final File wroFile = new File(url.toURI()); mojo.setWroFile(wroFile); mojo.setContextFolder(wroFile.getParentFile().getParentFile().getPath()); } private void setWroWithValidResources() throws Exception { setWroFile("wro.xml"); } protected final void setWroWithInvalidResources() throws Exception { setWroFile("wroWithInvalidResources.xml"); } @Test(expected = MojoExecutionException.class) public void cannotExecuteWhenInvalidResourcesPresentAndDoNotIgnoreMissingResources() throws Exception { setWroWithInvalidResources(); mojo.execute(); } @Test(expected = MojoExecutionException.class) public void testResourceWithErrors() throws Exception { mojo.setTargetGroups("invalid"); mojo.execute(); } @Test(expected = MojoExecutionException.class) public void testResourceWithUndefVariablesAndUndefOption() throws Exception { mojo.setOptions("undef, browser"); mojo.setTargetGroups("undef"); mojo.execute(); } @Test public void testErrorsWithNoFailFast() throws Exception { mojo.setFailNever(true); mojo.setOptions("undef, browser"); mojo.setTargetGroups("undef"); mojo.execute(); } @Test(expected = CustomException.class) public void shouldOverrideCustomProcessorsFactory() throws Throwable { try { mojo.setWroManagerFactory(CustomWroManagerFactory.class.getName()); mojo.setTargetGroups(null); mojo.execute(); } catch (final MojoExecutionException e) { throw e.getCause(); } } @Test public void shouldUseTaskExecutorWhenRunningInParallel() throws Exception { final AtomicBoolean invoked = new AtomicBoolean(); final TaskExecutor<Void> taskExecutor = new TaskExecutor<Void>() { @Override public void submit(final Collection<Callable<Void>> callables) throws Exception { invoked.set(true); super.submit(callables); } }; mojo.setFailNever(true); mojo.setTaskExecutor(taskExecutor); mojo.setIgnoreMissingResources(Boolean.TRUE.toString()); mojo.setParallelProcessing(false); mojo.execute(); assertFalse(invoked.get()); mojo.setParallelProcessing(true); mojo.execute(); assertTrue(invoked.get()); } private static class CustomException extends WroRuntimeException { public CustomException(final String message) { super(message); } } public static class CustomWroManagerFactory extends DefaultStandaloneContextAwareManagerFactory { @Override protected ProcessorsFactory newProcessorsFactory() { throw new CustomException("Should have not call this method"); } @Override protected WroModelFactory newModelFactory() { return new WroModelFactory() { public WroModel create() { return new WroModel().addGroup(new Group("all")); } public void destroy() { } }; } } @After public void tearDown() { getMojo().clean(); } }