add validation for async action
authorJinWang An <jinwang.an@samsung.com>
Mon, 3 Feb 2020 06:29:50 +0000 (15:29 +0900)
committerYoungjae Shin <yj99.shin@samsung.com>
Wed, 18 Mar 2020 08:53:50 +0000 (17:53 +0900)
example/mode/tizen_asyncValidFail_mode.xml [new file with mode: 0644]
supervisor/ModeXMLParser.cpp
supervisor/ModeXMLParser.h
unittest/modes_test_parser.cpp

diff --git a/example/mode/tizen_asyncValidFail_mode.xml b/example/mode/tizen_asyncValidFail_mode.xml
new file mode 100644 (file)
index 0000000..763c8ff
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<tizenModes xmlns="http://www.tizen.org" version="6.0">
+  <mode name="async_valied" type="exclusive" hidden="true">
+    <action rule="test.sleepErrorReturn" stopOnErr="true" type="async">5</action>
+  </mode>
+</tizenModes>
index b6d691b..1fb105b 100644 (file)
@@ -17,6 +17,7 @@
 #include <cstring>
 #include <string>
 #include <utility>
+#include <functional>
 #include <libxml/tree.h>
 #include <libxml/xmlschemas.h>
 #include "mdss.h"
@@ -28,6 +29,7 @@
 
 MODES_NAMESPACE_USE;
 
+
 ModeXMLParser::ModeXMLParser(const std::string &modeFile, RuleManager &rMgr)
        : ModeParser(rMgr), XMLParser(modeFile), isParsedModeAttr(false)
 {
@@ -35,7 +37,7 @@ ModeXMLParser::ModeXMLParser(const std::string &modeFile, RuleManager &rMgr)
 
 Mode ModeXMLParser::getMode()
 {
-       iterateElement(getRoot());
+       iterateElement(getRoot(), std::bind(&ModeXMLParser::parseElement, this, std::placeholders::_1));
        return mode;
 }
 
@@ -72,28 +74,51 @@ void ModeXMLParser::parseModeAttr()
        }
 }
 
+void ModeXMLParser::validateAction(xmlNodePtr node)
+{
+       char *actionTypeProp = (char*)xmlGetProp(node, ModesXMLTag::TYPE);
+       if (actionTypeProp && MDS_EQUAL == strcmp(actionTypeProp, "async")) {
+               char *stopOnErrProp = (char*)xmlGetProp(node, ModesXMLTag::STOP_ON_ERR);
+               if (stopOnErrProp && MDS_EQUAL == strcmp(stopOnErrProp, "true")) {
+                       xmlFree(stopOnErrProp);
+                       xmlFree(actionTypeProp);
+                       ERR("Can NOT support stopOnErr in async");
+                       throw ModesEx(ModesEx::INVALID_ARG);
+               }
+               xmlFree(stopOnErrProp);
+       }
+       xmlFree(actionTypeProp);
+}
+
 void ModeXMLParser::validateMode(const std::string &xsd)
 {
        try {
                validate(xsd);
+               iterateElement(getRoot(), std::bind(&ModeXMLParser::validateElement, this, std::placeholders::_1));
        } catch (ModesEx &e) {
                ERR("validate() Fail(%s)", e.what());
                throw ModesEx(ModesEx::INVALID_ARG);
        }
 }
 
-void ModeXMLParser::iterateElement(xmlNodePtr node)
+void ModeXMLParser::iterateElement(xmlNodePtr node, std::function<void(xmlNodePtr)> func)
 {
        xmlNode *cur = NULL;
        for (cur = node; cur; cur = cur->next) {
                if (xmlIsBlankNode(cur))
                        continue;
 
-               parseElement(cur);
-               iterateElement(cur->children);
+               func(cur);
+               iterateElement(cur->children, func);
        }
 }
 
+void ModeXMLParser::validateElement(xmlNodePtr node)
+{
+       if (MDS_EQUAL == xmlStrcmp(node->name, ModesXMLTag::ACTION))
+               validateAction(node);
+}
+
 void ModeXMLParser::parseElement(xmlNodePtr node)
 {
        if (MDS_EQUAL == xmlStrcmp(node->name, ModesXMLTag::MODE)) {
index e973980..2cd72a4 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <libxml/tree.h>
 #include <utility>
+#include <functional>
 #include "mdss.h"
 #include "ModeParser.h"
 #include "XMLParser.h"
@@ -34,8 +35,6 @@ public:
        void validateMode(const std::string &xsd) override;
 
 private:
-       void iterateElement(xmlNodePtr node);
-       void parseElement(xmlNodePtr node);
        void parseMode(xmlNodePtr node);
        std::string extractModeName(xmlNodePtr node);
        Mode::ModeType extractModeType(xmlNodePtr node);
@@ -45,6 +44,10 @@ private:
        void parseUndo(xmlNodePtr node);
        Action *parseActionInfo(xmlNodePtr node);
        void parseModeAttr();
+       void validateAction(xmlNodePtr node);
+       void validateElement(xmlNodePtr node);
+       void parseElement(xmlNodePtr node);
+       void iterateElement(xmlNodePtr node, std::function<void(xmlNodePtr)> func);
 
        Mode mode;
        std::string filePath;
index af8aec1..b7e0b75 100644 (file)
@@ -121,6 +121,13 @@ TEST_F(ParserTest, invalidActionValue)
        EXPECT_THROW(modeparser2.getMode(), ModesEx);
 }
 
+TEST_F(ParserTest, validateAsyncStopOnErr)
+{
+       ModeXMLParser modeparser("tizen_asyncValidFail_mode.xml", ruleMgr);
+
+       EXPECT_THROW(modeparser.validateMode(MODES_MODE_DEFAULT_XSD_FILE), ModesEx);
+}
+
 TEST_F(ParserTest, printError)
 {
        EXPECT_NO_THROW(