From 6871fc5b14320ff1e514037a0cc63678b47de9e9 Mon Sep 17 00:00:00 2001 From: Francis Dupont Date: Thu, 12 Jan 2017 11:37:49 +0100 Subject: [PATCH] [5097] Added unit tests for bad pools (cf #3956) --- src/bin/dhcp4/tests/config_parser_unittest.cc | 109 +++++++++++++++++ src/bin/dhcp6/tests/config_parser_unittest.cc | 115 ++++++++++++++++++ 2 files changed, 224 insertions(+) diff --git a/src/bin/dhcp4/tests/config_parser_unittest.cc b/src/bin/dhcp4/tests/config_parser_unittest.cc index ffb5548f4e..c59efc6d09 100644 --- a/src/bin/dhcp4/tests/config_parser_unittest.cc +++ b/src/bin/dhcp4/tests/config_parser_unittest.cc @@ -1466,6 +1466,115 @@ TEST_F(Dhcp4ParserTest, poolPrefixLen) { EXPECT_EQ(4000, subnet->getValid()); } +// Goal of this test is to verify if invalid pool definitions +// return a location in the error message. +TEST_F(Dhcp4ParserTest, badPools) { + + // not a prefix + string config_bogus1 = "{ " + genIfaceConfig() + "," + + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ { " + " \"pools\": [ { \"pool\": \"foo/28\" } ]," + " \"subnet\": \"192.0.2.0/24\" } ]," + "\"valid-lifetime\": 4000 }"; + + // not a length + string config_bogus2 = "{ " + genIfaceConfig() + "," + + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ { " + " \"pools\": [ { \"pool\": \"192.0.2.128/foo\" } ]," + " \"subnet\": \"192.0.2.0/24\" } ]," + "\"valid-lifetime\": 4000 }"; + + // invalid prefix length + string config_bogus3 = "{ " + genIfaceConfig() + "," + + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ { " + " \"pools\": [ { \"pool\": \"192.0.2.128/100\" } ]," + " \"subnet\": \"192.0.2.0/24\" } ]," + "\"valid-lifetime\": 4000 }"; + + // not a prefix nor a min-max + string config_bogus4 = "{ " + genIfaceConfig() + "," + + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ { " + " \"pools\": [ { \"pool\": \"foo\" } ]," + " \"subnet\": \"192.0.2.0/24\" } ]," + "\"valid-lifetime\": 4000 }"; + + // not an address + string config_bogus5 = "{ " + genIfaceConfig() + "," + + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ { " + " \"pools\": [ { \"pool\": \"foo - bar\" } ]," + " \"subnet\": \"192.0.2.0/24\" } ]," + "\"valid-lifetime\": 4000 }"; + + // min > max + string config_bogus6 = "{ " + genIfaceConfig() + "," + + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet4\": [ { " + " \"pools\": [ { \"pool\": \"192.0.2.200 - 192.0.2.100\" } ]," + " \"subnet\": \"192.0.2.0/24\" } ]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json1; + ASSERT_NO_THROW(json1 = parseDHCP4(config_bogus1)); + ConstElementPtr json2; + ASSERT_NO_THROW(json2 = parseDHCP4(config_bogus2)); + ConstElementPtr json3; + ASSERT_NO_THROW(json3 = parseDHCP4(config_bogus3)); + ConstElementPtr json4; + ASSERT_NO_THROW(json4 = parseDHCP4(config_bogus4)); + ConstElementPtr json5; + ASSERT_NO_THROW(json5 = parseDHCP4(config_bogus5)); + ConstElementPtr json6; + ASSERT_NO_THROW(json6 = parseDHCP4(config_bogus6)); + + ConstElementPtr status; + EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json1)); + + // check if returned status is always a failure + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); + + CfgMgr::instance().clear(); + + EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json2)); + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); + + CfgMgr::instance().clear(); + + EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json3)); + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); + + CfgMgr::instance().clear(); + + EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json4)); + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); + + CfgMgr::instance().clear(); + + EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json5)); + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); + + CfgMgr::instance().clear(); + + EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json6)); + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); +} + // The goal of this test is to check whether an option definition // that defines an option carrying an IPv4 address can be created. TEST_F(Dhcp4ParserTest, optionDefIpv4Address) { diff --git a/src/bin/dhcp6/tests/config_parser_unittest.cc b/src/bin/dhcp6/tests/config_parser_unittest.cc index 7876a854cb..7f121d8ff8 100644 --- a/src/bin/dhcp6/tests/config_parser_unittest.cc +++ b/src/bin/dhcp6/tests/config_parser_unittest.cc @@ -1512,6 +1512,121 @@ TEST_F(Dhcp6ParserTest, poolPrefixLen) { EXPECT_EQ(4000, subnet->getValid()); } +// Goal of this test is to verify if invalid pool definitions +// return a location in the error message. +TEST_F(Dhcp6ParserTest, badPools) { + + // not a prefix + string config_bogus1 = "{ " + genIfaceConfig() + "," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet6\": [ { " + " \"pools\": [ { \"pool\": \"foo/80\" } ]," + " \"subnet\": \"2001:db8:1::/64\" } ]," + "\"valid-lifetime\": 4000 }"; + + // not a length + string config_bogus2 = "{ " + genIfaceConfig() + "," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet6\": [ { " + " \"pools\": [ { \"pool\": \"2001:db8:1::/foo\" } ]," + " \"subnet\": \"2001:db8:1::/64\" } ]," + "\"valid-lifetime\": 4000 }"; + + // invalid prefix length + string config_bogus3 = "{ " + genIfaceConfig() + "," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet6\": [ { " + " \"pools\": [ { \"pool\": \"2001:db8:1::/200\" } ]," + " \"subnet\": \"2001:db8:1::/64\" } ]," + "\"valid-lifetime\": 4000 }"; + + // not a prefix nor a min-max + string config_bogus4 = "{ " + genIfaceConfig() + "," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet6\": [ { " + " \"pools\": [ { \"pool\": \"foo\" } ]," + " \"subnet\": \"2001:db8:1::/64\" } ]," + "\"valid-lifetime\": 4000 }"; + + // not an address + string config_bogus5 = "{ " + genIfaceConfig() + "," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet6\": [ { " + " \"pools\": [ { \"pool\": \"foo - bar\" } ]," + " \"subnet\": \"2001:db8:1::/64\" } ]," + "\"valid-lifetime\": 4000 }"; + + // min > max + string config_bogus6 = "{ " + genIfaceConfig() + "," + "\"preferred-lifetime\": 3000," + "\"rebind-timer\": 2000, " + "\"renew-timer\": 1000, " + "\"subnet6\": [ { " + " \"pools\": [ { \"pool\": \"2001:db8::ff:ffff - 2001:db8::\" } ]," + " \"subnet\": \"2001:db8:1::/64\" } ]," + "\"valid-lifetime\": 4000 }"; + + ConstElementPtr json1; + ASSERT_NO_THROW(json1 = parseDHCP6(config_bogus1)); + ConstElementPtr json2; + ASSERT_NO_THROW(json2 = parseDHCP6(config_bogus2)); + ConstElementPtr json3; + ASSERT_NO_THROW(json3 = parseDHCP6(config_bogus3)); + ConstElementPtr json4; + ASSERT_NO_THROW(json4 = parseDHCP6(config_bogus4)); + ConstElementPtr json5; + ASSERT_NO_THROW(json5 = parseDHCP6(config_bogus5)); + ConstElementPtr json6; + ASSERT_NO_THROW(json6 = parseDHCP6(config_bogus6)); + + ConstElementPtr status; + EXPECT_NO_THROW(status = configureDhcp6Server(srv_, json1)); + + // check if returned status is always a failure + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); + + CfgMgr::instance().clear(); + + EXPECT_NO_THROW(status = configureDhcp6Server(srv_, json2)); + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); + + CfgMgr::instance().clear(); + + EXPECT_NO_THROW(status = configureDhcp6Server(srv_, json3)); + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); + + CfgMgr::instance().clear(); + + EXPECT_NO_THROW(status = configureDhcp6Server(srv_, json4)); + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); + + CfgMgr::instance().clear(); + + EXPECT_NO_THROW(status = configureDhcp6Server(srv_, json5)); + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); + + CfgMgr::instance().clear(); + + EXPECT_NO_THROW(status = configureDhcp6Server(srv_, json6)); + checkResult(status, 1); + EXPECT_TRUE(errorContainsPosition(status, "")); +} + // Goal of this test is to verify the basic parsing of a prefix delegation // pool. It uses a single, valid pd pool. TEST_F(Dhcp6ParserTest, pdPoolBasics) { -- 2.47.2