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>
31 const char *XML_1_okay = "XML_1_okay.xml";
32 const char *XSD_1_okay = "XML_1_okay.xsd";
33 const char *XML_1_wrong = "XML_1_wrong.xml";
34 const char *XSD_1_wrong = "XML_1_wrong.xsd";
35 const char *XML_2_structure = "XML_2_structure.xml";
36 const char *XML_3_structure = "XML_3_structure.xml";
38 std::string format_test_path(const char *file)
40 return std::string("/usr/share/ckm-db-test/") + std::string(file);
43 bool startCallbackFlag = false;
44 XML::Parser::ElementHandlerPtr dummyStartCallback()
46 startCallbackFlag = true;
47 // return empty pointer
48 return XML::Parser::ElementHandlerPtr();
50 bool endCallbackFlag = false;
51 void dummyEndCallback(const XML::Parser::ElementHandlerPtr &)
53 endCallbackFlag = true;
57 BOOST_AUTO_TEST_SUITE(XML_PARSER_TEST)
59 BOOST_AUTO_TEST_CASE(XmlParserTest_wrong_argument)
61 XML::Parser parser(0);
62 BOOST_REQUIRE(Parser::ErrorCode::ERROR_INVALID_ARGUMENT == parser.Validate(0));
65 BOOST_REQUIRE(Parser::ErrorCode::ERROR_INVALID_ARGUMENT == parser.Parse());
67 BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.RegisterElementCb("Key", dummyStartCallback, dummyEndCallback));
68 BOOST_REQUIRE(Parser::ErrorCode::ERROR_XML_PARSE_FAILED == parser.Parse());
71 BOOST_AUTO_TEST_CASE(XmlParserTest_no_XML_file)
73 XML::Parser parser(format_test_path("i-am-not-here").c_str());
74 BOOST_REQUIRE(Parser::ErrorCode::ERROR_XML_VALIDATION_FAILED == parser.Validate(format_test_path(XSD_1_okay).c_str()));
77 BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_correct_verify)
79 XML::Parser parser(format_test_path(XML_1_okay).c_str());
80 BOOST_REQUIRE(0 == parser.Validate(format_test_path(XSD_1_okay).c_str()));
83 BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_wrong_verify)
85 XML::Parser parser(format_test_path(XML_1_wrong).c_str());
86 BOOST_REQUIRE(Parser::ErrorCode::ERROR_XML_VALIDATION_FAILED == parser.Validate(format_test_path(XSD_1_okay).c_str()));
89 BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_wrong_schema)
91 XML::Parser parser(format_test_path(XML_1_okay).c_str());
92 BOOST_REQUIRE(Parser::ErrorCode::ERROR_XSD_PARSE_FAILED == parser.Validate(format_test_path(XSD_1_wrong).c_str()));
95 BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_correct_parse_incorrect_callbacks)
97 XML::Parser parser(format_test_path(XML_1_okay).c_str());
98 BOOST_REQUIRE(0 == parser.Validate(format_test_path(XSD_1_okay).c_str()));
100 BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.RegisterElementCb("Data", NULL, NULL));
101 BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.Parse());
104 BOOST_AUTO_TEST_CASE(XmlParserTest_XML1_correct_parse)
106 XML::Parser parser(format_test_path(XML_1_okay).c_str());
107 BOOST_REQUIRE(0 == parser.Validate(format_test_path(XSD_1_okay).c_str()));
109 BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.RegisterElementCb("Key", dummyStartCallback, NULL));
110 BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.RegisterElementCb("Cert", NULL, dummyEndCallback));
111 startCallbackFlag = false;
112 endCallbackFlag = false;
113 BOOST_REQUIRE(Parser::ErrorCode::SUCCESS == parser.Parse());
114 BOOST_REQUIRE(startCallbackFlag == true);
115 BOOST_REQUIRE(endCallbackFlag == true);
122 class ExpectedSumHandler : public XML::Parser::ElementHandler
125 ExpectedSumHandler() : m_value(0) {}
127 virtual void Start(const XML::Parser::Attributes &) {}
128 virtual void Characters(const std::string &data) {
129 m_value = atoi(data.c_str());
131 virtual void End() {}
141 class MathHandler : public XML::Parser::ElementHandler
144 MathHandler() : m_valueSet(false), m_powerFactor(1) {}
146 virtual void Start(const XML::Parser::Attributes &attr) {
147 const auto & it = attr.find("powerFactor");
149 m_powerFactor = atoi(it->second.c_str());
151 virtual void Characters(const std::string &data) {
152 m_value = pow(atoi(data.c_str()), m_powerFactor);
155 virtual void End() {}
157 virtual int compute(int prevVal) = 0;
164 class AddHandler : public MathHandler
167 virtual int compute(int prevVal) {
171 return prevVal + m_value;
175 class MultiplyHandler : public MathHandler
178 virtual int compute(int prevVal) {
182 return prevVal * m_value;
186 class DivHandler : public MathHandler
189 virtual int compute(int prevVal) {
195 return prevVal / m_value;
199 StructureTest(const char *filename) : m_parser(filename), m_sum(0), m_expectedSum(0)
201 m_parser.RegisterErrorCb(StructureTest::Error);
202 m_parser.RegisterElementCb("Add",
203 [this]() -> XML::Parser::ElementHandlerPtr
205 return std::make_shared<AddHandler>();
207 [this](const XML::Parser::ElementHandlerPtr & element)
212 MathHandler *mathElement = reinterpret_cast<MathHandler*>(element.get());
213 m_sum = mathElement->compute(m_sum);
216 m_parser.RegisterElementCb("Multiply",
217 [this]() -> XML::Parser::ElementHandlerPtr
219 return std::make_shared<MultiplyHandler>();
221 [this](const XML::Parser::ElementHandlerPtr &element)
223 // multiply computation
226 MathHandler *mathElement = reinterpret_cast<MathHandler*>(element.get());
227 m_sum = mathElement->compute(m_sum);
230 m_parser.RegisterElementCb("Div",
231 [this]() -> XML::Parser::ElementHandlerPtr
233 return std::make_shared<DivHandler>();
235 [this](const XML::Parser::ElementHandlerPtr &element)
237 // division computation
240 MathHandler *mathElement = reinterpret_cast<MathHandler*>(element.get());
241 m_sum = mathElement->compute(m_sum);
244 m_parser.RegisterElementCb("ExpectedSum",
245 [this]() -> XML::Parser::ElementHandlerPtr
247 return std::make_shared<ExpectedSumHandler>();
249 [this](const XML::Parser::ElementHandlerPtr &element)
253 ExpectedSumHandler *sumElement = reinterpret_cast<ExpectedSumHandler*>(element.get());
254 m_expectedSum = sumElement->getSum();
259 static void Error(const Parser::ErrorType /*errorType*/,
260 const std::string & log_msg)
267 return m_parser.Parse();
273 int getExpectedSum() const {
274 return m_expectedSum;
277 XML::Parser m_parser;
282 BOOST_AUTO_TEST_CASE(XmlParserTest_XML2_structure)
284 StructureTest parser(format_test_path(XML_2_structure).c_str());
285 BOOST_REQUIRE(0 == parser.Parse());
286 BOOST_REQUIRE_MESSAGE(parser.getSum() == parser.getExpectedSum(),
287 "got sum: " << parser.getSum() << " while expected: " << parser.getExpectedSum());
290 BOOST_AUTO_TEST_SUITE_END()