diff options
author | Maciej J. Karpiuk <m.karpiuk2@samsung.com> | 2015-05-06 15:20:41 +0200 |
---|---|---|
committer | Krzysztof Jackiewicz <k.jackiewicz@samsung.com> | 2015-05-19 07:04:45 -0700 |
commit | 82f657827c1c162b72e454784daf92103ed315a4 (patch) | |
tree | 547913e6d179aede9a848a17dcab5c7eda5e482a /tests | |
parent | 68ef1034badf1554b572989f42bf0d9dbd53d95f (diff) | |
download | key-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.txt | 10 | ||||
-rw-r--r-- | tests/XML_1_okay.xml | 38 | ||||
-rw-r--r-- | tests/XML_1_okay.xsd | 128 | ||||
-rw-r--r-- | tests/XML_1_wrong.xml | 38 | ||||
-rw-r--r-- | tests/XML_1_wrong.xsd | 128 | ||||
-rw-r--r-- | tests/XML_2_structure.xml | 22 | ||||
-rw-r--r-- | tests/test_xml-parser.cpp | 290 |
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() |