/** * Copyright (c) Codice Foundation * <p> * This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser * General Public License as published by the Free Software Foundation, either version 3 of the * License, or any later version. * <p> * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. A copy of the GNU Lesser General Public License * is distributed along with this program and can be found at * <http://www.gnu.org/licenses/lgpl.html>. */ package org.codice.ddf.admin.application.service.impl; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.any; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; import javax.management.ObjectName; import org.apache.commons.collections.ListUtils; import org.apache.commons.lang.StringUtils; import org.apache.karaf.features.BundleInfo; import org.apache.karaf.features.Dependency; import org.apache.karaf.features.Feature; import org.codice.ddf.admin.application.plugin.ApplicationPlugin; import org.codice.ddf.admin.application.rest.model.FeatureDetails; import org.codice.ddf.admin.application.service.Application; import org.codice.ddf.admin.application.service.ApplicationNode; import org.codice.ddf.admin.application.service.ApplicationService; import org.codice.ddf.admin.application.service.ApplicationServiceException; import org.codice.ddf.admin.application.service.ApplicationStatus; import org.codice.ddf.ui.admin.api.ConfigurationAdminExt; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentMatcher; import org.mockito.Mockito; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.service.metatype.MetaTypeInformation; import org.osgi.service.metatype.MetaTypeService; import org.osgi.util.tracker.ServiceTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.Appender; public class ApplicationServiceBeanTest { private static final String TEST_FEATURE_DESCRIPTION = "Mock Feature for ApplicationServiceBean tests"; private static final String TEST_FEATURE_DETAILS = "TestFeatureDetails"; private static final String TEST_FEATURE_STATUS = "TestStatus"; private static final String TEST_APP_NAME = "TestApp"; private static final String TEST_VERSION = "0.0.0"; private static final String TEST_APP_DESCRIP = "Test app for testGetApplicationTree"; private static final String TEST_FEATURE_NAME = "TestFeature"; private static final String TEST_URL = "TestMockURL"; private static final String BAD_URL = ">BadURL<"; private static final String TEST_LOCATION = "TestLocation"; private static final String TEST_REPO_NAME = "TestRepo"; private static final String ADD_APP_ASE = "Could not add application"; private static final String REMOVE_APP_ASE = "Could not remove application"; private static final String GET_SERV_ASE = "There was an error while trying to access the application"; private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationServiceBeanMBean.class); private ApplicationService testAppService; private ConfigurationAdminExt testConfigAdminExt; private ApplicationNode testNode1; private ApplicationNode testNode2; private ApplicationNode testNode3; private Application testApp; private ApplicationStatus testStatus; private Set<ApplicationNode> nodeSet; private Set<ApplicationNode> childrenSet; private BundleContext bundleContext; private MBeanServer mBeanServer; private ObjectName objectName; @Before public void setUp() throws Exception { testAppService = mock(ApplicationServiceImpl.class); testConfigAdminExt = mock(ConfigurationAdminExt.class); testApp = mock(ApplicationImpl.class); when(testApp.getName()).thenReturn(TEST_APP_NAME); when(testApp.getVersion()).thenReturn(TEST_VERSION); when(testApp.getDescription()).thenReturn(TEST_APP_DESCRIP); when(testApp.getURI()).thenReturn(getClass().getClassLoader() .getResource("test-features-with-main-feature.xml") .toURI()); bundleContext = mock(BundleContext.class); mBeanServer = mock(MBeanServer.class); objectName = new ObjectName( ApplicationService.class.getName() + ":service=application-service"); } /** * Sets up an application tree for use in testing * * @throws Exception */ public void setUpTree() throws Exception { testNode1 = mock(ApplicationNodeImpl.class); testNode2 = mock(ApplicationNodeImpl.class); testNode3 = mock(ApplicationNodeImpl.class); testStatus = mock(ApplicationStatus.class); when(testNode1.getApplication()).thenReturn(testApp); when(testNode2.getApplication()).thenReturn(testApp); when(testNode3.getApplication()).thenReturn(testApp); when(testNode1.getStatus()).thenReturn(testStatus); when(testNode2.getStatus()).thenReturn(testStatus); when(testNode3.getStatus()).thenReturn(testStatus); nodeSet = new TreeSet<>(); nodeSet.add(testNode1); nodeSet.add(testNode2); childrenSet = new TreeSet<>(); childrenSet.add(testNode3); when(testAppService.getApplicationTree()).thenReturn(nodeSet); when(testStatus.getState()).thenReturn(ApplicationStatus.ApplicationState.ACTIVE); when(testNode1.getChildren()).thenReturn(childrenSet); when(testNode2.getChildren()).thenReturn(childrenSet); when(testNode3.getChildren()).thenReturn((new TreeSet<ApplicationNode>())); } /** * Tests the {@link ApplicationServiceBean#init()} method * * @throws Exception */ @Test public void testInit() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); serviceBean.init(); verify(mBeanServer).registerMBean(serviceBean, objectName); } /** * Tests the {@link ApplicationServiceBean#init()} method for the case * where the serviceBean has already been initialized * * @throws Exception */ @Test public void testInitTwice() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); when(mBeanServer.registerMBean(any(Object.class), any(ObjectName.class))).thenThrow(new InstanceAlreadyExistsException()) .thenReturn(null); serviceBean.init(); verify(mBeanServer, atMost(1)).unregisterMBean(objectName); verify(mBeanServer, times(2)).registerMBean(serviceBean, objectName); } /** * Tests the {@link ApplicationServiceBean#init()} method for the case * where an exception other than the InstanceAlreadyExistsException is thrown * by mBeanServer.registerMBean(....) * * @throws Exception */ @Test(expected = ApplicationServiceException.class) public void testInitWhenRegisterMBeanThrowsInstanceAlreadyExistsException() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); when(mBeanServer.registerMBean(any(Object.class), any(ObjectName.class))).thenThrow(new NullPointerException()); serviceBean.init(); } /** * Tests the {@link ApplicationServiceBean#destroy()} method * * @throws Exception */ @Test public void testDestroy() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); serviceBean.destroy(); verify(mBeanServer).unregisterMBean(objectName); } /** * Tests the {@link ApplicationServiceBean#destroy()} method * for the case where an InstanceNotFoundException is thrown by mBeanServer.unregisterMBean(...) * * @throws Exception */ @Test(expected = ApplicationServiceException.class) public void testDestroyWhenUnregisterMBeanThrowsInstanceNotFoundException() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); doThrow(new InstanceNotFoundException()).when(mBeanServer) .unregisterMBean(objectName); serviceBean.destroy(); } /** * Tests the {@link ApplicationServiceBean#destroy()} method * for the case where an MBeanRegistrationException is thrown * by mBeanServer.unregisterMBean(...) * * @throws Exception */ @Test(expected = ApplicationServiceException.class) public void testDestroyWhenUnregisterMBeanThrowsMBeanRegistrationException() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); doThrow(new MBeanRegistrationException(new Exception())).when(mBeanServer) .unregisterMBean(any(ObjectName.class)); serviceBean.destroy(); } /** * Tests the {@link ApplicationServiceBean#getInstallationProfiles()} method * * @throws Exception */ @Test public void testGetInstallationProfiles() throws Exception { Feature testFeature1 = mock(Feature.class); Feature testFeature2 = mock(Feature.class); Dependency testDependency1 = mock(Dependency.class); Dependency testDependency2 = mock(Dependency.class); when(testFeature1.getName()).thenReturn(TEST_FEATURE_NAME); when(testFeature2.getName()).thenReturn(TEST_FEATURE_NAME); when(testDependency1.getName()).thenReturn(TEST_FEATURE_NAME); when(testDependency2.getName()).thenReturn(TEST_FEATURE_NAME); when(testFeature1.getDescription()).thenReturn(TEST_FEATURE_DESCRIPTION); when(testFeature2.getDescription()).thenReturn(TEST_FEATURE_DESCRIPTION); List<Dependency> dependencies1 = new ArrayList<>(); dependencies1.add(testDependency1); List<Dependency> dependencies2 = new ArrayList<>(); dependencies2.add(testDependency2); when(testFeature1.getDependencies()).thenReturn(dependencies1); when(testFeature2.getDependencies()).thenReturn(dependencies2); List<Feature> featureList = new ArrayList<>(); featureList.add(testFeature1); featureList.add(testFeature2); when(testAppService.getInstallationProfiles()).thenReturn(featureList); ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); List<Map<String, Object>> result = serviceBean.getInstallationProfiles(); assertThat("Should contain the nodes set up previously.", (String) result.get(0) .get("name"), is(TEST_FEATURE_NAME)); assertThat("Should have two entries.", result.size(), is(2)); } /** * Tests the {@link ApplicationServiceBean#getApplicationTree()} method * * @throws Exception */ @Test public void testGetApplicationTree() throws Exception { setUpTree(); ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); serviceBean.init(); List<Map<String, Object>> result = serviceBean.getApplicationTree(); assertThat("Should return the application nodes set up previously.", (String) result.get(0) .get("name"), is(TEST_APP_NAME)); assertThat("Size of root should be one.", result.size(), is(1)); verify(testApp, atLeastOnce()).getName(); verify(testNode1).getChildren(); } /** * Tests the {@link ApplicationServiceBean#getApplications()} method * * @throws Exception */ @Test public void testGetApplications() throws Exception { setUpTree(); ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); serviceBean.init(); List<Map<String, Object>> result = serviceBean.getApplications(); assertThat("Should return the application nodes set up previously.", (String) result.get(0) .get("name"), is(TEST_APP_NAME)); assertThat("Size of root should be two.", result.size(), is(2)); verify(testApp, atLeastOnce()).getName(); verify(testNode1).getChildren(); verify(testNode1, atLeastOnce()).getApplication(); } /** * Tests the {@link ApplicationServiceBean#getApplications()} method for the case where * the applications have no children * * @throws Exception */ @Test public void testGetApplicationsNoChildren() throws Exception { setUpTree(); ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); serviceBean.init(); when(testNode1.getChildren()).thenReturn((new TreeSet<ApplicationNode>())); when(testNode2.getChildren()).thenReturn((new TreeSet<ApplicationNode>())); when(testNode3.getChildren()).thenReturn((new TreeSet<ApplicationNode>())); List<Map<String, Object>> result = serviceBean.getApplications(); assertThat("Should return the application nodes set up previously.", (String) result.get(0) .get("name"), is(TEST_APP_NAME)); assertThat("Size of root should be one.", result.size(), is(1)); } /** * Tests the {@link ApplicationServiceBean#getApplications()} method for the case where * a child node has dependencies * * @throws Exception */ @Test public void testGetApplicationsChildDependencies() throws Exception { setUpTree(); ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); serviceBean.init(); ApplicationNode testNode4 = mock(ApplicationNodeImpl.class); when(testNode4.getApplication()).thenReturn(testApp); when(testNode4.getStatus()).thenReturn(testStatus); Set<ApplicationNode> testNode3ChildrenSet = new TreeSet<>(); testNode3ChildrenSet.add(testNode4); when(testNode3.getChildren()).thenReturn(testNode3ChildrenSet); List<Map<String, Object>> result = serviceBean.getApplications(); assertThat("Should return the applications set up previously.", (String) result.get(0) .get("name"), is(TEST_APP_NAME)); assertThat("Size of root should be three.", result.size(), is(3)); } /** * Tests the {@link ApplicationServiceBean#getApplications()} method for the case where * more than one child node has dependencies * * @throws Exception */ @Test public void testGetApplicationsMultiChildDependencies() throws Exception { setUpTree(); ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); serviceBean.init(); ApplicationNode testNode4 = mock(ApplicationNodeImpl.class); when(testNode4.getApplication()).thenReturn(testApp); when(testNode4.getStatus()).thenReturn(testStatus); Set<ApplicationNode> testNode1ChildrenSet = new TreeSet<>(); testNode1ChildrenSet.add(testNode2); testNode1ChildrenSet.add(testNode4); when(testNode1.getChildren()).thenReturn(testNode1ChildrenSet); List<Map<String, Object>> result = serviceBean.getApplications(); assertThat("Should return the applications set up previously.", (String) result.get(0) .get("name"), is(TEST_APP_NAME)); assertThat("Size of root should be three.", result.size(), is(3)); } /** * Tests the {@link ApplicationServiceBean#startApplication(String)} method * * @throws Exception */ @Test public void testStartApplication() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); assertTrue(serviceBean.startApplication(TEST_APP_NAME)); verify(testAppService).startApplication(TEST_APP_NAME); } /** * Tests the {@link ApplicationServiceBean#startApplication(String)} method for the case where * an exception is thrown * * @throws Exception */ @Test public void testStartApplicationException() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); doThrow(new ApplicationServiceException()).when(testAppService) .startApplication(TEST_APP_NAME); assertFalse(serviceBean.startApplication(TEST_APP_NAME)); verify(testAppService).startApplication(TEST_APP_NAME); } /** * Tests the {@link ApplicationServiceBean#stopApplication(String)} * * @throws Exception */ @Test public void testStopApplication() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); assertTrue(serviceBean.stopApplication(TEST_APP_NAME)); verify(testAppService).stopApplication(TEST_APP_NAME); } /** * Tests the {@link ApplicationServiceBean#stopApplication(String)} method for the case where * an exception is thrown * * @throws Exception */ @Test public void testStopApplicationException() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); doThrow(new ApplicationServiceException()).when(testAppService) .stopApplication(TEST_APP_NAME); assertFalse(serviceBean.stopApplication(TEST_APP_NAME)); verify(testAppService).stopApplication(TEST_APP_NAME); } /** * Tests the {@link ApplicationServiceBean#addApplications(List)} method * * @throws Exception */ @Test public void testAddApplications() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); List<Map<String, Object>> testURLList = new ArrayList<>(); Map<String, Object> testURLMap1 = mock(HashMap.class); when(testURLMap1.get("value")).thenReturn(TEST_URL); Map<String, Object> testURLMap2 = mock(HashMap.class); when(testURLMap2.get("value")).thenReturn(TEST_URL); testURLList.add(testURLMap1); testURLList.add(testURLMap2); serviceBean.addApplications(testURLList); verify(testURLMap1).get("value"); verify(testURLMap2).get("value"); } /** * Tests the {@link ApplicationServiceBean#addApplications(List)} method * for the case where a URISyntaxException is caught * * @throws Exception */ @Test public void testAddApplicationsUSE() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); List<Map<String, Object>> testURLList = new ArrayList<>(); Map<String, Object> testURLMap1 = mock(HashMap.class); when(testURLMap1.get("value")).thenReturn(BAD_URL); testURLList.add(testURLMap1); serviceBean.addApplications(testURLList); verify(testURLMap1, Mockito.times(2)).get("value"); } /** * Tests the {@link ApplicationServiceBean#addApplications(List)} method * for the case where an ApplicationServiceException is thrown * * @throws Exception */ // TODO RAP 29 Aug 16: DDF-2443 - Fix test to not depend on specific log output @Test public void testAddApplicationsASE() throws Exception { ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); final Appender mockAppender = mock(Appender.class); when(mockAppender.getName()).thenReturn("MOCK"); root.addAppender(mockAppender); root.setLevel(Level.ALL); ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); List<Map<String, Object>> testURLList = new ArrayList<>(); Map<String, Object> testURLMap1 = mock(HashMap.class); when(testURLMap1.get("value")).thenReturn(TEST_URL); Map<String, Object> testURLMap2 = mock(HashMap.class); when(testURLMap2.get("value")).thenReturn(TEST_URL); testURLList.add(testURLMap1); testURLList.add(testURLMap2); doThrow(new ApplicationServiceException()).when(testAppService) .addApplication(any(URI.class)); serviceBean.addApplications(testURLList); verify(mockAppender, times(2)).doAppend(argThat(new ArgumentMatcher() { @Override public boolean matches(final Object argument) { return ((LoggingEvent) argument).getFormattedMessage() .contains(ADD_APP_ASE); } })); } /** * Tests the {@link ApplicationServiceBean#removeApplication(String)} method for the case where * the string parameter is valid * * @throws Exception */ @Test public void testRemoveApplication() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); serviceBean.removeApplication(TEST_APP_NAME); verify(testAppService).removeApplication(TEST_APP_NAME); } /** * Tests the {@link ApplicationServiceBean#removeApplication(String)} method for the case where * the string parameter is invalid * * @throws Exception */ @Test public void testRemoveApplicationInvalidParam() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); serviceBean.removeApplication(StringUtils.EMPTY); verifyNoMoreInteractions(testAppService); } /** * Tests the {@link ApplicationServiceBean#removeApplication(String)} method * for the case where an ApplicationServiceException is thrown by the AppService * * @throws Exception */ // TODO RAP 29 Aug 16: DDF-2443 - Fix test to not depend on specific log output @Test public void testRemoveApplicationASE() throws Exception { ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); final Appender mockAppender = mock(Appender.class); when(mockAppender.getName()).thenReturn("MOCK"); root.addAppender(mockAppender); root.setLevel(Level.ALL); ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); doThrow(new ApplicationServiceException()).when(testAppService) .removeApplication(any(String.class)); serviceBean.removeApplication(TEST_APP_NAME); verify(mockAppender).doAppend(argThat(new ArgumentMatcher() { @Override public boolean matches(final Object argument) { return ((LoggingEvent) argument).getFormattedMessage() .contains(REMOVE_APP_ASE); } })); } /** * Tests the {@link ApplicationServiceBean#getServices(String)} method * * @throws Exception */ @Test public void testGetServices() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer) { @Override protected BundleContext getContext() { return bundleContext; } }; Bundle testBundle = mock(Bundle.class); Bundle[] bundles = {testBundle}; when(bundleContext.getBundles()).thenReturn(bundles); List<Map<String, Object>> services = new ArrayList<>(); Map<String, Object> testService1 = new HashMap<>(); List<Map<String, Object>> testService1Configs = new ArrayList<>(); Map<String, Object> testConfig1 = new HashMap<>(); testConfig1.put("bundle_location", TEST_LOCATION); testService1Configs.add(testConfig1); services.add(testService1); testService1.put("configurations", testService1Configs); BundleInfo testBundle1 = mock(BundleInfo.class); Set<BundleInfo> testBundles = new HashSet<>(); testBundles.add(testBundle1); when(testApp.getBundles()).thenReturn(testBundles); when(testBundle1.getLocation()).thenReturn(TEST_LOCATION); when(testAppService.getApplication(TEST_APP_NAME)).thenReturn(testApp); when(testConfigAdminExt.listServices(Mockito.any(String.class), Mockito.any(String.class))).thenReturn(services); assertThat("Should find the given services.", serviceBean.getServices(TEST_APP_NAME) .get(0), is(testService1)); } /** * Tests the {@link ApplicationServiceBean#getServices(String)} method * for the case where the services do not have the "configurations" key * * @throws Exception */ @Test public void testGetServicesNotContainsKey() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer) { @Override protected BundleContext getContext() { return bundleContext; } }; Bundle testBundle = mock(Bundle.class); Bundle[] bundles = {testBundle}; when(bundleContext.getBundles()).thenReturn(bundles); List<Map<String, Object>> services = new ArrayList<>(); Map<String, Object> testService2 = mock(HashMap.class); Map<String, Object> testService1 = mock(HashMap.class); services.add(testService1); services.add(testService2); when(testService1.get("factory")).thenReturn(true); when(testService2.get("factory")).thenReturn(false); BundleInfo testBundle1 = mock(BundleInfo.class); Set<BundleInfo> testBundles = new HashSet<>(); testBundles.add(testBundle1); when(testApp.getBundles()).thenReturn(testBundles); when(testBundle1.getLocation()).thenReturn(TEST_LOCATION); when(testAppService.getApplication(TEST_APP_NAME)).thenReturn(testApp); when(testConfigAdminExt.listServices(Mockito.any(String.class), Mockito.any(String.class))).thenReturn(services); assertThat("Should not find any services.", serviceBean.getServices(TEST_APP_NAME), is(ListUtils.EMPTY_LIST)); } /** * Tests the {@link ApplicationServiceBean#getServices(String)} method * for the case where the services do not have the "configurations" key * and there is MetatypeInformation present for each service. * <p> * This test mostly just checks that * * @throws Exception */ @Test public void testGetServicesMetatypeInfo() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer) { @Override protected BundleContext getContext() { return bundleContext; } }; ServiceTracker testServiceTracker = mock(ServiceTracker.class); serviceBean.setServiceTracker(testServiceTracker); MetaTypeService testMTS = mock(MetaTypeService.class); MetaTypeInformation testMTI = mock(MetaTypeInformation.class); when(testServiceTracker.getService()).thenReturn(testMTS); when(testMTS.getMetaTypeInformation(any(Bundle.class))).thenReturn(testMTI); when(testMTI.getPids()).thenReturn(new String[] {"001", "002"}); when(testMTI.getFactoryPids()).thenReturn(new String[] {"001", "002"}); Bundle testBundle = mock(Bundle.class); Bundle[] bundles = {testBundle}; when(bundleContext.getBundles()).thenReturn(bundles); when(testBundle.getLocation()).thenReturn(TEST_LOCATION); List<Map<String, Object>> services = new ArrayList<>(); Map<String, Object> testService2 = mock(HashMap.class); Map<String, Object> testService1 = mock(HashMap.class); services.add(testService1); services.add(testService2); List<Map<String, Object>> testService1Configs = new ArrayList<>(); Map<String, Object> testConfig1 = new HashMap<>(); testConfig1.put("bundle_location", TEST_LOCATION); testService1Configs.add(testConfig1); List<Map<String, Object>> testService2Configs = new ArrayList<>(); Map<String, Object> testConfig2 = new HashMap<>(); testConfig2.put("bundle_location", TEST_LOCATION); testService1Configs.add(testConfig2); when(testService1.get("factory")).thenReturn(true); when(testService2.get("factory")).thenReturn(false); when(testService1.get("configurations")).thenReturn(testService1Configs); when(testService2.get("configurations")).thenReturn(testService2Configs); when(testService1.get("id")).thenReturn("001"); when(testService2.get("id")).thenReturn("002"); BundleInfo testBundle1 = mock(BundleInfo.class); Set<BundleInfo> testBundles = new HashSet<>(); testBundles.add(testBundle1); when(testApp.getBundles()).thenReturn(testBundles); when(testBundle1.getLocation()).thenReturn(TEST_LOCATION); when(testAppService.getApplication(TEST_APP_NAME)).thenReturn(testApp); when(testConfigAdminExt.listServices(Mockito.any(String.class), Mockito.any(String.class))).thenReturn(services); assertThat("Should find the given services.", serviceBean.getServices(TEST_APP_NAME) .get(0), is(testService1)); } /** * Tests the {@link ApplicationServiceBean#getServices(String)} method * for the case where an ApplicationServiceException is thrown * * @throws Exception */ // TODO RAP 29 Aug 16: DDF-2443 - Fix test to not depend on specific log output @Test public void testGetServicesASE() throws Exception { ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); final Appender mockAppender = mock(Appender.class); when(mockAppender.getName()).thenReturn("MOCK"); root.addAppender(mockAppender); root.setLevel(Level.ALL); ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer) { @Override protected BundleContext getContext() { return bundleContext; } }; Bundle testBundle = mock(Bundle.class); Bundle[] bundles = {testBundle}; when(bundleContext.getBundles()).thenReturn(bundles); List<Map<String, Object>> services = new ArrayList<>(); Map<String, Object> testService1 = new HashMap<>(); services.add(testService1); doThrow(new ApplicationServiceException()).when(testApp) .getBundles(); when(testAppService.getApplication(TEST_APP_NAME)).thenReturn(testApp); when(testConfigAdminExt.listServices(Mockito.any(String.class), Mockito.any(String.class))).thenReturn(services); serviceBean.getServices(TEST_APP_NAME); verify(mockAppender).doAppend(argThat(new ArgumentMatcher() { @Override public boolean matches(final Object argument) { return ((LoggingEvent) argument).getFormattedMessage() .contains(GET_SERV_ASE); } })); } /** * Tests the {@link ApplicationServiceBean#getApplicationPlugins()} method * and the {@link ApplicationServiceBean#setApplicationPlugins(List)} method * * @throws Exception */ @Test public void testGetSetApplicationPlugins() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); ApplicationPlugin testPlugin1 = mock(ApplicationPlugin.class); ApplicationPlugin testPlugin2 = mock(ApplicationPlugin.class); List<ApplicationPlugin> pluginList = new ArrayList<>(); pluginList.add(testPlugin1); pluginList.add(testPlugin2); serviceBean.setApplicationPlugins(pluginList); assertEquals(pluginList, serviceBean.getApplicationPlugins()); } /** * Tests the {@link ApplicationServiceBean#getAllFeatures()} method * * @throws Exception */ @Test public void testGetAllFeatures() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); List<FeatureDetails> testFeatureDetailsList = new ArrayList<>(); FeatureDetails testFeatureDetails1 = mock(FeatureDetails.class); testFeatureDetailsList.add(testFeatureDetails1); when(testFeatureDetails1.getName()).thenReturn(TEST_FEATURE_DETAILS); when(testFeatureDetails1.getVersion()).thenReturn(TEST_VERSION); when(testFeatureDetails1.getStatus()).thenReturn(TEST_FEATURE_STATUS); when(testFeatureDetails1.getRepository()).thenReturn(TEST_REPO_NAME); when(testAppService.getAllFeatures()).thenReturn(testFeatureDetailsList); assertThat("Features returned should match testFeatureDetailsList features", (String) serviceBean.getAllFeatures() .get(0) .get("name"), is(testFeatureDetailsList.get(0) .getName())); verify(testAppService).getAllFeatures(); } /** * Tests the {@link ApplicationServiceBean#findApplicationFeatures(String)} method * * @throws Exception */ @Test public void testFindApplicationFeatures() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); List<FeatureDetails> testFeatureDetailsList = new ArrayList<>(); FeatureDetails testFeatureDetails1 = mock(FeatureDetails.class); testFeatureDetailsList.add(testFeatureDetails1); when(testFeatureDetails1.getName()).thenReturn(TEST_FEATURE_DETAILS); when(testFeatureDetails1.getVersion()).thenReturn(TEST_VERSION); when(testFeatureDetails1.getStatus()).thenReturn(TEST_FEATURE_STATUS); when(testFeatureDetails1.getRepository()).thenReturn(TEST_REPO_NAME); when(testAppService.findApplicationFeatures(TEST_APP_NAME)).thenReturn( testFeatureDetailsList); assertThat("Features returned should match testFeatureDetailsList features", (String) serviceBean.findApplicationFeatures(TEST_APP_NAME) .get(0) .get("name"), is(testFeatureDetailsList.get(0) .getName())); verify(testAppService).findApplicationFeatures(TEST_APP_NAME); } /** * Tests the {@link ApplicationServiceBean#getPluginsForApplication(String)} method * * @throws Exception */ @Test public void testGetPluginsForApplication() throws Exception { ApplicationServiceBean serviceBean = new ApplicationServiceBean(testAppService, testConfigAdminExt, mBeanServer); ApplicationPlugin testPlugin1 = mock(ApplicationPlugin.class); ApplicationPlugin testPlugin2 = mock(ApplicationPlugin.class); List<ApplicationPlugin> pluginList = new ArrayList<>(); pluginList.add(testPlugin1); pluginList.add(testPlugin2); Map<String, Object> plugin1JSON = new HashMap<>(); plugin1JSON.put("TestAppJSON", "Plugin1"); Map<String, Object> plugin2JSON = new HashMap<>(); plugin2JSON.put("TestAppJSON", "Plugin2"); when(testPlugin1.matchesAssocationName(TEST_APP_NAME)).thenReturn(true); when(testPlugin2.matchesAssocationName(TEST_APP_NAME)).thenReturn(true); when(testPlugin1.toJSON()).thenReturn(plugin1JSON); when(testPlugin2.toJSON()).thenReturn(plugin2JSON); serviceBean.setApplicationPlugins(pluginList); assertThat("Should return the list of plugins given to it.", serviceBean.getPluginsForApplication(TEST_APP_NAME) .get(0), is(plugin1JSON)); } }