9ef88b43192c74abbffa776688b091701a2303ed
[policy/distribution.git] /
1 /*-
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
8  * 
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  * 
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.
16  * 
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.distribution.forwarding.xacml.pdp.engine;
22
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;
30
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;
56
57 public class XacmlPdpPolicyForwarderTest {
58
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);
66
67     /**
68      * Set up.
69      */
70     @BeforeClass
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);
79     }
80
81     @Test
82     public void testForwardPolicy() throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException,
83             SecurityException, IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
84
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());
89
90         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
91         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
92
93         overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
94
95         XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
96         forwarder.configure("xacmlPdpConfiguration");
97
98         Collection<Policy> policies = new ArrayList<>();
99
100         OptimizationPolicy policy1 = new OptimizationPolicy();
101         policy1.setPolicyName("policy1");
102         policies.add(policy1);
103
104         Policy policy2 = new UnsupportedPolicy();
105         policies.add(policy2);
106
107         OptimizationPolicy policy3 = new OptimizationPolicy();
108         policy3.setPolicyName("policy3");
109         policies.add(policy3);
110
111         forwarder.forward(policies);
112
113         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy1)),
114                 eq(headers));
115         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy3)),
116                 eq(headers));
117         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy1)),
118                 eq(headers));
119         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy3)),
120                 eq(headers));
121     }
122
123     @Test
124     public void testForwardPolicy_CreateFailsPushNotInvoked()
125             throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
126             IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
127
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());
132
133         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
134         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
135
136         overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
137
138         XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
139         forwarder.configure("xacmlPdpConfiguration");
140
141         Collection<Policy> policies = new ArrayList<>();
142         OptimizationPolicy policy = new OptimizationPolicy();
143         policy.setPolicyName("policy");
144         policies.add(policy);
145         forwarder.forward(policies);
146
147         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
148         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
149     }
150
151     @Test
152     public void testForwardPolicy_PushFails()
153             throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
154             IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
155
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());
160
161         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
162         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
163
164         overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
165
166         XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
167         forwarder.configure("xacmlPdpConfiguration");
168
169         Collection<Policy> policies = new ArrayList<>();
170         OptimizationPolicy policy = new OptimizationPolicy();
171         policy.setPolicyName("policy");
172         policies.add(policy);
173         forwarder.forward(policies);
174
175         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
176         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy)),
177                 eq(headers));
178     }
179
180     @Test
181     public void testForwardPolicy_HttpClientInitFailureForPolicyCreate()
182             throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
183             IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
184
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());
189
190         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
191         when(httpClientFactoryMock.build(argThat(matcher))).thenThrow(new KeyManagementException());
192
193         overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
194
195         XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
196         forwarder.configure("xacmlPdpConfiguration");
197
198         Collection<Policy> policies = new ArrayList<>();
199         OptimizationPolicy policy = new OptimizationPolicy();
200         policy.setPolicyName("policy");
201         policies.add(policy);
202         forwarder.forward(policies);
203
204         verify(httpClientMock, times(0)).put(eq("createPolicy"), anyObject(), anyObject());
205         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
206     }
207
208     @Test
209     public void testForwardPolicy_HttpClientInitFailureForPolicyPush()
210             throws KeyManagementException, NoSuchAlgorithmException, NoSuchFieldException, SecurityException,
211             IllegalArgumentException, IllegalAccessException, PolicyDistributionException {
212
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());
217
218         HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
219         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock)
220                 .thenThrow(new KeyManagementException());
221
222         overwriteField(HttpClient.class, "factory", null, httpClientFactoryMock);
223
224         XacmlPdpPolicyForwarder forwarder = new XacmlPdpPolicyForwarder();
225         forwarder.configure("xacmlPdpConfiguration");
226
227         Collection<Policy> policies = new ArrayList<>();
228         OptimizationPolicy policy = new OptimizationPolicy();
229         policy.setPolicyName("policy");
230         policies.add(policy);
231         forwarder.forward(policies);
232
233         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
234         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
235     }
236
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);
245     }
246
247     class BusTopicParamsMatcher extends BaseMatcher<BusTopicParams> {
248
249         private BusTopicParams busTopicParams;
250
251         BusTopicParamsMatcher(final BusTopicParams busTopicParams) {
252             this.busTopicParams = busTopicParams;
253         }
254
255         @Override
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();
265             }
266             return false;
267         }
268
269         @Override
270         public void describeTo(Description arg0) {}
271     }
272
273     class PolicyParametersEntityMatcher extends BaseMatcher<Entity<PolicyParameters>> {
274
275         private OptimizationPolicy policy;
276
277         PolicyParametersEntityMatcher(final OptimizationPolicy policy) {
278             this.policy = policy;
279         }
280
281         @SuppressWarnings("unchecked")
282         @Override
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());
288             }
289             return false;
290         }
291
292         @Override
293         public void describeTo(Description arg0) {}
294     }
295
296     class PushPolicyParametersEntityMatcher extends BaseMatcher<Entity<PushPolicyParameters>> {
297
298         private Policy policy;
299
300         PushPolicyParametersEntityMatcher(final Policy policy) {
301             this.policy = policy;
302         }
303
304         @SuppressWarnings("unchecked")
305         @Override
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);
312             }
313             return false;
314         }
315
316         @Override
317         public void describeTo(Description arg0) {}
318     }
319
320     class UnsupportedPolicy implements Policy {
321
322         @Override
323         public String getPolicyName() {
324             return "unsupported";
325         }
326
327         @Override
328         public String getPolicyType() {
329             return "unsupported";
330         }
331     }
332 }