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