b67a339aa74853ba36df35c2805a73d1779d1c49
[policy/apex-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2019 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 ch.qos.logback.classic.Level;
29
30 import java.util.Properties;
31
32 import javax.ws.rs.client.Client;
33 import javax.ws.rs.client.Invocation.Builder;
34 import javax.ws.rs.client.WebTarget;
35 import javax.ws.rs.core.Response;
36
37 import org.junit.Test;
38 import org.mockito.Mock;
39 import org.mockito.Mockito;
40 import org.mockito.MockitoAnnotations;
41 import org.onap.policy.apex.service.engine.event.ApexEventConsumer;
42 import org.onap.policy.apex.service.engine.event.ApexEventException;
43 import org.onap.policy.apex.service.engine.event.SynchronousEventCache;
44 import org.onap.policy.apex.service.engine.event.impl.filecarrierplugin.consumer.ApexFileEventConsumer;
45 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerParameters;
46 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerPeeredMode;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
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("specified HTTP method of \"DELETE\" is invalid, only HTTP methods \"POST\" and \"PUT\" "
93                 + "are supproted for event sending on REST client producer (RestClientConsumer)", e.getMessage());
94         }
95
96         rcctp.setHttpMethod(null);
97         arcp.init("RestClientConsumer", producerParameters);
98         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
99         assertEquals("RestClientConsumer", arcp.getName());
100         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
101         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
102         arcp.stop();
103
104         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
105         arcp.init("RestClientConsumer", producerParameters);
106         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
107         assertEquals("RestClientConsumer", arcp.getName());
108         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
109         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
110         arcp.stop();
111
112
113         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
114         arcp.init("RestClientConsumer", producerParameters);
115         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
116         assertEquals("RestClientConsumer", arcp.getName());
117         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
118         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
119         arcp.stop();
120     }
121
122     @Test
123     public void testApexRestClientProducerPutEvent() throws ApexEventException {
124         MockitoAnnotations.initMocks(this);
125
126         ApexRestClientProducer arcp = new ApexRestClientProducer();
127         assertNotNull(arcp);
128
129         EventHandlerParameters producerParameters = new EventHandlerParameters();
130         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
131         producerParameters.setCarrierTechnologyParameters(rcctp);
132
133         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
134         arcp.init("RestClientConsumer", producerParameters);
135         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
136         assertEquals("RestClientConsumer", arcp.getName());
137
138         rcctp.setUrl("http://some.place.that.does.not/exist");
139         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
140         Mockito.doReturn(responseMock).when(builderMock).put(Mockito.any());
141         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
142         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
143         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
144         arcp.setClient(httpClientMock);
145
146         arcp.sendEvent(123, null, "EventName", "This is an Event");
147         arcp.stop();
148     }
149
150     @Test
151     public void testApexRestClientProducerPostEventFail() throws ApexEventException {
152         MockitoAnnotations.initMocks(this);
153
154         ApexRestClientProducer arcp = new ApexRestClientProducer();
155         assertNotNull(arcp);
156
157         EventHandlerParameters producerParameters = new EventHandlerParameters();
158         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
159         producerParameters.setCarrierTechnologyParameters(rcctp);
160
161         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
162         arcp.init("RestClientConsumer", producerParameters);
163         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
164         assertEquals("RestClientConsumer", arcp.getName());
165
166         rcctp.setUrl("http://some.place.that.does.not/exist");
167         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
168         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
169         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
170         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
171         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
172         arcp.setClient(httpClientMock);
173
174         //test property not found
175         rcctp.setUrl("http://some.place2.that.{key}.not/{tag}and.again.{tag}");
176         Properties properties = new Properties();
177         properties.put("tag", "exist");
178         try {
179             arcp.sendEvent(123, properties, "EventName", "This is an Event");
180             arcp.stop();
181             fail("test should throw an exception");
182         } catch (Exception e) {
183             assertEquals(
184                     "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",
187                     e.getMessage());
188         }
189     }
190
191     @Test
192     public void testApexRestClientProducerPostEventOK() throws ApexEventException {
193         MockitoAnnotations.initMocks(this);
194
195         ApexRestClientProducer arcp = new ApexRestClientProducer();
196         assertNotNull(arcp);
197
198         EventHandlerParameters producerParameters = new EventHandlerParameters();
199         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
200         producerParameters.setCarrierTechnologyParameters(rcctp);
201
202         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
203         arcp.init("RestClientConsumer", producerParameters);
204         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
205         assertEquals("RestClientConsumer", arcp.getName());
206
207         System.out.println("fail test");
208         rcctp.setUrl("http://some.place.{key}.does.not/{tag}");
209         Properties properties = new Properties();
210         properties.put("tag", "exist");
211         properties.put("key", "that");
212         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
213         Mockito.doReturn(responseMock).when(builderMock).put(Mockito.any());
214         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
215         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
216         Mockito.doReturn(targetMock).when(httpClientMock).target("http://some.place.that.does.not/exist");
217         arcp.setClient(httpClientMock);
218
219         arcp.sendEvent(123, properties, "EventName", "This is an Event");
220         arcp.stop();
221     }
222
223     @Test
224     public void testApexRestClientProducerPostEventCache() throws ApexEventException {
225         MockitoAnnotations.initMocks(this);
226
227         ApexRestClientProducer arcp = new ApexRestClientProducer();
228         assertNotNull(arcp);
229
230         EventHandlerParameters producerParameters = new EventHandlerParameters();
231         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
232         producerParameters.setCarrierTechnologyParameters(rcctp);
233
234         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
235
236         ApexEventConsumer consumer = new ApexFileEventConsumer();
237         SynchronousEventCache cache = new SynchronousEventCache(EventHandlerPeeredMode.SYNCHRONOUS, consumer, arcp,
238             1000);
239         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, cache);
240         assertEquals(cache, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
241         arcp.init("RestClientConsumer", producerParameters);
242         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
243         assertEquals("RestClientConsumer", arcp.getName());
244
245         rcctp.setUrl("http://some.place.that.does.not/exist");
246         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
247         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
248         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
249         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
250         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
251         arcp.setClient(httpClientMock);
252
253         arcp.sendEvent(123, null, "EventName", "This is an Event");
254         arcp.stop();
255     }
256
257     @Test
258     public void testApexRestClientProducerPostEventCacheTrace() throws ApexEventException {
259         MockitoAnnotations.initMocks(this);
260
261         ch.qos.logback.classic.Logger classicLogger = (ch.qos.logback.classic.Logger) LOGGER;
262         classicLogger.setLevel(Level.TRACE);
263
264         ApexRestClientProducer arcp = new ApexRestClientProducer();
265         assertNotNull(arcp);
266
267         EventHandlerParameters producerParameters = new EventHandlerParameters();
268         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
269         producerParameters.setCarrierTechnologyParameters(rcctp);
270
271         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
272
273         ApexEventConsumer consumer = new ApexFileEventConsumer();
274         SynchronousEventCache cache = new SynchronousEventCache(EventHandlerPeeredMode.SYNCHRONOUS, consumer, arcp,
275             1000);
276         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, cache);
277         assertEquals(cache, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
278         arcp.init("RestClientConsumer", producerParameters);
279         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
280         assertEquals("RestClientConsumer", arcp.getName());
281
282         rcctp.setUrl("http://some.place.that.does.not/exist");
283         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
284         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
285         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
286         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
287         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
288         arcp.setClient(httpClientMock);
289
290         arcp.sendEvent(123, null, "EventName", "This is an Event");
291         arcp.stop();
292     }
293
294     @Test
295     public void testApexRestClientProducerHttpError() throws ApexEventException {
296         MockitoAnnotations.initMocks(this);
297
298         ApexRestClientProducer arcp = new ApexRestClientProducer();
299         assertNotNull(arcp);
300
301         EventHandlerParameters producerParameters = new EventHandlerParameters();
302         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
303         producerParameters.setCarrierTechnologyParameters(rcctp);
304
305         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
306         arcp.init("RestClientConsumer", producerParameters);
307         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
308         assertEquals("RestClientConsumer", arcp.getName());
309
310         rcctp.setUrl("http://some.place.that.does.not/exist");
311         Mockito.doReturn(Response.Status.BAD_REQUEST.getStatusCode()).when(responseMock).getStatus();
312         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
313         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
314         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
315         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
316         arcp.setClient(httpClientMock);
317
318         try {
319             arcp.sendEvent(123, null, "EventName", "This is an Event");
320             fail("test should throw an exception here");
321         } catch (Exception e) {
322             assertEquals(
323                 "send of event to URL \"http://some.place.that.does.not/exist\" using HTTP \"POST\" "
324                     + "failed with status code 400 and message \"null\", event:\n" + "This is an Event",
325                 e.getMessage());
326         }
327     }
328 }