package com.lassekoskela.maven; import static com.lassekoskela.maven.BuildEventsExtension.*; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenSession; import org.apache.maven.model.Build; import org.apache.maven.model.Profile; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.logging.Logger; import org.junit.Before; import org.junit.Test; import com.lassekoskela.maven.buildevents.BuildEventListener; import com.lassekoskela.maven.logging.ConsoleLog; import com.lassekoskela.maven.logging.FileLog; import com.lassekoskela.maven.logging.Log; public class BuildEventsExtensionTest { private static final String BUILD_OUTPUT_DIR = "target"; private static final String ACTIVE_PROFILE_ID = "default"; private MavenSession session; protected Log log; private BuildEventsExtension extension; private Properties userProperties; private Properties projectProperties; @Before public void setUp() throws Exception { userProperties = new Properties(); projectProperties = new Properties(); projectProperties.setProperty(ACTIVATION_PROFILE_KEY, "default"); session = createFakeMavenSession(userProperties, projectProperties); extension = new BuildEventsExtension() { @Override protected BuildEventListener createListener(Log configuredLog) { log = configuredLog; return super.createListener(log); } }; extension.logger = mock(Logger.class); } private MavenSession createFakeMavenSession(Properties userProperties, Properties projectProperties) { MavenProject project = createFakeMavenProject(projectProperties); MavenSession session = mock(MavenSession.class); when(session.getUserProperties()).thenReturn(userProperties); when(session.getRequest()).thenReturn(mock(MavenExecutionRequest.class)); when(session.getCurrentProject()).thenReturn(project); when(session.getExecutionRootDirectory()).thenReturn(abspath(".")); return session; } protected String abspath(String path) { try { return new File(path).getCanonicalFile().getAbsolutePath(); } catch (IOException e) { throw new RuntimeException(e); } } private MavenProject createFakeMavenProject(Properties projectProperties) { List<Profile> profiles = new ArrayList<Profile>(); Profile profile = mock(Profile.class); profiles.add(profile); when(profile.getId()).thenReturn(ACTIVE_PROFILE_ID); MavenProject project = mock(MavenProject.class); Build build = mock(Build.class); when(project.getBuild()).thenReturn(build); when(project.getProperties()).thenReturn(projectProperties); when(build.getDirectory()).thenReturn(BUILD_OUTPUT_DIR); when(project.getActiveProfiles()).thenReturn(profiles); return project; } @Test public void logsToConsoleByDefault() throws Exception { extension.afterProjectsRead(session); assertThat(log, is(instanceOf(ConsoleLog.class))); } @Test public void logsWhenPropertySet() throws Exception { projectProperties.setProperty(ACTIVATION_PROFILE_KEY, "someOtherProfile"); projectProperties.setProperty(ACTIVATION_PROPERTY_KEY, Boolean.TRUE.toString()); extension.afterProjectsRead(session); assertThat(log, is(instanceOf(ConsoleLog.class))); } @Test public void canBeExplicitlyToldToLogToConsole() throws Exception { userProperties.setProperty(OUTPUT_MODE, "console"); extension.afterProjectsRead(session); assertThat(log, is(instanceOf(ConsoleLog.class))); } @Test public void canBeToldToLogToDefaultFilesystemLocation() throws Exception { userProperties.setProperty(OUTPUT_MODE, "file"); extension.afterProjectsRead(session); assertThat(log, is(instanceOf(FileLog.class))); assertThat(log.destination(), is(abspath(DEFAULT_FILE_DESTINATION))); } @Test public void canBeToldToLogToSpecificFilesystemLocation() throws Exception { userProperties.setProperty(OUTPUT_MODE, "file"); userProperties.setProperty(OUTPUT_FILE, "tmp/whatever/specific.log"); extension.afterProjectsRead(session); assertThat(log, is(instanceOf(FileLog.class))); assertThat(log.destination(), is(abspath("tmp/whatever/specific.log"))); } @Test public void invalidConfigurationDefaultsToConsole() throws Exception { userProperties.setProperty(OUTPUT_MODE, "invalidValue"); extension.afterProjectsRead(session); assertThat(log, is(instanceOf(ConsoleLog.class))); verify(extension.logger).error("Invalid configuration: invalidValue"); } @Test public void doesntLogIfNoActivationProfileMatchesActiveProfiles() throws Exception { projectProperties.setProperty(ACTIVATION_PROFILE_KEY, "someOtherProfile"); extension.afterProjectsRead(session); assertNull(log); } @Test public void doesntLogIfMultipleActivationProfilesButNoMatchingActiveProfiles() throws Exception { projectProperties.setProperty(ACTIVATION_PROFILE_KEY, "some, other, thirdProfile"); extension.afterProjectsRead(session); assertNull(log); } @Test public void logWithMultipleActivationProfilesAndMatchingActiveProfile() throws Exception { projectProperties.setProperty(ACTIVATION_PROFILE_KEY, "some, other, maybe, " + ACTIVE_PROFILE_ID); extension.afterProjectsRead(session); assertThat(log, is(instanceOf(Log.class))); } }