2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2018 Ericsson. All rights reserved.
4 * Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
5 * Modifications Copyright (C) 2019 Nordix Foundation.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.distribution.forwarding.xacml.pdp.engine;
25 import static org.junit.Assert.assertSame;
26 import static org.mockito.Matchers.anyObject;
27 import static org.mockito.Matchers.argThat;
28 import static org.mockito.Matchers.eq;
29 import static org.mockito.Mockito.mock;
30 import static org.mockito.Mockito.times;
31 import static org.mockito.Mockito.verify;
32 import static org.mockito.Mockito.when;
34 import java.util.ArrayList;
35 import java.util.Collection;
36 import java.util.HashMap;
38 import javax.ws.rs.client.Entity;
39 import javax.ws.rs.core.Response;
41 import org.hamcrest.BaseMatcher;
42 import org.hamcrest.Description;
43 import org.junit.BeforeClass;
44 import org.junit.Test;
45 import org.onap.policy.api.PolicyParameters;
46 import org.onap.policy.api.PushPolicyParameters;
47 import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams;
48 import org.onap.policy.common.endpoints.http.client.HttpClient;
49 import org.onap.policy.common.endpoints.http.client.HttpClientConfigException;
50 import org.onap.policy.common.endpoints.http.client.HttpClientFactory;
51 import org.onap.policy.common.parameters.ParameterGroup;
52 import org.onap.policy.common.parameters.ParameterService;
53 import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpPolicyForwarder;
54 import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpPolicyForwarderParameterGroup;
55 import org.onap.policy.distribution.forwarding.xacml.pdp.testclasses.CommonTestData;
56 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
57 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
59 public class XacmlPdpPolicyForwarderTest {
61 private static final BusTopicParams BUS_TOPIC_PARAMS = BusTopicParams.builder().useHttps(true)
62 .hostname("10.10.10.10").port(1234).userName("myUser").password("myPassword").managed(false).build();
63 private static final String CLIENT_AUTH = "ClientAuth";
64 private static final String CLIENT_AUTH_VALUE = "myClientAuth";
65 private static final String PDP_GROUP_VALUE = "myPdpGroup";
66 private HashMap<String, Object> headers = new HashMap<>();
67 private BusTopicParamsMatcher matcher = new BusTopicParamsMatcher(BUS_TOPIC_PARAMS);
73 public static void setUp() {
74 final ParameterGroup parameterGroup = CommonTestData.getPolicyForwarderParameters(
75 "src/test/resources/parameters/XacmlPdpPolicyForwarderParameters.json",
76 XacmlPdpPolicyForwarderParameterGroup.class);
77 parameterGroup.setName("xacmlPdpConfiguration");
78 ParameterService.register(parameterGroup);
82 public void testForwardPolicy() throws Exception {
84 final HttpClient httpClientMock = mock(HttpClient.class);
85 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
86 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
87 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
89 final HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
90 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
92 final XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
93 forwarder.configure("xacmlPdpConfiguration");
95 final Collection<ToscaEntity> policies = new ArrayList<>();
97 final ToscaPolicy policy1 = createPolicy(policies, "policy1", "optimization");
99 final ToscaEntity policy2 = new UnsupportedPolicy();
100 policies.add(policy2);
102 final ToscaPolicy policy3 = createPolicy(policies, "policy3", "optimization");
104 forwarder.forward(policies);
106 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy1)),
108 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy3)),
110 verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy1)),
112 verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy3)),
117 public void testForwardPolicy_CreateFailsPushNotInvoked() throws Exception {
119 final HttpClient httpClientMock = mock(HttpClient.class);
120 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
121 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
122 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
124 final HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
125 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
127 final XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
128 forwarder.configure("xacmlPdpConfiguration");
130 final Collection<ToscaEntity> policies = new ArrayList<>();
131 final ToscaPolicy policy = createPolicy(policies, "policy", "optimization");
132 forwarder.forward(policies);
134 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
135 verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
139 public void testForwardPolicy_PushFails() throws Exception {
141 final HttpClient httpClientMock = mock(HttpClient.class);
142 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
143 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
144 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
146 final HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
147 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
149 final XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
150 forwarder.configure("xacmlPdpConfiguration");
152 final Collection<ToscaEntity> policies = new ArrayList<>();
153 final ToscaPolicy policy = createPolicy(policies, "policy", "optimization");
154 forwarder.forward(policies);
156 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
157 verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy)),
162 public void testForwardPolicy_HttpClientInitFailureForPolicyCreate() throws Exception {
164 final HttpClient httpClientMock = mock(HttpClient.class);
165 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
166 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
167 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
169 final HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
170 when(httpClientFactoryMock.build(argThat(matcher))).thenThrow(new HttpClientConfigException());
172 final XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
173 forwarder.configure("xacmlPdpConfiguration");
175 final Collection<ToscaEntity> policies = new ArrayList<>();
176 final ToscaPolicy policy = createPolicy(policies, "policy", "optimization");
177 forwarder.forward(policies);
179 assertSame(policy, policies.iterator().next());
181 verify(httpClientMock, times(0)).put(eq("createPolicy"), anyObject(), anyObject());
182 verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
186 public void testForwardPolicy_HttpClientInitFailureForPolicyPush() throws Exception {
188 final HttpClient httpClientMock = mock(HttpClient.class);
189 headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
190 when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
191 when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
193 final HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
194 when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock)
195 .thenThrow(new HttpClientConfigException());
197 final XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
198 forwarder.configure("xacmlPdpConfiguration");
200 final Collection<ToscaEntity> policies = new ArrayList<>();
201 final ToscaPolicy policy = createPolicy(policies, "policy", "optimization");
202 forwarder.forward(policies);
204 verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
205 verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
208 class BusTopicParamsMatcher extends BaseMatcher<BusTopicParams> {
210 private BusTopicParams busTopicParams;
212 BusTopicParamsMatcher(final BusTopicParams busTopicParams) {
213 this.busTopicParams = busTopicParams;
217 public boolean matches(final Object arg0) {
218 if (arg0 instanceof BusTopicParams) {
219 final BusTopicParams toCompareTo = (BusTopicParams) arg0;
220 return toCompareTo.isUseHttps() == busTopicParams.isUseHttps()
221 && toCompareTo.getHostname().equals(busTopicParams.getHostname())
222 && toCompareTo.getPort() == busTopicParams.getPort()
223 && toCompareTo.getUserName().equals(busTopicParams.getUserName())
224 && toCompareTo.getPassword().equals(busTopicParams.getPassword())
225 && toCompareTo.isManaged() == busTopicParams.isManaged();
231 public void describeTo(final Description arg0) {}
234 class PolicyParametersEntityMatcher extends BaseMatcher<Entity<PolicyParameters>> {
236 private ToscaPolicy policy;
238 PolicyParametersEntityMatcher(final ToscaPolicy policy) {
239 this.policy = policy;
242 @SuppressWarnings("unchecked")
244 public boolean matches(final Object arg0) {
245 if (arg0 instanceof Entity) {
246 final PolicyParameters toCompareTo = ((Entity<PolicyParameters>) arg0).getEntity();
247 return toCompareTo.getPolicyName().equals(policy.getName());
253 public void describeTo(final Description arg0) {}
256 class PushPolicyParametersEntityMatcher extends BaseMatcher<Entity<PushPolicyParameters>> {
258 private ToscaPolicy policy;
260 PushPolicyParametersEntityMatcher(final ToscaPolicy policy) {
261 this.policy = policy;
264 @SuppressWarnings("unchecked")
266 public boolean matches(final Object arg0) {
267 if (arg0 instanceof Entity) {
268 final PushPolicyParameters toCompareTo = ((Entity<PushPolicyParameters>) arg0).getEntity();
269 return toCompareTo.getPolicyName().equals(policy.getName())
270 && toCompareTo.getPolicyType().equals(policy.getType())
271 && toCompareTo.getPdpGroup().equals(PDP_GROUP_VALUE);
277 public void describeTo(final Description arg0) {}
280 class UnsupportedPolicy extends ToscaEntity {
283 public String getName() {
284 return "unsupported";
288 private class MyXacmlPdpPolicyForwarder extends XacmlPdpPolicyForwarder {
289 private HttpClientFactory factory;
291 public MyXacmlPdpPolicyForwarder(final HttpClientFactory httpClientFactory) {
292 this.factory = httpClientFactory;
296 protected HttpClientFactory getHttpClientFactory() {
301 private ToscaPolicy createPolicy(final Collection<ToscaEntity> policies, final String name, final String type) {
302 final ToscaPolicy policy1 = new ToscaPolicy();
303 policy1.setName(name);
304 policy1.setType(type);
305 policies.add(policy1);