Browse Source

[5017] More parseDHCP4 (unfinished)

Francis Dupont 8 years ago
parent
commit
948ad391f2
1 changed files with 152 additions and 103 deletions
  1. 152 103
      src/bin/dhcp4/tests/config_parser_unittest.cc

+ 152 - 103
src/bin/dhcp4/tests/config_parser_unittest.cc

@@ -1197,8 +1197,6 @@ TEST_F(Dhcp4ParserTest, nextServerOverride) {
 // Check whether it is possible to configure echo-client-id
 TEST_F(Dhcp4ParserTest, echoClientId) {
 
-    ConstElementPtr status;
-
     string config_false = "{ " + genIfaceConfig() + "," +
         "\"rebind-timer\": 2000, "
         "\"renew-timer\": 1000, "
@@ -1217,13 +1215,16 @@ TEST_F(Dhcp4ParserTest, echoClientId) {
         "    \"subnet\": \"192.0.2.0/24\" } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json_false = Element::fromJSON(config_false);
-    ElementPtr json_true = Element::fromJSON(config_true);
+    ConstElementPtr json_false;
+    ASSERT_NO_THROW(json_false = parseDHCP4(config_false));
+    ConstElementPtr json_true;
+    ASSERT_NO_THROW(json_true = parseDHCP4(config_true));
 
     // Let's check the default. It should be true
     ASSERT_TRUE(CfgMgr::instance().echoClientId());
 
     // Now check that "false" configuration is really applied.
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json_false));
     ASSERT_FALSE(CfgMgr::instance().echoClientId());
 
@@ -1240,8 +1241,6 @@ TEST_F(Dhcp4ParserTest, echoClientId) {
 // This test checks that the global match-client-id parameter is optional
 // and that values under the subnet are used.
 TEST_F(Dhcp4ParserTest, matchClientIdNoGlobal) {
-    ConstElementPtr status;
-
     std::string config = "{ " + genIfaceConfig() + "," +
         "\"rebind-timer\": 2000, "
         "\"renew-timer\": 1000, "
@@ -1258,7 +1257,10 @@ TEST_F(Dhcp4ParserTest, matchClientIdNoGlobal) {
         "} ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
+
+    ConstElementPtr status;
     ASSERT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     checkResult(status, 0);
 
@@ -1276,8 +1278,6 @@ TEST_F(Dhcp4ParserTest, matchClientIdNoGlobal) {
 // when there is no such parameter under subnet and that the parameter
 // specified for a subnet overrides the global setting.
 TEST_F(Dhcp4ParserTest, matchClientIdGlobal) {
-    ConstElementPtr status;
-
     std::string config = "{ " + genIfaceConfig() + "," +
         "\"rebind-timer\": 2000, "
         "\"renew-timer\": 1000, "
@@ -1294,7 +1294,10 @@ TEST_F(Dhcp4ParserTest, matchClientIdGlobal) {
         "} ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
+
+    ConstElementPtr status;
     ASSERT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     checkResult(status, 0);
 
@@ -1312,8 +1315,6 @@ TEST_F(Dhcp4ParserTest, matchClientIdGlobal) {
 // on a per subnet basis.
 TEST_F(Dhcp4ParserTest, subnetLocal) {
 
-    ConstElementPtr status;
-
     string config = "{ " + genIfaceConfig() + "," +
         "\"rebind-timer\": 2000, "
         "\"renew-timer\": 1000, "
@@ -1325,8 +1326,10 @@ TEST_F(Dhcp4ParserTest, subnetLocal) {
         "    \"subnet\": \"192.0.2.0/24\" } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
     // returned value should be 0 (configuration success)
@@ -1363,8 +1366,8 @@ TEST_F(Dhcp4ParserTest, multiplePools) {
         "    \"subnet\": \"192.0.3.0/24\""
         " } ],"
         "\"valid-lifetime\": 4000 }";
-    ElementPtr json;
-    ASSERT_NO_THROW(json = Element::fromJSON(config));
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     ConstElementPtr status;
     ASSERT_NO_THROW(status = configureDhcp4Server(*srv_, json));
@@ -1402,8 +1405,6 @@ TEST_F(Dhcp4ParserTest, multiplePools) {
 // pool are rejected.
 TEST_F(Dhcp4ParserTest, poolOutOfSubnet) {
 
-    ConstElementPtr status;
-
     string config = "{ " + genIfaceConfig() + "," +
         "\"rebind-timer\": 2000, "
         "\"renew-timer\": 1000, "
@@ -1412,8 +1413,10 @@ TEST_F(Dhcp4ParserTest, poolOutOfSubnet) {
         "    \"subnet\": \"192.0.2.0/24\" } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
     // returned value must be 1 (values error)
@@ -1427,8 +1430,6 @@ TEST_F(Dhcp4ParserTest, poolOutOfSubnet) {
 // notation as it was tested in several previous tests.
 TEST_F(Dhcp4ParserTest, poolPrefixLen) {
 
-    ConstElementPtr status;
-
     string config = "{ " + genIfaceConfig() + "," +
         "\"rebind-timer\": 2000, "
         "\"renew-timer\": 1000, "
@@ -1437,8 +1438,10 @@ TEST_F(Dhcp4ParserTest, poolPrefixLen) {
         "    \"subnet\": \"192.0.2.0/24\" } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
     // returned value must be 0 (configuration accepted)
@@ -1465,7 +1468,8 @@ TEST_F(Dhcp4ParserTest, optionDefIpv4Address) {
         "      \"space\": \"isc\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config, true));
 
     // Make sure that the particular option definition does not exist.
     OptionDefinitionPtr def = CfgMgr::instance().getStagingCfg()->
@@ -1507,7 +1511,8 @@ TEST_F(Dhcp4ParserTest, optionDefIpv4Address) {
     // configuration and should result in removal of the option 100 from the
     // libdhcp++.
     config = "{ }";
-    json = Element::fromJSON(config);
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config, true));
+
     ASSERT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     checkResult(status, 0);
 
@@ -1529,7 +1534,8 @@ TEST_F(Dhcp4ParserTest, optionDefRecord) {
         "      \"space\": \"isc\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Make sure that the particular option definition does not exist.
     OptionDefinitionPtr def = CfgMgr::instance().getStagingCfg()->
@@ -1582,7 +1588,8 @@ TEST_F(Dhcp4ParserTest, optionDefMultiple) {
         "      \"space\": \"isc\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Make sure that the option definitions do not exist yet.
     ASSERT_FALSE(CfgMgr::instance().getStagingCfg()->
@@ -1650,7 +1657,8 @@ TEST_F(Dhcp4ParserTest, optionDefDuplicate) {
         "      \"space\": \"isc\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Make sure that the option definition does not exist yet.
     ASSERT_FALSE(CfgMgr::instance().getStagingCfg()->
@@ -1688,7 +1696,8 @@ TEST_F(Dhcp4ParserTest, optionDefArray) {
         "      \"space\": \"isc\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Make sure that the particular option definition does not exist.
     OptionDefinitionPtr def = CfgMgr::instance().getStagingCfg()->
@@ -1729,7 +1738,8 @@ TEST_F(Dhcp4ParserTest, optionDefEncapsulate) {
         "      \"encapsulate\": \"sub-opts-space\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Make sure that the particular option definition does not exist.
     OptionDefinitionPtr def = CfgMgr::instance().getStagingCfg()->
@@ -1768,7 +1778,8 @@ TEST_F(Dhcp4ParserTest, optionDefInvalidName) {
         "      \"space\": \"isc\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Use the configuration string to create new option definition.
     ConstElementPtr status;
@@ -1792,7 +1803,8 @@ TEST_F(Dhcp4ParserTest, optionDefInvalidType) {
         "      \"space\": \"isc\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Use the configuration string to create new option definition.
     ConstElementPtr status;
@@ -1817,7 +1829,8 @@ TEST_F(Dhcp4ParserTest, optionDefInvalidRecordType) {
         "      \"space\": \"isc\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Use the configuration string to create new option definition.
     ConstElementPtr status;
@@ -1842,7 +1855,8 @@ TEST_F(Dhcp4ParserTest, optionDefInvalidEncapsulatedSpace) {
         "      \"encapsulate\": \"invalid%space%name\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Use the configuration string to create new option definition.
     ConstElementPtr status;
@@ -1870,7 +1884,8 @@ TEST_F(Dhcp4ParserTest, optionDefEncapsulatedSpaceAndArray) {
         "      \"encapsulate\": \"valid-space-name\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Use the configuration string to create new option definition.
     ConstElementPtr status;
@@ -1895,7 +1910,8 @@ TEST_F(Dhcp4ParserTest, optionDefEncapsulateOwnSpace) {
         "      \"encapsulate\": \"isc\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Use the configuration string to create new option definition.
     ConstElementPtr status;
@@ -1923,7 +1939,8 @@ TEST_F(Dhcp4ParserTest, optionStandardDefOverride) {
         "      \"space\": \"dhcp4\""
         "  } ]"
         "}";
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     OptionDefinitionPtr def = CfgMgr::instance().getStagingCfg()->
         getCfgOptionDef()->get(DHCP4_OPTION_SPACE, 109);
@@ -1957,7 +1974,7 @@ TEST_F(Dhcp4ParserTest, optionStandardDefOverride) {
         "      \"space\": \"dhcp4\""
         "  } ]"
         "}";
-    json = Element::fromJSON(config);
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Use the configuration string to create new option definition.
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
@@ -1979,7 +1996,7 @@ TEST_F(Dhcp4ParserTest, optionStandardDefOverride) {
         "      \"space\": \"dhcp4\""
         "  } ]"
         "}";
-    json = Element::fromJSON(config);
+    ASSERT_NO_THROW(json = parseOPTION_DEF(config));
 
     // Use the configuration string to create new option definition.
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
@@ -2021,7 +2038,8 @@ TEST_F(Dhcp4ParserTest, optionDataDefaultsGlobal) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json));
     checkResult(x, 0);
@@ -2090,7 +2108,8 @@ TEST_F(Dhcp4ParserTest, optionDataDefaultsSubnet) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json));
     checkResult(x, 0);
@@ -2170,10 +2189,10 @@ TEST_F(Dhcp4ParserTest, optionDataTwoSpaces) {
         " } ]"
         "}";
 
-    ConstElementPtr status;
-
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     ASSERT_TRUE(status);
     checkResult(status, 0);
@@ -2245,10 +2264,10 @@ TEST_F(Dhcp4ParserTest, optionDataEncapsulate) {
         " } ]"
         "}";
 
-    ConstElementPtr status;
-
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     ASSERT_TRUE(status);
     checkResult(status, 0);
@@ -2302,7 +2321,7 @@ TEST_F(Dhcp4ParserTest, optionDataEncapsulate) {
         " } ]"
         "}";
 
-    json = Element::fromJSON(config);
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     ASSERT_TRUE(status);
@@ -2362,7 +2381,8 @@ TEST_F(Dhcp4ParserTest, optionDataInSingleSubnet) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json));
     checkResult(x, 0);
@@ -2509,7 +2529,8 @@ TEST_F(Dhcp4ParserTest, optionDataInMultipleSubnets) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json));
     checkResult(x, 0);
@@ -2612,7 +2633,8 @@ TEST_F(Dhcp4ParserTest, optionDataUnexpectedPrefix) {
 TEST_F(Dhcp4ParserTest, optionDataLowerCase) {
     ConstElementPtr x;
     std::string config = createConfigWithOption("0a0b0C0D", "data");
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json));
     checkResult(x, 0);
@@ -2655,7 +2677,8 @@ TEST_F(Dhcp4ParserTest, stdOptionData) {
     params["csv-format"] = "true";
 
     std::string config = createConfigWithOption(params);
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json));
     checkResult(x, 0);
@@ -2713,8 +2736,8 @@ TEST_F(Dhcp4ParserTest, DISABLED_Uint32Parser) {
 
     // CASE 1: 0 - minimum value, should work
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_,
-                    Element::fromJSON("{\"version\": 0,"
-                                      "\"renew-timer\": 0}")));
+                    parseDHCP4("{\"version\": 0,"
+                               "\"renew-timer\": 0}")));
 
     // returned value must be ok (0 is a proper value)
     checkResult(status, 0);
@@ -2722,8 +2745,8 @@ TEST_F(Dhcp4ParserTest, DISABLED_Uint32Parser) {
 
     // CASE 2: 4294967295U (UINT_MAX) should work as well
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_,
-                    Element::fromJSON("{\"version\": 0,"
-                                      "\"renew-timer\": 4294967295}")));
+                    parseDHCP4("{\"version\": 0,"
+                               "\"renew-timer\": 4294967295}")));
 
     // returned value must be ok (0 is a proper value)
     checkResult(status, 0);
@@ -2731,8 +2754,8 @@ TEST_F(Dhcp4ParserTest, DISABLED_Uint32Parser) {
 
     // CASE 3: 4294967296U (UINT_MAX + 1) should not work
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_,
-                    Element::fromJSON("{\"version\": 0,"
-                                      "\"renew-timer\": 4294967296}")));
+                    parseJSON("{\"version\": 0,"
+                              "\"renew-timer\": 4294967296}")));
 
     // returned value must be rejected (1 configuration error)
     checkResult(status, 1);
@@ -2740,8 +2763,8 @@ TEST_F(Dhcp4ParserTest, DISABLED_Uint32Parser) {
 
     // CASE 4: -1 (UINT_MIN -1 ) should not work
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_,
-                    Element::fromJSON("{\"version\": 0,"
-                                      "\"renew-timer\": -1}")));
+                    parseJSON("{\"version\": 0,"
+                              "\"renew-timer\": -1}")));
 
     // returned value must be rejected (1 configuration error)
     checkResult(status, 1);
@@ -2784,10 +2807,10 @@ TEST_F(Dhcp4ParserTest, stdOptionDataEncapsulate) {
         " } ]"
         "}";
 
-    ConstElementPtr status;
-
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     ASSERT_TRUE(status);
     checkResult(status, 0);
@@ -2841,7 +2864,7 @@ TEST_F(Dhcp4ParserTest, stdOptionDataEncapsulate) {
         "}";
 
 
-    json = Element::fromJSON(config);
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     ASSERT_TRUE(status);
@@ -2919,10 +2942,10 @@ TEST_F(Dhcp4ParserTest, vendorOptionsHex) {
         " } ]"
         "}";
 
-    ConstElementPtr status;
-
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     ASSERT_TRUE(status);
     checkResult(status, 0);
@@ -2974,10 +2997,10 @@ TEST_F(Dhcp4ParserTest, vendorOptionsCsv) {
         " } ]"
         "}";
 
-    ConstElementPtr status;
-
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     ASSERT_TRUE(status);
     checkResult(status, 0);
@@ -3089,8 +3112,9 @@ TEST_F(Dhcp4ParserTest, InvalidLibrary) {
     // Parse a configuration containing a failing library.
     string config = buildHooksLibrariesConfig(NOT_PRESENT_LIBRARY);
 
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
     ConstElementPtr status;
-    ElementPtr json = Element::fromJSON(config);
     ASSERT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
     // The status object must not be NULL
@@ -3150,7 +3174,8 @@ TEST_F(Dhcp4ParserTest, selectedInterfaces) {
         "\"renew-timer\": 1000, "
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     ConstElementPtr status;
 
@@ -3188,7 +3213,8 @@ TEST_F(Dhcp4ParserTest, allInterfaces) {
         "\"renew-timer\": 1000, "
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     ConstElementPtr status;
 
@@ -3221,7 +3247,8 @@ TEST_F(Dhcp4ParserTest, selectedInterfacesAndAddresses) {
         "\"renew-timer\": 1000, "
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     ConstElementPtr status;
 
@@ -3285,8 +3312,8 @@ TEST_F(Dhcp4ParserTest, d2ClientConfig) {
         "\"valid-lifetime\": 4000 }";
 
     // Convert the JSON string to configuration elements.
-    ElementPtr config;
-    ASSERT_NO_THROW(config = Element::fromJSON(config_str));
+    ConstElementPtr config;
+    ASSERT_NO_THROW(config = parseDHCP4(config_str));
 
     // Pass the configuration in for parsing.
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, config));
@@ -3347,8 +3374,8 @@ TEST_F(Dhcp4ParserTest, invalidD2ClientConfig) {
         "\"valid-lifetime\": 4000 }";
 
     // Convert the JSON string to configuration elements.
-    ElementPtr config;
-    ASSERT_NO_THROW(config = Element::fromJSON(config_str));
+    ConstElementPtr config;
+    ASSERT_NO_THROW(config = parseDHCP4(config_str));
 
     // Configuration should not throw, but should fail.
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, config));
@@ -3385,7 +3412,8 @@ TEST_F(Dhcp4ParserTest, subnetRelayInfo) {
         "    \"subnet\": \"192.0.2.0/24\" } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
@@ -3426,7 +3454,8 @@ TEST_F(Dhcp4ParserTest, classifySubnets) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json));
     checkResult(x, 0);
@@ -3570,7 +3599,8 @@ TEST_F(Dhcp4ParserTest, reservations) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json));
     checkResult(x, 0);
@@ -3711,7 +3741,7 @@ TEST_F(Dhcp4ParserTest, reservationWithOptionDefinition) {
         "          \"space\": \"isc\""
         "        }"
         "        ]"
-        "      },"
+        "      }"
         "    ],"
         "    \"pools\": [ { \"pool\": \"192.0.3.101 - 192.0.3.150\" } ],"
         "    \"subnet\": \"192.0.3.0/24\", "
@@ -3720,7 +3750,8 @@ TEST_F(Dhcp4ParserTest, reservationWithOptionDefinition) {
         "\"valid-lifetime\": 4000"
         "}";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config, true));
 
     EXPECT_NO_THROW(x = configureDhcp4Server(*srv_, json));
     checkResult(x, 0);
@@ -3772,7 +3803,8 @@ TEST_F(Dhcp4ParserTest, reservationBogus) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseJSON(config));
 
     CfgMgr::instance().clear();
 
@@ -3799,7 +3831,7 @@ TEST_F(Dhcp4ParserTest, reservationBogus) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    json = Element::fromJSON(config);
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     // Remove existing configuration, if any.
     CfgMgr::instance().clear();
@@ -3824,7 +3856,7 @@ TEST_F(Dhcp4ParserTest, reservationBogus) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    json = Element::fromJSON(config);
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     // Remove existing configuration, if any.
     CfgMgr::instance().clear();
@@ -3855,7 +3887,7 @@ TEST_F(Dhcp4ParserTest, reservationBogus) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    json = Element::fromJSON(config);
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     // Remove existing configuration, if any.
     CfgMgr::instance().clear();
@@ -3900,7 +3932,8 @@ TEST_F(Dhcp4ParserTest, hostReservationPerSubnet) {
         " } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(hr_config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(hr_config));
     ConstElementPtr result;
     EXPECT_NO_THROW(result = configureDhcp4Server(*srv_, json));
 
@@ -3946,7 +3979,8 @@ TEST_F(Dhcp4ParserTest, declineTimerDefault) {
         "\"subnet4\": [ ]"
         "}";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
@@ -3968,7 +4002,8 @@ TEST_F(Dhcp4ParserTest, declineTimer) {
         "\"subnet4\": [ ]"
         "}";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
@@ -3990,7 +4025,8 @@ TEST_F(Dhcp4ParserTest, declineTimerError) {
         "\"subnet4\": [ ]"
         "}";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseJSON(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
@@ -4018,7 +4054,8 @@ TEST_F(Dhcp4ParserTest, expiredLeasesProcessing) {
         "\"subnet4\": [ ]"
         "}";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
@@ -4058,7 +4095,8 @@ TEST_F(Dhcp4ParserTest, expiredLeasesProcessingError) {
         "\"subnet4\": [ ]"
         "}";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
@@ -4086,7 +4124,8 @@ TEST_F(Dhcp4ParserTest, 4o6default) {
         "    \"subnet\": \"192.0.2.0/24\" } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
@@ -4119,7 +4158,8 @@ TEST_F(Dhcp4ParserTest, 4o6subnet) {
         "    \"4o6-subnet\": \"2001:db8::123/45\" } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
@@ -4177,9 +4217,12 @@ TEST_F(Dhcp4ParserTest, 4o6subnetBogus) {
         "\"valid-lifetime\": 4000 }"
     };
 
-    ElementPtr json1 = Element::fromJSON(config[0]);
-    ElementPtr json2 = Element::fromJSON(config[0]);
-    ElementPtr json3 = Element::fromJSON(config[0]);
+    ConstElementPtr json1;
+    ASSERT_NO_THROW(json1 = parseDHCP4(config[0]));
+    ConstElementPtr json2;
+    ASSERT_NO_THROW(json2 = parseDHCP4(config[0]));
+    ConstElementPtr json3;
+    ASSERT_NO_THROW(json3 = parseDHCP4(config[0]));
 
     // Check that the first config is rejected.
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json1));
@@ -4211,7 +4254,8 @@ TEST_F(Dhcp4ParserTest, 4o6iface) {
         "    \"4o6-interface\": \"ethX\" } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
@@ -4246,7 +4290,8 @@ TEST_F(Dhcp4ParserTest, 4o6subnetIface) {
         "    \"4o6-interface\": \"ethX\" } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
@@ -4283,7 +4328,8 @@ TEST_F(Dhcp4ParserTest, 4o6subnetInterfaceId) {
         "    \"4o6-interface-id\": \"vlan123\" } ],"
         "\"valid-lifetime\": 4000 }";
 
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
 
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
 
@@ -4331,9 +4377,11 @@ TEST_F(Dhcp4ParserTest, validClientClassDictionary) {
         " } ] \n"
         "} \n";
 
-    ConstElementPtr status;
-    ElementPtr json = Element::fromJSON(config);
 
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseDHCP4(config));
+
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     ASSERT_TRUE(status);
     checkResult(status, 0);
@@ -4372,9 +4420,10 @@ TEST_F(Dhcp4ParserTest, invalidClientClassDictionary) {
         " } ] \n"
         "} \n";
 
-    ConstElementPtr status;
-    ElementPtr json = Element::fromJSON(config);
+    ConstElementPtr json;
+    ASSERT_NO_THROW(json = parseJSON(config));
 
+    ConstElementPtr status;
     EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
     ASSERT_TRUE(status);
     checkResult(status, 1);