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