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