57f0c4342d2ab6cf7ee127a015baaa7fee73d42d
[policy/apex-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2019-2020 Nordix Foundation.
5  *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  * SPDX-License-Identifier: Apache-2.0
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.apex.plugins.event.carrier.restclient;
24
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertNotNull;
28
29 import java.util.Properties;
30 import javax.ws.rs.client.Client;
31 import javax.ws.rs.client.Invocation.Builder;
32 import javax.ws.rs.client.WebTarget;
33 import javax.ws.rs.core.Response;
34 import org.junit.Test;
35 import org.junit.runner.RunWith;
36 import org.mockito.Mock;
37 import org.mockito.Mockito;
38 import org.mockito.junit.MockitoJUnitRunner;
39 import org.onap.policy.apex.service.engine.event.ApexEventConsumer;
40 import org.onap.policy.apex.service.engine.event.ApexEventException;
41 import org.onap.policy.apex.service.engine.event.SynchronousEventCache;
42 import org.onap.policy.apex.service.engine.event.impl.filecarrierplugin.consumer.ApexFileEventConsumer;
43 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerParameters;
44 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerPeeredMode;
45
46 /**
47  * Test the ApexRestClientProducer class.
48  *
49  */
50 @RunWith(MockitoJUnitRunner.class)
51 public class ApexRestClientProducerTest {
52     @Mock
53     private Client httpClientMock;
54
55     @Mock
56     private WebTarget targetMock;
57
58     @Mock
59     private Builder builderMock;
60
61     @Mock
62     private Response responseMock;
63
64     @Test
65     public void testApexRestClientProducerErrors() throws ApexEventException {
66         ApexRestClientProducer arcp = new ApexRestClientProducer();
67         assertNotNull(arcp);
68
69         EventHandlerParameters producerParameters = new EventHandlerParameters();
70         assertThatThrownBy(() -> arcp.init("RestClientProducer", producerParameters))
71             .hasMessage("specified producer properties are not applicable to REST client producer"
72                 + " (RestClientProducer)");
73
74         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
75         producerParameters.setCarrierTechnologyParameters(rcctp);
76         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.DELETE);
77         assertThatThrownBy(() -> arcp.init("RestClientConsumer", producerParameters))
78             .hasMessage("specified HTTP method of \"DELETE\" is invalid, only HTTP methods \"POST\""
79                 + " and \"PUT\" are supported for event sending on REST client producer (RestClientConsumer)");
80
81         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.DELETE, rcctp.getHttpMethod());
82         rcctp.setHttpMethod(null);
83         arcp.init("RestClientConsumer", producerParameters);
84         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
85         assertEquals("RestClientConsumer", arcp.getName());
86         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
87         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
88         arcp.stop();
89
90         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
91         arcp.init("RestClientConsumer", producerParameters);
92         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
93         assertEquals("RestClientConsumer", arcp.getName());
94         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
95         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
96         arcp.stop();
97
98         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
99         arcp.init("RestClientConsumer", producerParameters);
100         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
101         assertEquals("RestClientConsumer", arcp.getName());
102         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
103         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
104         arcp.stop();
105     }
106
107     @Test
108     public void testApexRestClientProducerPutEvent() throws ApexEventException {
109         ApexRestClientProducer arcp = new ApexRestClientProducer();
110         assertNotNull(arcp);
111
112         EventHandlerParameters producerParameters = new EventHandlerParameters();
113         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
114         producerParameters.setCarrierTechnologyParameters(rcctp);
115
116         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
117         arcp.init("RestClientConsumer", producerParameters);
118         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
119         assertEquals("RestClientConsumer", arcp.getName());
120
121         rcctp.setUrl("http://some.place.that.does.not/exist");
122         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
123         Mockito.doReturn(responseMock).when(builderMock).put(Mockito.any());
124         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
125         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
126         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
127         arcp.setClient(httpClientMock);
128
129         arcp.sendEvent(123, null, "EventName", "This is an Event");
130         arcp.stop();
131     }
132
133     @Test
134     public void testApexRestClientProducerPostEventFail() throws ApexEventException {
135         ApexRestClientProducer arcp = new ApexRestClientProducer();
136         assertNotNull(arcp);
137
138         EventHandlerParameters producerParameters = new EventHandlerParameters();
139         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
140         producerParameters.setCarrierTechnologyParameters(rcctp);
141
142         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
143         arcp.init("RestClientConsumer", producerParameters);
144         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
145         assertEquals("RestClientConsumer", arcp.getName());
146
147         rcctp.setUrl("http://some.place.that.does.not/exist");
148         arcp.setClient(httpClientMock);
149
150         // test property not found
151         rcctp.setUrl("http://some.place2.that.{key}.not/{tag}and.again.{tag}");
152         Properties properties = new Properties();
153         properties.put("tag", "exist");
154         assertThatThrownBy(() -> {
155             arcp.sendEvent(123, properties, "EventName", "This is an Event");
156             arcp.stop();
157         }).hasMessageContaining("key \"key\" specified on url "
158                 + "\"http://some.place2.that.{key}.not/{tag}and.again.{tag}\" not found "
159                 + "in execution properties passed by the current policy");
160     }
161
162     @Test
163     public void testApexRestClientProducerPostEventOK() throws ApexEventException {
164         ApexRestClientProducer arcp = new ApexRestClientProducer();
165         assertNotNull(arcp);
166
167         EventHandlerParameters producerParameters = new EventHandlerParameters();
168         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
169         producerParameters.setCarrierTechnologyParameters(rcctp);
170
171         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
172         arcp.init("RestClientConsumer", producerParameters);
173         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
174         assertEquals("RestClientConsumer", arcp.getName());
175
176         System.out.println("fail test");
177         rcctp.setUrl("http://some.place.{key}.does.not/{tag}");
178         Properties properties = new Properties();
179         properties.put("tag", "exist");
180         properties.put("key", "that");
181         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
182         Mockito.doReturn(responseMock).when(builderMock).put(Mockito.any());
183         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
184         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
185         Mockito.doReturn(targetMock).when(httpClientMock).target("http://some.place.that.does.not/exist");
186         arcp.setClient(httpClientMock);
187
188         arcp.sendEvent(123, properties, "EventName", "This is an Event");
189         arcp.stop();
190     }
191
192     @Test
193     public void testApexRestClientProducerPostEventAccepted() throws ApexEventException {
194         ApexRestClientProducer arcp = new ApexRestClientProducer();
195         assertNotNull(arcp);
196
197         EventHandlerParameters producerParameters = new EventHandlerParameters();
198         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
199         producerParameters.setCarrierTechnologyParameters(rcctp);
200
201         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
202         arcp.init("RestClientConsumer", producerParameters);
203         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
204         assertEquals("RestClientConsumer", arcp.getName());
205
206         rcctp.setUrl("http://some.place.{key}.does.not/{tag}");
207         Properties properties = new Properties();
208         properties.put("tag", "exist");
209         properties.put("key", "that");
210         Mockito.doReturn(Response.Status.ACCEPTED.getStatusCode()).when(responseMock).getStatus();
211         Mockito.doReturn(responseMock).when(builderMock).put(Mockito.any());
212         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
213         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
214         Mockito.doReturn(targetMock).when(httpClientMock).target("http://some.place.that.does.not/exist");
215         arcp.setClient(httpClientMock);
216
217         arcp.sendEvent(123, properties, "EventName", "This is an ACCEPTED Event");
218         arcp.stop();
219     }
220
221     @Test
222     public void testApexRestClientProducerPostEventCache() throws ApexEventException {
223         ApexRestClientProducer arcp = new ApexRestClientProducer();
224         assertNotNull(arcp);
225
226         EventHandlerParameters producerParameters = new EventHandlerParameters();
227         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
228         producerParameters.setCarrierTechnologyParameters(rcctp);
229
230         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
231
232         ApexEventConsumer consumer = new ApexFileEventConsumer();
233         SynchronousEventCache cache =
234                 new SynchronousEventCache(EventHandlerPeeredMode.SYNCHRONOUS, consumer, arcp, 1000);
235         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, cache);
236         assertEquals(cache, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
237         arcp.init("RestClientConsumer", producerParameters);
238         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
239         assertEquals("RestClientConsumer", arcp.getName());
240
241         rcctp.setUrl("http://some.place.that.does.not/exist");
242         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
243         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
244         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
245         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
246         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
247         arcp.setClient(httpClientMock);
248
249         arcp.sendEvent(123, null, "EventName", "This is an Event");
250         arcp.stop();
251     }
252
253     @Test
254     public void testApexRestClientProducerPostEventCacheTrace() throws ApexEventException {
255         ApexRestClientProducer arcp = new ApexRestClientProducer();
256         assertNotNull(arcp);
257
258         EventHandlerParameters producerParameters = new EventHandlerParameters();
259         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
260         producerParameters.setCarrierTechnologyParameters(rcctp);
261
262         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
263
264         ApexEventConsumer consumer = new ApexFileEventConsumer();
265         SynchronousEventCache cache =
266                 new SynchronousEventCache(EventHandlerPeeredMode.SYNCHRONOUS, consumer, arcp, 1000);
267         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, cache);
268         assertEquals(cache, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
269         arcp.init("RestClientConsumer", producerParameters);
270         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
271         assertEquals("RestClientConsumer", arcp.getName());
272
273         rcctp.setUrl("http://some.place.that.does.not/exist");
274         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
275         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
276         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
277         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
278         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
279         arcp.setClient(httpClientMock);
280
281         arcp.sendEvent(123, null, "EventName", "This is an Event");
282         arcp.stop();
283     }
284
285     @Test
286     public void testApexRestClientProducerHttpError() throws ApexEventException {
287         ApexRestClientProducer arcp = new ApexRestClientProducer();
288         assertNotNull(arcp);
289
290         EventHandlerParameters producerParameters = new EventHandlerParameters();
291         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
292         producerParameters.setCarrierTechnologyParameters(rcctp);
293
294         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
295         arcp.init("RestClientConsumer", producerParameters);
296         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
297         assertEquals("RestClientConsumer", arcp.getName());
298
299         rcctp.setUrl("http://some.place.that.does.not/exist");
300         Mockito.doReturn(Response.Status.BAD_REQUEST.getStatusCode()).when(responseMock).getStatus();
301         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
302         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
303         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
304         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
305         arcp.setClient(httpClientMock);
306
307         assertThatThrownBy(() -> arcp.sendEvent(123, null, "EventName", "This is an Event"))
308             .hasMessageContaining("send of event to URL \"http://some.place.that.does.not/exist\" using HTTP \"POST\" "
309                 + "failed with status code 400");
310     }
311 }