aboutsummaryrefslogtreecommitdiffstats
path: root/utils/src/test/java/org/onap/policy/common/utils/coder
diff options
context:
space:
mode:
Diffstat (limited to 'utils/src/test/java/org/onap/policy/common/utils/coder')
-rw-r--r--utils/src/test/java/org/onap/policy/common/utils/coder/CoderTest.java129
-rw-r--r--utils/src/test/java/org/onap/policy/common/utils/coder/PropertyCoderTest.java25
-rw-r--r--utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderInstantAsMillisTest.java160
-rw-r--r--utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderObjectTest.java47
-rw-r--r--utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java85
-rw-r--r--utils/src/test/java/org/onap/policy/common/utils/coder/StandardValCoderTest.java165
-rw-r--r--utils/src/test/java/org/onap/policy/common/utils/coder/StandardYamlCoderTest.java30
7 files changed, 623 insertions, 18 deletions
diff --git a/utils/src/test/java/org/onap/policy/common/utils/coder/CoderTest.java b/utils/src/test/java/org/onap/policy/common/utils/coder/CoderTest.java
new file mode 100644
index 00000000..01821504
--- /dev/null
+++ b/utils/src/test/java/org/onap/policy/common/utils/coder/CoderTest.java
@@ -0,0 +1,129 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.common.utils.coder;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CoderTest {
+ private static final Long LONG = 10L;
+ private static final Integer INTEGER = 10;
+ private static final String INT_TEXT = INTEGER.toString();
+ private static final String TEXT = "some text";
+ private static final String ENCODED = "encoded value";
+ private static final String DECODED = "decoded value";
+
+ private MyCoder coder;
+
+ @Before
+ public void setUp() {
+ coder = new MyCoder();
+ }
+
+ @Test
+ public void testConvert() throws CoderException {
+ assertNull(coder.convert(null, String.class));
+
+ // same class of object
+ assertEquals(TEXT, coder.convert(TEXT, String.class));
+ assertEquals(INTEGER, coder.convert(INTEGER, Integer.class));
+
+ // source is a string
+ assertEquals(INTEGER, coder.convert(TEXT, Integer.class));
+
+ // target is a string
+ assertEquals(INT_TEXT, coder.convert(INTEGER, String.class));
+
+ // source and target are different types, neither is a string
+ assertEquals(INTEGER, coder.convert(LONG, Integer.class));
+ }
+
+ private static class MyCoder implements Coder {
+ @Override
+ public String encode(Object object) throws CoderException {
+ return (object.getClass() == String.class ? ENCODED : INT_TEXT);
+ }
+
+ @Override
+ public String encode(Object object, boolean pretty) throws CoderException {
+ // unused
+ return null;
+ }
+
+ @Override
+ public void encode(Writer target, Object object) throws CoderException {
+ // unused
+ }
+
+ @Override
+ public void encode(OutputStream target, Object object) throws CoderException {
+ // unused
+ }
+
+ @Override
+ public void encode(File target, Object object) throws CoderException {
+ // unused
+ }
+
+ @Override
+ public <T> T decode(String json, Class<T> clazz) throws CoderException {
+ return (clazz == String.class ? clazz.cast(DECODED) : clazz.cast(INTEGER));
+ }
+
+ @Override
+ public <T> T decode(Reader source, Class<T> clazz) throws CoderException {
+ // unused
+ return null;
+ }
+
+ @Override
+ public <T> T decode(InputStream source, Class<T> clazz) throws CoderException {
+ // unused
+ return null;
+ }
+
+ @Override
+ public <T> T decode(File source, Class<T> clazz) throws CoderException {
+ // unused
+ return null;
+ }
+
+ @Override
+ public StandardCoderObject toStandard(Object object) throws CoderException {
+ // unused
+ return null;
+ }
+
+ @Override
+ public <T> T fromStandard(StandardCoderObject sco, Class<T> clazz) throws CoderException {
+ // unused
+ return null;
+ }
+ }
+}
diff --git a/utils/src/test/java/org/onap/policy/common/utils/coder/PropertyCoderTest.java b/utils/src/test/java/org/onap/policy/common/utils/coder/PropertyCoderTest.java
index 83017e70..86f8a1b1 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/coder/PropertyCoderTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/coder/PropertyCoderTest.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* ONAP
* ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,28 +23,39 @@ package org.onap.policy.common.utils.coder;
import static org.junit.Assert.assertEquals;
import com.google.gson.annotations.SerializedName;
-
import java.io.Reader;
import java.io.StringReader;
import java.util.List;
-
import lombok.Getter;
-
import org.junit.Before;
import org.junit.Test;
public class PropertyCoderTest {
private PropertyCoder propertyCoder = null;
private static final String AES_ENCRYPTION_KEY = "aes_encryption_key";
+
+ /*
+ * Note: to generate the encrypted values, invoke CryptoUtils passing both the value
+ * to be encrypted and the secret key.
+ *
+ * The secret key should typically be 32 characters long, resulting in a 256-bit
+ * key, and is placed in "aes_encryption_key".
+ *
+ * For "xacml.pdp.rest.password", the encrypted value was generated via:
+ * java org.onap.policy.common.utils.security.CryptoUtils enc alpha abcdefghijklmnopqrstuvwxyzabcdef
+ *
+ * For "pass", the encrypted value was generated via:
+ * java org.onap.policy.common.utils.security.CryptoUtils enc hello abcdefghijklmnopqrstuvwxyzabcdef
+ */
private static final String json =
("{'aes_encryption_key':'abcdefghijklmnopqrstuvwxyzabcdef'"
- + ",'xacml.pdp.rest.password':'enc:YZ8EqzsxIOzIuK416SWAdrv+0cKKkqsQt/NYH9+uxwI='"
+ + ",'xacml.pdp.rest.password':'enc:FSfOhDygtmnX3gkMSfTFMoBFW+AG5k6goNj2KZgQmeF0DqgcMg=='"
+ ",'xacml.pdp.rest.user':'testpdp'"
+ ",'xacml.pdp.rest.client.user':'policy'"
+ ",'xacml.pdp.rest.client.password':'policy'"
+ ",'xacml.pdp.rest.environment':'TEST'"
+ ",'servers':[{'name':'server1','port':'10',"
- + "'pass':'enc:KXIY94KcAapOAAeFbtjQL4kBPB4k+NJfwdP+GpG3LWQ='}"
+ + "'pass':'enc:08Fj6tLhmWjkZkf52O2A2ZNT8PpL80yEOEKXlbV/gnm0lkR9OA=='}"
+ ",{'name':'server2','port':'20','pass':'plaintext'}]"
+ "}").replace('\'', '"');
@@ -102,4 +113,4 @@ public class PropertyCoderTest {
private String port;
private String pass;
}
-} \ No newline at end of file
+}
diff --git a/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderInstantAsMillisTest.java b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderInstantAsMillisTest.java
new file mode 100644
index 00000000..ec977da6
--- /dev/null
+++ b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderInstantAsMillisTest.java
@@ -0,0 +1,160 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP PAP
+ * ================================================================================
+ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.common.utils.coder;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import com.google.gson.JsonElement;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.time.Instant;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import lombok.ToString;
+import org.junit.Before;
+import org.junit.Test;
+
+public class StandardCoderInstantAsMillisTest {
+ private static final long INSTANT_MILLIS = 1583249713500L;
+ private static final String INSTANT_TEXT = String.valueOf(INSTANT_MILLIS);
+
+ private StandardCoder coder;
+
+ @Before
+ public void setUp() {
+ coder = new StandardCoderInstantAsMillis();
+ }
+
+ @Test
+ public void testConvert() throws CoderException {
+ MyObject obj = makeObject();
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> map = coder.convert(obj, LinkedHashMap.class);
+
+ assertThat(map.toString()).contains(INSTANT_TEXT);
+
+ MyObject obj2 = coder.convert(map, MyObject.class);
+ assertEquals(obj.toString(), obj2.toString());
+ }
+
+ @Test
+ public void testEncodeDecode() throws CoderException {
+ MyObject obj = makeObject();
+ assertThat(coder.encode(obj, false)).contains(INSTANT_TEXT);
+ assertThat(coder.encode(obj, true)).contains(INSTANT_TEXT);
+
+ String json = coder.encode(obj);
+ MyObject obj2 = coder.decode(json, MyObject.class);
+ assertEquals(obj.toString(), obj2.toString());
+
+ StringWriter wtr = new StringWriter();
+ coder.encode(wtr, obj);
+ json = wtr.toString();
+ assertThat(json).contains(INSTANT_TEXT);
+
+ StringReader rdr = new StringReader(json);
+ obj2 = coder.decode(rdr, MyObject.class);
+ assertEquals(obj.toString(), obj2.toString());
+ }
+
+ @Test
+ public void testJson() {
+ MyObject obj = makeObject();
+ assertThat(coder.toPrettyJson(obj)).contains(INSTANT_TEXT);
+ }
+
+ @Test
+ public void testToJsonTree_testFromJsonJsonElementClassT() throws Exception {
+ MyMap map = new MyMap();
+ map.props = new LinkedHashMap<>();
+ map.props.put("jel keyA", "jel valueA");
+ map.props.put("jel keyB", "jel valueB");
+
+ JsonElement json = coder.toJsonTree(map);
+ assertEquals("{'props':{'jel keyA':'jel valueA','jel keyB':'jel valueB'}}".replace('\'', '"'), json.toString());
+
+ Object result = coder.fromJson(json, MyMap.class);
+
+ assertNotNull(result);
+ assertEquals("{jel keyA=jel valueA, jel keyB=jel valueB}", result.toString());
+ }
+
+ @Test
+ public void testConvertFromDouble() throws Exception {
+ String text = "[listA, {keyA=100}, 200]";
+ assertEquals(text, coder.decode(text, Object.class).toString());
+
+ text = "{keyB=200}";
+ assertEquals(text, coder.decode(text, Object.class).toString());
+ }
+
+ @Test
+ public void testToStandard() throws Exception {
+ MyObject obj = makeObject();
+ StandardCoderObject sco = coder.toStandard(obj);
+ assertNotNull(sco.getData());
+ assertEquals("{'abc':'xyz','instant':1583249713500}".replace('\'', '"'), sco.getData().toString());
+
+ // class instead of object -> exception
+ assertThatThrownBy(() -> coder.toStandard(String.class)).isInstanceOf(CoderException.class);
+ }
+
+ @Test
+ public void testFromStandard() throws Exception {
+ MyObject obj = new MyObject();
+ obj.abc = "pdq";
+ StandardCoderObject sco = coder.toStandard(obj);
+
+ MyObject obj2 = coder.fromStandard(sco, MyObject.class);
+ assertEquals(obj.toString(), obj2.toString());
+
+ // null class -> exception
+ assertThatThrownBy(() -> coder.fromStandard(sco, null)).isInstanceOf(CoderException.class);
+ }
+
+
+ private MyObject makeObject() {
+ MyObject obj = new MyObject();
+ obj.abc = "xyz";
+ obj.instant = Instant.ofEpochMilli(INSTANT_MILLIS);
+ return obj;
+ }
+
+
+ @ToString
+ private static class MyObject {
+ private String abc;
+ private Instant instant;
+ }
+
+ public static class MyMap {
+ private Map<String, Object> props;
+
+ @Override
+ public String toString() {
+ return props.toString();
+ }
+ }
+}
diff --git a/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderObjectTest.java b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderObjectTest.java
index 44086f30..1748aed3 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderObjectTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderObjectTest.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* ONAP
* ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
package org.onap.policy.common.utils.coder;
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -34,10 +35,11 @@ public class StandardCoderObjectTest {
private static final String PROP1 = "abc";
private static final String PROP2 = "ghi";
+ private static final Integer PROP2_INDEX = 1;
private static final String PROP2b = "jkl";
private static final String VAL1 = "def";
private static final String VAL2 = "mno";
- private static final String JSON = "{'abc':'def','ghi':{'jkl':'mno'}}".replace('\'', '"');
+ private static final String JSON = "{'abc':'def','ghi':[{},{'jkl':'mno'}]}".replace('\'', '"');
private StandardCoderObject sco;
@@ -68,7 +70,7 @@ public class StandardCoderObjectTest {
assertEquals(VAL1, sco.getString(PROP1));
// multiple fields
- assertEquals(VAL2, sco.getString(PROP2, PROP2b));
+ assertEquals(VAL2, sco.getString(PROP2, PROP2_INDEX, PROP2b));
// not found
assertNull(sco.getString("xyz"));
@@ -85,5 +87,44 @@ public class StandardCoderObjectTest {
// not a JSON object
assertNull(sco.getString(PROP1, PROP2));
+
+ // invalid subscript
+ assertThatIllegalArgumentException().isThrownBy(() -> sco.getString(10.0));
+ }
+
+ @Test
+ public void testGetFieldFromObject() {
+ // not an object
+ assertNull(sco.getFieldFromObject(fromJson("[]"), PROP1));
+
+ // field doesn't exist
+ assertNull(sco.getFieldFromObject(fromJson("{}"), "non-existent"));
+
+ // field exists
+ assertEquals(4, sco.getFieldFromObject(fromJson("{\"world\":4}"), "world").getAsInt());
+ }
+
+ @Test
+ public void testGetItemFromArray() {
+ // not an array
+ assertNull(sco.getItemFromArray(fromJson("{}"), 0));
+
+ // negative index
+ assertThatIllegalArgumentException().isThrownBy(() -> sco.getItemFromArray(fromJson("[]"), -1));
+
+ // index out of bounds
+ assertNull(sco.getItemFromArray(fromJson("[5]"), 1));
+ assertNull(sco.getItemFromArray(fromJson("[5]"), 2));
+
+ // index exists
+ assertEquals(6, sco.getItemFromArray(fromJson("[5,6,7]"), 1).getAsInt());
+
+ // edge case: first and last item
+ assertEquals(50, sco.getItemFromArray(fromJson("[50,60,70]"), 0).getAsInt());
+ assertEquals(700, sco.getItemFromArray(fromJson("[500,600,700]"), 2).getAsInt());
+ }
+
+ private JsonElement fromJson(String json) {
+ return gson.fromJson(json, JsonElement.class);
}
}
diff --git a/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java
index 2a70f85a..33c7331e 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardCoderTest.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* ONAP PAP
* ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,12 +23,15 @@ package org.onap.policy.common.utils.coder;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
+import com.google.gson.JsonSyntaxException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -45,8 +48,11 @@ import java.nio.file.Files;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.TreeMap;
+import lombok.ToString;
import org.junit.Before;
import org.junit.Test;
@@ -64,6 +70,35 @@ public class StandardCoderTest {
}
@Test
+ public void testConvert() throws CoderException {
+ // null source
+ assertNull(coder.convert(null, StandardCoderObject.class));
+
+ // same class of object
+ StandardCoderObject sco = new StandardCoderObject();
+ assertSame(sco, coder.convert(sco, StandardCoderObject.class));
+
+ // source is a string
+ assertEquals(Integer.valueOf(10), coder.convert("10", Integer.class));
+
+ // target is a string
+ assertEquals("10", coder.convert(10, String.class));
+
+ // source and target are different types, neither is a string
+ sco = coder.convert(Map.of("hello", "world"), StandardCoderObject.class);
+ assertEquals("world", sco.getString("hello"));
+
+ // throw an exeception
+ coder = new StandardCoder() {
+ @Override
+ protected <T> T fromJson(JsonElement json, Class<T> clazz) {
+ throw jpe;
+ }
+ };
+ assertThatThrownBy(() -> coder.convert(10, Long.class)).isInstanceOf(CoderException.class).hasCause(jpe);
+ }
+
+ @Test
public void testEncodeObject() throws Exception {
List<Integer> arr = Arrays.asList(1100, 1110);
assertEquals("[1100,1110]", coder.encode(arr));
@@ -75,6 +110,32 @@ public class StandardCoderTest {
}
@Test
+ public void testEncodeObjectBoolean() throws Exception {
+ final List<Integer> arr = Arrays.asList(1100, 1110);
+
+ /*
+ * As plain json.
+ */
+ assertEquals("[1100,1110]", coder.encode(arr, false));
+
+ // test exception case
+ coder = spy(new StandardCoder());
+ when(coder.toJson(arr)).thenThrow(jpe);
+ assertThatThrownBy(() -> coder.encode(arr, false)).isInstanceOf(CoderException.class).hasCause(jpe);
+
+
+ /*
+ * As pretty json.
+ */
+ assertEquals("[\n 1100,\n 1110\n]", coder.encode(arr, true));
+
+ // test exception case
+ coder = spy(new StandardCoder());
+ when(coder.toPrettyJson(arr)).thenThrow(jpe);
+ assertThatThrownBy(() -> coder.encode(arr, true)).isInstanceOf(CoderException.class).hasCause(jpe);
+ }
+
+ @Test
public void testEncodeWriterObject() throws Exception {
List<Integer> arr = Arrays.asList(1200, 1210);
StringWriter wtr = new StringWriter();
@@ -260,7 +321,9 @@ public class StandardCoderTest {
assertEquals(json, coder.toJson(sco));
// invalid json -> exception
- assertThatThrownBy(() -> coder.fromJson(new StringReader("["), StandardCoderObject.class));
+ StringReader rdr = new StringReader("[");
+ assertThatThrownBy(() -> coder.fromJson(rdr, StandardCoderObject.class))
+ .isInstanceOf(JsonSyntaxException.class);
}
@Test
@@ -281,16 +344,24 @@ public class StandardCoderTest {
assertEquals(-10, map.props.get("negInt"));
assertEquals(100000000000L, map.props.get("posLong"));
assertEquals(12.5, map.props.get("doubleVal"));
+
+ // test when decoding into a map
+ @SuppressWarnings("unchecked")
+ Map<String, Object> map2 = coder.decode("{'intValue':10, 'dblVal':20.1}", TreeMap.class);
+ assertEquals("{dblVal=20.1, intValue=10}", map2.toString());
+ }
+
+ @Test
+ public void testListDouble() throws Exception {
+ @SuppressWarnings("unchecked")
+ List<Object> list = coder.decode("[10, 20.1, 30]", LinkedList.class);
+ assertEquals("[10, 20.1, 30]", list.toString());
}
+ @ToString
private static class MyObject {
private String abc;
-
- @Override
- public String toString() {
- return "MyObject [abc=" + abc + "]";
- }
}
public static class MyMap {
diff --git a/utils/src/test/java/org/onap/policy/common/utils/coder/StandardValCoderTest.java b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardValCoderTest.java
new file mode 100644
index 00000000..2fcdb0dd
--- /dev/null
+++ b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardValCoderTest.java
@@ -0,0 +1,165 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.common.utils.coder;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.worldturner.medeia.api.ValidationFailedException;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.junit.Before;
+import org.junit.Test;
+
+public class StandardValCoderTest {
+ private String jsonSchema;
+ private String validJson;
+ private String missingReqJson;
+ private String badRegexJson;
+
+ @Data
+ @NoArgsConstructor
+ public static class ValOuter {
+ @Data
+ @NoArgsConstructor
+ public static class ValInner {
+ public String subItemString;
+ public Integer subItemInteger;
+ }
+
+ public String aaString;
+ public int anInteger;
+ public boolean aaBoolean;
+ public List<ValInner> aaCollection;
+ }
+
+ @Before
+ public void testSetUp() throws Exception {
+ jsonSchema = getJson("src/test/resources/org/onap/policy/common/utils/coder/test.schema.json");
+ validJson = getJson("src/test/resources/org/onap/policy/common/utils/coder/valid.json");
+ missingReqJson = getJson("src/test/resources/org/onap/policy/common/utils/coder/missing-required.json");
+ badRegexJson = getJson("src/test/resources/org/onap/policy/common/utils/coder/bad-regex.json");
+ }
+
+ @Test
+ public void testDecode() throws CoderException {
+ StandardValCoder valCoder = new StandardValCoder(jsonSchema, "test-schema");
+
+ ValOuter valOuter = valCoder.decode(validJson, ValOuter.class);
+ assertValidJson(valOuter);
+
+ StringReader reader = new StringReader(validJson);
+ valOuter = valCoder.decode(reader, ValOuter.class);
+ assertValidJson(valOuter);
+
+ try {
+ valCoder.decode(missingReqJson, ValOuter.class);
+ fail("missing required field should have been flagged by the schema validation");
+ } catch (CoderException e) {
+ assertEquals("required", ((ValidationFailedException) e.getCause()).getFailures().get(0).getRule());
+ assertEquals("aaCollection",
+ ((ValidationFailedException) e.getCause()).getFailures().get(0).getProperty());
+ assertEquals("Required property aaCollection is missing from object",
+ ((ValidationFailedException) e.getCause()).getFailures().get(0).getMessage());
+ }
+
+ try {
+ valCoder.decode(badRegexJson, ValOuter.class);
+ fail("bad regex should have been flagged by the schema validation");
+ } catch (CoderException e) {
+ assertEquals("properties", ((ValidationFailedException) e.getCause()).getFailures().get(0).getRule());
+ assertEquals("aaString",
+ ((ValidationFailedException) e.getCause()).getFailures().get(0).getProperty());
+ assertEquals("Property validation failed",
+ ((ValidationFailedException) e.getCause()).getFailures().get(0).getMessage());
+ assertEquals("pattern",
+ ((ValidationFailedException) e.getCause()).getFailures()
+ .get(0).getDetails().iterator().next().getRule());
+ assertEquals("Pattern ^([a-z]*)$ is not contained in text",
+ ((ValidationFailedException) e.getCause()).getFailures()
+ .get(0).getDetails().iterator().next().getMessage());
+ }
+ }
+
+ @Test
+ public void testEncode() throws CoderException {
+ StandardValCoder valCoder = new StandardValCoder(jsonSchema, "test-schema");
+ ValOuter valOuter = valCoder.decode(validJson, ValOuter.class);
+
+ String valOuterJson = valCoder.encode(valOuter);
+ assertEquals(valOuter, valCoder.decode(valOuterJson, ValOuter.class));
+ assertValidJson(valOuter);
+
+ StringWriter writer = new StringWriter();
+ valCoder.encode(writer, valOuter);
+ assertEquals(valOuterJson, writer.toString());
+
+ // test exception case with an empty object
+ assertThatThrownBy(() -> valCoder.encode(new ValOuter())).isInstanceOf(CoderException.class);
+ }
+
+ @Test
+ public void testPretty() throws CoderException {
+ StandardValCoder valCoder = new StandardValCoder(jsonSchema, "test-schema");
+ ValOuter valOuter = valCoder.decode(validJson, ValOuter.class);
+
+ String valOuterJson = valCoder.encode(valOuter);
+ assertEquals(valOuterJson, valCoder.encode(valOuter, false));
+ String prettyValOuterJson = valCoder.encode(valOuter, true);
+ assertNotEquals(valOuterJson, prettyValOuterJson);
+
+ assertEquals(valOuter, valCoder.decode(prettyValOuterJson, ValOuter.class));
+
+ // test exception cases with an empty object
+ assertThatThrownBy(() -> valCoder.encode(new ValOuter(), false)).isInstanceOf(CoderException.class);
+ assertThatThrownBy(() -> valCoder.encode(new ValOuter(), true)).isInstanceOf(CoderException.class);
+ }
+
+ @Test
+ public void testConformance() {
+ StandardValCoder valCoder = new StandardValCoder(jsonSchema, "test-schema");
+ assertTrue(valCoder.isConformant(validJson));
+ assertFalse(valCoder.isConformant(missingReqJson));
+ assertFalse(valCoder.isConformant(badRegexJson));
+ }
+
+ private void assertValidJson(ValOuter valOuter) {
+ assertEquals("abcd", valOuter.getAaString());
+ assertEquals(90, valOuter.getAnInteger());
+ assertTrue(valOuter.isAaBoolean());
+ assertEquals("defg", valOuter.getAaCollection().get(0).getSubItemString());
+ assertEquals(Integer.valueOf(1200), valOuter.getAaCollection().get(0).getSubItemInteger());
+ }
+
+ private String getJson(String filePath) throws IOException {
+ return new String(Files.readAllBytes(Paths.get(filePath)));
+ }
+} \ No newline at end of file
diff --git a/utils/src/test/java/org/onap/policy/common/utils/coder/StandardYamlCoderTest.java b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardYamlCoderTest.java
index e38c5c9c..cadeb055 100644
--- a/utils/src/test/java/org/onap/policy/common/utils/coder/StandardYamlCoderTest.java
+++ b/utils/src/test/java/org/onap/policy/common/utils/coder/StandardYamlCoderTest.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* ONAP
* ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,8 +20,11 @@
package org.onap.policy.common.utils.coder;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
import java.io.File;
import java.io.StringWriter;
@@ -45,6 +48,25 @@ public class StandardYamlCoderTest {
}
@Test
+ public void testToPrettyJson() throws CoderException {
+ String expected = coder.encode(cont);
+ assertEquals(expected, coder.encode(cont, false));
+
+ String yaml = coder.encode(cont, true);
+ assertEquals(expected, yaml);
+
+ Container cont2 = coder.decode(yaml, Container.class);
+ assertEquals(cont, cont2);
+
+ // test exception cases
+ IllegalArgumentException expex = new IllegalArgumentException("expected exception");
+ coder = spy(new StandardYamlCoder());
+ when(coder.toJson(cont)).thenThrow(expex);
+ assertThatThrownBy(() -> coder.encode(cont, false)).isInstanceOf(CoderException.class).hasCause(expex);
+ assertThatThrownBy(() -> coder.encode(cont, true)).isInstanceOf(CoderException.class).hasCause(expex);
+ }
+
+ @Test
public void testToJsonObject() throws CoderException {
String yaml = coder.encode(cont);
@@ -75,6 +97,12 @@ public class StandardYamlCoderTest {
}
@Test
+ public void testFromJsonDoubleToInteger() throws Exception {
+ Object value = coder.decode("20", Object.class);
+ assertEquals(Integer.valueOf(20), value);
+ }
+
+ @Test
public void testStandardTypeAdapter() throws Exception {
String yaml = "abc: def\n";
StandardCoderObject sco = coder.fromJson(yaml, StandardCoderObject.class);