/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.module.deployment.impl.internal.application; import static java.util.Collections.emptyList; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.notNullValue; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mule.runtime.core.context.notification.MuleContextNotification.CONTEXT_INITIALISED; import org.mule.runtime.core.context.notification.MuleContextNotification; import org.mule.runtime.deployment.model.api.application.ApplicationDescriptor; import org.mule.runtime.deployment.model.api.application.ApplicationStatus; import org.mule.runtime.deployment.model.api.artifact.ArtifactContext; import org.mule.runtime.deployment.model.internal.application.MuleApplicationClassLoader; import org.mule.runtime.module.extension.internal.loader.ExtensionModelLoaderRepository; import org.mule.runtime.module.service.ServiceRepository; import org.mule.tck.junit4.AbstractMuleContextTestCase; import org.mule.tck.probe.JUnitProbe; import org.mule.tck.probe.PollingProber; import java.io.File; import org.junit.Test; /** * This tests verifies that the {@link DefaultMuleApplication} status is set correctly depending on its * {@link org.mule.runtime.core.api.MuleContext}'s lifecycle phase */ public class DefaultMuleApplicationStatusTestCase extends AbstractMuleContextTestCase { private static final int PROBER_TIMEOUT = 1000; private static final int PROBER_INTERVAL = 100; private DefaultMuleApplication application; private File appLocation = new File("fakeLocation"); @Override protected void doSetUp() throws Exception { MuleApplicationClassLoader parentArtifactClassLoader = mock(MuleApplicationClassLoader.class); ArtifactContext mockArtifactContext = mock(ArtifactContext.class); when(mockArtifactContext.getMuleContext()).thenReturn(muleContext); application = new DefaultMuleApplication(null, parentArtifactClassLoader, emptyList(), null, mock(ServiceRepository.class), mock(ExtensionModelLoaderRepository.class), appLocation, null, null); application.setArtifactContext(mockArtifactContext); } @Test public void initialState() { assertStatus(ApplicationStatus.CREATED); } @Test public void initialised() { // the context was initialised before we gave it to the application, so we need // to fire the notification again since the listener wasn't there muleContext.fireNotification(new MuleContextNotification(muleContext, CONTEXT_INITIALISED)); assertStatus(ApplicationStatus.INITIALISED); } @Test public void started() throws Exception { muleContext.start(); assertStatus(ApplicationStatus.STARTED); } @Test public void stopped() throws Exception { muleContext.start(); muleContext.stop(); assertStatus(ApplicationStatus.STOPPED); } @Test public void destroyed() { muleContext.dispose(); assertStatus(ApplicationStatus.DESTROYED); } @Test public void nullDeploymentClassLoaderAfterDispose() { ApplicationDescriptor descriptor = mock(ApplicationDescriptor.class); when(descriptor.getAbsoluteResourcePaths()).thenReturn(new String[] {}); DefaultMuleApplication application = new DefaultMuleApplication(descriptor, mock(MuleApplicationClassLoader.class), emptyList(), null, null, null, appLocation, null, null); application.install(); assertThat(application.deploymentClassLoader, is(notNullValue())); application.dispose(); assertThat(application.deploymentClassLoader, is(nullValue())); } @Test public void deploymentFailedOnInit() { try { application.init(); fail("Was expecting init to fail"); } catch (Exception e) { assertStatus(ApplicationStatus.DEPLOYMENT_FAILED); } } @Test public void deploymentFailedOnStart() throws Exception { try { application.start(); fail("Was expecting start to fail"); } catch (Exception e) { muleContext.stop(); muleContext.dispose(); assertStatus(ApplicationStatus.DEPLOYMENT_FAILED); } } private void assertStatus(final ApplicationStatus status) { PollingProber prober = new PollingProber(PROBER_TIMEOUT, PROBER_INTERVAL); prober.check(new JUnitProbe() { @Override protected boolean test() throws Exception { assertThat(application.getStatus(), is(status)); return true; } @Override public String describeFailure() { return String.format("Application remained at status %s instead of moving to %s", application.getStatus().name(), status.name()); } }); } }