summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMaciej J. Karpiuk <m.karpiuk2@samsung.com>2015-05-06 15:20:41 +0200
committerKrzysztof Jackiewicz <k.jackiewicz@samsung.com>2015-05-19 07:04:45 -0700
commit82f657827c1c162b72e454784daf92103ed315a4 (patch)
tree547913e6d179aede9a848a17dcab5c7eda5e482a /tests
parent68ef1034badf1554b572989f42bf0d9dbd53d95f (diff)
downloadkey-manager-82f657827c1c162b72e454784daf92103ed315a4.tar.gz
key-manager-82f657827c1c162b72e454784daf92103ed315a4.tar.bz2
key-manager-82f657827c1c162b72e454784daf92103ed315a4.zip
Add generic XML parser + tests.
Change-Id: I44494b0e3034cb0e6e258bc9b8da8cadb5e2be70
Diffstat (limited to 'tests')
-rw-r--r--tests/CMakeLists.txt10
-rw-r--r--tests/XML_1_okay.xml38
-rw-r--r--tests/XML_1_okay.xsd128
-rw-r--r--tests/XML_1_wrong.xml38
-rw-r--r--tests/XML_1_wrong.xsd128
-rw-r--r--tests/XML_2_structure.xml22
-rw-r--r--tests/test_xml-parser.cpp290
7 files changed, 654 insertions, 0 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 8c2b2b91..42530c52 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -1,3 +1,8 @@
+PKG_CHECK_MODULES(KEY_MANAGER_TEST_DEP
+ libxml-2.0
+ REQUIRED
+ )
+
FIND_PACKAGE(Threads REQUIRED)
ADD_DEFINITIONS( "-DBOOST_TEST_DYN_LINK" )
@@ -10,11 +15,13 @@ SET(KEY_MANAGER_PATH ${PROJECT_SOURCE_DIR}/src/manager)
SET(KEY_MANAGER_TEST_MERGED_SRC ${PROJECT_SOURCE_DIR}/tests)
INCLUDE_DIRECTORIES(
+ ${KEY_MANAGER_DEP_INCLUDE_DIRS}
${KEY_MANAGER_PATH}/dpl/db/include
${KEY_MANAGER_PATH}/dpl/core/include
${KEY_MANAGER_PATH}/dpl/log/include
${KEY_MANAGER_PATH}/sqlcipher
${KEY_MANAGER_PATH}/service
+ ${KEY_MANAGER_PATH}/initial-values
${KEY_MANAGER_PATH}/main
${KEY_MANAGER_PATH}/common/
${KEY_MANAGER_PATH}/client-async/
@@ -34,8 +41,10 @@ SET(TEST_MERGED_SOURCES
${KEY_MANAGER_TEST_MERGED_SRC}/test_descriptor-set.cpp
${KEY_MANAGER_TEST_MERGED_SRC}/test_comm-manager.cpp
${KEY_MANAGER_TEST_MERGED_SRC}/test_serialization.cpp
+ ${KEY_MANAGER_TEST_MERGED_SRC}/test_xml-parser.cpp
${KEY_MANAGER_PATH}/service/db-crypto.cpp
${KEY_MANAGER_PATH}/service/key-provider.cpp
+ ${KEY_MANAGER_PATH}/initial-values/parser.cpp
${KEY_MANAGER_PATH}/client-async/descriptor-set.cpp
${KEY_MANAGER_PATH}/dpl/core/src/assert.cpp
${KEY_MANAGER_PATH}/dpl/core/src/colors.cpp
@@ -49,6 +58,7 @@ ADD_EXECUTABLE(${TARGET_TEST_MERGED} ${TEST_MERGED_SOURCES})
TARGET_LINK_LIBRARIES(${TARGET_TEST_MERGED}
${TARGET_KEY_MANAGER_COMMON}
${CMAKE_THREAD_LIBS_INIT}
+ ${KEY_MANAGER_DEP_LIBRARIES}
boost_unit_test_framework
-ldl
)
diff --git a/tests/XML_1_okay.xml b/tests/XML_1_okay.xml
new file mode 100644
index 00000000..dae9fcf9
--- /dev/null
+++ b/tests/XML_1_okay.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<InitialValues version="0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="initial_values.xsd ">
+ <Key name="key1" type="RSA_PRV" password="123">
+ <PEM>
+ -----BEGIN PUBLIC KEY-----
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2b1bXDa+S8/MGWnMkru4
+ T4tUddtZNi0NVjQn9RFH1NMa220GsRhRO56F77FlSVFKfSfVZKIiWg6C+DVCkcLf
+ zXJ/Z0pvwOQYBAqVMFjV6efQGN0JzJ1Unu7pPRiZl7RKGEI+cyzzrcDyrLLrQ2W7
+ 0ZySkNEOv6Frx9JgC5NExuYY4lk2fQQa38JXiZkfyzif2em0px7mXbyf5LjccsKq
+ v1e+XLtMsL0ZefRcqsP++NzQAI8fKX7WBT+qK0HJDLiHrKOTWYzx6CwJ66LD/vvf
+ j55xtsKDLVDbsotvf8/m6VLMab+vqKk11TP4tq6yo0mwyTADvgl1zowQEO9I1W6o
+ zQIDAQAB
+ -----END PUBLIC KEY-----
+ </PEM>
+ </Key>
+ <Cert exportable="true" name="cert1">
+ <DER>
+ MIIEgDCCA2igAwIBAgIIcjtBYJGQtOAwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
+ BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
+ cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwNTIyMTEyOTQyWhcNMTQwODIwMDAwMDAw
+ WjBtMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
+ TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEcMBoGA1UEAwwTYWNj
+ rHva8A==
+ </DER>
+ </Cert>
+ <Data name="data1">
+ <ASCII>
+ My secret data
+ </ASCII>
+ </Data>
+ <Key name="aes1" type="AES">
+ <Base64>
+ MIIEgDCCA2igAwIBAgIIcjtBYJGQtOAwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
+ </Base64>
+ <Permission accessor="web_app1"/>
+ <Permission accessor="web_app2"/>
+ </Key>
+</InitialValues>
diff --git a/tests/XML_1_okay.xsd b/tests/XML_1_okay.xsd
new file mode 100644
index 00000000..a587bebf
--- /dev/null
+++ b/tests/XML_1_okay.xsd
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:element name="InitialValues" type="InitialValuesType"></xsd:element>
+
+ <xsd:complexType name="InitialValuesType">
+ <xsd:sequence>
+ <xsd:choice maxOccurs="unbounded" minOccurs="1">
+ <xsd:element name="Data" type="DataType"
+ maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="Key" type="KeyType"
+ maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="Cert" type="CertType"
+ maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ </xsd:choice>
+ </xsd:sequence>
+ <xsd:attribute name="version" type="xsd:int" use="required"></xsd:attribute>
+ </xsd:complexType>
+
+ <xsd:complexType name="ObjectType">
+ <xsd:attribute name="name" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"></xsd:minLength>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ <xsd:attribute name="password" use="optional"
+ type="xsd:string">
+ </xsd:attribute>
+ <xsd:attribute name="exportable" use="optional"
+ default="false">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:boolean"></xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:complexType>
+
+ <xsd:complexType name="KeyType">
+ <xsd:complexContent>
+ <xsd:extension base="ObjectType">
+ <xsd:sequence>
+ <xsd:choice maxOccurs="1" minOccurs="1">
+ <xsd:element name="PEM"
+ type="EncodingPemType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="DER"
+ type="EncodingDerType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="Base64"
+ type="EncodingRawType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ </xsd:choice>
+ <xsd:element name="Permission" type="PermissionType" maxOccurs="unbounded" minOccurs="0"></xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="type">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="RSA_PRV"></xsd:enumeration>
+ <xsd:enumeration value="RSA_PUB"></xsd:enumeration>
+ <xsd:enumeration value="ECDSA_PRV"></xsd:enumeration>
+ <xsd:enumeration value="ECDSA_PUB"></xsd:enumeration>
+ <xsd:enumeration value="DSA_PRV"></xsd:enumeration>
+ <xsd:enumeration value="DSA_PUB"></xsd:enumeration>
+ <xsd:enumeration value="AES"></xsd:enumeration>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="CertType">
+ <xsd:complexContent>
+ <xsd:extension base="ObjectType">
+ <xsd:sequence>
+ <xsd:choice maxOccurs="1" minOccurs="1">
+ <xsd:element name="PEM" type="EncodingPemType"
+ maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="DER"
+ type="EncodingDerType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ </xsd:choice>
+ <xsd:element name="Permission" type="PermissionType" maxOccurs="unbounded" minOccurs="0"></xsd:element>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="DataType">
+ <xsd:complexContent>
+ <xsd:extension base="ObjectType">
+ <xsd:sequence>
+ <xsd:choice maxOccurs="1" minOccurs="1">
+ <xsd:element name="ASCII"
+ type="EncodingAsciiType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="Base64"
+ type="EncodingRawType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ </xsd:choice>
+ <xsd:element name="Permission" type="PermissionType" maxOccurs="unbounded" minOccurs="0"></xsd:element>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:simpleType name="EncodingAsciiType">
+ <xsd:restriction base="xsd:string"></xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingDerType">
+ <xsd:restriction base="xsd:string"></xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingPemType">
+ <xsd:restriction base="xsd:string"></xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingRawType">
+ <xsd:restriction base="xsd:string"></xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:complexType name="PermissionType">
+ <xsd:attribute name="accessor" type="xsd:string"></xsd:attribute>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/tests/XML_1_wrong.xml b/tests/XML_1_wrong.xml
new file mode 100644
index 00000000..72a565a8
--- /dev/null
+++ b/tests/XML_1_wrong.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<InitialValues version="0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="initial_values.xsd ">
+ <Key name="key1" type="RSA_PRV" password="123">
+ <PEM>
+ -----BEGIN PUBLIC KEY-----
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2b1bXDa+S8/MGWnMkru4
+ T4tUddtZNi0NVjQn9RFH1NMa220GsRhRO56F77FlSVFKfSfVZKIiWg6C+DVCkcLf
+ zXJ/Z0pvwOQYBAqVMFjV6efQGN0JzJ1Unu7pPRiZl7RKGEI+cyzzrcDyrLLrQ2W7
+ 0ZySkNEOv6Frx9JgC5NExuYY4lk2fQQa38JXiZkfyzif2em0px7mXbyf5LjccsKq
+ v1e+XLtMsL0ZefRcqsP++NzQAI8fKX7WBT+qK0HJDLiHrKOTWYzx6CwJ66LD/vvf
+ j55xtsKDLVDbsotvf8/m6VLMab+vqKk11TP4tq6yo0mwyTADvgl1zowQEO9I1W6o
+ zQIDAQAB
+ -----END PUBLIC KEY-----
+ </PEM>
+ </HERE_GOES_AN_ERROR>
+ <Cert exportable="true" name="cert1">
+ <DER>
+ MIIEgDCCA2igAwIBAgIIcjtBYJGQtOAwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
+ BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
+ cm5ldCBBdXRob3JpdHkgRzIwHhcNMTQwNTIyMTEyOTQyWhcNMTQwODIwMDAwMDAw
+ WjBtMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
+ TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEcMBoGA1UEAwwTYWNj
+ rHva8A==
+ </DER>
+ </Cert>
+ <Data name="data1">
+ <ASCII>
+ My secret data
+ </ASCII>
+ </Data>
+ <Key name="aes1" type="AES">
+ <Base64>
+ MIIEgDCCA2igAwIBAgIIcjtBYJGQtOAwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
+ </Base64>
+ <Permission accessor="web_app1"/>
+ <Permission accessor="web_app2"/>
+ </Key>
+</InitialValues>
diff --git a/tests/XML_1_wrong.xsd b/tests/XML_1_wrong.xsd
new file mode 100644
index 00000000..558e16ac
--- /dev/null
+++ b/tests/XML_1_wrong.xsd
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <xsd:element name="InitialValues" type="InitialValuesType"></xsd:element>
+
+ <xsd:complexType name="InitialValuesType">
+ <xsd:sequence>
+ <xsd:choice maxOccurs="unbounded" minOccurs="1">
+ <xsd:element name="Data" type="DataType"
+ maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="Key" type="KeyType"
+ maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="Cert" type="CertType"
+ maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ </xsd:choice>
+<!-- </xsd:sequence> -->
+ <xsd:attribute name="version" type="xsd:int" use="required"></xsd:attribute>
+ </xsd:complexType>
+
+ <xsd:complexType name="ObjectType">
+ <xsd:attribute name="name" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"></xsd:minLength>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ <xsd:attribute name="password" use="optional"
+ type="xsd:string">
+ </xsd:attribute>
+ <xsd:attribute name="exportable" use="optional"
+ default="false">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:boolean"></xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:complexType>
+
+ <xsd:complexType name="KeyType">
+ <xsd:complexContent>
+ <xsd:extension base="ObjectType">
+ <xsd:sequence>
+ <xsd:choice maxOccurs="1" minOccurs="1">
+ <xsd:element name="PEM"
+ type="EncodingPemType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="DER"
+ type="EncodingDerType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="Base64"
+ type="EncodingRawType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ </xsd:choice>
+ <xsd:element name="Permission" type="PermissionType" maxOccurs="unbounded" minOccurs="0"></xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="type">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="RSA_PRV"></xsd:enumeration>
+ <xsd:enumeration value="RSA_PUB"></xsd:enumeration>
+ <xsd:enumeration value="ECDSA_PRV"></xsd:enumeration>
+ <xsd:enumeration value="ECDSA_PUB"></xsd:enumeration>
+ <xsd:enumeration value="DSA_PRV"></xsd:enumeration>
+ <xsd:enumeration value="DSA_PUB"></xsd:enumeration>
+ <xsd:enumeration value="AES"></xsd:enumeration>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="CertType">
+ <xsd:complexContent>
+ <xsd:extension base="ObjectType">
+ <xsd:sequence>
+ <xsd:choice maxOccurs="1" minOccurs="1">
+ <xsd:element name="PEM" type="EncodingPemType"
+ maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="DER"
+ type="EncodingDerType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ </xsd:choice>
+ <xsd:element name="Permission" type="PermissionType" maxOccurs="unbounded" minOccurs="0"></xsd:element>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="DataType">
+ <xsd:complexContent>
+ <xsd:extension base="ObjectType">
+ <xsd:sequence>
+ <xsd:choice maxOccurs="1" minOccurs="1">
+ <xsd:element name="ASCII"
+ type="EncodingAsciiType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ <xsd:element name="Base64"
+ type="EncodingRawType" maxOccurs="1" minOccurs="1">
+ </xsd:element>
+ </xsd:choice>
+ <xsd:element name="Permission" type="PermissionType" maxOccurs="unbounded" minOccurs="0"></xsd:element>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:simpleType name="EncodingAsciiType">
+ <xsd:restriction base="xsd:string"></xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingDerType">
+ <xsd:restriction base="xsd:string"></xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingPemType">
+ <xsd:restriction base="xsd:string"></xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingRawType">
+ <xsd:restriction base="xsd:string"></xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:complexType name="PermissionType">
+ <xsd:attribute name="accessor" type="xsd:string"></xsd:attribute>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/tests/XML_2_structure.xml b/tests/XML_2_structure.xml
new file mode 100644
index 00000000..02538c4a
--- /dev/null
+++ b/tests/XML_2_structure.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StructureTest version="0">
+<Add>1</Add>
+<Add powerFactor="4">2</Add>
+<Add>3</Add>
+<Add>5</Add>
+<Add dummyAttr="123">7</Add>
+<Add>11</Add>
+<Add>13</Add>
+<Multiply>
+ -10
+</Multiply>
+<Add>17</Add>
+<Add>19</Add>
+<Div>
+
+
+ -2</Div>
+<ExpectedSum>
+ 262
+</ExpectedSum>
+</StructureTest>
diff --git a/tests/test_xml-parser.cpp b/tests/test_xml-parser.cpp
new file mode 100644
index 00000000..04bc72e2
--- /dev/null
+++ b/tests/test_xml-parser.cpp
@@ -0,0 +1,290 @@
+/*
+ * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd 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
+ *
+ *
+ * @file test_xml-parser.cpp
+ * @author Maciej Karpiuk (m.karpiuk2@samsung.com)
+ * @version 1.0
+ * @brief XML parser tests.
+ */
+
+#include <vector>
+#include <boost/test/unit_test.hpp>
+#include <parser.h>
+
+using namespace XML;
+
+namespace
+{
+const char *XML_1_okay = "XML_1_okay.xml";
+const char *XSD_1_okay = "XML_1_okay.xsd";
+const char *XML_1_wrong = "XML_1_wrong.xml";
+const char *XSD_1_wrong = "XML_1_wrong.xsd";
+const char *XML_2_structure = "XML_2_structure.xml";
+const char *XML_3_structure = "XML_3_structure.xml";
+
+std::string format_test_path(const char *file)
+{
+ return std::string("/usr/share/ckm-db-test/") + std::string(file);
+}
+
+bool startCallbackFlag = false;
+XML::Parser::ElementHandlerPtr dummyStartCallback()
+{
+ startCallbackFlag = true;
+ // return empty pointer
+ return XML::Parser::ElementHandlerPtr();
+}
+bool endCallbackFlag = false;
+void dummyEndCallback(const XML::Parser::ElementHandlerPtr &)
+{
+ endCallbackFlag = true;
+}
+}
+
+BOOST_AUTO_TEST_SUITE(XML_PARSER_TEST)
+
+BOOST_AUTO_TEST_CASE(XmlParserTest_wrong_argument)
+{
+ XML::Parser parser(0);
+ BOOST_REQUIRE(Parser::ErrorCode::ERROR_INVALID_ARGUMENT == parser.Validate(0));
+
+ // no listeners
+ BOOST_REQUIRE(Parser::ErrorCode::ERROR_INVALID_ARGUMENT == parser.Parse());
+
+ BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.RegisterElementCb("Key", dummyStartCallback, dummyEndCallback));
+ BOOST_REQUIRE(Parser::ErrorCode::ERROR_XML_PARSE_FAILED == parser.Parse());
+}
+
+BOOST_AUTO_TEST_CASE(XmlParserTest_no_XML_file)
+{
+ XML::Parser parser(format_test_path("i-am-not-here").c_str());
+ BOOST_REQUIRE(Parser::ErrorCode::ERROR_XML_VALIDATION_FAILED == parser.Validate(format_test_path(XSD_1_okay).c_str()));
+}
+
+BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_correct_verify)
+{
+ XML::Parser parser(format_test_path(XML_1_okay).c_str());
+ BOOST_REQUIRE(0 == parser.Validate(format_test_path(XSD_1_okay).c_str()));
+}
+
+BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_wrong_verify)
+{
+ XML::Parser parser(format_test_path(XML_1_wrong).c_str());
+ BOOST_REQUIRE(Parser::ErrorCode::ERROR_XML_VALIDATION_FAILED == parser.Validate(format_test_path(XSD_1_okay).c_str()));
+}
+
+BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_wrong_schema)
+{
+ XML::Parser parser(format_test_path(XML_1_okay).c_str());
+ BOOST_REQUIRE(Parser::ErrorCode::ERROR_XSD_PARSE_FAILED == parser.Validate(format_test_path(XSD_1_wrong).c_str()));
+}
+
+BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_correct_parse_incorrect_callbacks)
+{
+ XML::Parser parser(format_test_path(XML_1_okay).c_str());
+ BOOST_REQUIRE(0 == parser.Validate(format_test_path(XSD_1_okay).c_str()));
+
+ BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.RegisterElementCb("Data", NULL, NULL));
+ BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.Parse());
+}
+
+BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_correct_parse)
+{
+ XML::Parser parser(format_test_path(XML_1_okay).c_str());
+ BOOST_REQUIRE(0 == parser.Validate(format_test_path(XSD_1_okay).c_str()));
+
+ BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.RegisterElementCb("Key", dummyStartCallback, NULL));
+ BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.RegisterElementCb("Cert", NULL, dummyEndCallback));
+ startCallbackFlag = false;
+ endCallbackFlag = false;
+ BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.Parse());
+ BOOST_REQUIRE(startCallbackFlag == true);
+ BOOST_REQUIRE(endCallbackFlag == true);
+}
+
+
+class StructureTest
+{
+public:
+ class ExpectedSumHandler : public XML::Parser::ElementHandler
+ {
+ public:
+ ExpectedSumHandler() : m_value(0) {}
+
+ virtual void Start(const XML::Parser::Attributes &) {}
+ virtual void Characters(const std::string &data) {
+ m_value = atoi(data.c_str());
+ }
+ virtual void End() {}
+
+ int getSum() const {
+ return m_value;
+ }
+
+ protected:
+ int m_value;
+ };
+
+ class MathHandler : public XML::Parser::ElementHandler
+ {
+ public:
+ MathHandler() : m_valueSet(false), m_powerFactor(1) {}
+
+ virtual void Start(const XML::Parser::Attributes &attr) {
+ const auto & it = attr.find("powerFactor");
+ if(it != attr.end())
+ m_powerFactor = atoi(it->second.c_str());
+ }
+ virtual void Characters(const std::string &data) {
+ m_value = pow(atoi(data.c_str()), m_powerFactor);
+ m_valueSet = true;
+ }
+ virtual void End() {}
+
+ virtual int compute(int prevVal) = 0;
+
+ protected:
+ bool m_valueSet;
+ int m_value;
+ int m_powerFactor;
+ };
+ class AddHandler : public MathHandler
+ {
+ public:
+ virtual int compute(int prevVal) {
+ if( !m_valueSet )
+ return prevVal;
+
+ return prevVal + m_value;
+ }
+ };
+
+ class MultiplyHandler : public MathHandler
+ {
+ public:
+ virtual int compute(int prevVal) {
+ if( !m_valueSet )
+ return prevVal;
+
+ return prevVal * m_value;
+ }
+ };
+
+ class DivHandler : public MathHandler
+ {
+ public:
+ virtual int compute(int prevVal) {
+ if( !m_valueSet )
+ return prevVal;
+
+ if(m_value == 0)
+ return prevVal;
+ return prevVal / m_value;
+ }
+ };
+
+ StructureTest(const char *filename) : m_parser(filename), m_sum(0), m_expectedSum(0)
+ {
+ m_parser.RegisterErrorCb(StructureTest::Error);
+ m_parser.RegisterElementCb("Add",
+ [this]() -> XML::Parser::ElementHandlerPtr
+ {
+ return std::make_shared<AddHandler>();
+ },
+ [this](const XML::Parser::ElementHandlerPtr & element)
+ {
+ // add computation
+ if(element)
+ {
+ MathHandler *mathElement = reinterpret_cast<MathHandler*>(element.get());
+ m_sum = mathElement->compute(m_sum);
+ }
+ });
+ m_parser.RegisterElementCb("Multiply",
+ [this]() -> XML::Parser::ElementHandlerPtr
+ {
+ return std::make_shared<MultiplyHandler>();
+ },
+ [this](const XML::Parser::ElementHandlerPtr &element)
+ {
+ // multiply computation
+ if(element)
+ {
+ MathHandler *mathElement = reinterpret_cast<MathHandler*>(element.get());
+ m_sum = mathElement->compute(m_sum);
+ }
+ });
+ m_parser.RegisterElementCb("Div",
+ [this]() -> XML::Parser::ElementHandlerPtr
+ {
+ return std::make_shared<DivHandler>();
+ },
+ [this](const XML::Parser::ElementHandlerPtr &element)
+ {
+ // division computation
+ if(element)
+ {
+ MathHandler *mathElement = reinterpret_cast<MathHandler*>(element.get());
+ m_sum = mathElement->compute(m_sum);
+ }
+ });
+ m_parser.RegisterElementCb("ExpectedSum",
+ [this]() -> XML::Parser::ElementHandlerPtr
+ {
+ return std::make_shared<ExpectedSumHandler>();
+ },
+ [this](const XML::Parser::ElementHandlerPtr &element)
+ {
+ if(element)
+ {
+ ExpectedSumHandler *sumElement = reinterpret_cast<ExpectedSumHandler*>(element.get());
+ m_expectedSum = sumElement->getSum();
+ }
+ });
+ }
+
+ static void Error(const Parser::ErrorType /*errorType*/,
+ const std::string & log_msg)
+ {
+ BOOST_FAIL(log_msg);
+ }
+
+ int Parse()
+ {
+ return m_parser.Parse();
+ }
+
+ int getSum() const {
+ return m_sum;
+ }
+ int getExpectedSum() const {
+ return m_expectedSum;
+ }
+private:
+ XML::Parser m_parser;
+ int m_sum;
+ int m_expectedSum;
+};
+
+BOOST_AUTO_TEST_CASE(XmlParserTest_XML2_structure)
+{
+ StructureTest parser(format_test_path(XML_2_structure).c_str());
+ BOOST_REQUIRE(0 == parser.Parse());
+ BOOST_REQUIRE_MESSAGE(parser.getSum() == parser.getExpectedSum(),
+ "got sum: " << parser.getSum() << " while expected: " << parser.getExpectedSum());
+}
+
+BOOST_AUTO_TEST_SUITE_END()