diff options
author | Tomek Mrugalski <tomasz@isc.org> | 2016-12-06 19:16:03 +0100 |
---|---|---|
committer | Tomek Mrugalski <tomasz@isc.org> | 2016-12-06 19:16:03 +0100 |
commit | 39919c3bd31e1806ccc53df83a626a8ee9123316 (patch) | |
tree | 1fbfee5c4e3b2faf057d69d57a8033a24a6013a7 /src | |
parent | [5014_phase2] Use Dhcp6 (vs JSON) parser as much as possible in unit tests (diff) | |
download | kea-39919c3bd31e1806ccc53df83a626a8ee9123316.tar.xz kea-39919c3bd31e1806ccc53df83a626a8ee9123316.zip |
[5036] Code cleanup
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/dhcp6/dhcp6_lexer.ll | 21 | ||||
-rw-r--r-- | src/bin/dhcp6/dhcp6_parser.yy | 1 | ||||
-rw-r--r-- | src/bin/dhcp6/kea_controller.cc | 4 | ||||
-rw-r--r-- | src/bin/dhcp6/parser_context.h | 69 | ||||
-rw-r--r-- | src/bin/dhcp6/tests/dhcp6_test_utils.h | 4 | ||||
-rw-r--r-- | src/bin/dhcp6/tests/parser_unittest.cc | 108 |
6 files changed, 113 insertions, 94 deletions
diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index efc4b62c74..3d65b8b2eb 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -102,29 +102,28 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} if (start_token_flag) { start_token_flag = false; switch (start_token_value) { - case Parser6Context::PARSER_GENERIC_JSON: + case Parser6Context::SUBPARSER_JSON: default: - return isc::dhcp::Dhcp6Parser::make_TOPLEVEL_GENERIC_JSON(driver.loc_); + return isc::dhcp::Dhcp6Parser::make_SUB_JSON(driver.loc_); +// return isc::dhcp::Dhcp6Parser::make_TOPLEVEL_GENERIC_JSON(driver.loc_); case Parser6Context::PARSER_DHCP6: return isc::dhcp::Dhcp6Parser::make_TOPLEVEL_DHCP6(driver.loc_); case Parser6Context::SUBPARSER_DHCP6: return isc::dhcp::Dhcp6Parser::make_SUB_DHCP6(driver.loc_); - case Parser6Context::SUBPARSER_INTERFACES6: + case Parser6Context::PARSER_INTERFACES: return isc::dhcp::Dhcp6Parser::make_SUB_INTERFACES6(driver.loc_); - case Parser6Context::SUBPARSER_SUBNET6: + case Parser6Context::PARSER_SUBNET6: return isc::dhcp::Dhcp6Parser::make_SUB_SUBNET6(driver.loc_); - case Parser6Context::SUBPARSER_POOL6: + case Parser6Context::PARSER_POOL6: return isc::dhcp::Dhcp6Parser::make_SUB_POOL6(driver.loc_); - case Parser6Context::SUBPARSER_PD_POOL: + case Parser6Context::PARSER_PD_POOL: return isc::dhcp::Dhcp6Parser::make_SUB_PD_POOL(driver.loc_); - case Parser6Context::SUBPARSER_HOST_RESERVATION6: + case Parser6Context::PARSER_HOST_RESERVATION: return isc::dhcp::Dhcp6Parser::make_SUB_RESERVATION(driver.loc_); - case Parser6Context::SUBPARSER_OPTION_DATA: + case Parser6Context::PARSER_OPTION_DATA: return isc::dhcp::Dhcp6Parser::make_SUB_OPTION_DATA(driver.loc_); - case Parser6Context::SUBPARSER_HOOKS_LIBRARY: + case Parser6Context::PARSER_HOOKS_LIBRARY: return isc::dhcp::Dhcp6Parser::make_SUB_HOOKS_LIBRARY(driver.loc_); - case Parser6Context::SUBPARSER_JSON: - return isc::dhcp::Dhcp6Parser::make_SUB_JSON(driver.loc_); } } %} diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index 33c365cf9b..a084ec37bf 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -39,6 +39,7 @@ using namespace std; %define api.token.prefix {TOKEN_} // Tokens in an order which makes sense and related to the intented use. +// Actual regexps for tokens are defined in dhcp6_lexer.ll. %token END 0 "end of file" COMMA "," diff --git a/src/bin/dhcp6/kea_controller.cc b/src/bin/dhcp6/kea_controller.cc index b337b1a4ca..62be83af99 100644 --- a/src/bin/dhcp6/kea_controller.cc +++ b/src/bin/dhcp6/kea_controller.cc @@ -57,12 +57,8 @@ void configure(const std::string& file_name) { } // Read contents of the file and parse it as JSON -#if 0 - json = isc::data::Element::fromJSONFile(file_name, true); -#else Parser6Context parser; json = parser.parseFile(file_name, Parser6Context::PARSER_DHCP6); -#endif if (!json) { isc_throw(isc::BadValue, "no configuration found"); } diff --git a/src/bin/dhcp6/parser_context.h b/src/bin/dhcp6/parser_context.h index 2ba32a572a..e3728c52bf 100644 --- a/src/bin/dhcp6/parser_context.h +++ b/src/bin/dhcp6/parser_context.h @@ -23,6 +23,8 @@ namespace isc { namespace dhcp { /// @brief Evaluation error exception raised when trying to parse. +/// +/// @todo: This probably should be common for Dhcp4 and Dhcp6. class Dhcp6ParseError : public isc::Exception { public: Dhcp6ParseError(const char* file, size_t line, const char* what) : @@ -35,26 +37,53 @@ class Parser6Context { public: - /// @brief Defines currently support the content supported + /// @brief Defines currently supported scopes + /// + /// Dhcp6Parser is able to parse several types of scope. Usually, when it + /// parses a config file, it expects the data to have a map with Dhcp6 in it + /// and all the parameters within that Dhcp6 map. However, sometimes the + /// parser is expected to parse only a subset of that information. For example, + /// it may be asked to parse a structure that is host-reservation only, without + /// the global 'Dhcp6' or 'reservations' around it. In such case the parser + /// is being told to start parsing as SUBPARSER_HOST_RESERVATION6. typedef enum { - PARSER_GENERIC_JSON, // This will parse the content as generic JSON - PARSER_DHCP6, // This will parse the content as DHCP6 config - // DHCP6 config subparsers + /// This parser will parse the content as generic JSON. + //PARSER_GENERIC_JSON, + + SUBPARSER_JSON, + + /// This parser will parse the content as Dhcp6 config wrapped in a map (that's + /// the regular config file) + PARSER_DHCP6, + + /// This parser will parse the content of Dhcp6. It is mostly used + /// in unit-tests as most of the unit-tests do not define the outer + /// map and Dhcp6 entity, just the contents of it. SUBPARSER_DHCP6, - SUBPARSER_INTERFACES6, - SUBPARSER_SUBNET6, - SUBPARSER_POOL6, - SUBPARSER_PD_POOL, - SUBPARSER_HOST_RESERVATION6, - // Common DHCP subparsers - SUBPARSER_OPTION_DEF, - SUBPARSER_OPTION_DATA, - SUBPARSER_HOOKS_LIBRARY, - // SUBPARSER_CONTROL_SOCKET, - // SUBPARSER_D2_CLIENT, - // SUBPARSER_LEASE_EXPIRATION, - // JSON value subparser - SUBPARSER_JSON + + /// This will parse the conde as Subnet6 content. + PARSER_SUBNET6, + + /// This parser will parse pool6 content. + PARSER_POOL6, + + /// This parser will parse the interfaces content. + PARSER_INTERFACES, + + /// This parser will parse the content as pd-pool. + PARSER_PD_POOL, + + /// This parser will parse the content as host-reservation + PARSER_HOST_RESERVATION, + + /// This parser will parse the content as option definition. + PARSER_OPTION_DEF, + + /// This parser will parse the content as option data. + PARSER_OPTION_DATA, + + /// This parser will parse the content as hooks-library + PARSER_HOOKS_LIBRARY } ParserType; /// @brief Default constructor. @@ -108,7 +137,7 @@ public: /// Used by YY_FATAL_ERROR macro so required to be static. static void fatal(const std::string& what); - /// @brief Convert position + /// @brief Converts bison's position to one understandable by isc::data::Element /// /// Convert a bison location into an element position /// (take the begin, the end is lost) @@ -166,7 +195,7 @@ public: std::vector<isc::dhcp::location> locs_; /// @brief Lexer state stack - std::vector<struct yy_buffer_state*> states_;; + std::vector<struct yy_buffer_state*> states_; /// @brief sFile (aka FILE) FILE* sfile_; diff --git a/src/bin/dhcp6/tests/dhcp6_test_utils.h b/src/bin/dhcp6/tests/dhcp6_test_utils.h index 47b4a92500..0ac3cabe22 100644 --- a/src/bin/dhcp6/tests/dhcp6_test_utils.h +++ b/src/bin/dhcp6/tests/dhcp6_test_utils.h @@ -644,7 +644,7 @@ inline isc::data::ConstElementPtr parseJSON(const std::string& in) { isc::dhcp::Parser6Context ctx; - return (ctx.parseString(in, isc::dhcp::Parser6Context::PARSER_GENERIC_JSON)); + return (ctx.parseString(in, isc::dhcp::Parser6Context::SUBPARSER_JSON)); } // For parser testing (DHCP6) @@ -669,7 +669,7 @@ parseOPTION_DEF(const std::string& in) { try { isc::dhcp::Parser6Context ctx; - return (ctx.parseString(in, isc::dhcp::Parser6Context::SUBPARSER_OPTION_DEF)); + return (ctx.parseString(in, isc::dhcp::Parser6Context::PARSER_OPTION_DEF)); } catch (const std::exception& ex) { #ifdef ENABLE_DEBUG diff --git a/src/bin/dhcp6/tests/parser_unittest.cc b/src/bin/dhcp6/tests/parser_unittest.cc index f24ea2745e..3453859ea0 100644 --- a/src/bin/dhcp6/tests/parser_unittest.cc +++ b/src/bin/dhcp6/tests/parser_unittest.cc @@ -65,7 +65,7 @@ void testParser2(const std::string& txt, Parser6Context::ParserType parser_type) TEST(ParserTest, mapInMap) { string txt = "{ \"xyzzy\": { \"foo\": 123, \"baz\": 456 } }"; - testParser(txt, Parser6Context::PARSER_GENERIC_JSON); + testParser(txt, Parser6Context::SUBPARSER_JSON); } TEST(ParserTest, listInList) { @@ -76,7 +76,7 @@ TEST(ParserTest, listInList) { TEST(ParserTest, nestedMaps) { string txt = "{ \"europe\": { \"UK\": { \"London\": { \"street\": \"221B Baker\" }}}}"; - testParser(txt, Parser6Context::PARSER_GENERIC_JSON); + testParser(txt, Parser6Context::SUBPARSER_JSON); } TEST(ParserTest, nestedLists) { @@ -87,7 +87,7 @@ TEST(ParserTest, nestedLists) { TEST(ParserTest, listsInMaps) { string txt = "{ \"constellations\": { \"orion\": [ \"rigel\", \"betelguese\" ], " "\"cygnus\": [ \"deneb\", \"albireo\"] } }"; - testParser(txt, Parser6Context::PARSER_GENERIC_JSON); + testParser(txt, Parser6Context::SUBPARSER_JSON); } TEST(ParserTest, mapsInLists) { @@ -103,7 +103,7 @@ TEST(ParserTest, types) { "\"map\": { \"foo\": \"bar\" }," "\"list\": [ 1, 2, 3 ]," "\"null\": null }"; - testParser(txt, Parser6Context::PARSER_GENERIC_JSON); + testParser(txt, Parser6Context::SUBPARSER_JSON); } TEST(ParserTest, keywordJSON) { @@ -111,7 +111,7 @@ TEST(ParserTest, keywordJSON) { "\"type\": \"password\"," "\"user\": \"name\"," "\"password\": \"type\" }"; - testParser(txt, Parser6Context::PARSER_GENERIC_JSON); + testParser(txt, Parser6Context::SUBPARSER_JSON); } TEST(ParserTest, keywordDhcp6) { @@ -267,148 +267,142 @@ void testError(const std::string& txt, // Check errors TEST(ParserTest, errors) { // no input - testError("", - Parser6Context::PARSER_GENERIC_JSON, - "<string>:1.1: syntax error, unexpected end of file, " - "expecting {"); - testError(" ", - Parser6Context::PARSER_GENERIC_JSON, - "<string>:1.2: syntax error, unexpected end of file, " - "expecting {"); - testError("\n", - Parser6Context::PARSER_GENERIC_JSON, - "<string>:2.1: syntax error, unexpected end of file, " - "expecting {"); + testError("", Parser6Context::SUBPARSER_JSON, + "<string>:1.1: syntax error, unexpected end of file"); + testError(" ", Parser6Context::SUBPARSER_JSON, + "<string>:1.2: syntax error, unexpected end of file"); + testError("\n", Parser6Context::SUBPARSER_JSON, + "<string>:2.1: syntax error, unexpected end of file"); // comments testError("# nothing\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:2.1: syntax error, unexpected end of file, " "expecting {"); testError(" #\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:2.1: syntax error, unexpected end of file, " "expecting {"); testError("// nothing\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:2.1: syntax error, unexpected end of file, " "expecting {"); testError("/* nothing */\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:2.1: syntax error, unexpected end of file, " "expecting {"); testError("/* no\nthing */\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:3.1: syntax error, unexpected end of file, " "expecting {"); testError("/* no\nthing */\n\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:4.1: syntax error, unexpected end of file, " "expecting {"); testError("/* nothing\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "Comment not closed. (/* in line 1"); testError("\n\n\n/* nothing\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "Comment not closed. (/* in line 4"); testError("{ /* */*/ }\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.3-8: Invalid character: *"); testError("{ /* // *// }\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.3-11: Invalid character: /"); testError("{ /* // */// }\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:2.1: syntax error, unexpected end of file, " "expecting }"); // includes testError("<?\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "Directive not closed."); testError("<?include\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "Directive not closed."); string file = string(CFG_EXAMPLES) + "/" + "stateless.json"; testError("<?include \"" + file + "\"\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "Directive not closed."); testError("<?include \"/foo/bar\" ?>/n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "Can't open include file /foo/bar"); // numbers testError("123", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-3: syntax error, unexpected integer, " "expecting {"); testError("-456", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-4: syntax error, unexpected integer, " "expecting {"); testError("-0001", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-5: syntax error, unexpected integer, " "expecting {"); testError("1234567890123456789012345678901234567890", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-40: Failed to convert " "1234567890123456789012345678901234567890" " to an integer."); testError("-3.14e+0", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-8: syntax error, unexpected floating point, " "expecting {"); testError("1e50000", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-7: Failed to convert 1e50000 " "to a floating point."); // strings testError("\"aabb\"", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-6: syntax error, unexpected constant string, " "expecting {"); testError("{ \"aabb\"err", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.9: Invalid character: e"); testError("{ err\"aabb\"", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.3: Invalid character: e"); testError("\"a\n\tb\"", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-6: Invalid control in \"a\n\tb\""); testError("\"a\\n\\tb\"", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-8: syntax error, unexpected constant string, " "expecting {"); testError("\"a\\x01b\"", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-8: Bad escape in \"a\\x01b\""); testError("\"a\\u0062\"", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-9: Unsupported unicode escape in \"a\\u0062\""); testError("\"a\\u062z\"", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-9: Bad escape in \"a\\u062z\""); testError("\"abc\\\"", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1-6: Overflow escape in \"abc\\\""); // from data_unittest.c testError("\\a", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1: Invalid character: \\"); testError("\\", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1: Invalid character: \\"); testError("\\\"\\\"", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1: Invalid character: \\"); // want a map testError("[]\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.1: syntax error, unexpected [, " "expecting {"); testError("[]\n", @@ -416,14 +410,14 @@ TEST(ParserTest, errors) { "<string>:1.1: syntax error, unexpected [, " "expecting {"); testError("{ 123 }\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.3-5: syntax error, unexpected integer, " "expecting }"); testError("{ 123 }\n", Parser6Context::PARSER_DHCP6, "<string>:1.3-5: syntax error, unexpected integer"); testError("{ \"foo\" }\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.9: syntax error, unexpected }, " "expecting :"); testError("{ \"foo\" }\n", @@ -442,21 +436,21 @@ TEST(ParserTest, errors) { "<string>:2.1: syntax error, unexpected end of file, " "expecting \",\" or }"); testError("{}{}\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.3: syntax error, unexpected {, " "expecting end of file"); // bad commas testError("{ , }\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.3: syntax error, unexpected \",\", " "expecting }"); testError("{ , \"foo\":true }\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.3: syntax error, unexpected \",\", " "expecting }"); testError("{ \"foo\":true, }\n", - Parser6Context::PARSER_GENERIC_JSON, + Parser6Context::SUBPARSER_JSON, "<string>:1.15: syntax error, unexpected }, " "expecting constant string"); |