diff --git a/bobfile b/bobfile index 51ad46f..898c3b3 100644 --- a/bobfile +++ b/bobfile @@ -5,7 +5,7 @@ packaging: jar enablePreview: false release: 19 dependencies: - - repository: org.objenesis:objenesis:3.3 + - repository: org.objenesis:objenesis:3.4 - repository: junit:junit:4.13.2 scope: test - repository: org.unitils:unitils-core:3.4.6 diff --git a/pom.xml b/pom.xml index a67e88f..a5f2e25 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.github.codemonstur simplexml - 3.1.1 + 3.1.2 ${project.groupId}:${project.artifactId} A clean and simple XML parser, serializer, and deserializer. @@ -41,7 +41,7 @@ 19 19 - 3.3 + 3.4 4.13.2 3.4.6 1.12.0 diff --git a/src/test/java/unittests/EscapeMapTagIsKeyTest.java b/src/test/java/unittests/EscapeMapTagIsKeyTest.java new file mode 100644 index 0000000..a96c046 --- /dev/null +++ b/src/test/java/unittests/EscapeMapTagIsKeyTest.java @@ -0,0 +1,103 @@ +package unittests; + +import org.junit.Test; +import xmlparser.XmlParser; +import xmlparser.annotations.XmlMapTagIsKey; +import xmlparser.annotations.XmlMapWithAttributes; + +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static xmlparser.XmlParser.newXmlParser; + +public class EscapeMapTagIsKeyTest { + + private final XmlParser parserDefault = new XmlParser(); + private final XmlParser parserEncodeUTF8 = newXmlParser().shouldEncodeUTF8().build(); + + private static class PojoMap { + @XmlMapTagIsKey + private final Map map; + + private PojoMap(final Map map) { + this.map = map; + } + } + + @Test + public void serializeMapWithDangerousChars() { + final PojoMap inputPojo = new PojoMap(Map.of("key", "<>&\"'")); + final String expected = "\n" + + " \n" + + " <>&"'\n" + + " \n" + + "\n"; + + final String actual = parserDefault.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void deserializeMapWithEscapedChars() { + final String inputXml = "\n" + + " \n" + + " <>&"'\n" + + " \n" + + "\n"; + final PojoMap expected = new PojoMap(Map.of("key", "<>&\"'")); + + final PojoMap actual = parserDefault.fromXml(inputXml, PojoMap.class); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected.map.get("key"), actual.map.get("key")); + } + + @Test + public void serializeMapUTF8Characters() { + final PojoMap inputPojo = new PojoMap(Map.of("key", "ƑƟƠƄǠȒ")); + final String expected = "\n" + + " \n" + + " ƑƟƠƄǠȒ\n" + + " \n" + + "\n"; + + final String actual = parserEncodeUTF8.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void dontSerializeMapUTF8Characters() { + final PojoMap inputPojo = new PojoMap(Map.of("key", "ƑƟƠƄǠȒ")); + final String expected = "\n" + + " \n" + + " ƑƟƠƄǠȒ\n" + + " \n" + + "\n"; + + final String actual = parserDefault.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void deserializeMapUTF8Characters() { + final String inputXml = "\n" + + " \n" + + " ƑƟƠƄǠȒ\n" + + " \n" + + "\n"; + final PojoMap expected = new PojoMap(Map.of("key", "ƑƟƠƄǠȒ")); + + final PojoMap actual = parserEncodeUTF8.fromXml(inputXml, PojoMap.class); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected.map.get("key"), actual.map.get("key")); + } + +} diff --git a/src/test/java/unittests/EscapeMapWithAttributesTest.java b/src/test/java/unittests/EscapeMapWithAttributesTest.java new file mode 100644 index 0000000..2d60b57 --- /dev/null +++ b/src/test/java/unittests/EscapeMapWithAttributesTest.java @@ -0,0 +1,161 @@ +package unittests; + +import org.junit.Test; +import xmlparser.XmlParser; +import xmlparser.annotations.XmlMapWithAttributes; +import xmlparser.annotations.XmlMapWithChildNodes; + +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static xmlparser.XmlParser.newXmlParser; + +public class EscapeMapWithAttributesTest { + + private final XmlParser parserDefault = new XmlParser(); + private final XmlParser parserEncodeUTF8 = newXmlParser().shouldEncodeUTF8().build(); + + private static class PojoMap { + @XmlMapWithAttributes(keyName = "key") + private final Map map1; + @XmlMapWithAttributes(keyName = "key", valueName = "value") + private final Map map2; + + private PojoMap(final Map map1, final Map map2) { + this.map1 = map1; + this.map2 = map2; + } + } + + @Test + public void serializeMap1WithDangerousChars() { + final PojoMap inputPojo = new PojoMap(Map.of("<>&\"'", "<>&\"'"), null); + final String expected = "\n" + + " <>&"'\n" + + "\n"; + + final String actual = parserDefault.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void serializeMap2WithDangerousChars() { + final PojoMap inputPojo = new PojoMap(null, Map.of("<>&\"'", "<>&\"'")); + final String expected = "\n" + + " \n" + + "\n"; + + final String actual = parserDefault.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void deserializeMap1WithEscapedChars() { + final String inputXml = "\n" + + " <>&"'\n" + + "\n"; + final PojoMap expected = new PojoMap(Map.of("<>&\"'", "<>&\"'"), null); + + final PojoMap actual = parserDefault.fromXml(inputXml, PojoMap.class); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected.map1.get("<>&\"'"), actual.map1.get("<>&\"'")); + } + + @Test + public void deserializeMap2WithEscapedChars() { + final String inputXml = "\n" + + " \n" + + "\n"; + final PojoMap expected = new PojoMap(null, Map.of("<>&\"'", "<>&\"'")); + + final PojoMap actual = parserDefault.fromXml(inputXml, PojoMap.class); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected.map2.get("<>&\"'"), actual.map2.get("<>&\"'")); + } + + @Test + public void serializeMap1UTF8Characters() { + final PojoMap inputPojo = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null); + final String expected = "\n" + + " ƑƟƠƄǠȒ\n" + + "\n"; + + final String actual = parserEncodeUTF8.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void dontSerializeMap1UTF8Characters() { + final PojoMap inputPojo = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null); + final String expected = "\n" + + " ƑƟƠƄǠȒ\n" + + "\n"; + + final String actual = parserDefault.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void deserializeMap1UTF8Characters() { + final String inputXml = "\n" + + " ƑƟƠƄǠȒ\n" + + "\n"; + final PojoMap expected = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null); + + final PojoMap actual = parserEncodeUTF8.fromXml(inputXml, PojoMap.class); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected.map1.get("ƑƟƠƄǠȒ"), actual.map1.get("ƑƟƠƄǠȒ")); + } + + @Test + public void serializeMap2UTF8Characters() { + final PojoMap inputPojo = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ")); + final String expected = "\n" + + " \n" + + "\n"; + + final String actual = parserEncodeUTF8.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void dontSerializeMap2UTF8Characters() { + final PojoMap inputPojo = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ")); + final String expected = "\n" + + " \n" + + "\n"; + + final String actual = parserDefault.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void deserializeMap2UTF8Characters() { + final String inputXml = "\n" + + " \n" + + "\n"; + final PojoMap expected = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ")); + + final PojoMap actual = parserEncodeUTF8.fromXml(inputXml, PojoMap.class); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected.map2.get("ƑƟƠƄǠȒ"), actual.map2.get("ƑƟƠƄǠȒ")); + } + +} diff --git a/src/test/java/unittests/EscapeMapWithChildNodesTest.java b/src/test/java/unittests/EscapeMapWithChildNodesTest.java new file mode 100644 index 0000000..9f51842 --- /dev/null +++ b/src/test/java/unittests/EscapeMapWithChildNodesTest.java @@ -0,0 +1,192 @@ +package unittests; + +import model.Pojo; +import model.PojoWithAttribute; +import org.junit.Test; +import xmlparser.XmlParser; +import xmlparser.annotations.XmlMapWithChildNodes; + +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static xmlparser.XmlParser.newXmlParser; + +public class EscapeMapWithChildNodesTest { + + private final XmlParser parserDefault = new XmlParser(); + private final XmlParser parserEncodeUTF8 = newXmlParser().shouldEncodeUTF8().build(); + + private static class PojoMap { + @XmlMapWithChildNodes(keyName = "key") + private final Map map1; + @XmlMapWithChildNodes(keyName = "key", valueName = "value") + private final Map map2; + + private PojoMap(final Map map1, final Map map2) { + this.map1 = map1; + this.map2 = map2; + } + } + + @Test + public void serializeMap1WithDangerousChars() { + final PojoMap inputPojo = new PojoMap(Map.of("<>&\"'", "<>&\"'"), null); + final String expected = "\n" + + " \n" + + " <>&"'\n" + + " <>&"'\n" + + " \n" + + "\n"; + + final String actual = parserDefault.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void serializeMap2WithDangerousChars() { + final PojoMap inputPojo = new PojoMap(null, Map.of("<>&\"'", "<>&\"'")); + final String expected = "\n" + + " \n" + + " <>&"'\n" + + " <>&"'\n" + + " \n" + + "\n"; + + final String actual = parserDefault.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void deserializeMap1WithEscapedChars() { + final String inputXml = "\n" + + " \n" + + " <>&"'\n" + + " <>&"'\n" + + " \n" + + "\n"; + final PojoMap expected = new PojoMap(Map.of("<>&\"'", "<>&\"'"), null); + + final PojoMap actual = parserDefault.fromXml(inputXml, PojoMap.class); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected.map1.get("<>&\"'"), actual.map1.get("<>&\"'")); + } + + @Test + public void deserializeMap2WithEscapedChars() { + final String inputXml = "\n" + + " \n" + + " <>&"'\n" + + " <>&"'\n" + + " \n" + + "\n"; + final PojoMap expected = new PojoMap(null, Map.of("<>&\"'", "<>&\"'")); + + final PojoMap actual = parserDefault.fromXml(inputXml, PojoMap.class); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected.map2.get("<>&\"'"), actual.map2.get("<>&\"'")); + } + + @Test + public void serializeMap1UTF8Characters() { + final PojoMap inputPojo = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null); + final String expected = "\n" + + " \n" + + " ƑƟƠƄǠȒ\n" + + " ƑƟƠƄǠȒ\n" + + " \n" + + "\n"; + + final String actual = parserEncodeUTF8.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void dontSerializeMap1UTF8Characters() { + final PojoMap inputPojo = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null); + final String expected = "\n" + + " \n" + + " ƑƟƠƄǠȒ\n" + + " ƑƟƠƄǠȒ\n" + + " \n" + + "\n"; + + final String actual = parserDefault.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void deserializeMap1UTF8Characters() { + final String inputXml = "\n" + + " \n" + + " ƑƟƠƄǠȒ\n" + + " ƑƟƠƄǠȒ\n" + + " \n" + + "\n"; + final PojoMap expected = new PojoMap(Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ"), null); + + final PojoMap actual = parserEncodeUTF8.fromXml(inputXml, PojoMap.class); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected.map1.get("ƑƟƠƄǠȒ"), actual.map1.get("ƑƟƠƄǠȒ")); + } + + @Test + public void serializeMap2UTF8Characters() { + final PojoMap inputPojo = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ")); + final String expected = "\n" + + " \n" + + " ƑƟƠƄǠȒ\n" + + " ƑƟƠƄǠȒ\n" + + " \n" + + "\n"; + + final String actual = parserEncodeUTF8.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void dontSerializeMap2UTF8Characters() { + final PojoMap inputPojo = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ")); + final String expected = "\n" + + " \n" + + " ƑƟƠƄǠȒ\n" + + " ƑƟƠƄǠȒ\n" + + " \n" + + "\n"; + + final String actual = parserDefault.toXml(inputPojo); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected, actual); + } + + @Test + public void deserializeMap2UTF8Characters() { + final String inputXml = "\n" + + " \n" + + " ƑƟƠƄǠȒ\n" + + " ƑƟƠƄǠȒ\n" + + " \n" + + "\n"; + final PojoMap expected = new PojoMap(null, Map.of("ƑƟƠƄǠȒ", "ƑƟƠƄǠȒ")); + + final PojoMap actual = parserEncodeUTF8.fromXml(inputXml, PojoMap.class); + + assertNotNull("No serialization response", actual); + assertEquals("Invalid serialized output", expected.map2.get("ƑƟƠƄǠȒ"), actual.map2.get("ƑƟƠƄǠȒ")); + } + +}