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