2  * ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2018 Intel. All rights reserved.
 
   4  *  Copyright (C) 2019 Nordix Foundation.
 
   5  * ================================================================================
 
   6  * Licensed under the Apache License, Version 2.0 (the "License");
 
   7  * you may not use this file except in compliance with the License.
 
   8  * You may obtain a copy of the License at
 
  10  *      http://www.apache.org/licenses/LICENSE-2.0
 
  12  * Unless required by applicable law or agreed to in writing, software
 
  13  * distributed under the License is distributed on an "AS IS" BASIS,
 
  14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  15  * See the License for the specific language governing permissions and
 
  16  * limitations under the License.
 
  18  * SPDX-License-Identifier: Apache-2.0
 
  19  * ============LICENSE_END=========================================================
 
  22 package org.onap.policy.distribution.reception.handling.sdc;
 
  24 import static org.junit.Assert.assertEquals;
 
  25 import static org.junit.Assert.assertTrue;
 
  26 import static org.junit.Assert.fail;
 
  27 import static org.mockito.Matchers.any;
 
  29 import com.google.gson.Gson;
 
  30 import com.google.gson.GsonBuilder;
 
  31 import java.io.FileReader;
 
  32 import java.io.IOException;
 
  33 import java.lang.reflect.Field;
 
  34 import java.util.ArrayList;
 
  35 import java.util.Arrays;
 
  36 import java.util.Collection;
 
  37 import java.util.HashMap;
 
  39 import org.junit.After;
 
  40 import org.junit.Before;
 
  41 import org.junit.Test;
 
  42 import org.junit.runner.RunWith;
 
  43 import org.mockito.Mock;
 
  44 import org.mockito.Mockito;
 
  45 import org.mockito.runners.MockitoJUnitRunner;
 
  46 import org.onap.policy.common.parameters.ParameterService;
 
  47 import org.onap.policy.distribution.forwarding.PolicyForwarder;
 
  48 import org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters;
 
  49 import org.onap.policy.distribution.model.Csar;
 
  50 import org.onap.policy.distribution.reception.decoding.PluginInitializationException;
 
  51 import org.onap.policy.distribution.reception.decoding.PolicyDecoder;
 
  52 import org.onap.policy.distribution.reception.handling.AbstractReceptionHandler;
 
  53 import org.onap.policy.distribution.reception.handling.PluginHandler;
 
  54 import org.onap.policy.distribution.reception.parameters.PluginHandlerParameters;
 
  55 import org.onap.policy.distribution.reception.parameters.PolicyDecoderParameters;
 
  56 import org.onap.policy.distribution.reception.statistics.DistributionStatisticsManager;
 
  57 import org.onap.sdc.api.IDistributionClient;
 
  58 import org.onap.sdc.api.notification.IArtifactInfo;
 
  59 import org.onap.sdc.api.notification.INotificationData;
 
  60 import org.onap.sdc.api.results.IDistributionClientDownloadResult;
 
  61 import org.onap.sdc.api.results.IDistributionClientResult;
 
  62 import org.onap.sdc.utils.DistributionActionResultEnum;
 
  63 import org.slf4j.Logger;
 
  64 import org.slf4j.LoggerFactory;
 
  67  * Class to perform unit test of {@link SdcReceptionHandler}.
 
  69  * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com)
 
  71 @RunWith(MockitoJUnitRunner.class)
 
  72 public class TestSdcReceptionHandler {
 
  74     private static final Logger LOGGER = LoggerFactory.getLogger(TestSdcReceptionHandler.class);
 
  75     private static final String DUMMY_SERVICE_CSAR = "dummyService.csar";
 
  78     private IDistributionClientResult successfulClientInitResult;
 
  80     private IDistributionClientResult failureClientInitResult;
 
  82     private IDistributionClient distributionClient;
 
  84     private IDistributionClientDownloadResult successfulClientDownloadResult;
 
  86     private INotificationData notificationData;
 
  88     private IArtifactInfo artifactInfo;
 
  90     private SdcReceptionHandlerConfigurationParameterGroup pssdConfigParameters;
 
  91     private SdcReceptionHandler sypHandler;
 
  95      * Setup for the test cases.
 
  97      * @throws IOException if it occurs
 
  98      * @throws SecurityException if it occurs
 
  99      * @throws NoSuchFieldException if it occurs
 
 100      * @throws IllegalAccessException if it occurs
 
 101      * @throws IllegalArgumentException if it occurs
 
 104     public final void init() throws IOException, NoSuchFieldException, SecurityException, IllegalArgumentException,
 
 105             IllegalAccessException {
 
 106         DistributionStatisticsManager.resetAllStatistics();
 
 107         final Gson gson = new GsonBuilder().create();
 
 108         pssdConfigParameters = gson.fromJson(new FileReader("src/test/resources/handling-sdc.json"),
 
 109                 SdcReceptionHandlerConfigurationParameterGroup.class);
 
 110         ParameterService.register(pssdConfigParameters);
 
 111         final SdcReceptionHandler sdcHandler = new SdcReceptionHandler();
 
 112         sypHandler = Mockito.spy(sdcHandler);
 
 114         Mockito.when(sypHandler.createSdcDistributionClient()).thenReturn(distributionClient);
 
 115         Mockito.when(distributionClient.init(any(), any())).thenReturn(successfulClientInitResult);
 
 116         Mockito.when(distributionClient.start()).thenReturn(successfulClientInitResult);
 
 117         Mockito.when(distributionClient.stop()).thenReturn(successfulClientInitResult);
 
 118         Mockito.when(distributionClient.sendComponentDoneStatus(any())).thenReturn(successfulClientInitResult);
 
 119         Mockito.when(distributionClient.sendComponentDoneStatus(any(), any())).thenReturn(successfulClientInitResult);
 
 120         Mockito.when(distributionClient.sendDownloadStatus(any())).thenReturn(successfulClientInitResult);
 
 121         Mockito.when(distributionClient.sendDownloadStatus(any(), any())).thenReturn(successfulClientInitResult);
 
 122         Mockito.when(distributionClient.sendDeploymentStatus(any())).thenReturn(successfulClientInitResult);
 
 123         Mockito.when(distributionClient.sendDeploymentStatus(any(), any())).thenReturn(successfulClientInitResult);
 
 124         Mockito.when(distributionClient.download(any())).thenReturn(successfulClientDownloadResult);
 
 125         Mockito.when(notificationData.getServiceArtifacts()).thenReturn(Arrays.asList(artifactInfo));
 
 126         Mockito.when(artifactInfo.getArtifactName()).thenReturn(DUMMY_SERVICE_CSAR);
 
 127         Mockito.when(successfulClientDownloadResult.getArtifactPayload()).thenReturn(new byte[1]);
 
 128         Mockito.when(successfulClientInitResult.getDistributionActionResult())
 
 129                 .thenReturn(DistributionActionResultEnum.SUCCESS);
 
 130         Mockito.when(successfulClientDownloadResult.getDistributionActionResult())
 
 131                 .thenReturn(DistributionActionResultEnum.SUCCESS);
 
 132         Mockito.when(failureClientInitResult.getDistributionActionResult())
 
 133                 .thenReturn(DistributionActionResultEnum.FAIL);
 
 138     public void teardown() {
 
 139         ParameterService.deregister(pssdConfigParameters);
 
 143     public final void testInitializeSdcClient() {
 
 145             sypHandler.initializeReception(pssdConfigParameters.getName());
 
 146         } catch (final Exception exp) {
 
 147             LOGGER.error("testInitializeSdcClient failed", exp);
 
 148             fail("Test should not throw any exception");
 
 153     public final void testInitializeSdcClient_Failure() {
 
 155         Mockito.when(successfulClientInitResult.getDistributionActionResult())
 
 156                 .thenReturn(DistributionActionResultEnum.FAIL).thenReturn(DistributionActionResultEnum.SUCCESS);
 
 158             sypHandler.initializeReception(pssdConfigParameters.getName());
 
 159         } catch (final Exception exp) {
 
 160             LOGGER.error("testInitializeSdcClient_Failure failed", exp);
 
 161             fail("Test should not throw any exception");
 
 166     public final void testStartSdcClient_Failure() {
 
 168             Mockito.when(distributionClient.start()).thenReturn(failureClientInitResult)
 
 169                     .thenReturn(successfulClientInitResult);
 
 170             sypHandler.initializeReception(pssdConfigParameters.getName());
 
 171         } catch (final Exception exp) {
 
 172             LOGGER.error("testStartSdcClient_Failure failed", exp);
 
 173             fail("Test should not throw any exception");
 
 178     public final void testStopSdcClient() {
 
 180             sypHandler.initializeReception(pssdConfigParameters.getName());
 
 181             sypHandler.destroy();
 
 182         } catch (final Exception exp) {
 
 183             LOGGER.error("testStopSdcClient failed", exp);
 
 184             fail("Test should not throw any exception");
 
 190     public final void testStopSdcClient_Failure() throws PluginInitializationException {
 
 192         sypHandler.initializeReception(pssdConfigParameters.getName());
 
 193         Mockito.when(distributionClient.stop()).thenReturn(failureClientInitResult)
 
 194                 .thenReturn(successfulClientInitResult);
 
 196             sypHandler.destroy();
 
 197         } catch (final Exception exp) {
 
 198             LOGGER.error("testStopSdcClient_Failure failed", exp);
 
 199             fail("Test should not throw any exception");
 
 204     public final void testStopSdcClientWithoutStart() {
 
 206             sypHandler.destroy();
 
 207         } catch (final Exception exp) {
 
 208             LOGGER.error("testStopSdcClientWithoutStart", exp);
 
 209             fail("Test should not throw any exception");
 
 215     public void testNotificationCallBack() throws NoSuchFieldException, SecurityException, IllegalArgumentException,
 
 216             IllegalAccessException, PluginInitializationException {
 
 218         final DummyDecoder policyDecoder = new DummyDecoder();
 
 219         final Collection<PolicyDecoder<Csar, DummyPolicy>> policyDecoders = new ArrayList<>();
 
 220         policyDecoders.add(policyDecoder);
 
 222         final DummyPolicyForwarder policyForwarder = new DummyPolicyForwarder();
 
 223         final Collection<PolicyForwarder> policyForwarders = new ArrayList<>();
 
 224         policyForwarders.add(policyForwarder);
 
 226         setUpPlugins(sypHandler, policyDecoders, policyForwarders);
 
 227         sypHandler.initializeReception(pssdConfigParameters.getName());
 
 228         sypHandler.activateCallback(notificationData);
 
 230         assertTrue(policyDecoder.getDecodedPolicy().getName().contains(DUMMY_SERVICE_CSAR));
 
 231         assertEquals(1, policyForwarder.getNumberOfPoliciesReceived());
 
 232         assertTrue(policyForwarder.receivedPolicyWithGivenType(DUMMY_SERVICE_CSAR));
 
 233         assertEquals(1, DistributionStatisticsManager.getTotalDistributionCount());
 
 234         assertEquals(1, DistributionStatisticsManager.getDistributionSuccessCount());
 
 235         assertEquals(0, DistributionStatisticsManager.getDistributionFailureCount());
 
 236         assertEquals(1, DistributionStatisticsManager.getTotalDownloadCount());
 
 237         assertEquals(1, DistributionStatisticsManager.getDownloadSuccessCount());
 
 238         assertEquals(0, DistributionStatisticsManager.getDownloadFailureCount());
 
 242     public void testDownloadArtifactFailure() throws NoSuchFieldException, SecurityException, IllegalArgumentException,
 
 243             IllegalAccessException, PluginInitializationException {
 
 245         Mockito.when(successfulClientDownloadResult.getDistributionActionResult())
 
 246                 .thenReturn(DistributionActionResultEnum.FAIL);
 
 248         final DummyDecoder policyDecoder = new DummyDecoder();
 
 249         final Collection<PolicyDecoder<Csar, DummyPolicy>> policyDecoders = new ArrayList<>();
 
 250         policyDecoders.add(policyDecoder);
 
 252         final DummyPolicyForwarder policyForwarder = new DummyPolicyForwarder();
 
 253         final Collection<PolicyForwarder> policyForwarders = new ArrayList<>();
 
 254         policyForwarders.add(policyForwarder);
 
 256         setUpPlugins(sypHandler, policyDecoders, policyForwarders);
 
 257         sypHandler.initializeReception(pssdConfigParameters.getName());
 
 258         sypHandler.activateCallback(notificationData);
 
 260         assertEquals(null, policyDecoder.getDecodedPolicy());
 
 261         assertEquals(0, policyForwarder.getNumberOfPoliciesReceived());
 
 262         assertEquals(1, DistributionStatisticsManager.getTotalDistributionCount());
 
 263         assertEquals(0, DistributionStatisticsManager.getDistributionSuccessCount());
 
 264         assertEquals(1, DistributionStatisticsManager.getDistributionFailureCount());
 
 265         assertEquals(1, DistributionStatisticsManager.getTotalDownloadCount());
 
 266         assertEquals(0, DistributionStatisticsManager.getDownloadSuccessCount());
 
 267         assertEquals(1, DistributionStatisticsManager.getDownloadFailureCount());
 
 271     public void testSendDistributionStatusFailure() throws NoSuchFieldException, SecurityException,
 
 272             IllegalArgumentException, IllegalAccessException, PluginInitializationException {
 
 274         Mockito.when(successfulClientDownloadResult.getDistributionActionResult())
 
 275                 .thenReturn(DistributionActionResultEnum.FAIL);
 
 276         Mockito.when(distributionClient.sendDownloadStatus(any(), any())).thenReturn(failureClientInitResult);
 
 277         Mockito.when(distributionClient.sendDeploymentStatus(any(), any())).thenReturn(failureClientInitResult);
 
 278         Mockito.when(distributionClient.sendComponentDoneStatus(any(), any())).thenReturn(failureClientInitResult);
 
 280         final DummyDecoder policyDecoder = new DummyDecoder();
 
 281         final Collection<PolicyDecoder<Csar, DummyPolicy>> policyDecoders = new ArrayList<>();
 
 282         policyDecoders.add(policyDecoder);
 
 284         final DummyPolicyForwarder policyForwarder = new DummyPolicyForwarder();
 
 285         final Collection<PolicyForwarder> policyForwarders = new ArrayList<>();
 
 286         policyForwarders.add(policyForwarder);
 
 288         setUpPlugins(sypHandler, policyDecoders, policyForwarders);
 
 289         sypHandler.initializeReception(pssdConfigParameters.getName());
 
 290         sypHandler.activateCallback(notificationData);
 
 292         assertEquals(null, policyDecoder.getDecodedPolicy());
 
 293         assertEquals(0, policyForwarder.getNumberOfPoliciesReceived());
 
 296     private void setUpPlugins(final AbstractReceptionHandler receptionHandler,
 
 297             final Collection<PolicyDecoder<Csar, DummyPolicy>> decoders, final Collection<PolicyForwarder> forwarders)
 
 298             throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException,
 
 299             PluginInitializationException {
 
 300         final PluginHandlerParameters pluginParameters = getPluginHandlerParameters();
 
 301         pluginParameters.setName("DummyDistributionGroup");
 
 302         ParameterService.register(pluginParameters);
 
 303         final PluginHandler pluginHandler = new PluginHandler(pluginParameters.getName());
 
 305         final Field decodersField = pluginHandler.getClass().getDeclaredField("policyDecoders");
 
 306         decodersField.setAccessible(true);
 
 307         decodersField.set(pluginHandler, decoders);
 
 309         final Field forwardersField = pluginHandler.getClass().getDeclaredField("policyForwarders");
 
 310         forwardersField.setAccessible(true);
 
 311         forwardersField.set(pluginHandler, forwarders);
 
 313         final Field pluginHandlerField = AbstractReceptionHandler.class.getDeclaredField("pluginHandler");
 
 314         pluginHandlerField.setAccessible(true);
 
 315         pluginHandlerField.set(receptionHandler, pluginHandler);
 
 316         ParameterService.deregister(pluginParameters.getName());
 
 319     private PluginHandlerParameters getPluginHandlerParameters() {
 
 320         final Map<String, PolicyDecoderParameters> policyDecoders = getPolicyDecoders();
 
 321         final Map<String, PolicyForwarderParameters> policyForwarders = getPolicyForwarders();
 
 322         final PluginHandlerParameters pluginHandlerParameters =
 
 323                 new PluginHandlerParameters(policyDecoders, policyForwarders);
 
 324         return pluginHandlerParameters;
 
 327     private Map<String, PolicyDecoderParameters> getPolicyDecoders() {
 
 328         final Map<String, PolicyDecoderParameters> policyDecoders = new HashMap<String, PolicyDecoderParameters>();
 
 329         final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters("DummyDecoder",
 
 330                 "org.onap.policy.distribution.reception.handling.sdc.DummyDecoder", "DummyDecoderConfiguration");
 
 331         policyDecoders.put("DummyDecoderKey", pDParameters);
 
 332         return policyDecoders;
 
 335     private Map<String, PolicyForwarderParameters> getPolicyForwarders() {
 
 336         final Map<String, PolicyForwarderParameters> policyForwarders =
 
 337                 new HashMap<String, PolicyForwarderParameters>();
 
 338         final PolicyForwarderParameters pFParameters = new PolicyForwarderParameters("DummyForwarder",
 
 339                 "org.onap.policy.distribution.reception.handling.sdc.DummyPolicyForwarder", "DummyConfiguration");
 
 340         policyForwarders.put("DummyForwarderKey", pFParameters);
 
 341         return policyForwarders;