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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.apex.plugins.event.carrier.restclient;
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;
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;
52 * This class tests the ApexRestClientConsumer class.
54 @ExtendWith(MockitoExtension.class)
55 class ApexRestClientConsumerTest {
56 private final PrintStream stdout = System.out;
59 private Client httpClientMock;
62 private WebTarget targetMock;
65 private Builder builderMock;
68 private Response responseMock;
72 System.setOut(stdout);
76 void testApexRestClientConsumerErrors() throws ApexEventException {
77 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
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)");
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)");
94 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.DELETE, rcctp.getHttpMethod());
95 rcctp.setHttpMethod(null);
96 rcctp.setHttpCodeFilter("zzz");
98 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
99 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
101 assertEquals("RestClientConsumer", arcc.getName());
103 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
104 assertNull(arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
111 // We have not set the URL, this test should not receive any events
113 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
115 assertEquals(0, incomingEventReceiver.getEventCount());
117 // We have not set the URL, this test should not receive any events
119 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
121 assertEquals(0, incomingEventReceiver.getEventCount());
125 void testApexRestClientConsumerHttpError() throws ApexEventException {
126 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
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();
136 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
137 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
139 assertEquals("[1-5][0][0-5]", rcctp.getHttpCodeFilter());
141 assertEquals("RestClientConsumer", arcc.getName());
143 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
144 assertNull(arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
153 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
154 System.setOut(new PrintStream(outContent));
156 // We have not set the URL, this test should not receive any events
158 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
160 assertEquals(0, incomingEventReceiver.getEventCount());
164 void testApexRestClientConsumerJsonError() throws ApexEventException {
165 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
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]");
174 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
175 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
176 assertEquals("RestClientConsumer", arcc.getName());
178 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
180 assertNull(arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
190 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
191 System.setOut(new PrintStream(outContent));
193 // We have not set the URL, this test should not receive any events
195 await().atMost(400, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
196 .contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
198 assertEquals(0, incomingEventReceiver.getEventCount());
202 void testApexRestClientConsumerJsonEmpty() throws ApexEventException {
203 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
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]");
212 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
213 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
215 assertEquals("RestClientConsumer", arcc.getName());
217 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
219 assertNull(arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
230 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
231 System.setOut(new PrintStream(outContent));
233 // We have not set the URL, this test should not receive any events
235 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
236 .contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
239 assertEquals(0, incomingEventReceiver.getEventCount());
241 final String outString = outContent.toString();
243 assertTrue(outString.contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
247 void testApexRestClientConsumerJsonOk() throws ApexEventException {
248 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
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]");
257 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
258 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
260 assertEquals("RestClientConsumer", arcc.getName());
262 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
264 assertNull(arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
275 // We have not set the URL, this test should not receive any events
277 await().atMost(400, TimeUnit.MILLISECONDS)
278 .until(() -> incomingEventReceiver.getLastEvent().equals("This is an event"));
283 void testApexRestClientConsumerInvalidStatusCode() throws ApexEventException {
284 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
287 EventHandlerParameters consumerParameters = new EventHandlerParameters();
288 SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
289 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
290 consumerParameters.setCarrierTechnologyParameters(rcctp);
291 rcctp.setHttpCodeFilter("zzz");
293 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
294 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
296 assertEquals("RestClientConsumer", arcc.getName());
298 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
300 assertNull(arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
311 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
312 System.setOut(new PrintStream(outContent));
315 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);