2 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
17 * @file test_xml-parser.cpp
18 * @author Maciej Karpiuk (m.karpiuk2@samsung.com)
20 * @brief XML parser tests.
24 #include <boost/test/unit_test.hpp>
32 const char *XML_1_okay = "XML_1_okay.xml";
33 const char *XSD_1_okay = "XML_1_okay.xsd";
34 const char *XML_1_wrong = "XML_1_wrong.xml";
35 const char *XSD_1_wrong = "XML_1_wrong.xsd";
36 const char *XML_2_structure = "XML_2_structure.xml";
37 const char *XML_3_structure = "XML_3_structure.xml";
39 std::string format_test_path(const char *file)
41 return std::string("/usr/share/ckm-db-test/") + std::string(file);
44 bool startCallbackFlag = false;
45 XML::Parser::ElementHandlerPtr dummyStartCallback()
47 startCallbackFlag = true;
48 // return empty pointer
49 return XML::Parser::ElementHandlerPtr();
51 bool endCallbackFlag = false;
52 void dummyEndCallback(const XML::Parser::ElementHandlerPtr &)
54 endCallbackFlag = true;
58 BOOST_AUTO_TEST_SUITE(XML_PARSER_TEST)
60 BOOST_AUTO_TEST_CASE(XmlParserTest_wrong_argument)
62 std::string emptyPath;
63 XML::Parser parser(emptyPath);
64 BOOST_REQUIRE(Parser::ErrorCode::ERROR_INVALID_ARGUMENT == parser.Validate(emptyPath));
67 BOOST_REQUIRE(Parser::ErrorCode::ERROR_INVALID_ARGUMENT == parser.Parse());
69 BOOST_REQUIRE(Parser::ErrorCode::PARSE_SUCCESS == parser.RegisterElementCb("Key", dummyStartCallback, dummyEndCallback));
70 BOOST_REQUIRE(Parser::ErrorCode::ERROR_XML_PARSE_FAILED == parser.Parse());
73 BOOST_AUTO_TEST_CASE(XmlParserTest_no_XML_file)
75 XML::Parser parser(format_test_path("i-am-not-here").c_str());
76 BOOST_REQUIRE(Parser::ErrorCode::ERROR_XML_VALIDATION_FAILED == parser.Validate(format_test_path(XSD_1_okay).c_str()));
79 BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_correct_verify)
81 XML::Parser parser(format_test_path(XML_1_okay).c_str());
82 BOOST_REQUIRE(0 == parser.Validate(format_test_path(XSD_1_okay).c_str()));
85 BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_wrong_verify)
87 XML::Parser parser(format_test_path(XML_1_wrong).c_str());
88 BOOST_REQUIRE(Parser::ErrorCode::ERROR_XML_VALIDATION_FAILED == parser.Validate(format_test_path(XSD_1_okay).c_str()));
91 BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_wrong_schema)
93 XML::Parser parser(format_test_path(XML_1_okay).c_str());
94 BOOST_REQUIRE(Parser::ErrorCode::ERROR_XSD_PARSE_FAILED == parser.Validate(format_test_path(XSD_1_wrong).c_str()));
97 BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_correct_parse_incorrect_callbacks)
99 XML::Parser parser(format_test_path(XML_1_okay).c_str());
100 BOOST_REQUIRE(0 == parser.Validate(format_test_path(XSD_1_okay).c_str()));
102 BOOST_REQUIRE(Parser::ErrorCode::PARSE_SUCCESS == parser.RegisterElementCb("Data", NULL, NULL));
103 BOOST_REQUIRE(Parser::ErrorCode::PARSE_SUCCESS == parser.Parse());
106 BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_correct_parse)
108 XML::Parser parser(format_test_path(XML_1_okay).c_str());
109 BOOST_REQUIRE(0 == parser.Validate(format_test_path(XSD_1_okay).c_str()));
111 BOOST_REQUIRE(Parser::ErrorCode::PARSE_SUCCESS == parser.RegisterElementCb("Key", dummyStartCallback, NULL));
112 BOOST_REQUIRE(Parser::ErrorCode::PARSE_SUCCESS == parser.RegisterElementCb("Cert", NULL, dummyEndCallback));
113 startCallbackFlag = false;
114 endCallbackFlag = false;
115 BOOST_REQUIRE(Parser::ErrorCode::PARSE_SUCCESS == parser.Parse());
116 BOOST_REQUIRE(startCallbackFlag == true);
117 BOOST_REQUIRE(endCallbackFlag == true);
124 class ExpectedSumHandler : public XML::Parser::ElementHandler
127 ExpectedSumHandler() : m_value(0) {}
129 virtual void Start(const XML::Parser::Attributes &) {}
130 virtual void Characters(const std::string &data) {
131 m_value = atoi(data.c_str());
133 virtual void End() {}
143 class MathHandler : public XML::Parser::ElementHandler
146 MathHandler() : m_valueSet(false), m_powerFactor(1) {}
148 virtual void Start(const XML::Parser::Attributes &attr) {
149 const auto & it = attr.find("powerFactor");
151 m_powerFactor = atoi(it->second.c_str());
153 virtual void Characters(const std::string &data) {
154 m_value = pow(atoi(data.c_str()), m_powerFactor);
157 virtual void End() {}
159 virtual int compute(int prevVal) = 0;
166 class AddHandler : public MathHandler
169 virtual int compute(int prevVal) {
173 return prevVal + m_value;
177 class MultiplyHandler : public MathHandler
180 virtual int compute(int prevVal) {
184 return prevVal * m_value;
188 class DivHandler : public MathHandler
191 virtual int compute(int prevVal) {
197 return prevVal / m_value;
201 StructureTest(const char *filename) : m_parser(filename), m_sum(0), m_expectedSum(0)
203 m_parser.RegisterErrorCb(StructureTest::Error);
204 m_parser.RegisterElementCb("Add",
205 [this]() -> XML::Parser::ElementHandlerPtr
207 return std::make_shared<AddHandler>();
209 [this](const XML::Parser::ElementHandlerPtr & element)
214 MathHandler *mathElement = reinterpret_cast<MathHandler*>(element.get());
215 m_sum = mathElement->compute(m_sum);
218 m_parser.RegisterElementCb("Multiply",
219 [this]() -> XML::Parser::ElementHandlerPtr
221 return std::make_shared<MultiplyHandler>();
223 [this](const XML::Parser::ElementHandlerPtr &element)
225 // multiply computation
228 MathHandler *mathElement = reinterpret_cast<MathHandler*>(element.get());
229 m_sum = mathElement->compute(m_sum);
232 m_parser.RegisterElementCb("Div",
233 [this]() -> XML::Parser::ElementHandlerPtr
235 return std::make_shared<DivHandler>();
237 [this](const XML::Parser::ElementHandlerPtr &element)
239 // division computation
242 MathHandler *mathElement = reinterpret_cast<MathHandler*>(element.get());
243 m_sum = mathElement->compute(m_sum);
246 m_parser.RegisterElementCb("ExpectedSum",
247 [this]() -> XML::Parser::ElementHandlerPtr
249 return std::make_shared<ExpectedSumHandler>();
251 [this](const XML::Parser::ElementHandlerPtr &element)
255 ExpectedSumHandler *sumElement = reinterpret_cast<ExpectedSumHandler*>(element.get());
256 m_expectedSum = sumElement->getSum();
261 static void Error(const Parser::ErrorType /*errorType*/,
262 const std::string & log_msg)
269 return m_parser.Parse();
275 int getExpectedSum() const {
276 return m_expectedSum;
279 XML::Parser m_parser;
284 BOOST_AUTO_TEST_CASE(XmlParserTest_XML2_structure)
286 StructureTest parser(format_test_path(XML_2_structure).c_str());
287 BOOST_REQUIRE(0 == parser.Parse());
288 BOOST_REQUIRE_MESSAGE(parser.getSum() == parser.getExpectedSum(),
289 "got sum: " << parser.getSum() << " while expected: " << parser.getExpectedSum());
292 BOOST_AUTO_TEST_SUITE_END()