6face9e50a4c9ab7addf363669527deb7c37f403
[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.assertTrue;
27 import static org.junit.Assert.fail;
28
29 import java.io.ByteArrayOutputStream;
30 import java.io.PrintStream;
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.After;
38 import org.junit.Test;
39 import org.mockito.Mock;
40 import org.mockito.Mockito;
41 import org.mockito.MockitoAnnotations;
42 import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
43 import org.onap.policy.apex.service.engine.event.ApexEventException;
44 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerParameters;
45 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerPeeredMode;
46
47 /**
48  * This class tests the ApexRestClientConusmer class.
49  *
50  */
51 public class ApexRestClientConusmerTest {
52     private final PrintStream stdout = System.out;
53
54     @Mock
55     private Client httpClientMock;
56
57     @Mock
58     private WebTarget targetMock;
59
60     @Mock
61     private Builder builderMock;
62
63     @Mock
64     private Response responseMock;
65
66     @After
67     public void after() {
68         System.setOut(stdout);
69     }
70
71     @Test
72     public void testApexRestClientConsumerErrors() throws ApexEventException {
73         MockitoAnnotations.initMocks(this);
74
75         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
76         assertNotNull(arcc);
77
78         EventHandlerParameters consumerParameters = new EventHandlerParameters();
79         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
80         try {
81             arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
82             fail("test should throw an exception here");
83         } catch (ApexEventException e) {
84             assertEquals(
85                 "specified consumer properties are not applicable to REST client consumer (RestClientConsumer)",
86                 e.getMessage());
87         }
88
89         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
90         consumerParameters.setCarrierTechnologyParameters(rcctp);
91         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.DELETE);
92         try {
93             arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
94             assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
95             fail("test should throw an exception here");
96         } catch (ApexEventException e) {
97             assertEquals("specified HTTP method of \"DELETE\" is invalid, only HTTP method \"GET\" is supported "
98                 + "for event reception on REST client consumer (RestClientConsumer)", e.getMessage());
99         }
100
101         rcctp.setHttpMethod(null);
102         rcctp.setHttpCodeFilter("zzz");
103
104         arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
105         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
106
107         assertEquals("RestClientConsumer", arcc.getName());
108
109         arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
110         assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
111
112         rcctp.setUrl("http://some.place.that.does.not/exist");
113         Mockito.doReturn(Response.Status.BAD_REQUEST.getStatusCode()).when(responseMock).getStatus();
114         Mockito.doReturn(responseMock).when(builderMock).get();
115         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
116         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
117         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
118         arcc.setClient(httpClientMock);
119
120         // We have not set the URL, this test should not receive any events
121         arcc.start();
122         ThreadUtilities.sleep(200);
123         arcc.stop();
124         assertEquals(0, incomingEventReceiver.getEventCount());
125
126         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
127
128         // We have not set the URL, this test should not receive any events
129         arcc.start();
130         ThreadUtilities.sleep(200);
131         arcc.stop();
132         assertEquals(0, incomingEventReceiver.getEventCount());
133     }
134
135     @Test
136     public void testApexRestClientConsumerHttpError() throws ApexEventException {
137         MockitoAnnotations.initMocks(this);
138
139         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
140         assertNotNull(arcc);
141
142         EventHandlerParameters consumerParameters = new EventHandlerParameters();
143         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
144         consumerParameters.setCarrierTechnologyParameters(rcctp);
145         rcctp.setUrl("http://some.place.that.does.not/exist");
146         rcctp.setHttpCodeFilter("[1-5][0][0-5]");
147         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
148
149         arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
150         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
151
152         assertEquals("[1-5][0][0-5]", rcctp.getHttpCodeFilter());
153
154         assertEquals("RestClientConsumer", arcc.getName());
155
156         arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
157         assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
158
159         Mockito.doReturn(Response.Status.BAD_REQUEST.getStatusCode()).when(responseMock).getStatus();
160         Mockito.doReturn(responseMock).when(builderMock).get();
161         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
162         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
163         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
164         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
165         arcc.setClient(httpClientMock);
166
167         ByteArrayOutputStream outContent = new ByteArrayOutputStream();
168         System.setOut(new PrintStream(outContent));
169
170         // We have not set the URL, this test should not receive any events
171         arcc.start();
172         ThreadUtilities.sleep(200);
173         arcc.stop();
174         assertEquals(0, incomingEventReceiver.getEventCount());
175     }
176
177     @Test
178     public void testApexRestClientConsumerJsonError() {
179         MockitoAnnotations.initMocks(this);
180
181         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
182         assertNotNull(arcc);
183
184         EventHandlerParameters consumerParameters = new EventHandlerParameters();
185         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
186         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
187         consumerParameters.setCarrierTechnologyParameters(rcctp);
188         rcctp.setHttpCodeFilter("[1-5][0][0-5]");
189
190         try {
191             arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
192             assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
193
194             assertEquals("RestClientConsumer", arcc.getName());
195
196             arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
197
198             assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
199         } catch (ApexEventException e) {
200             fail("test should not throw an exception");
201         }
202
203         rcctp.setUrl("http://some.place.that.does.not/exist");
204         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
205         Mockito.doReturn(responseMock).when(builderMock).get();
206         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
207         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
208         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
209         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
210         arcc.setClient(httpClientMock);
211
212         ByteArrayOutputStream outContent = new ByteArrayOutputStream();
213         System.setOut(new PrintStream(outContent));
214
215         // We have not set the URL, this test should not receive any events
216         arcc.start();
217         ThreadUtilities.sleep(200);
218         arcc.stop();
219
220         assertEquals(0, incomingEventReceiver.getEventCount());
221
222         final String outString = outContent.toString();
223
224         assertTrue(outString.contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
225     }
226
227     @Test
228     public void testApexRestClientConsumerJsonEmpty() throws ApexEventException {
229         MockitoAnnotations.initMocks(this);
230
231         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
232         assertNotNull(arcc);
233
234         EventHandlerParameters consumerParameters = new EventHandlerParameters();
235         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
236         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
237         consumerParameters.setCarrierTechnologyParameters(rcctp);
238         rcctp.setHttpCodeFilter("[1-5][0][0-5]");
239
240         arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
241         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
242
243         assertEquals("RestClientConsumer", arcc.getName());
244
245         arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
246
247         assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
248
249         rcctp.setUrl("http://some.place.that.does.not/exist");
250         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
251         Mockito.doReturn("").when(responseMock).readEntity(String.class);
252         Mockito.doReturn(responseMock).when(builderMock).get();
253         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
254         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
255         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
256         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
257         arcc.setClient(httpClientMock);
258
259         ByteArrayOutputStream outContent = new ByteArrayOutputStream();
260         System.setOut(new PrintStream(outContent));
261
262         // We have not set the URL, this test should not receive any events
263         arcc.start();
264         ThreadUtilities.sleep(200);
265         arcc.stop();
266
267         assertEquals(0, incomingEventReceiver.getEventCount());
268
269         final String outString = outContent.toString();
270
271         assertTrue(outString.contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
272     }
273
274     @Test
275     public void testApexRestClientConsumerJsonOk() throws ApexEventException {
276         MockitoAnnotations.initMocks(this);
277
278         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
279         assertNotNull(arcc);
280
281         EventHandlerParameters consumerParameters = new EventHandlerParameters();
282         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
283         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
284         consumerParameters.setCarrierTechnologyParameters(rcctp);
285         rcctp.setHttpCodeFilter("[1-5][0][0-5]");
286
287         arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
288         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
289
290         assertEquals("RestClientConsumer", arcc.getName());
291
292         arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
293
294         assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
295
296         rcctp.setUrl("http://some.place.that.does.not/exist");
297         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
298         Mockito.doReturn("This is an event").when(responseMock).readEntity(String.class);
299         Mockito.doReturn(responseMock).when(builderMock).get();
300         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
301         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
302         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
303         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
304         arcc.setClient(httpClientMock);
305
306         // We have not set the URL, this test should not receive any events
307         arcc.start();
308         ThreadUtilities.sleep(200);
309         arcc.stop();
310
311         assertEquals("This is an event", incomingEventReceiver.getLastEvent());
312     }
313
314     @Test
315     public void testApexRestClientConsumerInvalidStatusCode() throws ApexEventException {
316         MockitoAnnotations.initMocks(this);
317
318         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
319         assertNotNull(arcc);
320
321         EventHandlerParameters consumerParameters = new EventHandlerParameters();
322         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
323         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
324         consumerParameters.setCarrierTechnologyParameters(rcctp);
325         rcctp.setHttpCodeFilter("zzz");
326
327         arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
328         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
329
330         assertEquals("RestClientConsumer", arcc.getName());
331
332         arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
333
334         assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
335
336         rcctp.setUrl("http://some.place.that.does.not/exist");
337         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
338         Mockito.doReturn("This is an event").when(responseMock).readEntity(String.class);
339         Mockito.doReturn(responseMock).when(builderMock).get();
340         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
341         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
342         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
343         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
344         arcc.setClient(httpClientMock);
345
346         ByteArrayOutputStream outContent = new ByteArrayOutputStream();
347         System.setOut(new PrintStream(outContent));
348
349         try {
350             // We have not set the URL, this test should not receive any events
351             arcc.start();
352             ThreadUtilities.sleep(200);
353             arcc.stop();
354         } catch (Exception e) {
355             // test invalid status code
356             assertEquals("received an invalid status code \"200\"", e.getMessage());
357         }
358     }
359 }