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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.apex.plugins.event.carrier.restclient;
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;
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;
51 * Test the ApexRestClientProducer class.
54 @ExtendWith(MockitoExtension.class)
55 class ApexRestClientProducerTest {
57 private Client httpClientMock;
60 private WebTarget targetMock;
63 private Builder builderMock;
66 private Response responseMock;
68 AutoCloseable closeable;
71 void testApexRestClientProducerErrors() throws ApexEventException {
72 ApexRestClientProducer arcp = new ApexRestClientProducer();
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)");
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)");
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));
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));
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));
114 void testApexRestClientProducerPutEvent() throws ApexEventException {
115 ApexRestClientProducer arcp = new ApexRestClientProducer();
118 EventHandlerParameters producerParameters = new EventHandlerParameters();
119 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
120 producerParameters.setCarrierTechnologyParameters(rcctp);
122 rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
123 arcp.init("RestClientConsumer", producerParameters);
124 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
125 assertEquals("RestClientConsumer", arcp.getName());
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);
135 arcp.sendEvent(123, null, "EventName", "This is an Event");
140 void testApexRestClientProducerPostEventFail() throws ApexEventException {
141 ApexRestClientProducer arcp = new ApexRestClientProducer();
144 EventHandlerParameters producerParameters = new EventHandlerParameters();
145 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
146 producerParameters.setCarrierTechnologyParameters(rcctp);
148 rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
149 arcp.init("RestClientConsumer", producerParameters);
150 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
151 assertEquals("RestClientConsumer", arcp.getName());
153 rcctp.setUrl("http://some.place.that.does.not/exist");
154 arcp.setClient(httpClientMock);
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");
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");
169 void testApexRestClientProducerPostEventOK() throws ApexEventException {
170 ApexRestClientProducer arcp = new ApexRestClientProducer();
173 EventHandlerParameters producerParameters = new EventHandlerParameters();
174 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
175 producerParameters.setCarrierTechnologyParameters(rcctp);
177 rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
178 arcp.init("RestClientConsumer", producerParameters);
179 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
180 assertEquals("RestClientConsumer", arcp.getName());
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);
194 arcp.sendEvent(123, properties, "EventName", "This is an Event");
199 void testApexRestClientProducerPostEventAccepted() throws ApexEventException {
200 ApexRestClientProducer arcp = new ApexRestClientProducer();
203 EventHandlerParameters producerParameters = new EventHandlerParameters();
204 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
205 producerParameters.setCarrierTechnologyParameters(rcctp);
207 rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.PUT);
208 arcp.init("RestClientConsumer", producerParameters);
209 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.PUT, rcctp.getHttpMethod());
210 assertEquals("RestClientConsumer", arcp.getName());
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);
223 arcp.sendEvent(123, properties, "EventName", "This is an ACCEPTED Event");
228 void testApexRestClientProducerPostEventCache() throws ApexEventException {
229 ApexRestClientProducer arcp = new ApexRestClientProducer();
232 EventHandlerParameters producerParameters = new EventHandlerParameters();
233 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
234 producerParameters.setCarrierTechnologyParameters(rcctp);
236 rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
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());
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);
255 arcp.sendEvent(123, null, "EventName", "This is an Event");
260 void testApexRestClientProducerHttpError() throws ApexEventException {
261 ApexRestClientProducer arcp = new ApexRestClientProducer();
264 EventHandlerParameters producerParameters = new EventHandlerParameters();
265 RestClientCarrierTechnologyParameters rcctp = new RestClientCarrierTechnologyParameters();
266 producerParameters.setCarrierTechnologyParameters(rcctp);
268 rcctp.setHttpMethod(RestClientCarrierTechnologyParameters.HttpMethod.POST);
269 arcp.init("RestClientConsumer", producerParameters);
270 assertEquals(RestClientCarrierTechnologyParameters.HttpMethod.POST, rcctp.getHttpMethod());
271 assertEquals("RestClientConsumer", arcp.getName());
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);
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");
287 void after() throws Exception {
288 if (closeable != null) {