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