/* * 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.internal; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.nullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mule.runtime.core.api.config.MuleProperties.MULE_HOME_DIRECTORY_PROPERTY; import org.mule.runtime.core.util.FileUtils; import org.mule.runtime.deployment.model.api.application.Application; import org.mule.runtime.deployment.model.api.domain.Domain; import org.mule.runtime.module.deployment.api.DeploymentService; import org.mule.tck.junit4.AbstractMuleTestCase; import org.mule.tck.size.SmallTest; import java.io.File; import java.io.IOException; import java.util.Arrays; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) @SmallTest public class DomainArchiveDeployerTestCase extends AbstractMuleTestCase { public static final String DOMAIN_ZIP_PATH = "someZipFile"; public static final String DOMAIN_NAME = "domain-name"; public static final String JAR_FILE_EXTENSION = ".jar"; public static final String MOCK_APPLICATION_1_NAME = "MOCK_APPLICATION1_NAME"; public static final String MOCK_APPLICATION_2_NAME = "MOCK_APPLICATION2_NAME"; public static final String NON_EXISTENT_DOMAIN_ID = "NonExistentDomainId"; @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @Mock private ArchiveDeployer<Domain> mockDomainDeployer; @Mock private Domain mockDomain; @Mock private ArchiveDeployer<Application> mockApplicationDeployer; @Mock private DeploymentService mockDeploymentService; @Mock private Application mockApplication1; @Mock private Application mockApplication2; @Mock private ArtifactDeployer<Application> mockApplicationArtifactDeployer; private File domainsFolder; private File appsFolder; @Before public void setUp() { System.setProperty(MULE_HOME_DIRECTORY_PROPERTY, temporaryFolder.getRoot().getAbsolutePath()); domainsFolder = new File(temporaryFolder.getRoot(), "domains"); domainsFolder.mkdirs(); appsFolder = new File(temporaryFolder.getRoot(), "apps"); appsFolder.mkdirs(); when(mockDomainDeployer.getDeploymentDirectory()).thenReturn(domainsFolder); when(mockDomain.getArtifactName()).thenReturn(DOMAIN_NAME); when(mockApplication1.getArtifactName()).thenReturn(MOCK_APPLICATION_1_NAME); when(mockApplication2.getArtifactName()).thenReturn(MOCK_APPLICATION_2_NAME); } @After public void tearDown() { System.clearProperty(MULE_HOME_DIRECTORY_PROPERTY); } @Test public void returnNullIfDeploymentReturnsNull() { when(mockDomainDeployer.deployPackagedArtifact(DOMAIN_ZIP_PATH)).thenReturn(null); DomainArchiveDeployer domainArchiveDeployer = new DomainArchiveDeployer(mockDomainDeployer, mockApplicationDeployer, mockDeploymentService); assertThat(domainArchiveDeployer.deployPackagedArtifact("someZipFile"), nullValue()); } @Test public void doNotFailIfNoAppsFolderPresent() throws Exception { when(mockDomainDeployer.deployPackagedArtifact(DOMAIN_ZIP_PATH)).thenReturn(mockDomain); DomainArchiveDeployer domainArchiveDeployer = new DomainArchiveDeployer(mockDomainDeployer, mockApplicationDeployer, mockDeploymentService); assertThat(domainArchiveDeployer.deployPackagedArtifact(DOMAIN_ZIP_PATH), is(mockDomain)); } @Test public void deployAllAppsInsideDomainAppsFolder() throws Exception { String testAppName = "test-app"; String testApp2Name = "test-app2"; when(mockDomainDeployer.deployPackagedArtifact(DOMAIN_ZIP_PATH)).thenReturn(mockDomain); putApplicationInTestDomainAppsFolder(testAppName); putApplicationInTestDomainAppsFolder(testApp2Name); DomainArchiveDeployer domainArchiveDeployer = new DomainArchiveDeployer(mockDomainDeployer, mockApplicationDeployer, mockDeploymentService); domainArchiveDeployer.deployPackagedArtifact(DOMAIN_ZIP_PATH); verifyApplicationCopyToAppsFolder(testAppName); verifyApplicationCopyToAppsFolder(testApp2Name); } @Test public void undeployDomainWithNoApps() throws Exception { when(mockDeploymentService.findDomain(DOMAIN_NAME)).thenReturn(mockDomain); when(mockDomainDeployer.deployPackagedArtifact(DOMAIN_ZIP_PATH)).thenReturn(mockDomain); when(mockDeploymentService.findDomainApplications(DOMAIN_NAME)).thenReturn(Arrays.asList(new Application[0])); DomainArchiveDeployer domainArchiveDeployer = new DomainArchiveDeployer(mockDomainDeployer, mockApplicationDeployer, mockDeploymentService); domainArchiveDeployer.undeployArtifact(DOMAIN_NAME); verify(mockDomainDeployer, times(1)).undeployArtifact(DOMAIN_NAME); } @Test public void undeployDomainApps() throws Exception { when(mockDeploymentService.findDomain(DOMAIN_NAME)).thenReturn(mockDomain); when(mockDomainDeployer.deployPackagedArtifact(DOMAIN_ZIP_PATH)).thenReturn(mockDomain); when(mockDeploymentService.findDomainApplications(DOMAIN_NAME)) .thenReturn(Arrays.asList(new Application[] {mockApplication1, mockApplication2})); DomainArchiveDeployer domainArchiveDeployer = new DomainArchiveDeployer(mockDomainDeployer, mockApplicationDeployer, mockDeploymentService); domainArchiveDeployer.undeployArtifact(DOMAIN_NAME); verify(mockApplicationDeployer, times(1)).undeployArtifact(MOCK_APPLICATION_1_NAME); verify(mockApplicationDeployer, times(1)).undeployArtifact(MOCK_APPLICATION_2_NAME); verify(mockDomainDeployer, times(1)).undeployArtifact(DOMAIN_NAME); } @Test(expected = IllegalArgumentException.class) public void undeployNonExistentDomain() { when(mockDeploymentService.findDomain(NON_EXISTENT_DOMAIN_ID)).thenReturn(null); DomainArchiveDeployer domainArchiveDeployer = new DomainArchiveDeployer(mockDomainDeployer, mockApplicationDeployer, mockDeploymentService); domainArchiveDeployer.undeployArtifact(NON_EXISTENT_DOMAIN_ID); } private void verifyApplicationCopyToAppsFolder(String applicationName) { assertThat(new File(appsFolder, applicationName + JAR_FILE_EXTENSION).exists(), is(true)); } private void putApplicationInTestDomainAppsFolder(String appName) throws IOException { File domainDirectory = new File(domainsFolder, DOMAIN_NAME); domainDirectory.mkdirs(); assertThat(FileUtils.createFile(new File(domainsFolder, DOMAIN_NAME + File.separator + DomainArchiveDeployer.DOMAIN_BUNDLE_APPS_FOLDER + File.separator + appName + JAR_FILE_EXTENSION).getAbsolutePath()) .exists(), is(true)); } }