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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.apex.plugins.event.carrier.restclient;
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;
30 import java.io.ByteArrayOutputStream;
31 import java.io.PrintStream;
32 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;
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;
49 * This class tests the ApexRestClientConusmer class.
52 public class ApexRestClientConusmerTest {
53 private final PrintStream stdout = System.out;
56 private Client httpClientMock;
59 private WebTarget targetMock;
62 private Builder builderMock;
65 private Response responseMock;
69 System.setOut(stdout);
73 public void testApexRestClientConsumerErrors() throws ApexEventException {
74 MockitoAnnotations.initMocks(this);
76 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
79 EventHandlerParameters consumerParameters = new EventHandlerParameters();
80 SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
82 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
83 fail("test should throw an exception here");
84 } catch (ApexEventException e) {
86 "specified consumer properties are not applicable to REST client consumer (RestClientConsumer)",
90 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
91 consumerParameters.setCarrierTechnologyParameters(rcctp);
92 rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.DELETE);
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());
102 rcctp.setHttpMethod(null);
103 rcctp.setHttpCodeFilter("zzz");
105 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
106 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
108 assertEquals("RestClientConsumer", arcc.getName());
110 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
111 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
121 // We have not set the URL, this test should not receive any events
123 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
125 assertEquals(0, incomingEventReceiver.getEventCount());
127 Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
129 // We have not set the URL, this test should not receive any events
131 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
133 assertEquals(0, incomingEventReceiver.getEventCount());
137 public void testApexRestClientConsumerHttpError() throws ApexEventException {
138 MockitoAnnotations.initMocks(this);
140 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
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();
150 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
151 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
153 assertEquals("[1-5][0][0-5]", rcctp.getHttpCodeFilter());
155 assertEquals("RestClientConsumer", arcc.getName());
157 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
158 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
168 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
169 System.setOut(new PrintStream(outContent));
171 // We have not set the URL, this test should not receive any events
173 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
175 assertEquals(0, incomingEventReceiver.getEventCount());
179 public void testApexRestClientConsumerJsonError() {
180 MockitoAnnotations.initMocks(this);
182 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
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]");
192 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
193 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
195 assertEquals("RestClientConsumer", arcc.getName());
197 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
199 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
200 } catch (ApexEventException e) {
201 fail("test should not throw an exception");
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);
213 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
214 System.setOut(new PrintStream(outContent));
216 // We have not set the URL, this test should not receive any events
218 await().atMost(400, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
219 .contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
221 assertEquals(0, incomingEventReceiver.getEventCount());
225 public void testApexRestClientConsumerJsonEmpty() throws ApexEventException {
226 MockitoAnnotations.initMocks(this);
228 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
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]");
237 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
238 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
240 assertEquals("RestClientConsumer", arcc.getName());
242 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
244 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
256 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
257 System.setOut(new PrintStream(outContent));
259 // We have not set the URL, this test should not receive any events
261 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
262 .contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
265 assertEquals(0, incomingEventReceiver.getEventCount());
267 final String outString = outContent.toString();
269 assertTrue(outString.contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
273 public void testApexRestClientConsumerJsonOk() throws ApexEventException {
274 MockitoAnnotations.initMocks(this);
276 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
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]");
285 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
286 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
288 assertEquals("RestClientConsumer", arcc.getName());
290 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
292 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
304 // We have not set the URL, this test should not receive any events
306 await().atMost(400, TimeUnit.MILLISECONDS)
307 .until(() -> incomingEventReceiver.getLastEvent().equals("This is an event"));
312 public void testApexRestClientConsumerInvalidStatusCode() throws ApexEventException {
313 MockitoAnnotations.initMocks(this);
315 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
318 EventHandlerParameters consumerParameters = new EventHandlerParameters();
319 SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
320 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
321 consumerParameters.setCarrierTechnologyParameters(rcctp);
322 rcctp.setHttpCodeFilter("zzz");
324 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
325 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
327 assertEquals("RestClientConsumer", arcc.getName());
329 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
331 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
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);
343 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
344 System.setOut(new PrintStream(outContent));
347 // We have not set the URL, this test should not receive any events
349 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
351 } catch (Exception e) {
352 // test invalid status code
353 assertEquals("received an invalid status code \"200\"", e.getMessage());