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;
33 import javax.ws.rs.client.Client;
34 import javax.ws.rs.client.Invocation.Builder;
35 import javax.ws.rs.client.WebTarget;
36 import javax.ws.rs.core.Response;
37 import org.junit.After;
38 import org.junit.Test;
39 import org.mockito.Mock;
40 import org.mockito.Mockito;
41 import org.mockito.MockitoAnnotations;
42 import org.onap.policy.apex.service.engine.event.ApexEventException;
43 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerParameters;
44 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerPeeredMode;
47 * This class tests the ApexRestClientConusmer class.
50 public class ApexRestClientConusmerTest {
51 private final PrintStream stdout = System.out;
54 private Client httpClientMock;
57 private WebTarget targetMock;
60 private Builder builderMock;
63 private Response responseMock;
67 System.setOut(stdout);
71 public void testApexRestClientConsumerErrors() throws ApexEventException {
72 MockitoAnnotations.initMocks(this);
74 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
77 EventHandlerParameters consumerParameters = new EventHandlerParameters();
78 SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
80 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
81 fail("test should throw an exception here");
82 } catch (ApexEventException e) {
84 "specified consumer properties are not applicable to REST client consumer (RestClientConsumer)",
88 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
89 consumerParameters.setCarrierTechnologyParameters(rcctp);
90 rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.DELETE);
92 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
93 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
94 fail("test should throw an exception here");
95 } catch (ApexEventException e) {
96 assertEquals("specified HTTP method of \"DELETE\" is invalid, only HTTP method \"GET\" is supported "
97 + "for event reception on REST client consumer (RestClientConsumer)", e.getMessage());
100 rcctp.setHttpMethod(null);
101 rcctp.setHttpCodeFilter("zzz");
103 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
104 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
106 assertEquals("RestClientConsumer", arcc.getName());
108 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
109 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
111 rcctp.setUrl("http://some.place.that.does.not/exist");
112 Mockito.doReturn(Response.Status.BAD_REQUEST.getStatusCode()).when(responseMock).getStatus();
113 Mockito.doReturn(responseMock).when(builderMock).get();
114 Mockito.doReturn(builderMock).when(targetMock).request("application/json");
115 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
116 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
117 arcc.setClient(httpClientMock);
119 // We have not set the URL, this test should not receive any events
121 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
123 assertEquals(0, incomingEventReceiver.getEventCount());
125 Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
127 // We have not set the URL, this test should not receive any events
129 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
131 assertEquals(0, incomingEventReceiver.getEventCount());
135 public void testApexRestClientConsumerHttpError() throws ApexEventException {
136 MockitoAnnotations.initMocks(this);
138 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
141 EventHandlerParameters consumerParameters = new EventHandlerParameters();
142 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
143 consumerParameters.setCarrierTechnologyParameters(rcctp);
144 rcctp.setUrl("http://some.place.that.does.not/exist");
145 rcctp.setHttpCodeFilter("[1-5][0][0-5]");
146 SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
148 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
149 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
151 assertEquals("[1-5][0][0-5]", rcctp.getHttpCodeFilter());
153 assertEquals("RestClientConsumer", arcc.getName());
155 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
156 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
158 Mockito.doReturn(Response.Status.BAD_REQUEST.getStatusCode()).when(responseMock).getStatus();
159 Mockito.doReturn(responseMock).when(builderMock).get();
160 Mockito.doReturn(builderMock).when(targetMock).request("application/json");
161 Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
162 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
163 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
164 arcc.setClient(httpClientMock);
166 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
167 System.setOut(new PrintStream(outContent));
169 // We have not set the URL, this test should not receive any events
171 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
173 assertEquals(0, incomingEventReceiver.getEventCount());
177 public void testApexRestClientConsumerJsonError() {
178 MockitoAnnotations.initMocks(this);
180 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
183 EventHandlerParameters consumerParameters = new EventHandlerParameters();
184 SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
185 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
186 consumerParameters.setCarrierTechnologyParameters(rcctp);
187 rcctp.setHttpCodeFilter("[1-5][0][0-5]");
190 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
191 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
193 assertEquals("RestClientConsumer", arcc.getName());
195 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
197 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
198 } catch (ApexEventException e) {
199 fail("test should not throw an exception");
202 rcctp.setUrl("http://some.place.that.does.not/exist");
203 Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
204 Mockito.doReturn(responseMock).when(builderMock).get();
205 Mockito.doReturn(builderMock).when(targetMock).request("application/json");
206 Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
207 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
208 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
209 arcc.setClient(httpClientMock);
211 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
212 System.setOut(new PrintStream(outContent));
214 // We have not set the URL, this test should not receive any events
216 await().atMost(400, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
217 .contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
219 assertEquals(0, incomingEventReceiver.getEventCount());
223 public void testApexRestClientConsumerJsonEmpty() throws ApexEventException {
224 MockitoAnnotations.initMocks(this);
226 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
229 EventHandlerParameters consumerParameters = new EventHandlerParameters();
230 SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
231 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
232 consumerParameters.setCarrierTechnologyParameters(rcctp);
233 rcctp.setHttpCodeFilter("[1-5][0][0-5]");
235 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
236 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
238 assertEquals("RestClientConsumer", arcc.getName());
240 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
242 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
244 rcctp.setUrl("http://some.place.that.does.not/exist");
245 Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
246 Mockito.doReturn("").when(responseMock).readEntity(String.class);
247 Mockito.doReturn(responseMock).when(builderMock).get();
248 Mockito.doReturn(builderMock).when(targetMock).request("application/json");
249 Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
250 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
251 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
252 arcc.setClient(httpClientMock);
254 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
255 System.setOut(new PrintStream(outContent));
257 // We have not set the URL, this test should not receive any events
259 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
260 .contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
263 assertEquals(0, incomingEventReceiver.getEventCount());
265 final String outString = outContent.toString();
267 assertTrue(outString.contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
271 public void testApexRestClientConsumerJsonOk() throws ApexEventException {
272 MockitoAnnotations.initMocks(this);
274 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
277 EventHandlerParameters consumerParameters = new EventHandlerParameters();
278 SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
279 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
280 consumerParameters.setCarrierTechnologyParameters(rcctp);
281 rcctp.setHttpCodeFilter("[1-5][0][0-5]");
283 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
284 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
286 assertEquals("RestClientConsumer", arcc.getName());
288 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
290 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
292 rcctp.setUrl("http://some.place.that.does.not/exist");
293 Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
294 Mockito.doReturn("This is an event").when(responseMock).readEntity(String.class);
295 Mockito.doReturn(responseMock).when(builderMock).get();
296 Mockito.doReturn(builderMock).when(targetMock).request("application/json");
297 Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
298 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
299 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
300 arcc.setClient(httpClientMock);
302 // We have not set the URL, this test should not receive any events
304 await().atMost(400, TimeUnit.MILLISECONDS)
305 .until(() -> incomingEventReceiver.getLastEvent().equals("This is an event"));
310 public void testApexRestClientConsumerInvalidStatusCode() throws ApexEventException {
311 MockitoAnnotations.initMocks(this);
313 ApexRestClientConsumer arcc = new ApexRestClientConsumer();
316 EventHandlerParameters consumerParameters = new EventHandlerParameters();
317 SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
318 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
319 consumerParameters.setCarrierTechnologyParameters(rcctp);
320 rcctp.setHttpCodeFilter("zzz");
322 arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
323 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
325 assertEquals("RestClientConsumer", arcc.getName());
327 arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
329 assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
331 rcctp.setUrl("http://some.place.that.does.not/exist");
332 Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
333 Mockito.doReturn("This is an event").when(responseMock).readEntity(String.class);
334 Mockito.doReturn(responseMock).when(builderMock).get();
335 Mockito.doReturn(builderMock).when(targetMock).request("application/json");
336 Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
337 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
338 Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getHttpCodeFilter());
339 arcc.setClient(httpClientMock);
341 ByteArrayOutputStream outContent = new ByteArrayOutputStream();
342 System.setOut(new PrintStream(outContent));
345 // We have not set the URL, this test should not receive any events
347 await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
349 } catch (Exception e) {
350 // test invalid status code
351 assertEquals("received an invalid status code \"200\"", e.getMessage());