2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2023 Nordix Foundation.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.controlloop.actor.appc;
24 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.assertSame;
29 import java.util.Arrays;
30 import java.util.Collections;
32 import java.util.TreeMap;
33 import org.junit.After;
34 import org.junit.AfterClass;
35 import org.junit.Before;
36 import org.junit.BeforeClass;
37 import org.junit.Test;
38 import org.junit.runner.RunWith;
39 import org.mockito.junit.MockitoJUnitRunner;
40 import org.onap.policy.appc.CommonHeader;
41 import org.onap.policy.appc.Request;
42 import org.onap.policy.appc.ResponseCode;
43 import org.onap.policy.appc.ResponseStatus;
44 import org.onap.policy.controlloop.actorserviceprovider.OperationResult;
45 import org.onap.policy.controlloop.actorserviceprovider.impl.BidirectionalTopicOperation.Status;
46 import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig;
47 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
49 @RunWith(MockitoJUnitRunner.class)
50 public class AppcOperationTest extends BasicAppcOperation {
51 private AppcOperation oper;
54 public static void setUpBeforeClass() throws Exception {
55 // use same topic name for both sides
56 initBeforeClass(MY_SINK, MY_SINK);
60 public static void tearDownAfterClass() {
69 public void setUp() throws Exception {
72 oper = new MyOper(params, config);
77 public void tearDown() {
82 public void testConstructor() {
83 assertEquals(DEFAULT_ACTOR, oper.getActorName());
84 assertEquals(DEFAULT_OPERATION, oper.getName());
88 public void testMakeRequest() {
89 oper.generateSubRequestId(2);
90 String subreq = oper.getSubRequestId();
91 assertNotNull(subreq);
93 Request request = oper.makeRequest(2, genvnf);
94 assertEquals(DEFAULT_OPERATION, request.getAction());
96 assertNotNull(request.getPayload());
98 CommonHeader header = request.getCommonHeader();
99 assertNotNull(header);
100 assertEquals(params.getRequestId(), header.getRequestId());
102 assertEquals(subreq, header.getSubRequestId());
104 request = oper.makeRequest(2, genvnf);
105 assertEquals(subreq, request.getCommonHeader().getSubRequestId());
107 // repeat using a null payload
108 params = params.toBuilder().payload(null).build();
109 oper = new MyOper(params, config);
110 assertEquals(Map.of(AppcOperation.VNF_ID_KEY, MY_VNF), oper.makeRequest(2, genvnf).getPayload());
114 public void testConvertPayload() {
115 Request request = oper.makeRequest(2, genvnf);
119 Map.of(AppcOperation.VNF_ID_KEY, MY_VNF,
120 KEY1, Map.of("input", "hello"),
121 KEY2, Map.of("output", "world")),
122 request.getPayload());
127 * insert invalid json text into the payload.
129 Map<String, Object> payload = new TreeMap<>(params.getPayload());
130 payload.put("invalid-key", "{invalid json");
132 params = params.toBuilder().payload(payload).build();
134 oper = new MyOper(params, config);
135 request = oper.makeRequest(2, genvnf);
139 Map.of(AppcOperation.VNF_ID_KEY, MY_VNF,
140 KEY1, Map.of("input", "hello"),
141 KEY2, Map.of("output", "world")),
142 request.getPayload());
147 * insert null item into the payload.
149 payload = new TreeMap<>();
150 payload.put(KEY1, "abc");
151 payload.put(KEY2, null);
152 payload.put(KEY3, "def");
153 params = params.toBuilder().payload(payload).build();
155 oper = new MyOper(params, config);
156 request = oper.makeRequest(2, genvnf);
158 payload.put(AppcOperation.VNF_ID_KEY, MY_VNF);
159 payload.put(KEY1, "abc");
160 payload.put(KEY2, null);
161 payload.put(KEY3, "def");
163 assertEquals(payload, request.getPayload());
167 public void testGetExpectedKeyValues() {
168 oper.generateSubRequestId(2);
169 Request request = oper.makeRequest(2, genvnf);
170 assertEquals(Arrays.asList(request.getCommonHeader().getSubRequestId()),
171 oper.getExpectedKeyValues(50, request));
175 public void testDetmStatusStringResponse() {
176 final ResponseStatus status = response.getStatus();
178 // null status (i.e., it's a Request, not a Response)
179 response.setStatus(null);
180 assertEquals(Status.STILL_WAITING, oper.detmStatus("", response));
181 response.setStatus(status);
185 assertThatIllegalArgumentException().isThrownBy(() -> oper.detmStatus("", response))
186 .withMessage("unknown APPC-C response status code: -45");
188 status.setCode(ResponseCode.SUCCESS.getValue());
189 assertEquals(Status.SUCCESS, oper.detmStatus("", response));
191 status.setCode(ResponseCode.FAILURE.getValue());
192 assertEquals(Status.FAILURE, oper.detmStatus("", response));
194 status.setCode(ResponseCode.ERROR.getValue());
195 assertThatIllegalArgumentException().isThrownBy(() -> oper.detmStatus("", response))
196 .withMessage("APP-C request was not accepted, code=" + ResponseCode.ERROR.getValue());
198 status.setCode(ResponseCode.REJECT.getValue());
199 assertThatIllegalArgumentException().isThrownBy(() -> oper.detmStatus("", response))
200 .withMessage("APP-C request was not accepted, code=" + ResponseCode.REJECT.getValue());
202 status.setCode(ResponseCode.ACCEPT.getValue());
203 assertEquals(Status.STILL_WAITING, oper.detmStatus("", response));
207 public void testSetOutcome() {
208 final ResponseStatus status = response.getStatus();
211 response.setStatus(null);
212 assertSame(outcome, oper.setOutcome(outcome, OperationResult.SUCCESS, response));
213 assertEquals(OperationResult.SUCCESS, outcome.getResult());
214 assertNotNull(outcome.getMessage());
215 assertSame(response, outcome.getResponse());
216 response.setStatus(status);
219 status.setDescription(null);
220 assertSame(outcome, oper.setOutcome(outcome, OperationResult.FAILURE, response));
221 assertEquals(OperationResult.FAILURE, outcome.getResult());
222 assertNotNull(outcome.getMessage());
223 assertSame(response, outcome.getResponse());
224 status.setDescription(MY_DESCRIPTION);
226 for (OperationResult result : OperationResult.values()) {
227 assertSame(outcome, oper.setOutcome(outcome, result, response));
228 assertEquals(result, outcome.getResult());
229 assertEquals(MY_DESCRIPTION, outcome.getMessage());
230 assertSame(response, outcome.getResponse());
234 private class MyOper extends AppcOperation {
236 public MyOper(ControlLoopOperationParams params, BidirectionalTopicConfig config) {
237 super(params, config, Collections.emptyList());
241 protected Request makeRequest(int attempt) {
242 return makeRequest(attempt, genvnf);