2  * ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2018 Intel. All rights reserved.
 
   4  * ================================================================================
 
   5  * Licensed under the Apache License, Version 2.0 (the "License");
 
   6  * you may not use this file except in compliance with the License.
 
   7  * You may obtain a copy of the License at
 
   9  *      http://www.apache.org/licenses/LICENSE-2.0
 
  11  * Unless required by applicable law or agreed to in writing, software
 
  12  * distributed under the License is distributed on an "AS IS" BASIS,
 
  13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  14  * See the License for the specific language governing permissions and
 
  15  * limitations under the License.
 
  17  * SPDX-License-Identifier: Apache-2.0
 
  18  * ============LICENSE_END=========================================================
 
  21 package org.onap.policy.distribution.reception.handling.sdc;
 
  23 import static org.junit.Assert.assertEquals;
 
  24 import static org.junit.Assert.assertTrue;
 
  25 import static org.junit.Assert.fail;
 
  26 import static org.mockito.Matchers.any;
 
  28 import com.google.gson.Gson;
 
  29 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;
 
  40 import org.junit.After;
 
  41 import org.junit.Before;
 
  42 import org.junit.Test;
 
  43 import org.junit.runner.RunWith;
 
  44 import org.mockito.Mock;
 
  45 import org.mockito.Mockito;
 
  46 import org.mockito.runners.MockitoJUnitRunner;
 
  47 import org.onap.policy.common.logging.flexlogger.FlexLogger;
 
  48 import org.onap.policy.common.logging.flexlogger.Logger;
 
  49 import org.onap.policy.common.parameters.ParameterService;
 
  50 import org.onap.policy.distribution.forwarding.PolicyForwarder;
 
  51 import org.onap.policy.distribution.forwarding.parameters.PolicyForwarderParameters;
 
  52 import org.onap.policy.distribution.model.Csar;
 
  53 import org.onap.policy.distribution.reception.decoding.PluginInitializationException;
 
  54 import org.onap.policy.distribution.reception.decoding.PluginTerminationException;
 
  55 import org.onap.policy.distribution.reception.decoding.PolicyDecoder;
 
  56 import org.onap.policy.distribution.reception.handling.AbstractReceptionHandler;
 
  57 import org.onap.policy.distribution.reception.handling.PluginHandler;
 
  58 import org.onap.policy.distribution.reception.parameters.PluginHandlerParameters;
 
  59 import org.onap.policy.distribution.reception.parameters.PolicyDecoderParameters;
 
  60 import org.onap.sdc.api.notification.IArtifactInfo;
 
  61 import org.onap.sdc.api.notification.INotificationData;
 
  62 import org.onap.sdc.api.results.IDistributionClientDownloadResult;
 
  63 import org.onap.sdc.api.results.IDistributionClientResult;
 
  64 import org.onap.sdc.impl.mock.DistributionClientStubImpl;
 
  65 import org.onap.sdc.utils.DistributionActionResultEnum;
 
  68  * Class to perform unit test of {@link SdcReceptionHandler}.
 
  70  * @author Ram Krishna Verma (ram.krishna.verma@ericsson.com)
 
  72 @RunWith(MockitoJUnitRunner.class)
 
  73 public class TestSdcReceptionHandler {
 
  75     private static final Logger LOGGER = FlexLogger.getLogger(TestSdcReceptionHandler.class);
 
  76     private static final String DUMMY_SERVICE_CSAR = "dummyService.csar";
 
  79     private IDistributionClientResult successfulClientInitResult;
 
  81     private IDistributionClientResult failureClientInitResult;
 
  83     private DistributionClientStubImpl distributionClient;
 
  85     private IDistributionClientDownloadResult successfulClientDownloadResult;
 
  87     private INotificationData notificationData;
 
  89     private IArtifactInfo artifactInfo;
 
  91     private SdcReceptionHandlerConfigurationParameterGroup pssdConfigParameters;
 
  92     private SdcReceptionHandler sypHandler;
 
  96      * Setup for the test cases.
 
  98      * @throws IOException if it occurs
 
 101     public final void init() throws IOException {
 
 102         final Gson gson = new GsonBuilder().create();
 
 103         pssdConfigParameters = gson.fromJson(new FileReader("src/test/resources/handling-sdc.json"),
 
 104                 SdcReceptionHandlerConfigurationParameterGroup.class);
 
 105         ParameterService.register(pssdConfigParameters);
 
 106         final SdcReceptionHandler sdcHandler = new SdcReceptionHandler();
 
 107         sypHandler = Mockito.spy(sdcHandler);
 
 109         Mockito.when(sypHandler.createSdcDistributionClient()).thenReturn(distributionClient);
 
 110         Mockito.when(distributionClient.init(any(), any())).thenReturn(successfulClientInitResult);
 
 111         Mockito.when(distributionClient.start()).thenReturn(successfulClientInitResult);
 
 112         Mockito.when(distributionClient.stop()).thenReturn(successfulClientInitResult);
 
 113         Mockito.when(distributionClient.download(any())).thenReturn(successfulClientDownloadResult);
 
 114         Mockito.when(notificationData.getServiceArtifacts()).thenReturn(Arrays.asList(artifactInfo));
 
 115         Mockito.when(artifactInfo.getArtifactName()).thenReturn(DUMMY_SERVICE_CSAR);
 
 116         Mockito.when(successfulClientDownloadResult.getArtifactPayload()).thenReturn(new byte[1]);
 
 117         Mockito.when(successfulClientInitResult.getDistributionActionResult())
 
 118                 .thenReturn(DistributionActionResultEnum.SUCCESS);
 
 119         Mockito.when(successfulClientDownloadResult.getDistributionActionResult())
 
 120                 .thenReturn(DistributionActionResultEnum.SUCCESS);
 
 125     public void teardown() {
 
 126         ParameterService.deregister(pssdConfigParameters);
 
 130     public final void testInitializeSdcClient() {
 
 132             sypHandler.initializeReception(pssdConfigParameters.getName());
 
 133         } catch (final PluginInitializationException exp) {
 
 135             fail("Test should not throw any exception");
 
 140     public final void testInitializeSdcClient_Again() throws PluginInitializationException {
 
 141         sypHandler.initializeReception(pssdConfigParameters.getName());
 
 143             sypHandler.initializeReception(pssdConfigParameters.getName());
 
 144             fail("Test must throw an exception here");
 
 145         } catch (final Exception exp) {
 
 146             assertTrue(exp.getMessage().startsWith("The SDC Client is already initialized"));
 
 151     public final void testInitializeSdcClient_Failure() throws PluginInitializationException {
 
 153         Mockito.when(successfulClientInitResult.getDistributionActionResult())
 
 154                 .thenReturn(DistributionActionResultEnum.FAIL);
 
 156             sypHandler.initializeReception(pssdConfigParameters.getName());
 
 157             fail("Test must throw an exception here");
 
 158         } catch (final Exception exp) {
 
 159             assertTrue(exp.getMessage().startsWith("SDC client initialization failed with reason"));
 
 164     public final void testStartSdcClient_Failure() throws PluginInitializationException {
 
 166             Mockito.when(distributionClient.start()).thenReturn(failureClientInitResult);
 
 167             Mockito.when(failureClientInitResult.getDistributionActionResult())
 
 168                     .thenReturn(DistributionActionResultEnum.FAIL);
 
 169             sypHandler.initializeReception(pssdConfigParameters.getName());
 
 171             fail("Test must throw an exception here");
 
 172         } catch (final Exception exp) {
 
 173             assertTrue(exp.getMessage().startsWith("SDC client start failed with reason"));
 
 178     public final void testStopSdcClient() {
 
 180             sypHandler.initializeReception(pssdConfigParameters.getName());
 
 181             sypHandler.destroy();
 
 182         } catch (final PluginInitializationException | PluginTerminationException exp) {
 
 184             fail("Test should not throw any exception");
 
 190     public final void testStopSdcClientWithoutStart() {
 
 192             sypHandler.destroy();
 
 193         } catch (final PluginTerminationException exp) {
 
 195             fail("Test should not throw any exception");
 
 201     public final void testStopSdcClient_Failure() throws PluginInitializationException {
 
 203         sypHandler.initializeReception(pssdConfigParameters.getName());
 
 204         Mockito.when(successfulClientInitResult.getDistributionActionResult())
 
 205                 .thenReturn(DistributionActionResultEnum.FAIL);
 
 207             sypHandler.destroy();
 
 208             fail("Test must throw an exception here");
 
 209         } catch (final Exception exp) {
 
 210             assertTrue(exp.getMessage().startsWith("SDC client stop failed with reason"));
 
 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         assertEquals(DummyDecoder.DUMMY_POLICY, policyDecoder.getDecodedPolicy().getPolicyType());
 
 231         assertTrue(policyDecoder.getDecodedPolicy().getPolicyName().contains(DUMMY_SERVICE_CSAR));
 
 232         assertEquals(1, policyForwarder.getNumberOfPoliciesReceived());
 
 233         assertTrue(policyForwarder.receivedPolicyWithGivenType(DummyDecoder.DUMMY_POLICY));
 
 237     public void testDownloadArtifactFailure() throws NoSuchFieldException, SecurityException, IllegalArgumentException,
 
 238             IllegalAccessException, PluginInitializationException {
 
 240         Mockito.when(successfulClientDownloadResult.getDistributionActionResult())
 
 241                 .thenReturn(DistributionActionResultEnum.FAIL);
 
 243         final DummyDecoder policyDecoder = new DummyDecoder();
 
 244         final Collection<PolicyDecoder<Csar, DummyPolicy>> policyDecoders = new ArrayList<>();
 
 245         policyDecoders.add(policyDecoder);
 
 247         final DummyPolicyForwarder policyForwarder = new DummyPolicyForwarder();
 
 248         final Collection<PolicyForwarder> policyForwarders = new ArrayList<>();
 
 249         policyForwarders.add(policyForwarder);
 
 251         setUpPlugins(sypHandler, policyDecoders, policyForwarders);
 
 252         sypHandler.initializeReception(pssdConfigParameters.getName());
 
 253         sypHandler.activateCallback(notificationData);
 
 255         assertEquals(null, policyDecoder.getDecodedPolicy());
 
 256         assertEquals(0, policyForwarder.getNumberOfPoliciesReceived());
 
 259     private void setUpPlugins(final AbstractReceptionHandler receptionHandler,
 
 260             final Collection<PolicyDecoder<Csar, DummyPolicy>> decoders, final Collection<PolicyForwarder> forwarders)
 
 261             throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException,
 
 262             PluginInitializationException {
 
 263         final PluginHandlerParameters pluginParameters = getPluginHandlerParameters();
 
 264         pluginParameters.setName("DummyDistributionGroup");
 
 265         ParameterService.register(pluginParameters);
 
 266         final PluginHandler pluginHandler = new PluginHandler(pluginParameters.getName());
 
 268         final Field decodersField = pluginHandler.getClass().getDeclaredField("policyDecoders");
 
 269         decodersField.setAccessible(true);
 
 270         decodersField.set(pluginHandler, decoders);
 
 272         final Field forwardersField = pluginHandler.getClass().getDeclaredField("policyForwarders");
 
 273         forwardersField.setAccessible(true);
 
 274         forwardersField.set(pluginHandler, forwarders);
 
 276         final Field pluginHandlerField = AbstractReceptionHandler.class.getDeclaredField("pluginHandler");
 
 277         pluginHandlerField.setAccessible(true);
 
 278         pluginHandlerField.set(receptionHandler, pluginHandler);
 
 279         ParameterService.deregister(pluginParameters.getName());
 
 282     private PluginHandlerParameters getPluginHandlerParameters() {
 
 283         final Map<String, PolicyDecoderParameters> policyDecoders = getPolicyDecoders();
 
 284         final Map<String, PolicyForwarderParameters> policyForwarders = getPolicyForwarders();
 
 285         final PluginHandlerParameters pluginHandlerParameters =
 
 286                 new PluginHandlerParameters(policyDecoders, policyForwarders);
 
 287         return pluginHandlerParameters;
 
 290     private Map<String, PolicyDecoderParameters> getPolicyDecoders() {
 
 291         final Map<String, PolicyDecoderParameters> policyDecoders = new HashMap<String, PolicyDecoderParameters>();
 
 292         final PolicyDecoderParameters pDParameters = new PolicyDecoderParameters("DummyDecoder",
 
 293                 "org.onap.policy.distribution.reception.handling.sdc.DummyDecoder");
 
 294         policyDecoders.put("DummyDecoderKey", pDParameters);
 
 295         return policyDecoders;
 
 298     private Map<String, PolicyForwarderParameters> getPolicyForwarders() {
 
 299         final Map<String, PolicyForwarderParameters> policyForwarders =
 
 300                 new HashMap<String, PolicyForwarderParameters>();
 
 301         final PolicyForwarderParameters pFParameters = new PolicyForwarderParameters("DummyForwarder",
 
 302                 "org.onap.policy.distribution.reception.handling.sdc.DummyPolicyForwarder", "DummyConfiguration");
 
 303         policyForwarders.put("DummyForwarderKey", pFParameters);
 
 304         return policyForwarders;