Merge "Point to parent SNAPSHOT"
[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  * ================================================================================
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  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.controlloop.actor.appc;
22
23 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertSame;
27
28 import java.util.Arrays;
29 import java.util.Map;
30 import java.util.TreeMap;
31 import org.junit.After;
32 import org.junit.AfterClass;
33 import org.junit.Before;
34 import org.junit.BeforeClass;
35 import org.junit.Test;
36 import org.onap.policy.appc.CommonHeader;
37 import org.onap.policy.appc.Request;
38 import org.onap.policy.appc.ResponseCode;
39 import org.onap.policy.appc.ResponseStatus;
40 import org.onap.policy.controlloop.actorserviceprovider.impl.BidirectionalTopicOperation.Status;
41 import org.onap.policy.controlloop.actorserviceprovider.parameters.BidirectionalTopicConfig;
42 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
43 import org.onap.policy.controlloop.policy.PolicyResult;
44
45 public class AppcOperationTest extends BasicAppcOperation {
46     private AppcOperation oper;
47
48     @BeforeClass
49     public static void setUpBeforeClass() throws Exception {
50         // use same topic name for both sides
51         initBeforeClass(MY_SINK, MY_SINK);
52     }
53
54     @AfterClass
55     public static void tearDownAfterClass() {
56         destroyAfterClass();
57     }
58
59     /**
60      * Sets up.
61      */
62     @Before
63     @Override
64     public void setUp() throws Exception {
65         super.setUp();
66
67         oper = new MyOper(params, config);
68     }
69
70     @After
71     @Override
72     public void tearDown() {
73         super.tearDown();
74     }
75
76     @Test
77     public void testConstructor() {
78         assertEquals(DEFAULT_ACTOR, oper.getActorName());
79         assertEquals(DEFAULT_OPERATION, oper.getName());
80     }
81
82     @Test
83     public void testStartPreprocessorAsync() {
84         assertNotNull(oper.startPreprocessorAsync());
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, MY_VNF);
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, MY_VNF);
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, MY_VNF).getPayload());
111     }
112
113     @Test
114     public void testConvertPayload() {
115         Request request = oper.makeRequest(2, MY_VNF);
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, MY_VNF);
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, MY_VNF);
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, MY_VNF);
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, PolicyResult.SUCCESS, response));
213         assertEquals(PolicyResult.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, PolicyResult.FAILURE, response));
221         assertEquals(PolicyResult.FAILURE, outcome.getResult());
222         assertNotNull(outcome.getMessage());
223         assertSame(response, outcome.getResponse());
224         status.setDescription(MY_DESCRIPTION);
225
226         for (PolicyResult result : PolicyResult.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 static class MyOper extends AppcOperation {
235
236         public MyOper(ControlLoopOperationParams params, BidirectionalTopicConfig config) {
237             super(params, config);
238         }
239
240         @Override
241         protected Request makeRequest(int attempt) {
242             return makeRequest(attempt, MY_VNF);
243         }
244     }
245 }