From 8b1be00c0642f1f167cd3d136aa8215e40deb142 Mon Sep 17 00:00:00 2001 From: Joss Armstrong Date: Wed, 19 Dec 2018 14:15:04 +0000 Subject: [PATCH] Fix for test coverage in oam.utils package Removed 'PrepareForTest' annotations which were preventing test coverage of classes in appc.oam.utils package. Added unit tests for untested code. Increased line coverage of the package from 49% to 83%. Issue-ID: APPC-1287 Change-Id: I893de5281f8c46e92269be895ef304bbf87c88b9 Signed-off-by: Joss Armstrong --- appc-oam/appc-oam-bundle/pom.xml | 1 - .../java/org/onap/appc/oam/util/BundleHelper.java | 8 +- .../java/org/onap/appc/oam/util/StateHelper.java | 7 +- .../org/onap/appc/oam/util/BundleFilterTest.java | 45 +++++++++++ .../org/onap/appc/oam/util/BundleHelperTest.java | 94 ++++++++++++++++++++-- .../org/onap/appc/oam/util/StateHelperTest.java | 20 ++--- 6 files changed, 157 insertions(+), 18 deletions(-) create mode 100644 appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/BundleFilterTest.java diff --git a/appc-oam/appc-oam-bundle/pom.xml b/appc-oam/appc-oam-bundle/pom.xml index edd909306..f2c1c6274 100644 --- a/appc-oam/appc-oam-bundle/pom.xml +++ b/appc-oam/appc-oam-bundle/pom.xml @@ -282,7 +282,6 @@ ${project.version} provided - 1.5.0-SNAPSHOT diff --git a/appc-oam/appc-oam-bundle/src/main/java/org/onap/appc/oam/util/BundleHelper.java b/appc-oam/appc-oam-bundle/src/main/java/org/onap/appc/oam/util/BundleHelper.java index b862ed3a7..7639c4075 100644 --- a/appc-oam/appc-oam-bundle/src/main/java/org/onap/appc/oam/util/BundleHelper.java +++ b/appc-oam/appc-oam-bundle/src/main/java/org/onap/appc/oam/util/BundleHelper.java @@ -5,6 +5,8 @@ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs + * ================================================================================ + * Modifications (C) 2018 Ericsson * ============================================================================= * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -166,7 +168,7 @@ public class BundleHelper { String[] bundlesToStop = readPropsFromPropListName(PROP_BUNDLE_TO_STOP); String[] regExBundleNotStop = readPropsFromPropListName(PROP_BUNDLES_TO_NOT_STOP); - BundleFilter bundleList = new BundleFilter(bundlesToStop, regExBundleNotStop, getBundleList()); + BundleFilter bundleList = getBundleFilter(bundlesToStop, regExBundleNotStop, getBundleList()); logger.info(String.format("(%d) APPC bundles to Stop/Start: %s.", bundleList.getBundlesToStop().size(), bundleList.getBundlesToStop().toString())); @@ -220,6 +222,10 @@ public class BundleHelper { } } + protected BundleFilter getBundleFilter(String[] stopRegexes, String[] exceptRegexes, Bundle[] bundles) { + return new BundleFilter(stopRegexes, exceptRegexes, bundles); + } + /** * Runnable to execute bundle operations: start or stop */ diff --git a/appc-oam/appc-oam-bundle/src/main/java/org/onap/appc/oam/util/StateHelper.java b/appc-oam/appc-oam-bundle/src/main/java/org/onap/appc/oam/util/StateHelper.java index 0d24b5e8a..6ed50dbe6 100644 --- a/appc-oam/appc-oam-bundle/src/main/java/org/onap/appc/oam/util/StateHelper.java +++ b/appc-oam/appc-oam-bundle/src/main/java/org/onap/appc/oam/util/StateHelper.java @@ -5,6 +5,8 @@ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs + * ================================================================================ + * Modifications (C) 2018 Ericsson * ============================================================================= * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -122,7 +124,7 @@ public class StateHelper { * @return AppcOamStates */ public AppcOamStates getBundlesState() { - BundleHelper bundleHelper = new BundleHelper(logger, configurationHelper, this); + BundleHelper bundleHelper = getBundleHelper(logger, configurationHelper); Map lcmBundleMap = bundleHelper.getAppcLcmBundles(); if (lcmBundleMap == null || lcmBundleMap.isEmpty()) { return AppcOamStates.Unknown; @@ -140,4 +142,7 @@ public class StateHelper { return AppcOamStates.getOamStateFromBundleState(currentState); } + protected BundleHelper getBundleHelper(EELFLogger logger, ConfigurationHelper configurationHelper) { + return new BundleHelper(logger, configurationHelper, this); + } } diff --git a/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/BundleFilterTest.java b/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/BundleFilterTest.java new file mode 100644 index 000000000..f987ececf --- /dev/null +++ b/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/BundleFilterTest.java @@ -0,0 +1,45 @@ +/* + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2018 Ericsson + * ============================================================================= + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.oam.util; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; +import org.mockito.Mockito; +import org.osgi.framework.Bundle; + +public class BundleFilterTest { + + @Test + public void testBundleFilter() { + Bundle mockBundle1 = Mockito.mock(Bundle.class); + Bundle mockBundle2 = Mockito.mock(Bundle.class); + Mockito.doReturn("Bundle-regex1").when(mockBundle1).getSymbolicName(); + Mockito.doReturn("Bundle-regex2").when(mockBundle2).getSymbolicName(); + Bundle[] bundles = {mockBundle1, mockBundle2}; + String[] stopRegex = {"Bundle-regex1"}; + String[] exceptRegex = {"NOT_MATCHING_REGEX"}; + BundleFilter mockBundleFilter = Mockito.spy(new BundleFilter(stopRegex, exceptRegex, bundles)); + assertEquals(1, mockBundleFilter.getBundlesToStop().size()); + assertEquals(1, mockBundleFilter.getBundlesToNotStop().size()); + } + +} diff --git a/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/BundleHelperTest.java b/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/BundleHelperTest.java index 4d6b2f8ec..24df0440e 100644 --- a/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/BundleHelperTest.java +++ b/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/BundleHelperTest.java @@ -5,6 +5,8 @@ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs + * ================================================================================ + * Modifications (C) 2018 Ericsson * ============================================================================= * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,16 +25,23 @@ package org.onap.appc.oam.util; +import static org.hamcrest.CoreMatchers.isA; + import com.att.eelf.configuration.EELFLogger; +import com.google.common.collect.ImmutableMap; import org.apache.commons.lang.ArrayUtils; import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.onap.appc.configuration.Configuration; import org.onap.appc.exceptions.APPCException; import org.onap.appc.oam.AppcOam; +import org.onap.appc.oam.processor.BaseCommon; +import org.onap.appc.oam.util.BundleHelper.BundleTask; import org.onap.appc.statemachine.impl.readers.AppcOamStates; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -47,20 +56,28 @@ import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; - +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.FutureTask; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.spy; -@SuppressWarnings("ResultOfMethodCallIgnored") @RunWith(PowerMockRunner.class) -@PrepareForTest({BundleHelper.class, FrameworkUtil.class}) +@PrepareForTest(FrameworkUtil.class) public class BundleHelperTest { private BundleHelper bundleHelper; private AsyncTaskHelper mockTaskHelper = mock(AsyncTaskHelper.class); + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + @Before public void setUp() throws Exception { bundleHelper = spy(new BundleHelper(null, null, null)); @@ -72,7 +89,7 @@ public class BundleHelperTest { @Test public void testBundleOperations() throws Exception { - // spy mocked bundle for calls to method statr or stop. + // spy mocked bundle for calls to method start or stop. // Note: the time of method calls are accumulated in this test method. Bundle mockBundle = spy(Mockito.mock(Bundle.class)); Map mapFromGetAppcLcmBundles = new HashMap<>(); @@ -172,8 +189,75 @@ public class BundleHelperTest { Mockito.doReturn(propValue3).when(fakeConf).getProperty("4321"); propResult = bundleHelper.readPropsFromPropListName(propKey); Assert.assertTrue("PropertyResult should have two elements", propResult.length == 2); - List propResultList = Arrays.asList(propResult); + List propResultList = Arrays.asList(propResult); Assert.assertTrue("PropertyResult should have propertyValue2", propResultList.contains(propValue2)); Assert.assertTrue("PropertyResult should have propertyValue2", propResultList.contains(propValue3)); } + + @Test + public void testIsTaskAllDone() throws InterruptedException, ExecutionException { + assertTrue(bundleHelper.isAllTaskDone(getMapForTests(true))); + } + + @Test + public void testIsTaskAllDoneNotDone() throws InterruptedException, ExecutionException { + assertFalse(bundleHelper.isAllTaskDone(getMapForTests(false))); + } + + @Test + public void testCancelUnfinished() throws InterruptedException, ExecutionException { + Map> map = getMapForTests(false); + bundleHelper.cancelUnfinished(map); + Mockito.verify(map.get("TEST_KEY"), Mockito.times(1)).cancel(true); + } + + @Test + public void testGetFailedMetrics() throws InterruptedException, ExecutionException { + Map> map = getMapForTests(false); + FutureTask mockFutureTask = (FutureTask) map.get("TEST_KEY"); + Mockito.doReturn(Mockito.mock(BundleHelper.BundleTask.class)).when(mockFutureTask).get(); + assertEquals(0, bundleHelper.getFailedMetrics(map)); + } + + @Test + public void testGetFailedMetricsExceptionFlow() throws InterruptedException, ExecutionException { + Map> map = getMapForTests(false); + FutureTask mockFutureTask = (FutureTask) map.get("TEST_KEY"); + Mockito.doThrow(new ExecutionException("TestExecutionException", new Throwable())).when(mockFutureTask).get(); + expectedEx.expect(RuntimeException.class); + expectedEx.expectCause(isA(ExecutionException.class)); + bundleHelper.getFailedMetrics(map); + } + + @Test + public void testGetAppcLcmBundles() { + Mockito.doReturn(null).when(bundleHelper).readPropsFromPropListName(Mockito.anyString()); + mockStatic(FrameworkUtil.class); + Bundle myBundle = mock(Bundle.class); + PowerMockito.when(FrameworkUtil.getBundle(any())).thenReturn(myBundle); + BundleFilter mockBundleFilter = Mockito.mock(BundleFilter.class); + Mockito.doReturn(mockBundleFilter).when(bundleHelper).getBundleFilter(null, null, null); + assertTrue(bundleHelper.getAppcLcmBundles().isEmpty()); + } + + @Test + public void testBundleTask() throws Exception { + AppcOam.RPC mockRpc = AppcOam.RPC.maintenance_mode; + Bundle mockBundle = Mockito.mock(Bundle.class); + BaseCommon mockBaseCommon = Mockito.mock(BaseCommon.class); + assertTrue(bundleHelper. new BundleTask(mockRpc, mockBundle, mockBaseCommon) instanceof BundleHelper.BundleTask); + } + + private Map> getMapForTests(boolean isDone) throws InterruptedException, ExecutionException { + Callable callable = new Callable() { + @Override + public String call() throws Exception { + return "CALLED"; + } + }; + FutureTask futureTask = Mockito.spy(new FutureTask(callable)); + Mockito.doReturn(isDone).when(futureTask).isDone(); + Map> map = ImmutableMap.of("TEST_KEY", futureTask); + return map; + } } diff --git a/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/StateHelperTest.java b/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/StateHelperTest.java index 8cbb9bb4c..c2cf8e7a0 100644 --- a/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/StateHelperTest.java +++ b/appc-oam/appc-oam-bundle/src/test/java/org/onap/appc/oam/util/StateHelperTest.java @@ -5,6 +5,8 @@ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs + * ================================================================================ + * Modifications (C) 2018 Ericsson * ============================================================================= * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,7 +35,6 @@ import org.opendaylight.yang.gen.v1.org.onap.appc.oam.rev170303.AppcState; import org.onap.appc.statemachine.impl.readers.AppcOamStates; import org.osgi.framework.Bundle; import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.reflect.Whitebox; @@ -44,7 +45,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; @RunWith(PowerMockRunner.class) -@PrepareForTest({StateHelper.class}) public class StateHelperTest { private StateHelper stateHelper; @@ -63,7 +63,7 @@ public class StateHelperTest { stateHelper.setState(appcOamStates); Assert.assertEquals("Should have the new value", appcOamStates, Whitebox.getInternalState(stateHelper, "appcOamCurrentState")); - // reest to default value + // reset to default value stateHelper.setState(AppcOamStates.Unknown); } @@ -90,7 +90,7 @@ public class StateHelperTest { @Test public void testGetCurrentOamState() throws Exception { AppcOamStates mockResult = AppcOamStates.Started; - // mock getBundlesState, as we are testin it separately + // mock getBundlesState, as we are testing it separately PowerMockito.doReturn(mockResult).when(stateHelper, "getBundlesState"); Whitebox.setInternalState(stateHelper, "appcOamCurrentState", AppcOamStates.Unknown); @@ -142,23 +142,23 @@ public class StateHelperTest { @Test public void testGetBundlesState() throws Exception { - BundleHelper mockBundlerHelper = mock(BundleHelper.class); - PowerMockito.whenNew(BundleHelper.class).withAnyArguments().thenReturn(mockBundlerHelper); - + BundleHelper mockBundleHelper = mock(BundleHelper.class); + Mockito.doReturn(mockBundleHelper).when(stateHelper).getBundleHelper(Mockito.any(EELFLogger.class), Mockito.any(ConfigurationHelper.class)); + // test null bundle map - Mockito.when(mockBundlerHelper.getAppcLcmBundles()).thenReturn(null); + Mockito.when(mockBundleHelper.getAppcLcmBundles()).thenReturn(null); Assert.assertEquals("Should return unknown state", AppcOamStates.Unknown, stateHelper.getBundlesState()); // tet empty bundle map Map bundleMap = new HashMap<>(); - Mockito.when(mockBundlerHelper.getAppcLcmBundles()).thenReturn(bundleMap); + Mockito.when(mockBundleHelper.getAppcLcmBundles()).thenReturn(bundleMap); Assert.assertEquals("Should return unknown state", AppcOamStates.Unknown, stateHelper.getBundlesState()); Bundle mockBundle1 = mock(Bundle.class); Bundle mockBundle2 = mock(Bundle.class); bundleMap.put("1", mockBundle1); bundleMap.put("2", mockBundle2); - Mockito.when(mockBundlerHelper.getAppcLcmBundles()).thenReturn(bundleMap); + Mockito.when(mockBundleHelper.getAppcLcmBundles()).thenReturn(bundleMap); // test bundles have differnt states Mockito.doReturn(Bundle.RESOLVED).when(mockBundle1).getState(); -- 2.16.6