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() throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException,
83 SecurityException, IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
85 HttpClient httpClientMock = mock(HttpClient.class);
86 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
87 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
88 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
90 HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
91 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
93 overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
95 XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
96 forwarder.configure("xacmlPdpConfiguration");
98 Collection<Policy> policies = new ArrayList<>();
100 OptimizationPolicy policy1 = new OptimizationPolicy();
101 policy1.setPolicyName("policy1");
102 policies.add(policy1);
104 Policy policy2 = new UnsupportedPolicy();
105 policies.add(policy2);
107 OptimizationPolicy policy3 = new OptimizationPolicy();
108 policy3.setPolicyName("policy3");
109 policies.add(policy3);
111 forwarder.forward(policies);
113 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy1)),
115 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy3)),
117 verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy1)),
119 verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy3)),
124 public void testForwardPolicy_CreateFailsPushNotInvoked()
125 throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
126 IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
128 HttpClient httpClientMock = mock(HttpClient.class);
129 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
130 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
131 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
133 HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
134 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
136 overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
138 XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
139 forwarder.configure("xacmlPdpConfiguration");
141 Collection<Policy> policies = new ArrayList<>();
142 OptimizationPolicy policy = new OptimizationPolicy();
143 policy.setPolicyName("policy");
144 policies.add(policy);
145 forwarder.forward(policies);
147 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
148 verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
152 public void testForwardPolicy_PushFails()
153 throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
154 IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
156 HttpClient httpClientMock = mock(HttpClient.class);
157 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
158 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
159 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
161 HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
162 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
164 overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
166 XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
167 forwarder.configure("xacmlPdpConfiguration");
169 Collection<Policy> policies = new ArrayList<>();
170 OptimizationPolicy policy = new OptimizationPolicy();
171 policy.setPolicyName("policy");
172 policies.add(policy);
173 forwarder.forward(policies);
175 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
176 verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy)),
181 public void testForwardPolicy_HttpClientInitFailureForPolicyCreate()
182 throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
183 IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
185 HttpClient httpClientMock = mock(HttpClient.class);
186 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
187 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
188 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
190 HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
191 when(httpClientFactoryMock.build(argThat(matcher))).thenThrow(new KeyManagementException());
193 overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
195 XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
196 forwarder.configure("xacmlPdpConfiguration");
198 Collection<Policy> policies = new ArrayList<>();
199 OptimizationPolicy policy = new OptimizationPolicy();
200 policy.setPolicyName("policy");
201 policies.add(policy);
202 forwarder.forward(policies);
204 verify(httpClientMock, times(0)).put(eq("createPolicy"), anyObject(), anyObject());
205 verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
209 public void testForwardPolicy_HttpClientInitFailureForPolicyPush()
210 throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
211 IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
213 HttpClient httpClientMock = mock(HttpClient.class);
214 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
215 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
216 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
218 HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
219 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock)
220 .thenThrow(new KeyManagementException());
222 overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
224 XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
225 forwarder.configure("xacmlPdpConfiguration");
227 Collection<Policy> policies = new ArrayList<>();
228 OptimizationPolicy policy = new OptimizationPolicy();
229 policy.setPolicyName("policy");
230 policies.add(policy);
231 forwarder.forward(policies);
233 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
234 verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
237 private void overwriteField(final Class<?> clazz, final String fieldName, final Object object, final Object value)
238 throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
239 Field field = clazz.getField(fieldName);
240 field.setAccessible(true);
241 Field modifiersField = Field.class.getDeclaredField("modifiers");
242 modifiersField.setAccessible(true);
243 modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
244 field.set(object, value);
247 class BusTopicParamsMatcher extends BaseMatcher<BusTopicParams> {
249 private BusTopicParams busTopicParams;
251 BusTopicParamsMatcher(final BusTopicParams busTopicParams) {
252 this.busTopicParams = busTopicParams;
256 public boolean matches(Object arg0) {
257 if (arg0 instanceof BusTopicParams) {
258 BusTopicParams toCompareTo = (BusTopicParams) arg0;
259 return toCompareTo.isUseHttps() == busTopicParams.isUseHttps()
260 && toCompareTo.getHostname().equals(busTopicParams.getHostname())
261 && toCompareTo.getPort() == busTopicParams.getPort()
262 && toCompareTo.getUserName().equals(busTopicParams.getUserName())
263 && toCompareTo.getPassword().equals(busTopicParams.getPassword())
264 && toCompareTo.isManaged() == busTopicParams.isManaged();
270 public void describeTo(Description arg0) {}
273 class PolicyParametersEntityMatcher extends BaseMatcher<Entity<PolicyParameters>> {
275 private OptimizationPolicy policy;
277 PolicyParametersEntityMatcher(final OptimizationPolicy policy) {
278 this.policy = policy;
281 @SuppressWarnings("unchecked")
283 public boolean matches(Object arg0) {
284 if (arg0 instanceof Entity) {
285 PolicyParameters toCompareTo = ((Entity<PolicyParameters>) arg0).getEntity();
286 return toCompareTo.getPolicyName().equals(policy.getPolicyName())
287 && toCompareTo.getPolicyConfigType().toString().equals(policy.getPolicyConfigType());
293 public void describeTo(Description arg0) {}
296 class PushPolicyParametersEntityMatcher extends BaseMatcher<Entity<PushPolicyParameters>> {
298 private Policy policy;
300 PushPolicyParametersEntityMatcher(final Policy policy) {
301 this.policy = policy;
304 @SuppressWarnings("unchecked")
306 public boolean matches(Object arg0) {
307 if (arg0 instanceof Entity) {
308 PushPolicyParameters toCompareTo = ((Entity<PushPolicyParameters>) arg0).getEntity();
309 return toCompareTo.getPolicyName().equals(policy.getPolicyName())
310 && toCompareTo.getPolicyType().equals(policy.getPolicyType())
311 && toCompareTo.getPdpGroup().equals(PDP_GROUP_VALUE);
317 public void describeTo(Description arg0) {}
320 class UnsupportedPolicy implements Policy {
323 public String getPolicyName() {
324 return "unsupported";
328 public String getPolicyType() {
329 return "unsupported";