545499b40d97107aafee6f25644240c65a2b2e37
[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  *  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.Assert.assertEquals;
28 import static org.junit.Assert.assertNotNull;
29 import static org.junit.Assert.assertTrue;
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.junit.runner.RunWith;
41 import org.mockito.Mock;
42 import org.mockito.Mockito;
43 import org.mockito.junit.MockitoJUnitRunner;
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;
47
48 /**
49  * This class tests the ApexRestClientConusmer class.
50  *
51  */
52 @RunWith(MockitoJUnitRunner.class)
53 public class ApexRestClientConusmerTest {
54     private final PrintStream stdout = System.out;
55
56     @Mock
57     private Client httpClientMock;
58
59     @Mock
60     private WebTarget targetMock;
61
62     @Mock
63     private Builder builderMock;
64
65     @Mock
66     private Response responseMock;
67
68     @After
69     public void after() {
70         System.setOut(stdout);
71     }
72
73     @Test
74     public void testApexRestClientConsumerErrors() throws ApexEventException {
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(
82                 "specified consumer properties are not applicable to REST client" + " 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(builderMock).when(targetMock).request("application/json");
106         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
107         arcc.setClient(httpClientMock);
108
109         // We have not set the URL, this test should not receive any events
110         arcc.start();
111         await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
112         arcc.stop();
113         assertEquals(0, incomingEventReceiver.getEventCount());
114
115         // We have not set the URL, this test should not receive any events
116         arcc.start();
117         await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
118         arcc.stop();
119         assertEquals(0, incomingEventReceiver.getEventCount());
120     }
121
122     @Test
123     public void testApexRestClientConsumerHttpError() throws ApexEventException {
124         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
125         assertNotNull(arcc);
126
127         EventHandlerParameters consumerParameters = new EventHandlerParameters();
128         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
129         consumerParameters.setCarrierTechnologyParameters(rcctp);
130         rcctp.setUrl("http://some.place.that.does.not/exist");
131         rcctp.setHttpCodeFilter("[1-5][0][0-5]");
132         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
133
134         arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
135         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
136
137         assertEquals("[1-5][0][0-5]", rcctp.getHttpCodeFilter());
138
139         assertEquals("RestClientConsumer", arcc.getName());
140
141         arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
142         assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
143
144         Mockito.doReturn(Response.Status.BAD_REQUEST.getStatusCode()).when(responseMock).getStatus();
145         Mockito.doReturn(responseMock).when(builderMock).get();
146         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
147         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
148         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
149         arcc.setClient(httpClientMock);
150
151         ByteArrayOutputStream outContent = new ByteArrayOutputStream();
152         System.setOut(new PrintStream(outContent));
153
154         // We have not set the URL, this test should not receive any events
155         arcc.start();
156         await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
157         arcc.stop();
158         assertEquals(0, incomingEventReceiver.getEventCount());
159     }
160
161     @Test
162     public void testApexRestClientConsumerJsonError() throws ApexEventException {
163         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
164         assertNotNull(arcc);
165
166         EventHandlerParameters consumerParameters = new EventHandlerParameters();
167         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
168         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
169         consumerParameters.setCarrierTechnologyParameters(rcctp);
170         rcctp.setHttpCodeFilter("[1-5][0][0-5]");
171
172         arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
173         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
174         assertEquals("RestClientConsumer", arcc.getName());
175
176         arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
177
178         assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
179
180         rcctp.setUrl("http://some.place.that.does.not/exist");
181         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
182         Mockito.doReturn(responseMock).when(builderMock).get();
183         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
184         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
185         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
186         arcc.setClient(httpClientMock);
187
188         ByteArrayOutputStream outContent = new ByteArrayOutputStream();
189         System.setOut(new PrintStream(outContent));
190
191         // We have not set the URL, this test should not receive any events
192         arcc.start();
193         await().atMost(400, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
194             .contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
195         arcc.stop();
196         assertEquals(0, incomingEventReceiver.getEventCount());
197     }
198
199     @Test
200     public void testApexRestClientConsumerJsonEmpty() throws ApexEventException {
201         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
202         assertNotNull(arcc);
203
204         EventHandlerParameters consumerParameters = new EventHandlerParameters();
205         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
206         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
207         consumerParameters.setCarrierTechnologyParameters(rcctp);
208         rcctp.setHttpCodeFilter("[1-5][0][0-5]");
209
210         arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
211         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
212
213         assertEquals("RestClientConsumer", arcc.getName());
214
215         arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
216
217         assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
218
219         rcctp.setUrl("http://some.place.that.does.not/exist");
220         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
221         Mockito.doReturn("").when(responseMock).readEntity(String.class);
222         Mockito.doReturn(responseMock).when(builderMock).get();
223         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
224         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
225         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
226         arcc.setClient(httpClientMock);
227
228         ByteArrayOutputStream outContent = new ByteArrayOutputStream();
229         System.setOut(new PrintStream(outContent));
230
231         // We have not set the URL, this test should not receive any events
232         arcc.start();
233         await().atMost(200, TimeUnit.MILLISECONDS).until(() -> outContent.toString()
234             .contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
235         arcc.stop();
236
237         assertEquals(0, incomingEventReceiver.getEventCount());
238
239         final String outString = outContent.toString();
240
241         assertTrue(outString.contains("received an empty event from URL \"http://some.place.that.does.not/exist\""));
242     }
243
244     @Test
245     public void testApexRestClientConsumerJsonOk() throws ApexEventException {
246         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
247         assertNotNull(arcc);
248
249         EventHandlerParameters consumerParameters = new EventHandlerParameters();
250         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
251         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
252         consumerParameters.setCarrierTechnologyParameters(rcctp);
253         rcctp.setHttpCodeFilter("[1-5][0][0-5]");
254
255         arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
256         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
257
258         assertEquals("RestClientConsumer", arcc.getName());
259
260         arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
261
262         assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
263
264         rcctp.setUrl("http://some.place.that.does.not/exist");
265         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
266         Mockito.doReturn("This is an event").when(responseMock).readEntity(String.class);
267         Mockito.doReturn(responseMock).when(builderMock).get();
268         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
269         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
270         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
271         arcc.setClient(httpClientMock);
272
273         // We have not set the URL, this test should not receive any events
274         arcc.start();
275         await().atMost(400, TimeUnit.MILLISECONDS)
276             .until(() -> incomingEventReceiver.getLastEvent().equals("This is an event"));
277         arcc.stop();
278     }
279
280     @Test
281     public void testApexRestClientConsumerInvalidStatusCode() throws ApexEventException {
282         ApexRestClientConsumer arcc = new ApexRestClientConsumer();
283         assertNotNull(arcc);
284
285         EventHandlerParameters consumerParameters = new EventHandlerParameters();
286         SupportApexEventReceiver incomingEventReceiver = new SupportApexEventReceiver();
287         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
288         consumerParameters.setCarrierTechnologyParameters(rcctp);
289         rcctp.setHttpCodeFilter("zzz");
290
291         arcc.init("RestClientConsumer", consumerParameters, incomingEventReceiver);
292         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.GET, rcctp.getHttpMethod());
293
294         assertEquals("RestClientConsumer", arcc.getName());
295
296         arcc.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
297
298         assertEquals(null, arcc.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
299
300         rcctp.setUrl("http://some.place.that.does.not/exist");
301         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
302         Mockito.doReturn("This is an event").when(responseMock).readEntity(String.class);
303         Mockito.doReturn(responseMock).when(builderMock).get();
304         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
305         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
306         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
307         arcc.setClient(httpClientMock);
308
309         ByteArrayOutputStream outContent = new ByteArrayOutputStream();
310         System.setOut(new PrintStream(outContent));
311
312         arcc.start();
313         await().atMost(200, TimeUnit.MILLISECONDS).until(() -> incomingEventReceiver.getEventCount() == 0);
314         arcc.stop();
315     }
316 }