Fix issues in xacml-pdp for new sonar rules
[policy/xacml-pdp.git] / applications / common / src / test / java / org / onap / policy / pdp / xacml / application / common / std / StdBaseTranslatorTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
4  * ================================================================================
5  * Copyright (C) 2019-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  *
19  * SPDX-License-Identifier: Apache-2.0
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.pdp.xacml.application.common.std;
24
25 import static org.assertj.core.api.Assertions.assertThat;
26 import static org.assertj.core.api.Assertions.assertThatThrownBy;
27 import static org.junit.Assert.assertEquals;
28 import static org.junit.Assert.assertNotNull;
29 import static org.junit.Assert.assertNull;
30
31 import com.att.research.xacml.api.Advice;
32 import com.att.research.xacml.api.AttributeAssignment;
33 import com.att.research.xacml.api.Decision;
34 import com.att.research.xacml.api.IdReference;
35 import com.att.research.xacml.api.Obligation;
36 import com.att.research.xacml.api.Response;
37 import com.att.research.xacml.api.XACML3;
38 import com.att.research.xacml.std.StdStatusCode;
39 import java.text.ParseException;
40 import java.util.Arrays;
41 import java.util.Collection;
42 import java.util.HashMap;
43 import java.util.Map;
44 import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicySetType;
45 import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType;
46 import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType;
47 import org.junit.Before;
48 import org.junit.Test;
49 import org.onap.policy.common.utils.coder.CoderException;
50 import org.onap.policy.common.utils.resources.ResourceUtils;
51 import org.onap.policy.models.decisions.concepts.DecisionResponse;
52 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
53 import org.onap.policy.pdp.xacml.application.common.TestUtilsCommon;
54 import org.onap.policy.pdp.xacml.application.common.ToscaDictionary;
55 import org.onap.policy.pdp.xacml.application.common.ToscaPolicyConversionException;
56
57 public class StdBaseTranslatorTest {
58
59     String policyJson;
60     String policyBadJson;
61
62     AttributeAssignment assignmentPolicyId;
63     AttributeAssignment assignmentPolicy;
64     AttributeAssignment assignmentBadPolicy;
65     AttributeAssignment assignmentWeight;
66     AttributeAssignment assignmentPolicyType;
67     AttributeAssignment assignmentUnknown;
68
69     Obligation obligation;
70
71     /**
72      * beforeSetup - loads and creates objects used later by the tests.
73      * @throws CoderException CoderException
74      *
75      */
76     @Before
77     public void beforeSetup() throws CoderException {
78         policyJson = ResourceUtils.getResourceAsString("test.policy.json");
79         policyBadJson = ResourceUtils.getResourceAsString("test.policy.bad.json");
80
81         assignmentPolicyId = TestUtilsCommon.createAttributeAssignment(
82                 ToscaDictionary.ID_OBLIGATION_POLICY_ID.stringValue(),
83                 ToscaDictionary.ID_OBLIGATION_POLICY_ID_CATEGORY.stringValue(),
84                 "policy.id"
85                 );
86
87         assignmentPolicy = TestUtilsCommon.createAttributeAssignment(
88                 ToscaDictionary.ID_OBLIGATION_POLICY_CONTENT.stringValue(),
89                 ToscaDictionary.ID_OBLIGATION_POLICY_CONTENT_CATEGORY.stringValue(),
90                 policyJson
91                 );
92
93         assignmentBadPolicy = TestUtilsCommon.createAttributeAssignment(
94                 ToscaDictionary.ID_OBLIGATION_POLICY_CONTENT.stringValue(),
95                 ToscaDictionary.ID_OBLIGATION_POLICY_CONTENT_CATEGORY.stringValue(),
96                 policyBadJson
97                 );
98
99         assignmentWeight = TestUtilsCommon.createAttributeAssignment(
100                 ToscaDictionary.ID_OBLIGATION_POLICY_WEIGHT.stringValue(),
101                 ToscaDictionary.ID_OBLIGATION_POLICY_WEIGHT_CATEGORY.stringValue(),
102                 0
103                 );
104
105         assignmentPolicyType = TestUtilsCommon.createAttributeAssignment(
106                 ToscaDictionary.ID_OBLIGATION_POLICY_TYPE.stringValue(),
107                 ToscaDictionary.ID_OBLIGATION_POLICY_TYPE_CATEGORY.stringValue(),
108                 "onap.policies.Test"
109                 );
110
111         assignmentUnknown = TestUtilsCommon.createAttributeAssignment(
112                 "foo:bar",
113                 XACML3.ID_SUBJECT_CATEGORY_ACCESS_SUBJECT.stringValue(),
114                 10.2
115                 );
116
117         obligation = TestUtilsCommon.createXacmlObligation(
118                 ToscaDictionary.ID_OBLIGATION_REST_BODY.stringValue(),
119                 Arrays.asList(assignmentPolicyId, assignmentPolicy, assignmentWeight, assignmentPolicyType));
120     }
121
122     @Test
123     public void testTranslatorNormalFlow() throws Exception {
124         StdBaseTranslator translator = new MyStdBaseTranslator();
125         assertNotNull(translator);
126         assertThatThrownBy(() -> translator.convertPolicy(null)).isInstanceOf(ToscaPolicyConversionException.class);
127         assertNull(translator.convertRequest(null));
128
129         assertThat(translator.generateAnyOfForPolicyType("foo.bar")).isNotNull();
130         assertThat(translator.generateAnyOfForPolicyType("foo.bar").getAllOf().size()).isEqualTo(1);
131
132         assertThat(translator.generateConditionForPolicyType("foo.bar")).isNotNull();
133         assertThat(translator.generateConditionForPolicyType("foo.bar").getExpression()).isNotNull();
134
135         //
136         // Test the addObligation method
137         //
138         PolicySetType policySet = new PolicySetType();
139
140         translator.addObligation(policySet, "policy.id", policyJson, 0, "foo.bar");
141
142         assertThat(policySet.getObligationExpressions().getObligationExpression().size()).isEqualTo(1);
143         assertThat(policySet.getObligationExpressions().getObligationExpression().get(0)
144                 .getAttributeAssignmentExpression().size()).isEqualTo(4);
145
146         PolicyType policy = new PolicyType();
147         translator.addObligation(policy, null, policyJson, null, null);
148
149         assertThat(policy.getObligationExpressions().getObligationExpression().size()).isEqualTo(1);
150         assertThat(policy.getObligationExpressions().getObligationExpression().get(0)
151                 .getAttributeAssignmentExpression().size()).isEqualTo(1);
152
153         RuleType rule = new RuleType();
154         translator.addObligation(rule, "policy.id", null, null, "foo.bar");
155
156         assertThat(rule.getObligationExpressions().getObligationExpression().size()).isEqualTo(1);
157         assertThat(rule.getObligationExpressions().getObligationExpression().get(0)
158                 .getAttributeAssignmentExpression().size()).isEqualTo(2);
159
160         rule = new RuleType();
161         translator.addObligation(rule, null, null, null, null);
162
163         assertThat(rule.getObligationExpressions().getObligationExpression().size()).isEqualTo(1);
164         assertThat(rule.getObligationExpressions().getObligationExpression().get(0)
165                 .getAttributeAssignmentExpression()).isEmpty();
166
167         //
168         // Should not throw an exception
169         //
170         translator.addObligation(new String(), "policy.id", policyJson, null, "foo.bar");
171
172         //
173         // Test the response conversion
174         //
175         Map<String, String> ids = new HashMap<>();
176         ids.put("onap.policies.Test", "1.0.0");
177         Collection<IdReference> policyIds = TestUtilsCommon.createPolicyIdList(ids);
178
179         Response xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_OK, null,
180                 Decision.PERMIT, Arrays.asList(obligation), policyIds);
181
182         DecisionResponse decision = translator.convertResponse(xacmlResponse);
183
184         assertNotNull(decision);
185
186         assertThat(decision.getPolicies()).isNotNull();
187         assertThat(decision.getPolicies()).isEmpty();
188     }
189
190     @Test
191     public void testBadData() throws ToscaPolicyConversionException, ParseException {
192         TestTranslator translator = new TestTranslator();
193
194         assertThatThrownBy(() -> translator.convertPolicy(
195                 new ToscaPolicy())).isInstanceOf(ToscaPolicyConversionException.class)
196                     .hasMessageContaining("missing metadata");
197
198         translator.metadata.put(StdBaseTranslator.POLICY_ID, "random.policy.id");
199
200         assertThatThrownBy(() -> translator.convertPolicy(
201                 new ToscaPolicy())).isInstanceOf(ToscaPolicyConversionException.class)
202                     .hasMessageContaining("missing metadata");
203
204         translator.metadata.put(StdBaseTranslator.POLICY_VERSION, "1.0.0");
205
206         ToscaPolicy policy = new ToscaPolicy();
207         assertEquals("1.0.0", translator.convertPolicy(policy).getVersion());
208
209         Map<String, String> ids = new HashMap<>();
210         ids.put("onap.policies.Test", "1.0.0");
211         Collection<IdReference> policyIds = TestUtilsCommon.createPolicyIdList(ids);
212
213         Response xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_OK, null,
214                 Decision.PERMIT, Arrays.asList(obligation), policyIds);
215
216         DecisionResponse decision = translator.convertResponse(xacmlResponse);
217
218         assertNotNull(decision);
219
220         assertThat(decision.getPolicies()).isNotNull();
221         assertThat(decision.getPolicies()).isEmpty();
222
223         Obligation badObligation = TestUtilsCommon.createXacmlObligation(
224                 ToscaDictionary.ID_OBLIGATION_REST_BODY.stringValue(),
225                 Arrays.asList(assignmentBadPolicy, assignmentUnknown));
226
227         xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_MISSING_ATTRIBUTE, null,
228                 Decision.PERMIT, Arrays.asList(badObligation), policyIds);
229
230         decision = translator.convertResponse(xacmlResponse);
231
232         assertNotNull(decision);
233
234         xacmlResponse = TestUtilsCommon.createXacmlResponse(StdStatusCode.STATUS_CODE_PROCESSING_ERROR,
235                 "Bad obligation", Decision.DENY, Arrays.asList(badObligation), policyIds);
236
237         decision = translator.convertResponse(xacmlResponse);
238
239         assertNotNull(decision);
240         assertThat(decision.getStatus()).isEqualTo("error");
241         assertThat(decision.getMessage()).isEqualTo("Bad obligation");
242     }
243
244     private class MyStdBaseTranslator extends StdBaseTranslator {
245
246         @Override
247         protected void scanObligations(Collection<Obligation> obligations, DecisionResponse decisionResponse) {
248         }
249
250         @Override
251         protected void scanAdvice(Collection<Advice> advice, DecisionResponse decisionResponse) {
252         }
253
254     }
255
256     private class TestTranslator extends StdBaseTranslator {
257         public Map<String, String> metadata = new HashMap<>();
258
259         @Override
260         protected void scanObligations(Collection<Obligation> obligations, DecisionResponse decisionResponse) {
261         }
262
263         @Override
264         protected void scanAdvice(Collection<Advice> advice, DecisionResponse decisionResponse) {
265         }
266
267         @Override
268         public PolicyType convertPolicy(ToscaPolicy toscaPolicy) throws ToscaPolicyConversionException {
269             PolicyType xacmlPolicy = new PolicyType();
270             this.fillMetadataSection(xacmlPolicy, metadata);
271             return xacmlPolicy;
272         }
273     }
274
275 }