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 policy1.setPolicyConfigType("Optimization");
103 policies.add(policy1);
105 Policy policy2 = new UnsupportedPolicy();
106 policies.add(policy2);
108 OptimizationPolicy policy3 = new OptimizationPolicy();
109 policy3.setPolicyName("policy3");
110 policy3.setPolicyConfigType("Optimization");
111 policies.add(policy3);
113 forwarder.forward(policies);
115 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy1)),
117 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy3)),
119 verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy1)),
121 verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy3)),
126 public void testForwardPolicy_CreateFailsPushNotInvoked()
127 throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
128 IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
130 HttpClient httpClientMock = mock(HttpClient.class);
131 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
132 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
133 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
135 HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
136 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
138 overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
140 XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
141 forwarder.configure("xacmlPdpConfiguration");
143 Collection<Policy> policies = new ArrayList<>();
144 OptimizationPolicy policy = new OptimizationPolicy();
145 policy.setPolicyName("policy");
146 policy.setPolicyConfigType("Optimization");
147 policies.add(policy);
148 forwarder.forward(policies);
150 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
151 verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
155 public void testForwardPolicy_PushFails()
156 throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
157 IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
159 HttpClient httpClientMock = mock(HttpClient.class);
160 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
161 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
162 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
164 HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
165 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
167 overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
169 XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
170 forwarder.configure("xacmlPdpConfiguration");
172 Collection<Policy> policies = new ArrayList<>();
173 OptimizationPolicy policy = new OptimizationPolicy();
174 policy.setPolicyName("policy");
175 policy.setPolicyConfigType("Optimization");
176 policies.add(policy);
177 forwarder.forward(policies);
179 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
180 verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy)),
185 public void testForwardPolicy_HttpClientInitFailureForPolicyCreate()
186 throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
187 IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
189 HttpClient httpClientMock = mock(HttpClient.class);
190 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
191 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
192 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
194 HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
195 when(httpClientFactoryMock.build(argThat(matcher))).thenThrow(new KeyManagementException());
197 overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
199 XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
200 forwarder.configure("xacmlPdpConfiguration");
202 Collection<Policy> policies = new ArrayList<>();
203 OptimizationPolicy policy = new OptimizationPolicy();
204 policy.setPolicyName("policy");
205 policy.setPolicyConfigType("Optimization");
206 policies.add(policy);
207 forwarder.forward(policies);
209 verify(httpClientMock, times(0)).put(eq("createPolicy"), anyObject(), anyObject());
210 verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
214 public void testForwardPolicy_HttpClientInitFailureForPolicyPush()
215 throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
216 IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
218 HttpClient httpClientMock = mock(HttpClient.class);
219 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
220 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
221 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
223 HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
224 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock)
225 .thenThrow(new KeyManagementException());
227 overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
229 XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
230 forwarder.configure("xacmlPdpConfiguration");
232 Collection<Policy> policies = new ArrayList<>();
233 OptimizationPolicy policy = new OptimizationPolicy();
234 policy.setPolicyName("policy");
235 policy.setPolicyConfigType("Optimization");
236 policies.add(policy);
237 forwarder.forward(policies);
239 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
240 verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
243 private void overwriteField(final Class<?> clazz, final String fieldName, final Object object, final Object value)
244 throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
245 Field field = clazz.getField(fieldName);
246 field.setAccessible(true);
247 Field modifiersField = Field.class.getDeclaredField("modifiers");
248 modifiersField.setAccessible(true);
249 modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
250 field.set(object, value);
253 class BusTopicParamsMatcher extends BaseMatcher<BusTopicParams> {
255 private BusTopicParams busTopicParams;
257 BusTopicParamsMatcher(final BusTopicParams busTopicParams) {
258 this.busTopicParams = busTopicParams;
262 public boolean matches(Object arg0) {
263 if (arg0 instanceof BusTopicParams) {
264 BusTopicParams toCompareTo = (BusTopicParams) arg0;
265 return toCompareTo.isUseHttps() == busTopicParams.isUseHttps()
266 && toCompareTo.getHostname().equals(busTopicParams.getHostname())
267 && toCompareTo.getPort() == busTopicParams.getPort()
268 && toCompareTo.getUserName().equals(busTopicParams.getUserName())
269 && toCompareTo.getPassword().equals(busTopicParams.getPassword())
270 && toCompareTo.isManaged() == busTopicParams.isManaged();
276 public void describeTo(Description arg0) {}
279 class PolicyParametersEntityMatcher extends BaseMatcher<Entity<PolicyParameters>> {
281 private OptimizationPolicy policy;
283 PolicyParametersEntityMatcher(final OptimizationPolicy policy) {
284 this.policy = policy;
287 @SuppressWarnings("unchecked")
289 public boolean matches(Object arg0) {
290 if (arg0 instanceof Entity) {
291 PolicyParameters toCompareTo = ((Entity<PolicyParameters>) arg0).getEntity();
292 return toCompareTo.getPolicyName().equals(policy.getPolicyName())
293 && toCompareTo.getPolicyConfigType().toString().equals(policy.getPolicyConfigType());
299 public void describeTo(Description arg0) {}
302 class PushPolicyParametersEntityMatcher extends BaseMatcher<Entity<PushPolicyParameters>> {
304 private Policy policy;
306 PushPolicyParametersEntityMatcher(final Policy policy) {
307 this.policy = policy;
310 @SuppressWarnings("unchecked")
312 public boolean matches(Object arg0) {
313 if (arg0 instanceof Entity) {
314 PushPolicyParameters toCompareTo = ((Entity<PushPolicyParameters>) arg0).getEntity();
315 return toCompareTo.getPolicyName().equals(policy.getPolicyName())
316 && toCompareTo.getPolicyType().equals(policy.getPolicyType())
317 && toCompareTo.getPdpGroup().equals(PDP_GROUP_VALUE);
323 public void describeTo(Description arg0) {}
326 class UnsupportedPolicy implements Policy {
329 public String getPolicyName() {
330 return "unsupported";
334 public String getPolicyType() {
335 return "unsupported";