287dd61478630da152eb727d21a0bfce6aea55ea
[policy/apex-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2019-2020 Nordix Foundation.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.apex.testsuites.integration.context.distribution;
23
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.assertNull;
28 import static org.junit.Assert.assertTrue;
29 import static org.onap.policy.apex.testsuites.integration.context.factory.TestContextAlbumFactory.createMultiAlbumsContextModel;
30 import static org.onap.policy.apex.testsuites.integration.context.utils.Constants.APEX_DISTRIBUTOR;
31 import static org.onap.policy.apex.testsuites.integration.context.utils.Constants.BYTE_VAL;
32 import static org.onap.policy.apex.testsuites.integration.context.utils.Constants.DATE_CONTEXT_ALBUM;
33 import static org.onap.policy.apex.testsuites.integration.context.utils.Constants.FLOAT_VAL;
34 import static org.onap.policy.apex.testsuites.integration.context.utils.Constants.INT_VAL;
35 import static org.onap.policy.apex.testsuites.integration.context.utils.Constants.LONG_VAL;
36 import static org.onap.policy.apex.testsuites.integration.context.utils.Constants.PI_VAL;
37 import static org.onap.policy.apex.testsuites.integration.context.utils.Constants.STRING_GLOBAL_VAL;
38 import static org.onap.policy.apex.testsuites.integration.context.utils.Constants.TIME_ZONE;
39 import static org.onap.policy.apex.testsuites.integration.context.utils.Constants.VERSION;
40
41 import java.util.Collection;
42 import java.util.Date;
43 import java.util.HashMap;
44 import java.util.Locale;
45 import java.util.Map;
46 import java.util.Map.Entry;
47 import java.util.Set;
48 import java.util.TimeZone;
49 import org.onap.policy.apex.context.ContextAlbum;
50 import org.onap.policy.apex.context.ContextException;
51 import org.onap.policy.apex.context.Distributor;
52 import org.onap.policy.apex.context.impl.distribution.DistributorFactory;
53 import org.onap.policy.apex.context.test.concepts.TestContextBooleanItem;
54 import org.onap.policy.apex.context.test.concepts.TestContextByteItem;
55 import org.onap.policy.apex.context.test.concepts.TestContextDateItem;
56 import org.onap.policy.apex.context.test.concepts.TestContextDateLocaleItem;
57 import org.onap.policy.apex.context.test.concepts.TestContextDateTzItem;
58 import org.onap.policy.apex.context.test.concepts.TestContextDoubleItem;
59 import org.onap.policy.apex.context.test.concepts.TestContextFloatItem;
60 import org.onap.policy.apex.context.test.concepts.TestContextIntItem;
61 import org.onap.policy.apex.context.test.concepts.TestContextLongItem;
62 import org.onap.policy.apex.context.test.concepts.TestContextLongObjectItem;
63 import org.onap.policy.apex.context.test.concepts.TestContextStringItem;
64 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
65 import org.onap.policy.apex.testsuites.integration.context.utils.Constants;
66 import org.slf4j.ext.XLogger;
67 import org.slf4j.ext.XLoggerFactory;
68
69 /**
70  * The Class SequentialContextInstantiation checks sequential initiation of context.
71  *
72  * @author Sergey Sachkov (sergey.sachkov@ericsson.com)
73  */
74 public class SequentialContextInstantiation {
75     // Logger for this class
76     private static final XLogger LOGGER = XLoggerFactory.getXLogger(SequentialContextInstantiation.class);
77
78     // Recurring string constants.
79     private static final String TEST_AB = "TestAB";
80     private static final String TEST_AA = "TestAA";
81     private static final String ITEM_NULL = "ItemNull";
82     private static final String ITEM06 = "Item06";
83     private static final String ITEM05 = "Item05";
84     private static final String ITEM03 = "Item03";
85     private static final String ITEM02 = "Item02";
86     private static final String ITEM01 = "Item01";
87     private static final String ITEM00_2 = "Item00_2";
88
89     // Recurring string constants.
90     private static final String NORMAL_TEST_EXCEPTION = "normal test exception";
91     private static final String DV1 = "dv1";
92     private static final String DV0 = "dv0";
93
94     /**
95      * Test sequential context instantiation.
96      *
97      * @throws ContextException the context exception
98      */
99     public void testSequentialContextInstantiation() throws ContextException {
100         LOGGER.debug("Running TestContextInstantiation test . . .");
101
102         final Distributor contextDistributor = getDistributor();
103
104         try {
105             final ContextAlbum dateAlbum = getContextAlbum(DATE_CONTEXT_ALBUM, contextDistributor);
106             final Date testDate = new Date();
107             final TestContextDateLocaleItem tciA00 = getTestContextDateLocaleItem();
108
109             dateAlbum.put(DV0, tciA00);
110             assertEquals(tciA00, dateAlbum.get(DV0));
111
112             dateAlbum.put(DV1, tciA00);
113             assertEquals(tciA00, dateAlbum.get(DV1));
114
115             final TestContextDateTzItem tci9 = getTestContextDateTzItem(testDate);
116
117             assertThatThrownBy(() -> dateAlbum.put("tci9", tci9))
118                 .hasMessageContaining("class \"" + TestContextDateTzItem.class.getName()
119                     + "\" not compatible with class \"" + TestContextDateLocaleItem.class.getName()
120                     + "\"");
121
122             final TestContextDateLocaleItem tciA01 = new TestContextDateLocaleItem(tciA00);
123             final TestContextDateLocaleItem tciA02 = new TestContextDateLocaleItem(tciA00);
124             final TestContextDateLocaleItem tciA03 = new TestContextDateLocaleItem(tciA00);
125
126             final Map<String, Object> valueMap0 = new HashMap<>();
127             valueMap0.put(ITEM01, tciA01);
128             valueMap0.put(ITEM02, tciA02);
129             valueMap0.put(ITEM03, tciA03);
130
131             dateAlbum.putAll(valueMap0);
132             assertEquals(5, dateAlbum.size());
133             assertEquals(tciA01, dateAlbum.get(ITEM01));
134             assertEquals(tciA02, dateAlbum.get(ITEM02));
135             assertEquals(tciA03, dateAlbum.get(ITEM03));
136
137             final Map<String, Object> valueMap1 = getMap(testDate, tciA00, tci9);
138
139             // Get another reference to the album
140             final ContextAlbum dateAlbum1 = getContextAlbum(DATE_CONTEXT_ALBUM, contextDistributor);
141
142             assertThatThrownBy(() -> dateAlbum1.putAll(valueMap1))
143                 .hasMessageContaining("not compatible with class \""
144                     + TestContextDateLocaleItem.class.getName() + "\"");
145             assertEquals(5, dateAlbum1.size());
146
147             valueMap1.clear();
148             valueMap1.put(ITEM00_2, tciA00);
149             dateAlbum1.putAll(valueMap1);
150             assertEquals(6, dateAlbum1.size());
151
152             assertEquals(tciA00, dateAlbum1.get(ITEM00_2));
153             dateAlbum.remove(ITEM00_2);
154             assertEquals(5, dateAlbum1.size());
155
156             final ContextAlbum dateAlbumCopy = getContextAlbum(DATE_CONTEXT_ALBUM, contextDistributor);
157
158             final Map<String, Object> valueMap2 = new HashMap<>();
159             valueMap2.put("Item04", tciA01);
160             valueMap2.put(ITEM05, tciA02);
161             valueMap2.put(ITEM06, tciA03);
162
163             dateAlbumCopy.putAll(valueMap2);
164             assertEquals(8, dateAlbumCopy.size());
165
166             assertEquals(tciA03, dateAlbumCopy.get(ITEM06));
167
168             final Collection<Object> mapValues = dateAlbum.values();
169             assertTrue(dateAlbumCopy.values().containsAll(mapValues));
170
171             // Check that clearing works
172             dateAlbum1.clear();
173             assertTrue(dateAlbum1.isEmpty());
174
175             dateAlbum.put("Item00", tciA00);
176             final Map<String, Object> valueMap3 = new HashMap<>();
177             valueMap3.put(ITEM01, tciA01);
178             valueMap3.put(ITEM02, tciA02);
179             valueMap3.put(ITEM03, tciA03);
180             dateAlbum.putAll(valueMap3);
181
182             final Map<String, Object> valueMap4 = new HashMap<>();
183             valueMap4.put("Item04", tciA01);
184             valueMap4.put(ITEM05, tciA02);
185             valueMap4.put(ITEM06, tciA03);
186
187             dateAlbumCopy.putAll(valueMap4);
188
189             assertContains(dateAlbum, tciA01);
190
191             final Set<Entry<String, Object>> entrySet = dateAlbum.entrySet();
192             assertEquals(7, entrySet.size());
193
194             assertAlbumGetAndPutMethods(dateAlbum, tciA03, tciA00);
195
196             // Should do removes
197             dateAlbum.remove(TEST_AA);
198             dateAlbum.remove(TEST_AB);
199             dateAlbum.remove(ITEM_NULL);
200             assertEquals(7, entrySet.size());
201             assertTrue(dateAlbumCopy.values().containsAll(mapValues));
202             // CHECKSTYLE:ON: checkstyle:magicNumber
203         } finally {
204             contextDistributor.clear();
205         }
206     }
207
208     private void assertContains(final ContextAlbum dateAlbum, final TestContextDateLocaleItem tciA01) {
209         assertThatThrownBy(() -> dateAlbum.containsKey(null))
210             .hasMessageContaining("null values are illegal on method parameter \"key\"");
211
212         assertTrue(dateAlbum.containsKey(ITEM05));
213         assertTrue(!dateAlbum.containsKey("Item07"));
214
215         assertThatThrownBy(() -> dateAlbum.containsValue(null))
216             .hasMessageContaining("null values are illegal on method parameter \"value\"");
217
218         assertTrue(dateAlbum.containsValue(tciA01));
219         assertTrue(!dateAlbum.containsValue("Hello"));
220     }
221
222     private void assertAlbumGetAndPutMethods(final ContextAlbum dateAlbum, final TestContextDateLocaleItem tciA03,
223                     final TestContextDateLocaleItem tciA00) {
224         assertThatThrownBy(() -> dateAlbum.get(null))
225             .hasMessageContaining("album \"DateContextAlbum:0.0.1\" null keys are illegal on keys for get()");
226
227         final Object aObject = dateAlbum.get(ITEM03);
228         assertEquals(tciA03, aObject);
229         assertThatThrownBy(() -> dateAlbum.put(null, null))
230             .hasMessageContaining("album \"DateContextAlbum:0.0.1\" null keys are illegal on keys for put()");
231
232         // Put null ContextItem should work (return null)
233         assertThatThrownBy(() -> dateAlbum.put(ITEM_NULL, null))
234             .hasMessageContaining("album \"DateContextAlbum:0.0.1\" null values are illegal on "
235                 + "key \"ItemNull\" for put()");
236
237         // Should return null
238         assertNull(dateAlbum.get(ITEM_NULL));
239         // Put should return the previous contextItem
240         tciA00.setDst(false);
241         final TestContextDateLocaleItem tciA03Clone = new TestContextDateLocaleItem(tciA03);
242         tciA03Clone.setDst(true);
243         TestContextDateLocaleItem retItem = (TestContextDateLocaleItem) dateAlbum.put(ITEM03, tciA03Clone);
244         assertEquals(tciA03, retItem);
245         retItem = (TestContextDateLocaleItem) dateAlbum.put(ITEM03, tciA03);
246         assertEquals(tciA03Clone, retItem);
247
248         assertThatThrownBy(() -> dateAlbum.put(ITEM_NULL, null))
249             .hasMessageContaining("album \"DateContextAlbum:0.0.1\" null values are illegal on "
250                 + "key \"ItemNull\" for put()");
251
252         dateAlbum.put(TEST_AA, tciA00);
253         assertEquals(tciA00, dateAlbum.get(TEST_AA));
254
255         // Should print warning
256         assertThatThrownBy(() -> dateAlbum.put(TEST_AA, null))
257             .hasMessageContaining("album \"DateContextAlbum:0.0.1\" null values are illegal on key \"TestAA\" "
258                 + "for put()");
259         assertEquals(8, dateAlbum.size());
260         assertThatThrownBy(() -> dateAlbum.put(TEST_AB, null))
261             .hasMessageContaining("album \"DateContextAlbum:0.0.1\" null values are illegal on key \"TestAB\" "
262                 + "for put()");
263         assertEquals(8, dateAlbum.size());
264     }
265
266     private Map<String, Object> getMap(final Date testDate, final TestContextDateLocaleItem tciA00,
267                     final TestContextDateTzItem tci9) {
268         final TestContextBooleanItem testBadItem000 = new TestContextBooleanItem();
269         final TestContextByteItem testBadItem001 = new TestContextByteItem();
270         final TestContextIntItem testBadItem002 = new TestContextIntItem();
271         final TestContextLongItem testBadItem003 = new TestContextLongItem();
272         final TestContextFloatItem testBadItem004 = new TestContextFloatItem();
273         final TestContextDoubleItem testBadItem005 = new TestContextDoubleItem();
274         final TestContextStringItem testBadItem006 = new TestContextStringItem();
275         final TestContextLongObjectItem testBadItem007 = new TestContextLongObjectItem();
276         final TestContextDateItem testBadItem008 = new TestContextDateItem();
277
278         testBadItem000.setFlag(false);
279         testBadItem001.setByteValue(BYTE_VAL);
280         testBadItem002.setIntValue(INT_VAL);
281         testBadItem003.setLongValue(LONG_VAL);
282         testBadItem004.setFloatValue(FLOAT_VAL);
283         testBadItem005.setDoubleValue(PI_VAL);
284         testBadItem006.setStringValue(STRING_GLOBAL_VAL);
285         testBadItem007.setLongValue(testDate.getTime());
286         testBadItem008.setDateValue(testDate);
287
288         final Map<String, Object> values = new HashMap<>();
289         values.put("TestBadItem000", testBadItem000);
290         values.put("TestBadItem001", testBadItem001);
291         values.put("TestBadItem002", testBadItem002);
292         values.put("TestBadItem003", testBadItem003);
293         values.put("TestBadItem004", testBadItem004);
294         values.put("TestBadItem005", testBadItem005);
295         values.put("TestBadItem006", testBadItem006);
296         values.put("TestBadItem007", testBadItem007);
297         values.put("TestBadItem008", testBadItem008);
298         values.put("TestBadItem009", tci9);
299         values.put(ITEM00_2, tciA00);
300         return values;
301     }
302
303     private TestContextDateTzItem getTestContextDateTzItem(final Date testDate) {
304         final TestContextDateTzItem tci9 = new TestContextDateTzItem();
305         tci9.setDateValue(new TestContextDateItem(testDate));
306         tci9.setTzValue(TimeZone.getTimeZone("Europe/Dublin").getDisplayName());
307         tci9.setDst(true);
308         return tci9;
309     }
310
311     private TestContextDateLocaleItem getTestContextDateLocaleItem() {
312         final TestContextDateLocaleItem tciA00 = new TestContextDateLocaleItem();
313         tciA00.setDateValue(new TestContextDateItem(new Date()));
314         tciA00.setTzValue(TIME_ZONE.getDisplayName());
315         tciA00.setDst(true);
316         tciA00.setUtcOffset(-600);
317         tciA00.setLocale(Locale.ENGLISH);
318         return tciA00;
319     }
320
321     private ContextAlbum getContextAlbum(final String albumName, final Distributor contextDistributor)
322                     throws ContextException {
323         final ContextAlbum dateAlbum = contextDistributor.createContextAlbum(new AxArtifactKey(albumName, VERSION));
324         assertNotNull(dateAlbum);
325         dateAlbum.setUserArtifactStack(Constants.getAxArtifactKeyArray());
326         return dateAlbum;
327     }
328
329     private Distributor getDistributor() throws ContextException {
330         final AxArtifactKey distributorKey = new AxArtifactKey(APEX_DISTRIBUTOR, VERSION);
331         final Distributor contextDistributor = new DistributorFactory().getDistributor(distributorKey);
332         contextDistributor.registerModel(createMultiAlbumsContextModel());
333         return contextDistributor;
334     }
335 }