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