ce688d62d285045e54b663e6c98d86066aee3a94
[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  * ================================================================================
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.apex.plugins.event.carrier.restclient;
23
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.fail;
27
28 import java.util.Properties;
29
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
35 import org.junit.Test;
36 import org.mockito.Mock;
37 import org.mockito.Mockito;
38 import org.mockito.MockitoAnnotations;
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 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 import ch.qos.logback.classic.Level;
49
50 /**
51  * Test the ApexRestClientProducer class.
52  *
53  */
54 public class ApexRestClientProducerTest {
55     private static final Logger LOGGER = LoggerFactory.getLogger(ApexRestClientProducer.class);
56
57     @Mock
58     private Client httpClientMock;
59
60     @Mock
61     private WebTarget targetMock;
62
63     @Mock
64     private Builder builderMock;
65
66     @Mock
67     private Response responseMock;
68
69     @Test
70     public void testApexRestClientProducerErrors() throws ApexEventException {
71         ApexRestClientProducer arcp = new ApexRestClientProducer();
72         assertNotNull(arcp);
73
74         EventHandlerParameters producerParameters = new EventHandlerParameters();
75         try {
76             arcp.init("RestClientProducer", producerParameters);
77             fail("test should throw an exception here");
78         } catch (ApexEventException e) {
79             assertEquals(
80                     "specified producer properties are not applicable to REST client producer (RestClientProducer)",
81                     e.getMessage());
82         }
83
84         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
85         producerParameters.setCarrierTechnologyParameters(rcctp);
86         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.DELETE);
87         try {
88             arcp.init("RestClientConsumer", producerParameters);
89             assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
90             fail("test should throw an exception here");
91         } catch (ApexEventException e) {
92             assertEquals(
93                     "specified HTTP method of \"DELETE\" is invalid, only HTTP methods \"POST\" and \"PUT\" "
94                             + "are supported for event sending on REST client producer (RestClientConsumer)",
95                     e.getMessage());
96         }
97
98         rcctp.setHttpMethod(null);
99         arcp.init("RestClientConsumer", producerParameters);
100         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, 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         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
107         arcp.init("RestClientConsumer", producerParameters);
108         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
109         assertEquals("RestClientConsumer", arcp.getName());
110         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
111         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
112         arcp.stop();
113
114         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
115         arcp.init("RestClientConsumer", producerParameters);
116         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
117         assertEquals("RestClientConsumer", arcp.getName());
118         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
119         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
120         arcp.stop();
121     }
122
123     @Test
124     public void testApexRestClientProducerPutEvent() throws ApexEventException {
125         MockitoAnnotations.initMocks(this);
126
127         ApexRestClientProducer arcp = new ApexRestClientProducer();
128         assertNotNull(arcp);
129
130         EventHandlerParameters producerParameters = new EventHandlerParameters();
131         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
132         producerParameters.setCarrierTechnologyParameters(rcctp);
133
134         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
135         arcp.init("RestClientConsumer", producerParameters);
136         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
137         assertEquals("RestClientConsumer", arcp.getName());
138
139         rcctp.setUrl("http://some.place.that.does.not/exist");
140         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
141         Mockito.doReturn(responseMock).when(builderMock).put(Mockito.any());
142         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
143         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
144         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
145         arcp.setClient(httpClientMock);
146
147         arcp.sendEvent(123, null, "EventName", "This is an Event");
148         arcp.stop();
149     }
150
151     @Test
152     public void testApexRestClientProducerPostEventFail() throws ApexEventException {
153         MockitoAnnotations.initMocks(this);
154
155         ApexRestClientProducer arcp = new ApexRestClientProducer();
156         assertNotNull(arcp);
157
158         EventHandlerParameters producerParameters = new EventHandlerParameters();
159         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
160         producerParameters.setCarrierTechnologyParameters(rcctp);
161
162         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
163         arcp.init("RestClientConsumer", producerParameters);
164         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
165         assertEquals("RestClientConsumer", arcp.getName());
166
167         rcctp.setUrl("http://some.place.that.does.not/exist");
168         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
169         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
170         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
171         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
172         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
173         arcp.setClient(httpClientMock);
174
175         // test property not found
176         rcctp.setUrl("http://some.place2.that.{key}.not/{tag}and.again.{tag}");
177         Properties properties = new Properties();
178         properties.put("tag", "exist");
179         try {
180             arcp.sendEvent(123, properties, "EventName", "This is an Event");
181             arcp.stop();
182             fail("test should throw an exception");
183         } catch (Exception e) {
184             assertEquals("key \"key\" specified on url "
185                     + "\"http://some.place2.that.{key}.not/{tag}and.again.{tag}\" not found "
186                     + "in execution properties passed by the current policy", e.getMessage());
187         }
188     }
189
190     @Test
191     public void testApexRestClientProducerPostEventOK() throws ApexEventException {
192         MockitoAnnotations.initMocks(this);
193
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         System.out.println("fail test");
207         rcctp.setUrl("http://some.place.{key}.does.not/{tag}");
208         Properties properties = new Properties();
209         properties.put("tag", "exist");
210         properties.put("key", "that");
211         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
212         Mockito.doReturn(responseMock).when(builderMock).put(Mockito.any());
213         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
214         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
215         Mockito.doReturn(targetMock).when(httpClientMock).target("http://some.place.that.does.not/exist");
216         arcp.setClient(httpClientMock);
217
218         arcp.sendEvent(123, properties, "EventName", "This is an Event");
219         arcp.stop();
220     }
221
222     @Test
223     public void testApexRestClientProducerPostEventCache() throws ApexEventException {
224         MockitoAnnotations.initMocks(this);
225
226         ApexRestClientProducer arcp = new ApexRestClientProducer();
227         assertNotNull(arcp);
228
229         EventHandlerParameters producerParameters = new EventHandlerParameters();
230         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
231         producerParameters.setCarrierTechnologyParameters(rcctp);
232
233         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
234
235         ApexEventConsumer consumer = new ApexFileEventConsumer();
236         SynchronousEventCache cache =
237                 new SynchronousEventCache(EventHandlerPeeredMode.SYNCHRONOUS, consumer, arcp, 1000);
238         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, cache);
239         assertEquals(cache, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
240         arcp.init("RestClientConsumer", producerParameters);
241         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
242         assertEquals("RestClientConsumer", arcp.getName());
243
244         rcctp.setUrl("http://some.place.that.does.not/exist");
245         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
246         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
247         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
248         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
249         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
250         arcp.setClient(httpClientMock);
251
252         arcp.sendEvent(123, null, "EventName", "This is an Event");
253         arcp.stop();
254     }
255
256     @Test
257     public void testApexRestClientProducerPostEventCacheTrace() throws ApexEventException {
258         MockitoAnnotations.initMocks(this);
259
260         ch.qos.logback.classic.Logger classicLogger = (ch.qos.logback.classic.Logger) LOGGER;
261         classicLogger.setLevel(Level.TRACE);
262
263         ApexRestClientProducer arcp = new ApexRestClientProducer();
264         assertNotNull(arcp);
265
266         EventHandlerParameters producerParameters = new EventHandlerParameters();
267         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
268         producerParameters.setCarrierTechnologyParameters(rcctp);
269
270         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
271
272         ApexEventConsumer consumer = new ApexFileEventConsumer();
273         SynchronousEventCache cache =
274                 new SynchronousEventCache(EventHandlerPeeredMode.SYNCHRONOUS, consumer, arcp, 1000);
275         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, cache);
276         assertEquals(cache, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
277         arcp.init("RestClientConsumer", producerParameters);
278         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
279         assertEquals("RestClientConsumer", arcp.getName());
280
281         rcctp.setUrl("http://some.place.that.does.not/exist");
282         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
283         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
284         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
285         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
286         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
287         arcp.setClient(httpClientMock);
288
289         arcp.sendEvent(123, null, "EventName", "This is an Event");
290         arcp.stop();
291     }
292
293     @Test
294     public void testApexRestClientProducerHttpError() throws ApexEventException {
295         MockitoAnnotations.initMocks(this);
296
297         ApexRestClientProducer arcp = new ApexRestClientProducer();
298         assertNotNull(arcp);
299
300         EventHandlerParameters producerParameters = new EventHandlerParameters();
301         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
302         producerParameters.setCarrierTechnologyParameters(rcctp);
303
304         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
305         arcp.init("RestClientConsumer", producerParameters);
306         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
307         assertEquals("RestClientConsumer", arcp.getName());
308
309         rcctp.setUrl("http://some.place.that.does.not/exist");
310         Mockito.doReturn(Response.Status.BAD_REQUEST.getStatusCode()).when(responseMock).getStatus();
311         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
312         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
313         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
314         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
315         arcp.setClient(httpClientMock);
316
317         try {
318             arcp.sendEvent(123, null, "EventName", "This is an Event");
319             fail("test should throw an exception here");
320         } catch (Exception e) {
321             assertEquals(
322                     "send of event to URL \"http://some.place.that.does.not/exist\" using HTTP \"POST\" "
323                             + "failed with status code 400 and message \"null\", event:\n" + "This is an Event",
324                     e.getMessage());
325         }
326     }
327 }