dc69e2e6757f68becad94f150e3110cb1fc6ac4f
[policy/models.git] / models-base / src / test / java / org / onap / policy / models / base / PfKeyImplTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019-2020 Nordix Foundation.
4  *  Modifications Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
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.models.base;
23
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
26 import static org.assertj.core.api.Assertions.assertThatThrownBy;
27 import static org.junit.Assert.assertEquals;
28 import static org.junit.Assert.assertFalse;
29 import static org.junit.Assert.assertNotEquals;
30 import static org.junit.Assert.assertNotNull;
31 import static org.junit.Assert.assertTrue;
32
33 import java.lang.reflect.Field;
34 import lombok.EqualsAndHashCode;
35 import lombok.Getter;
36 import lombok.NoArgsConstructor;
37 import lombok.Setter;
38 import org.junit.Test;
39 import org.onap.policy.common.parameters.ValidationResult;
40 import org.onap.policy.common.parameters.annotations.Pattern;
41 import org.onap.policy.models.base.PfKey.Compatibility;
42 import org.onap.policy.models.base.testconcepts.DummyPfKey;
43
44 public class PfKeyImplTest {
45
46     private static final String OTHER_IS_NULL = "^otherKey is marked .*on.*ull but is null$";
47     private static final String ID_IS_NULL = "^id is marked .*on.*ull but is null$";
48     private static final String VERSION123 = "1.2.3";
49     private static final String VERSION100 = "1.0.0";
50     private static final String VERSION001 = "0.0.1";
51
52     @Test
53     public void testConceptKey() {
54         assertThatIllegalArgumentException().isThrownBy(() -> new MyKey("some bad key id"))
55             .withMessage("parameter \"id\": value \"some bad key id\", " + "does not match regular expression \""
56                 + PfKey.KEY_ID_REGEXP + "\"");
57
58         assertThatThrownBy(() -> new MyKey((MyKey) null))
59             .hasMessageMatching("^copyConcept is marked .*on.*ull but is null$");
60
61         MyKey someKey0 = new MyKey();
62         assertTrue(someKey0.isNullKey());
63         assertEquals(new MyKey(PfKey.NULL_KEY_NAME, PfKey.NULL_KEY_VERSION), someKey0);
64
65         MyKey someKey1 = new MyKey("name", VERSION001);
66         MyKey someKey2 = new MyKey(someKey1);
67         MyKey someKey3 = new MyKey(someKey1.getId());
68         assertEquals(someKey1, someKey2);
69         assertEquals(someKey1, someKey3);
70         assertFalse(someKey1.isNullKey());
71         assertFalse(someKey1.isNullVersion());
72
73         assertEquals(someKey2, someKey1.getKey());
74         assertEquals(1, someKey1.getKeys().size());
75
76         someKey0.setName("zero");
77         someKey0.setVersion("0.0.2");
78
79         someKey3.setVersion("0.0.2");
80
81         MyKey someKey4 = new MyKey(someKey1);
82         someKey4.setVersion("0.1.2");
83
84         MyKey someKey4a = new MyKey(someKey1);
85         someKey4a.setVersion("0.0.0");
86
87         MyKey someKey5 = new MyKey(someKey1);
88         someKey5.setVersion("1.2.2");
89
90         MyKey someKey6 = new MyKey(someKey1);
91         someKey6.setVersion("3.0.0");
92
93         assertEquals("name:0.1.2", someKey4.getId());
94
95         assertThatThrownBy(() -> someKey0.getCompatibility(null)).isInstanceOf(NullPointerException.class)
96             .hasMessageMatching("^otherKey is marked .*on.*ull but is null$");
97
98         assertEquals(Compatibility.DIFFERENT, someKey0.getCompatibility(new DummyPfKey()));
99         assertEquals(Compatibility.DIFFERENT, someKey0.getCompatibility(someKey1));
100         assertEquals(Compatibility.IDENTICAL, someKey2.getCompatibility(someKey1));
101         assertEquals(Compatibility.PATCH, someKey3.getCompatibility(someKey1));
102         assertEquals(Compatibility.MINOR, someKey4.getCompatibility(someKey1));
103         assertEquals(Compatibility.PATCH, someKey4a.getCompatibility(someKey1));
104         assertEquals(Compatibility.PATCH, someKey1.getCompatibility(someKey4a));
105         assertEquals(Compatibility.MAJOR, someKey5.getCompatibility(someKey1));
106         assertEquals(Compatibility.MAJOR, someKey6.getCompatibility(someKey1));
107
108         assertTrue(someKey1.isCompatible(someKey2));
109         assertTrue(someKey1.isCompatible(someKey3));
110         assertTrue(someKey1.isCompatible(someKey4));
111         assertFalse(someKey1.isCompatible(someKey0));
112         assertFalse(someKey1.isCompatible(someKey5));
113         assertFalse(someKey1.isCompatible(new DummyPfKey()));
114
115         assertTrue(someKey0.validate("").isValid());
116         assertTrue(someKey1.validate("").isValid());
117         assertTrue(someKey2.validate("").isValid());
118         assertTrue(someKey3.validate("").isValid());
119         assertTrue(someKey4.validate("").isValid());
120         assertTrue(someKey5.validate("").isValid());
121         assertTrue(someKey6.validate("").isValid());
122
123         someKey0.clean();
124         assertNotNull(someKey0.toString());
125
126         MyKey someKey7 = new MyKey(someKey1);
127         assertEquals(244799191, someKey7.hashCode());
128         assertEquals(0, someKey7.compareTo(someKey1));
129         assertEquals(-12, someKey7.compareTo(someKey0));
130
131         assertThatThrownBy(() -> someKey0.compareTo(null)).isInstanceOf(NullPointerException.class)
132             .hasMessageMatching("^otherObj is marked .*on.*ull but is null$");
133
134         assertEquals(0, someKey0.compareTo(someKey0));
135         assertEquals(-36, someKey0.compareTo(new DummyPfKey()));
136
137         assertNotEquals(someKey0, null);
138         assertEquals(someKey0, (Object) someKey0);
139         assertNotEquals(someKey0, (Object) new DummyPfKey());
140
141         MyKey someKey8 = new MyKey();
142         someKey8.setVersion(VERSION001);
143         assertFalse(someKey8.isNullKey());
144
145         someKey8.setVersion("10");
146         assertEquals(0, someKey8.getMinorVersion());
147
148         someKey8.setVersion("10.11");
149         assertEquals(0, someKey8.getPatchVersion());
150     }
151
152     @Test
153     public void testNullArguments() {
154         assertThatThrownBy(() -> new MyKey((String) null)).hasMessageMatching(ID_IS_NULL);
155
156         assertThatThrownBy(() -> new MyKey((MyKey) null))
157             .hasMessageMatching("^copyConcept is marked .*on.*ull but is null$");
158
159         assertThatThrownBy(() -> new MyKey(null, null)).hasMessageMatching("name is marked .*on.*ull but is null$");
160
161         assertThatThrownBy(() -> new MyKey("name", null))
162             .hasMessageMatching("^version is marked .*on.*ull but is null$");
163
164         assertThatThrownBy(() -> new MyKey(null, VERSION001))
165             .hasMessageMatching("^name is marked .*on.*ull but is null$");
166
167         assertThatThrownBy(() -> new MyKey("AKey", VERSION001).isCompatible(null)).hasMessageMatching(OTHER_IS_NULL);
168     }
169
170     @Test
171     public void testValidation() throws Exception {
172         MyKey testKey = new MyKey("TheKey", VERSION001);
173         assertEquals("TheKey:0.0.1", testKey.getId());
174
175         Field nameField = testKey.getClass().getDeclaredField("name");
176         nameField.setAccessible(true);
177         nameField.set(testKey, "Key Name");
178         ValidationResult validationResult = testKey.validate("");
179         nameField.set(testKey, "TheKey");
180         nameField.setAccessible(false);
181         assertThat(validationResult.getResult()).contains("\"name\"").doesNotContain("\"version\"")
182             .contains("does not match regular expression " + PfKey.NAME_REGEXP);
183
184         Field versionField = testKey.getClass().getDeclaredField("version");
185         versionField.setAccessible(true);
186         versionField.set(testKey, "Key Version");
187         ValidationResult validationResult2 = testKey.validate("");
188         versionField.set(testKey, VERSION001);
189         versionField.setAccessible(false);
190         assertThat(validationResult2.getResult()).doesNotContain("\"name\"").contains("\"version\"")
191             .contains("does not match regular expression " + PfKey.VERSION_REGEXP);
192     }
193
194     @Test
195     public void testkeynewerThan() {
196         MyKey key1 = new MyKey("Key1", VERSION123);
197
198         assertThatThrownBy(() -> key1.isNewerThan(null)).hasMessageMatching(OTHER_IS_NULL);
199
200         assertThatThrownBy(() -> key1.isNewerThan(new PfReferenceKey())).hasMessage(
201             "org.onap.policy.models.base.PfReferenceKey is not " + "an instance of " + PfKeyImpl.class.getName());
202
203         assertFalse(key1.isNewerThan(key1));
204
205         MyKey key1a = new MyKey("Key1a", VERSION123);
206         assertFalse(key1.isNewerThan(key1a));
207
208         MyKey key1b = new MyKey("Key0", VERSION123);
209         assertTrue(key1.isNewerThan(key1b));
210
211         key1a.setName("Key1");
212         assertFalse(key1.isNewerThan(key1a));
213
214         key1a.setVersion("0.2.3");
215         assertTrue(key1.isNewerThan(key1a));
216         key1a.setVersion("2.2.3");
217         assertFalse(key1.isNewerThan(key1a));
218         key1a.setVersion(VERSION123);
219         assertFalse(key1.isNewerThan(key1a));
220
221         key1a.setVersion("1.1.3");
222         assertTrue(key1.isNewerThan(key1a));
223         key1a.setVersion("1.3.3");
224         assertFalse(key1.isNewerThan(key1a));
225         key1a.setVersion(VERSION123);
226         assertFalse(key1.isNewerThan(key1a));
227
228         key1a.setVersion("1.2.2");
229         assertTrue(key1.isNewerThan(key1a));
230         key1a.setVersion("1.2.4");
231         assertFalse(key1.isNewerThan(key1a));
232         key1a.setVersion(VERSION123);
233         assertFalse(key1.isNewerThan(key1a));
234
235         key1.setVersion(VERSION100);
236         assertFalse(key1.isNewerThan(key1a));
237         key1a.setVersion(VERSION100);
238         assertFalse(key1.isNewerThan(key1a));
239
240         PfReferenceKey refKey = new PfReferenceKey();
241
242         assertThatThrownBy(() -> refKey.isNewerThan(null)).hasMessageMatching(OTHER_IS_NULL);
243
244         assertThatThrownBy(() -> refKey.isNewerThan(new MyKey()))
245             .hasMessage(MyKey.class.getName() + " is not an instance of " + PfReferenceKey.class.getName());
246
247         assertFalse(refKey.isNewerThan(refKey));
248     }
249
250     @Test
251     public void testmajorMinorPatch() {
252         MyKey key = new MyKey("Key", VERSION100);
253         assertEquals(1, key.getMajorVersion());
254         assertEquals(0, key.getMinorVersion());
255         assertEquals(0, key.getPatchVersion());
256
257         key = new MyKey("Key", "1.2.0");
258         assertEquals(1, key.getMajorVersion());
259         assertEquals(2, key.getMinorVersion());
260         assertEquals(0, key.getPatchVersion());
261
262         key = new MyKey("Key", VERSION123);
263         assertEquals(1, key.getMajorVersion());
264         assertEquals(2, key.getMinorVersion());
265         assertEquals(3, key.getPatchVersion());
266     }
267
268     @Getter
269     @Setter
270     @EqualsAndHashCode(callSuper = false)
271     @NoArgsConstructor
272     public static class MyKey extends PfKeyImpl {
273         private static final long serialVersionUID = 1L;
274
275         @Pattern(regexp = NAME_REGEXP)
276         private String name;
277
278         @Pattern(regexp = VERSION_REGEXP)
279         private String version;
280
281         public MyKey(String name, String version) {
282             super(name, version);
283         }
284
285         public MyKey(String id) {
286             super(id);
287         }
288
289         public MyKey(MyKey myKey) {
290             super(myKey);
291         }
292     }
293 }