ac35081f29987b3fac0db1d6d04b3e9e57ebc170
[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.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertNotNull;
28
29 import java.util.Properties;
30 import javax.ws.rs.client.Client;
31 import javax.ws.rs.client.Invocation.Builder;
32 import javax.ws.rs.client.WebTarget;
33 import javax.ws.rs.core.Response;
34 import org.junit.Test;
35 import org.junit.runner.RunWith;
36 import org.mockito.Mock;
37 import org.mockito.Mockito;
38 import org.mockito.MockitoAnnotations;
39 import org.mockito.runners.MockitoJUnitRunner;
40 import org.onap.policy.apex.service.engine.event.ApexEventConsumer;
41 import org.onap.policy.apex.service.engine.event.ApexEventException;
42 import org.onap.policy.apex.service.engine.event.SynchronousEventCache;
43 import org.onap.policy.apex.service.engine.event.impl.filecarrierplugin.consumer.ApexFileEventConsumer;
44 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerParameters;
45 import org.onap.policy.apex.service.parameters.eventhandler.EventHandlerPeeredMode;
46
47 /**
48  * Test the ApexRestClientProducer class.
49  *
50  */
51 @RunWith(MockitoJUnitRunner.class)
52 public class ApexRestClientProducerTest {
53     @Mock
54     private Client httpClientMock;
55
56     @Mock
57     private WebTarget targetMock;
58
59     @Mock
60     private Builder builderMock;
61
62     @Mock
63     private Response responseMock;
64
65     @Test
66     public void testApexRestClientProducerErrors() throws ApexEventException {
67         ApexRestClientProducer arcp = new ApexRestClientProducer();
68         assertNotNull(arcp);
69
70         EventHandlerParameters producerParameters = new EventHandlerParameters();
71         assertThatThrownBy(() -> arcp.init("RestClientProducer", producerParameters))
72             .hasMessage("specified producer properties are not applicable to REST client producer"
73                 + " (RestClientProducer)");
74
75         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
76         producerParameters.setCarrierTechnologyParameters(rcctp);
77         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.DELETE);
78         assertThatThrownBy(() -> arcp.init("RestClientConsumer", producerParameters))
79             .hasMessage("specified HTTP method of \"DELETE\" is invalid, only HTTP methods \"POST\""
80                 + " and \"PUT\" are supported for event sending on REST client producer (RestClientConsumer)");
81
82         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.DELETE, rcctp.getHttpMethod());
83         rcctp.setHttpMethod(null);
84         arcp.init("RestClientConsumer", producerParameters);
85         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
86         assertEquals("RestClientConsumer", arcp.getName());
87         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
88         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
89         arcp.stop();
90
91         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
92         arcp.init("RestClientConsumer", producerParameters);
93         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
94         assertEquals("RestClientConsumer", arcp.getName());
95         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
96         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
97         arcp.stop();
98
99         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
100         arcp.init("RestClientConsumer", producerParameters);
101         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
102         assertEquals("RestClientConsumer", arcp.getName());
103         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, null);
104         assertEquals(null, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
105         arcp.stop();
106     }
107
108     @Test
109     public void testApexRestClientProducerPutEvent() throws ApexEventException {
110         MockitoAnnotations.initMocks(this);
111
112         ApexRestClientProducer arcp = new ApexRestClientProducer();
113         assertNotNull(arcp);
114
115         EventHandlerParameters producerParameters = new EventHandlerParameters();
116         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
117         producerParameters.setCarrierTechnologyParameters(rcctp);
118
119         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
120         arcp.init("RestClientConsumer", producerParameters);
121         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
122         assertEquals("RestClientConsumer", arcp.getName());
123
124         rcctp.setUrl("http://some.place.that.does.not/exist");
125         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
126         Mockito.doReturn(responseMock).when(builderMock).put(Mockito.any());
127         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
128         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
129         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
130         arcp.setClient(httpClientMock);
131
132         arcp.sendEvent(123, null, "EventName", "This is an Event");
133         arcp.stop();
134     }
135
136     @Test
137     public void testApexRestClientProducerPostEventFail() throws ApexEventException {
138         MockitoAnnotations.initMocks(this);
139
140         ApexRestClientProducer arcp = new ApexRestClientProducer();
141         assertNotNull(arcp);
142
143         EventHandlerParameters producerParameters = new EventHandlerParameters();
144         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
145         producerParameters.setCarrierTechnologyParameters(rcctp);
146
147         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
148         arcp.init("RestClientConsumer", producerParameters);
149         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
150         assertEquals("RestClientConsumer", arcp.getName());
151
152         rcctp.setUrl("http://some.place.that.does.not/exist");
153         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
154         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
155         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
156         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
157         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
158         arcp.setClient(httpClientMock);
159
160         // test property not found
161         rcctp.setUrl("http://some.place2.that.{key}.not/{tag}and.again.{tag}");
162         Properties properties = new Properties();
163         properties.put("tag", "exist");
164         assertThatThrownBy(() -> {
165             arcp.sendEvent(123, properties, "EventName", "This is an Event");
166             arcp.stop();
167         }).hasMessageContaining("key \"key\" specified on url "
168                 + "\"http://some.place2.that.{key}.not/{tag}and.again.{tag}\" not found "
169                 + "in execution properties passed by the current policy");
170     }
171
172     @Test
173     public void testApexRestClientProducerPostEventOK() throws ApexEventException {
174         MockitoAnnotations.initMocks(this);
175
176         ApexRestClientProducer arcp = new ApexRestClientProducer();
177         assertNotNull(arcp);
178
179         EventHandlerParameters producerParameters = new EventHandlerParameters();
180         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
181         producerParameters.setCarrierTechnologyParameters(rcctp);
182
183         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
184         arcp.init("RestClientConsumer", producerParameters);
185         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
186         assertEquals("RestClientConsumer", arcp.getName());
187
188         System.out.println("fail test");
189         rcctp.setUrl("http://some.place.{key}.does.not/{tag}");
190         Properties properties = new Properties();
191         properties.put("tag", "exist");
192         properties.put("key", "that");
193         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
194         Mockito.doReturn(responseMock).when(builderMock).put(Mockito.any());
195         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
196         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
197         Mockito.doReturn(targetMock).when(httpClientMock).target("http://some.place.that.does.not/exist");
198         arcp.setClient(httpClientMock);
199
200         arcp.sendEvent(123, properties, "EventName", "This is an Event");
201         arcp.stop();
202     }
203
204     @Test
205     public void testApexRestClientProducerPostEventCache() throws ApexEventException {
206         MockitoAnnotations.initMocks(this);
207
208         ApexRestClientProducer arcp = new ApexRestClientProducer();
209         assertNotNull(arcp);
210
211         EventHandlerParameters producerParameters = new EventHandlerParameters();
212         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
213         producerParameters.setCarrierTechnologyParameters(rcctp);
214
215         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
216
217         ApexEventConsumer consumer = new ApexFileEventConsumer();
218         SynchronousEventCache cache =
219                 new SynchronousEventCache(EventHandlerPeeredMode.SYNCHRONOUS, consumer, arcp, 1000);
220         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, cache);
221         assertEquals(cache, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
222         arcp.init("RestClientConsumer", producerParameters);
223         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
224         assertEquals("RestClientConsumer", arcp.getName());
225
226         rcctp.setUrl("http://some.place.that.does.not/exist");
227         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
228         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
229         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
230         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
231         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
232         arcp.setClient(httpClientMock);
233
234         arcp.sendEvent(123, null, "EventName", "This is an Event");
235         arcp.stop();
236     }
237
238     @Test
239     public void testApexRestClientProducerPostEventCacheTrace() throws ApexEventException {
240         MockitoAnnotations.initMocks(this);
241
242         ApexRestClientProducer arcp = new ApexRestClientProducer();
243         assertNotNull(arcp);
244
245         EventHandlerParameters producerParameters = new EventHandlerParameters();
246         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
247         producerParameters.setCarrierTechnologyParameters(rcctp);
248
249         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
250
251         ApexEventConsumer consumer = new ApexFileEventConsumer();
252         SynchronousEventCache cache =
253                 new SynchronousEventCache(EventHandlerPeeredMode.SYNCHRONOUS, consumer, arcp, 1000);
254         arcp.setPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS, cache);
255         assertEquals(cache, arcp.getPeeredReference(EventHandlerPeeredMode.SYNCHRONOUS));
256         arcp.init("RestClientConsumer", producerParameters);
257         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
258         assertEquals("RestClientConsumer", arcp.getName());
259
260         rcctp.setUrl("http://some.place.that.does.not/exist");
261         Mockito.doReturn(Response.Status.OK.getStatusCode()).when(responseMock).getStatus();
262         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
263         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
264         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
265         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
266         arcp.setClient(httpClientMock);
267
268         arcp.sendEvent(123, null, "EventName", "This is an Event");
269         arcp.stop();
270     }
271
272     @Test
273     public void testApexRestClientProducerHttpError() throws ApexEventException {
274         MockitoAnnotations.initMocks(this);
275
276         ApexRestClientProducer arcp = new ApexRestClientProducer();
277         assertNotNull(arcp);
278
279         EventHandlerParameters producerParameters = new EventHandlerParameters();
280         RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
281         producerParameters.setCarrierTechnologyParameters(rcctp);
282
283         rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
284         arcp.init("RestClientConsumer", producerParameters);
285         assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
286         assertEquals("RestClientConsumer", arcp.getName());
287
288         rcctp.setUrl("http://some.place.that.does.not/exist");
289         Mockito.doReturn(Response.Status.BAD_REQUEST.getStatusCode()).when(responseMock).getStatus();
290         Mockito.doReturn(responseMock).when(builderMock).post(Mockito.any());
291         Mockito.doReturn(builderMock).when(targetMock).request("application/json");
292         Mockito.doReturn(builderMock).when(builderMock).headers(Mockito.any());
293         Mockito.doReturn(targetMock).when(httpClientMock).target(rcctp.getUrl());
294         arcp.setClient(httpClientMock);
295
296         assertThatThrownBy(() -> arcp.sendEvent(123, null, "EventName", "This is an Event"))
297             .hasMessageContaining("send of event to URL \"http://some.place.that.does.not/exist\" using HTTP \"POST\" "
298                 + "failed with status code 400");
299     }
300 }