f9cd868a2a248a0fd1f0c9124f7920c9266d8c06
[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.junit.Assert.assertSame;
25 import static org.mockito.Matchers.anyObject;
26 import static org.mockito.Matchers.argThat;
27 import static org.mockito.Matchers.eq;
28 import static org.mockito.Mockito.mock;
29 import static org.mockito.Mockito.times;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when;
32
33 import java.util.ArrayList;
34 import java.util.Collection;
35 import java.util.HashMap;
36
37 import javax.ws.rs.client.Entity;
38 import javax.ws.rs.core.Response;
39
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.HttpClientConfigException;
49 import org.onap.policy.common.endpoints.http.client.HttpClientFactory;
50 import org.onap.policy.common.parameters.ParameterGroup;
51 import org.onap.policy.common.parameters.ParameterService;
52 import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpPolicyForwarder;
53 import org.onap.policy.distribution.forwarding.xacml.pdp.XacmlPdpPolicyForwarderParameterGroup.XacmlPdpPolicyForwarderParameterGroupBuilder;
54 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
55 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
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         final 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 Exception {
83
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());
88
89         final HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
90         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
91
92         final XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
93         forwarder.configure("xacmlPdpConfiguration");
94
95         final Collection<ToscaEntity> policies = new ArrayList<>();
96
97         final ToscaPolicy policy1 = createPolicy(policies, "policy1", "optimization");
98
99         final ToscaEntity policy2 = new UnsupportedPolicy();
100         policies.add(policy2);
101
102         final ToscaPolicy policy3 = createPolicy(policies, "policy3", "optimization");
103
104         forwarder.forward(policies);
105
106         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy1)),
107                 eq(headers));
108         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy3)),
109                 eq(headers));
110         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy1)),
111                 eq(headers));
112         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy3)),
113                 eq(headers));
114     }
115
116     @Test
117     public void testForwardPolicy_CreateFailsPushNotInvoked() throws Exception {
118
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());
123
124         final HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
125         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
126
127         final XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
128         forwarder.configure("xacmlPdpConfiguration");
129
130         final Collection<ToscaEntity> policies = new ArrayList<>();
131         final ToscaPolicy policy = createPolicy(policies, "policy", "optimization");
132         forwarder.forward(policies);
133
134         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
135         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
136     }
137
138     @Test
139     public void testForwardPolicy_PushFails() throws Exception {
140
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());
145
146         final HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
147         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock);
148
149         final XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
150         forwarder.configure("xacmlPdpConfiguration");
151
152         final Collection<ToscaEntity> policies = new ArrayList<>();
153         final ToscaPolicy policy = createPolicy(policies, "policy", "optimization");
154         forwarder.forward(policies);
155
156         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
157         verify(httpClientMock).put(eq("pushPolicy"), argThat(new PushPolicyParametersEntityMatcher(policy)),
158                 eq(headers));
159     }
160
161     @Test
162     public void testForwardPolicy_HttpClientInitFailureForPolicyCreate() throws Exception {
163
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());
168
169         final HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
170         when(httpClientFactoryMock.build(argThat(matcher))).thenThrow(new HttpClientConfigException());
171
172         final XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
173         forwarder.configure("xacmlPdpConfiguration");
174
175         final Collection<ToscaEntity> policies = new ArrayList<>();
176         final ToscaPolicy policy = createPolicy(policies, "policy", "optimization");
177         forwarder.forward(policies);
178
179         assertSame(policy, policies.iterator().next());
180
181         verify(httpClientMock, times(0)).put(eq("createPolicy"), anyObject(), anyObject());
182         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
183     }
184
185     @Test
186     public void testForwardPolicy_HttpClientInitFailureForPolicyPush() throws Exception {
187
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());
192
193         final HttpClientFactory httpClientFactoryMock = mock(HttpClientFactory.class);
194         when(httpClientFactoryMock.build(argThat(matcher))).thenReturn(httpClientMock)
195                 .thenThrow(new HttpClientConfigException());
196
197         final XacmlPdpPolicyForwarder forwarder = new MyXacmlPdpPolicyForwarder(httpClientFactoryMock);
198         forwarder.configure("xacmlPdpConfiguration");
199
200         final Collection<ToscaEntity> policies = new ArrayList<>();
201         final ToscaPolicy policy = createPolicy(policies, "policy", "optimization");
202         forwarder.forward(policies);
203
204         verify(httpClientMock).put(eq("createPolicy"), argThat(new PolicyParametersEntityMatcher(policy)), eq(headers));
205         verify(httpClientMock, times(0)).put(eq("pushPolicy"), anyObject(), anyObject());
206     }
207
208     class BusTopicParamsMatcher extends BaseMatcher<BusTopicParams> {
209
210         private BusTopicParams busTopicParams;
211
212         BusTopicParamsMatcher(final BusTopicParams busTopicParams) {
213             this.busTopicParams = busTopicParams;
214         }
215
216         @Override
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();
226             }
227             return false;
228         }
229
230         @Override
231         public void describeTo(final Description arg0) {}
232     }
233
234     class PolicyParametersEntityMatcher extends BaseMatcher<Entity<PolicyParameters>> {
235
236         private ToscaPolicy policy;
237
238         PolicyParametersEntityMatcher(final ToscaPolicy policy) {
239             this.policy = policy;
240         }
241
242         @SuppressWarnings("unchecked")
243         @Override
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());
248             }
249             return false;
250         }
251
252         @Override
253         public void describeTo(final Description arg0) {}
254     }
255
256     class PushPolicyParametersEntityMatcher extends BaseMatcher<Entity<PushPolicyParameters>> {
257
258         private ToscaPolicy policy;
259
260         PushPolicyParametersEntityMatcher(final ToscaPolicy policy) {
261             this.policy = policy;
262         }
263
264         @SuppressWarnings("unchecked")
265         @Override
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);
272             }
273             return false;
274         }
275
276         @Override
277         public void describeTo(final Description arg0) {}
278     }
279
280     class UnsupportedPolicy extends ToscaEntity {
281
282         @Override
283         public String getName() {
284             return "unsupported";
285         }
286     }
287
288     private class MyXacmlPdpPolicyForwarder extends XacmlPdpPolicyForwarder {
289         private HttpClientFactory factory;
290
291         public MyXacmlPdpPolicyForwarder(final HttpClientFactory httpClientFactory) {
292             this.factory = httpClientFactory;
293         }
294
295         @Override
296         protected HttpClientFactory getHttpClientFactory() {
297             return this.factory;
298         }
299     }
300
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);
306         return policy1;
307     }
308 }