2  * ============LICENSE_START=======================================================
 
   3  *  Copyright (C) 2018 Ericsson. 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.forwarding.xacml.pdp.engine;
 
  23 import static org.mockito.Matchers.anyObject;
 
  24 import static org.mockito.Matchers.argThat;
 
  25 import static org.mockito.Matchers.eq;
 
  26 import static org.mockito.Mockito.mock;
 
  27 import static org.mockito.Mockito.times;
 
  28 import static org.mockito.Mockito.verify;
 
  29 import static org.mockito.Mockito.when;
 
  31 import java.lang.reflect.Field;
 
  32 import java.lang.reflect.Modifier;
 
  33 import java.security.KeyManagementException;
 
  34 import java.security.NoSuchAlgorithmException;
 
  35 import java.util.ArrayList;
 
  36 import java.util.Collection;
 
  37 import java.util.HashMap;
 
  38 import javax.ws.rs.client.Entity;
 
  39 import javax.ws.rs.core.Response;
 
  40 import org.hamcrest.BaseMatcher;
 
  41 import org.hamcrest.Description;
 
  42 import org.junit.BeforeClass;
 
  43 import org.junit.Test;
 
  44 import org.onap.policy.api.PolicyParameters;
 
  45 import org.onap.policy.api.PushPolicyParameters;
 
  46 import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams;
 
  47 import org.onap.policy.common.endpoints.http.client.HttpClient;
 
  48 import org.onap.policy.common.endpoints.http.client.HttpClientFactory;
 
  49 import org.onap.policy.common.parameters.ParameterGroup;
 
  50 import org.onap.policy.common.parameters.ParameterService;
 
  51 import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpPolicyForwarder;
 
  52 import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpPolicyForwarderParameterGroup.XacmlPdpPolicyForwarderParameterGroupBuilder;
 
  53 import org.onap.policy.distribution.main.PolicyDistributionException;
 
  54 import org.onap.policy.distribution.model.OptimizationPolicy;
 
  55 import org.onap.policy.distribution.model.Policy;
 
  57 public class XacmlPdpPolicyForwarderTest {
 
  59     private static final BusTopicParams BUS_TOPIC_PARAMS = BusTopicParams.builder().useHttps(false).hostname("myHost")
 
  60             .port(1234).userName("myUser").password("myPassword").managed(true).build();
 
  61     private static final String CLIENT_AUTH = "ClientAuth";
 
  62     private static final String CLIENT_AUTH_VALUE = "myClientAuth";
 
  63     private static final String PDP_GROUP_VALUE = "myPdpGroup";
 
  64     private HashMap<String, Object> headers = new HashMap<>();
 
  65     private BusTopicParamsMatcher matcher = new BusTopicParamsMatcher(BUS_TOPIC_PARAMS);
 
  71     public static void setUp() {
 
  72         ParameterGroup parameterGroup = new XacmlPdpPolicyForwarderParameterGroupBuilder()
 
  73                 .setUseHttps(BUS_TOPIC_PARAMS.isUseHttps()).setHostname(BUS_TOPIC_PARAMS.getHostname())
 
  74                 .setPort(BUS_TOPIC_PARAMS.getPort()).setUserName(BUS_TOPIC_PARAMS.getUserName())
 
  75                 .setPassword(BUS_TOPIC_PARAMS.getPassword()).setClientAuth(CLIENT_AUTH_VALUE)
 
  76                 .setIsManaged(BUS_TOPIC_PARAMS.isManaged()).setPdpGroup(PDP_GROUP_VALUE).build();
 
  77         parameterGroup.setName("xacmlPdpConfiguration");
 
  78         ParameterService.register(parameterGroup);
 
  82     public void testForwardPolicy()
 
  83             throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException,SecurityException,
 
  84             IllegalArgumentException, IllegalAccessException, PolicyDistributionException, ClassNotFoundException {
 
  86         HttpClient httpClientMock = mock(HttpClient.class);
 
  87         headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
 
  88         when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
 
  89         when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
 
  91         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
 
  92         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
 
  94         overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
 
  96         XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
 
  97         forwarder.configure("xacmlPdpConfiguration");
 
  99         Collection<Policy> policies = new ArrayList<>();
 
 101         OptimizationPolicy policy1 = new OptimizationPolicy();
 
 102         policy1.setPolicyName("policy1");
 
 103         policies.add(policy1);
 
 105         Policy policy2 = new UnsupportedPolicy();
 
 106         policies.add(policy2);
 
 108         OptimizationPolicy policy3 = new OptimizationPolicy();
 
 109         policy3.setPolicyName("policy3");
 
 110         policies.add(policy3);
 
 112         forwarder.forward(policies);
 
 114         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy1)),
 
 116         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy3)),
 
 118         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy1)),
 
 120         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy3)),
 
 125     public void testForwardPolicy_CreateFailsPushNotInvoked()
 
 126             throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
 
 127             IllegalArgumentException, IllegalAccessException, PolicyDistributionException, ClassNotFoundException {
 
 129         HttpClient httpClientMock = mock(HttpClient.class);
 
 130         headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
 
 131         when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
 
 132         when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
 
 134         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
 
 135         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
 
 137         overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
 
 139         XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
 
 140         forwarder.configure("xacmlPdpConfiguration");
 
 142         Collection<Policy> policies = new ArrayList<>();
 
 143         OptimizationPolicy policy = new OptimizationPolicy();
 
 144         policy.setPolicyName("policy");
 
 145         policies.add(policy);
 
 146         forwarder.forward(policies);
 
 148         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
 
 149         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
 
 153     public void testForwardPolicy_PushFails()
 
 154             throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
 
 155             IllegalArgumentException, IllegalAccessException, PolicyDistributionException, ClassNotFoundException {
 
 157         HttpClient httpClientMock = mock(HttpClient.class);
 
 158         headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
 
 159         when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
 
 160         when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
 
 162         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
 
 163         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
 
 165         overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
 
 167         XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
 
 168         forwarder.configure("xacmlPdpConfiguration");
 
 170         Collection<Policy> policies = new ArrayList<>();
 
 171         OptimizationPolicy policy = new OptimizationPolicy();
 
 172         policy.setPolicyName("policy");
 
 173         policies.add(policy);
 
 174         forwarder.forward(policies);
 
 176         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
 
 177         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy)),
 
 182     public void testForwardPolicy_HttpClientInitFailureForPolicyCreate()
 
 183             throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
 
 184             IllegalArgumentException, IllegalAccessException, PolicyDistributionException, ClassNotFoundException {
 
 186         HttpClient httpClientMock = mock(HttpClient.class);
 
 187         headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
 
 188         when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
 
 189         when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
 
 191         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
 
 192         when(httpClientFactoryMock.build(argThat(matcher))).thenThrow(new KeyManagementException());
 
 194         overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
 
 196         XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
 
 197         forwarder.configure("xacmlPdpConfiguration");
 
 199         Collection<Policy> policies = new ArrayList<>();
 
 200         OptimizationPolicy policy = new OptimizationPolicy();
 
 201         policy.setPolicyName("policy");
 
 202         policies.add(policy);
 
 203         forwarder.forward(policies);
 
 205         verify(httpClientMock, times(0)).put(eq("createPolicy"), anyObject(), anyObject());
 
 206         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
 
 210     public void testForwardPolicy_HttpClientInitFailureForPolicyPush()
 
 211             throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
 
 212             IllegalArgumentException, IllegalAccessException, PolicyDistributionException, ClassNotFoundException {
 
 214         HttpClient httpClientMock = mock(HttpClient.class);
 
 215         headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
 
 216         when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
 
 217         when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
 
 219         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
 
 220         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock)
 
 221                 .thenThrow(new KeyManagementException());
 
 223         overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
 
 225         XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
 
 226         forwarder.configure("xacmlPdpConfiguration");
 
 228         Collection<Policy> policies = new ArrayList<>();
 
 229         OptimizationPolicy policy = new OptimizationPolicy();
 
 230         policy.setPolicyName("policy");
 
 231         policies.add(policy);
 
 232         forwarder.forward(policies);
 
 234         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
 
 235         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
 
 238     private void overwriteField(final Class<?> clazz, final String fieldName, final Object object, final Object value)
 
 239             throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
 
 240         Field field = clazz.getField(fieldName);
 
 241         field.setAccessible(true);
 
 242         Field modifiersField = Field.class.getDeclaredField("modifiers");
 
 243         modifiersField.setAccessible(true);
 
 244         modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
 
 245         field.set(object, value);
 
 248     class BusTopicParamsMatcher extends BaseMatcher<BusTopicParams> {
 
 250         private BusTopicParams busTopicParams;
 
 252         BusTopicParamsMatcher(final BusTopicParams busTopicParams) {
 
 253             this.busTopicParams = busTopicParams;
 
 257         public boolean matches(Object arg0) {
 
 258             if (arg0 instanceof BusTopicParams) {
 
 259                 BusTopicParams toCompareTo = (BusTopicParams) arg0;
 
 260                 return toCompareTo.isUseHttps() == busTopicParams.isUseHttps()
 
 261                         && toCompareTo.getHostname().equals(busTopicParams.getHostname())
 
 262                         && toCompareTo.getPort() == busTopicParams.getPort()
 
 263                         && toCompareTo.getUserName().equals(busTopicParams.getUserName())
 
 264                         && toCompareTo.getPassword().equals(busTopicParams.getPassword())
 
 265                         && toCompareTo.isManaged() == busTopicParams.isManaged();
 
 271         public void describeTo(Description arg0) {}
 
 274     class PolicyParametersEntityMatcher extends BaseMatcher<Entity<PolicyParameters>> {
 
 276         private OptimizationPolicy policy;
 
 278         PolicyParametersEntityMatcher(final OptimizationPolicy policy) {
 
 279             this.policy = policy;
 
 282         @SuppressWarnings("unchecked")
 
 284         public boolean matches(Object arg0) {
 
 285             if (arg0 instanceof Entity) {
 
 286                 PolicyParameters toCompareTo = ((Entity<PolicyParameters>) arg0).getEntity();
 
 287                 return toCompareTo.getPolicyName().equals(policy.getPolicyName())
 
 288                         && toCompareTo.getPolicyConfigType().toString().equals(policy.getPolicyConfigType());
 
 294         public void describeTo(Description arg0) {}
 
 297     class PushPolicyParametersEntityMatcher extends BaseMatcher<Entity<PushPolicyParameters>> {
 
 299         private Policy policy;
 
 301         PushPolicyParametersEntityMatcher(final Policy policy) {
 
 302             this.policy = policy;
 
 305         @SuppressWarnings("unchecked")
 
 307         public boolean matches(Object arg0) {
 
 308             if (arg0 instanceof Entity) {
 
 309                 PushPolicyParameters toCompareTo = ((Entity<PushPolicyParameters>) arg0).getEntity();
 
 310                 return toCompareTo.getPolicyName().equals(policy.getPolicyName())
 
 311                         && toCompareTo.getPolicyType().equals(policy.getPolicyType())
 
 312                         && toCompareTo.getPdpGroup().equals(PDP_GROUP_VALUE);
 
 318         public void describeTo(Description arg0) {}
 
 321     class UnsupportedPolicy implements Policy {
 
 324         public String getPolicyName() {
 
 325             return "unsupported";
 
 329         public String getPolicyType() {
 
 330             return "unsupported";