d40fa025deabdbf5218f203edb7e3090af7e605c
[policy/models.git] / models-interactions / model-actors / actor.appc / src / test / java / org / onap / policy / controlloop / actor / appc / AppcOperationTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
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
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  */
21
22 package org.onap.policy.controlloop.actor.appc;
23
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;
28
29 import java.util.Arrays;
30 import java.util.Collections;
31 import java.util.Map;
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;
48
49 @RunWith(MockitoJUnitRunner.class)
50 public class AppcOperationTest extends BasicAppcOperation {
51     private AppcOperation oper;
52
53     @BeforeClass
54     public static void setUpBeforeClass() throws Exception {
55         // use same topic name for both sides
56         initBeforeClass(MY_SINK, MY_SINK);
57     }
58
59     @AfterClass
60     public static void tearDownAfterClass() {
61         destroyAfterClass();
62     }
63
64     /**
65      * Sets up.
66      */
67     @Before
68     @Override
69     public void setUp() throws Exception {
70         super.setUp();
71
72         oper = new MyOper(params, config);
73     }
74
75     @After
76     @Override
77     public void tearDown() {
78         super.tearDown();
79     }
80
81     @Test
82     public void testConstructor() {
83         assertEquals(DEFAULT_ACTOR, oper.getActorName());
84         assertEquals(DEFAULT_OPERATION, oper.getName());
85     }
86
87     @Test
88     public void testMakeRequest() {
89         oper.generateSubRequestId(2);
90         String subreq = oper.getSubRequestId();
91         assertNotNull(subreq);
92
93         Request request = oper.makeRequest(2, genvnf);
94         assertEquals(DEFAULT_OPERATION, request.getAction());
95
96         assertNotNull(request.getPayload());
97
98         CommonHeader header = request.getCommonHeader();
99         assertNotNull(header);
100         assertEquals(params.getRequestId(), header.getRequestId());
101
102         assertEquals(subreq, header.getSubRequestId());
103
104         request = oper.makeRequest(2, genvnf);
105         assertEquals(subreq, request.getCommonHeader().getSubRequestId());
106
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());
111     }
112
113     @Test
114     public void testConvertPayload() {
115         Request request = oper.makeRequest(2, genvnf);
116
117         // @formatter:off
118         assertEquals(
119             Map.of(AppcOperation.VNF_ID_KEY, MY_VNF,
120                     KEY1, Map.of("input", "hello"),
121                     KEY2, Map.of("output", "world")),
122             request.getPayload());
123         // @formatter:on
124
125
126         /*
127          * insert invalid json text into the payload.
128          */
129         Map<String, Object> payload = new TreeMap<>(params.getPayload());
130         payload.put("invalid-key", "{invalid json");
131
132         params = params.toBuilder().payload(payload).build();
133
134         oper = new MyOper(params, config);
135         request = oper.makeRequest(2, genvnf);
136
137         // @formatter:off
138         assertEquals(
139             Map.of(AppcOperation.VNF_ID_KEY, MY_VNF,
140                     KEY1, Map.of("input", "hello"),
141                     KEY2, Map.of("output", "world")),
142             request.getPayload());
143         // @formatter:on
144
145
146         /*
147          * insert null item into the payload.
148          */
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();
154
155         oper = new MyOper(params, config);
156         request = oper.makeRequest(2, genvnf);
157
158         payload.put(AppcOperation.VNF_ID_KEY, MY_VNF);
159         payload.put(KEY1, "abc");
160         payload.put(KEY2, null);
161         payload.put(KEY3, "def");
162
163         assertEquals(payload, request.getPayload());
164     }
165
166     @Test
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));
172     }
173
174     @Test
175     public void testDetmStatusStringResponse() {
176         final ResponseStatus status = response.getStatus();
177
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);
182
183         // invalid code
184         status.setCode(-45);
185         assertThatIllegalArgumentException().isThrownBy(() -> oper.detmStatus("", response))
186                         .withMessage("unknown APPC-C response status code: -45");
187
188         status.setCode(ResponseCode.SUCCESS.getValue());
189         assertEquals(Status.SUCCESS, oper.detmStatus("", response));
190
191         status.setCode(ResponseCode.FAILURE.getValue());
192         assertEquals(Status.FAILURE, oper.detmStatus("", response));
193
194         status.setCode(ResponseCode.ERROR.getValue());
195         assertThatIllegalArgumentException().isThrownBy(() -> oper.detmStatus("", response))
196                         .withMessage("APP-C request was not accepted, code=" + ResponseCode.ERROR.getValue());
197
198         status.setCode(ResponseCode.REJECT.getValue());
199         assertThatIllegalArgumentException().isThrownBy(() -> oper.detmStatus("", response))
200                         .withMessage("APP-C request was not accepted, code=" + ResponseCode.REJECT.getValue());
201
202         status.setCode(ResponseCode.ACCEPT.getValue());
203         assertEquals(Status.STILL_WAITING, oper.detmStatus("", response));
204     }
205
206     @Test
207     public void testSetOutcome() {
208         final ResponseStatus status = response.getStatus();
209
210         // null status
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);
217
218         // null description
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);
225
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());
231         }
232     }
233
234     private class MyOper extends AppcOperation {
235
236         public MyOper(ControlLoopOperationParams params, BidirectionalTopicConfig config) {
237             super(params, config, Collections.emptyList());
238         }
239
240         @Override
241         protected Request makeRequest(int attempt) {
242             return makeRequest(attempt, genvnf);
243         }
244     }
245 }