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