43fac71813a03e2a4c21f4902eef7f0f01707936
[policy/distribution.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.distribution.forwarding.xacml.pdp.engine;
23
24 import static org.mockito.Matchers.anyObject;
25 import static org.mockito.Matchers.argThat;
26 import static org.mockito.Matchers.eq;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.times;
29 import static org.mockito.Mockito.verify;
30 import static org.mockito.Mockito.when;
31
32 import java.util.ArrayList;
33 import java.util.Collection;
34 import java.util.HashMap;
35 import javax.ws.rs.client.Entity;
36 import javax.ws.rs.core.Response;
37 import org.hamcrest.BaseMatcher;
38 import org.hamcrest.Description;
39 import org.junit.BeforeClass;
40 import org.junit.Test;
41 import org.onap.policy.api.PolicyParameters;
42 import org.onap.policy.api.PushPolicyParameters;
43 import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams;
44 import org.onap.policy.common.endpoints.http.client.HttpClient;
45 import org.onap.policy.common.endpoints.http.client.HttpClientConfigException;
46 import org.onap.policy.common.endpoints.http.client.HttpClientFactory;
47 import org.onap.policy.common.parameters.ParameterGroup;
48 import org.onap.policy.common.parameters.ParameterService;
49 import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpPolicyForwarder;
50 import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpPolicyForwarderParameterGroup.XacmlPdpPolicyForwarderParameterGroupBuilder;
51 import org.onap.policy.distribution.model.OptimizationPolicy;
52 import org.onap.policy.distribution.model.Policy;
53
54 public class XacmlPdpPolicyForwarderTest {
55
56     private static final BusTopicParams BUS_TOPIC_PARAMS = BusTopicParams.builder().useHttps(false).hostname("myHost")
57             .port(1234).userName("myUser").password("myPassword").managed(true).build();
58     private static final String CLIENT_AUTH = "ClientAuth";
59     private static final String CLIENT_AUTH_VALUE = "myClientAuth";
60     private static final String PDP_GROUP_VALUE = "myPdpGroup";
61     private HashMap<String, Object> headers = new HashMap<>();
62     private BusTopicParamsMatcher matcher = new BusTopicParamsMatcher(BUS_TOPIC_PARAMS);
63
64     /**
65      * Set up.
66      */
67     @BeforeClass
68     public static void setUp() {
69         ParameterGroup parameterGroup = new XacmlPdpPolicyForwarderParameterGroupBuilder()
70                 .setUseHttps(BUS_TOPIC_PARAMS.isUseHttps()).setHostname(BUS_TOPIC_PARAMS.getHostname())
71                 .setPort(BUS_TOPIC_PARAMS.getPort()).setUserName(BUS_TOPIC_PARAMS.getUserName())
72                 .setPassword(BUS_TOPIC_PARAMS.getPassword()).setClientAuth(CLIENT_AUTH_VALUE)
73                 .setIsManaged(BUS_TOPIC_PARAMS.isManaged()).setPdpGroup(PDP_GROUP_VALUE).build();
74         parameterGroup.setName("xacmlPdpConfiguration");
75         ParameterService.register(parameterGroup);
76     }
77
78     @Test
79     public void testForwardPolicy() throws Exception {
80
81         HttpClient httpClientMock = mock(HttpClient.class);
82         headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
83         when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
84         when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
85
86         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
87         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
88
89         XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
90         forwarder.configure("xacmlPdpConfiguration");
91
92         Collection<Policy> policies = new ArrayList<>();
93
94         OptimizationPolicy policy1 = new OptimizationPolicy();
95         policy1.setPolicyName("policy1");
96         policies.add(policy1);
97
98         Policy policy2 = new UnsupportedPolicy();
99         policies.add(policy2);
100
101         OptimizationPolicy policy3 = new OptimizationPolicy();
102         policy3.setPolicyName("policy3");
103         policies.add(policy3);
104
105         forwarder.forward(policies);
106
107         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy1)),
108                 eq(headers));
109         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy3)),
110                 eq(headers));
111         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy1)),
112                 eq(headers));
113         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy3)),
114                 eq(headers));
115     }
116
117     @Test
118     public void testForwardPolicy_CreateFailsPushNotInvoked() throws Exception {
119
120         HttpClient httpClientMock = mock(HttpClient.class);
121         headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
122         when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
123         when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
124
125         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
126         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
127
128         XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
129         forwarder.configure("xacmlPdpConfiguration");
130
131         Collection<Policy> policies = new ArrayList<>();
132         OptimizationPolicy policy = new OptimizationPolicy();
133         policy.setPolicyName("policy");
134         policies.add(policy);
135         forwarder.forward(policies);
136
137         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
138         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
139     }
140
141     @Test
142     public void testForwardPolicy_PushFails() throws Exception {
143
144         HttpClient httpClientMock = mock(HttpClient.class);
145         headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
146         when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
147         when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
148
149         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
150         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
151
152         XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
153         forwarder.configure("xacmlPdpConfiguration");
154
155         Collection<Policy> policies = new ArrayList<>();
156         OptimizationPolicy policy = new OptimizationPolicy();
157         policy.setPolicyName("policy");
158         policies.add(policy);
159         forwarder.forward(policies);
160
161         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
162         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy)),
163                 eq(headers));
164     }
165
166     @Test
167     public void testForwardPolicy_HttpClientInitFailureForPolicyCreate() throws Exception {
168
169         HttpClient httpClientMock = mock(HttpClient.class);
170         headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
171         when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
172         when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
173
174         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
175         when(httpClientFactoryMock.build(argThat(matcher))).thenThrow(new HttpClientConfigException());
176
177         XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
178         forwarder.configure("xacmlPdpConfiguration");
179
180         Collection<Policy> policies = new ArrayList<>();
181         OptimizationPolicy policy = new OptimizationPolicy();
182         policy.setPolicyName("policy");
183         policies.add(policy);
184         forwarder.forward(policies);
185
186         verify(httpClientMock, times(0)).put(eq("createPolicy"), anyObject(), anyObject());
187         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
188     }
189
190     @Test
191     public void testForwardPolicy_HttpClientInitFailureForPolicyPush() throws Exception {
192
193         HttpClient httpClientMock = mock(HttpClient.class);
194         headers.put(CLIENT_AUTH, CLIENT_AUTH_VALUE);
195         when(httpClientMock.put(eq("createPolicy"), anyObject(), eq(headers))).thenReturn(Response.ok().build());
196         when(httpClientMock.put(eq("pushPolicy"), anyObject(), eq(headers))).thenReturn(Response.status(400).build());
197
198         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
199         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock)
200                 .thenThrow(new HttpClientConfigException());
201
202         XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
203         forwarder.configure("xacmlPdpConfiguration");
204
205         Collection<Policy> policies = new ArrayList<>();
206         OptimizationPolicy policy = new OptimizationPolicy();
207         policy.setPolicyName("policy");
208         policies.add(policy);
209         forwarder.forward(policies);
210
211         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
212         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
213     }
214
215     class BusTopicParamsMatcher extends BaseMatcher<BusTopicParams> {
216
217         private BusTopicParams busTopicParams;
218
219         BusTopicParamsMatcher(final BusTopicParams busTopicParams) {
220             this.busTopicParams = busTopicParams;
221         }
222
223         @Override
224         public boolean matches(Object arg0) {
225             if (arg0 instanceof BusTopicParams) {
226                 BusTopicParams toCompareTo = (BusTopicParams) arg0;
227                 return toCompareTo.isUseHttps() == busTopicParams.isUseHttps()
228                         && toCompareTo.getHostname().equals(busTopicParams.getHostname())
229                         && toCompareTo.getPort() == busTopicParams.getPort()
230                         && toCompareTo.getUserName().equals(busTopicParams.getUserName())
231                         && toCompareTo.getPassword().equals(busTopicParams.getPassword())
232                         && toCompareTo.isManaged() == busTopicParams.isManaged();
233             }
234             return false;
235         }
236
237         @Override
238         public void describeTo(Description arg0) {}
239     }
240
241     class PolicyParametersEntityMatcher extends BaseMatcher<Entity<PolicyParameters>> {
242
243         private OptimizationPolicy policy;
244
245         PolicyParametersEntityMatcher(final OptimizationPolicy policy) {
246             this.policy = policy;
247         }
248
249         @SuppressWarnings("unchecked")
250         @Override
251         public boolean matches(Object arg0) {
252             if (arg0 instanceof Entity) {
253                 PolicyParameters toCompareTo = ((Entity<PolicyParameters>) arg0).getEntity();
254                 return toCompareTo.getPolicyName().equals(policy.getPolicyName())
255                         && toCompareTo.getPolicyConfigType().toString().equals(policy.getPolicyConfigType());
256             }
257             return false;
258         }
259
260         @Override
261         public void describeTo(Description arg0) {}
262     }
263
264     class PushPolicyParametersEntityMatcher extends BaseMatcher<Entity<PushPolicyParameters>> {
265
266         private Policy policy;
267
268         PushPolicyParametersEntityMatcher(final Policy policy) {
269             this.policy = policy;
270         }
271
272         @SuppressWarnings("unchecked")
273         @Override
274         public boolean matches(Object arg0) {
275             if (arg0 instanceof Entity) {
276                 PushPolicyParameters toCompareTo = ((Entity<PushPolicyParameters>) arg0).getEntity();
277                 return toCompareTo.getPolicyName().equals(policy.getPolicyName())
278                         && toCompareTo.getPolicyType().equals(policy.getPolicyType())
279                         && toCompareTo.getPdpGroup().equals(PDP_GROUP_VALUE);
280             }
281             return false;
282         }
283
284         @Override
285         public void describeTo(Description arg0) {}
286     }
287
288     class UnsupportedPolicy implements Policy {
289
290         @Override
291         public String getPolicyName() {
292             return "unsupported";
293         }
294
295         @Override
296         public String getPolicyType() {
297             return "unsupported";
298         }
299     }
300
301     private class MyXacmlPdpPolicyForwarder extends XacmlPdpPolicyForwarder {
302         private HttpClientFactory factory;
303
304         public MyXacmlPdpPolicyForwarder(HttpClientFactory httpClientFactory) {
305             this.factory = httpClientFactory;
306         }
307
308         @Override
309         protected HttpClientFactory getHttpClientFactory() {
310             return this.factory;
311         }
312     }
313 }