]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1265] Removed the random index for subnets
authorFrancis Dupont <fdupont@isc.org>
Tue, 2 Jun 2020 19:01:32 +0000 (21:01 +0200)
committerRazvan Becheriu <razvan@isc.org>
Mon, 27 Jul 2020 12:34:15 +0000 (15:34 +0300)
34 files changed:
src/bin/dhcp4/tests/config_parser_unittest.cc
src/bin/dhcp4/tests/decline_unittest.cc
src/bin/dhcp4/tests/dhcp4_srv_unittest.cc
src/bin/dhcp4/tests/get_config_unittest.cc
src/bin/dhcp4/tests/hooks_unittest.cc
src/bin/dhcp4/tests/kea_controller_unittest.cc
src/bin/dhcp4/tests/release_unittest.cc
src/bin/dhcp6/tests/classify_unittests.cc
src/bin/dhcp6/tests/config_parser_unittest.cc
src/bin/dhcp6/tests/decline_unittest.cc
src/bin/dhcp6/tests/dhcp6_message_test.cc
src/bin/dhcp6/tests/dhcp6_srv_unittest.cc
src/bin/dhcp6/tests/fqdn_unittest.cc
src/bin/dhcp6/tests/get_config_unittest.cc
src/bin/dhcp6/tests/hooks_unittest.cc
src/bin/dhcp6/tests/kea_controller_unittest.cc
src/bin/dhcp6/tests/sarr_unittest.cc
src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc
src/hooks/dhcp/mysql_cb/mysql_cb_dhcp6.cc
src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc
src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp6_unittest.cc
src/hooks/dhcp/user_chk/subnet_select_co.cc
src/lib/dhcpsrv/cfg_subnets4.cc
src/lib/dhcpsrv/cfg_subnets6.cc
src/lib/dhcpsrv/parsers/dhcp_parsers.cc
src/lib/dhcpsrv/shared_network.cc
src/lib/dhcpsrv/subnet.h
src/lib/dhcpsrv/tests/cfg_subnets4_unittest.cc
src/lib/dhcpsrv/tests/cfg_subnets6_unittest.cc
src/lib/dhcpsrv/tests/shared_network_unittest.cc
src/lib/dhcpsrv/tests/srv_config_unittest.cc
src/lib/dhcpsrv/tests/subnet_unittest.cc
src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc
src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc

index a3ea61658868c7a7d4fee8d30a10ec37e91fdde3..6496e0c5842b4df7a6081d3fbe8422b55730d79c 100644 (file)
@@ -793,7 +793,12 @@ public:
         ASSERT_TRUE(subnets);
         ASSERT_GE(subnets->size(), subnet_index + 1);
 
-        const PoolCollection pools = subnets->at(subnet_index)->getPools(Lease::TYPE_V4);
+        auto subnet = subnets->begin();
+        // std::advance is not available for subnets iterators.
+        for (size_t i = 0; i < subnet_index; ++i) {
+            subnet = std::next(subnet);
+        }
+        const PoolCollection pools = (*subnet)->getPools(Lease::TYPE_V4);
         ASSERT_GE(pools.size(), pool_index + 1);
 
         pool = pools.at(pool_index);
@@ -1109,10 +1114,11 @@ TEST_F(Dhcp4ParserTest, multipleSubnets) {
         ASSERT_EQ(4, subnets->size()); // We expect 4 subnets
 
         // Check subnet-ids of each subnet (it should be monotonously increasing)
-        EXPECT_EQ(1, subnets->at(0)->getID());
-        EXPECT_EQ(2, subnets->at(1)->getID());
-        EXPECT_EQ(3, subnets->at(2)->getID());
-        EXPECT_EQ(4, subnets->at(3)->getID());
+        auto subnet = subnets->begin();
+        EXPECT_EQ(1, (*subnet)->getID());
+        EXPECT_EQ(2, (*++subnet)->getID());
+        EXPECT_EQ(3, (*++subnet)->getID());
+        EXPECT_EQ(4, (*++subnet)->getID());
 
         // Repeat reconfiguration process 10 times and check that the subnet-id
         // is set to the same value. Technically, just two iterations would be
@@ -1167,10 +1173,12 @@ TEST_F(Dhcp4ParserTest, multipleSubnetsExplicitIDs) {
         ASSERT_EQ(4, subnets->size()); // We expect 4 subnets
 
         // Verify that subnet ids are as expected.
-        EXPECT_EQ(1024, subnets->at(0)->getID());
-        EXPECT_EQ(100, subnets->at(1)->getID());
-        EXPECT_EQ(1, subnets->at(2)->getID());
-        EXPECT_EQ(34, subnets->at(3)->getID());
+        // Now the subnet order is the subnet id one.
+        auto subnet = subnets->begin();
+        EXPECT_EQ(1, (*subnet)->getID());
+        EXPECT_EQ(34, (*++subnet)->getID());
+        EXPECT_EQ(100, (*++subnet)->getID());
+        EXPECT_EQ(1024, (*++subnet)->getID());
 
         // Repeat reconfiguration process 10 times and check that the subnet-id
         // is set to the same value.
@@ -1312,9 +1320,10 @@ TEST_F(Dhcp4ParserTest, reconfigureRemoveSubnet) {
     ASSERT_EQ(3, subnets->size()); // We expect 3 subnets now (4th is removed)
 
     // Check subnet-ids of each subnet (it should be monotonously increasing)
-    EXPECT_EQ(1, subnets->at(0)->getID());
-    EXPECT_EQ(2, subnets->at(1)->getID());
-    EXPECT_EQ(3, subnets->at(2)->getID());
+    auto subnet = subnets->begin();
+    EXPECT_EQ(1, (*subnet)->getID());
+    EXPECT_EQ(2, (*++subnet)->getID());
+    EXPECT_EQ(3, (*++subnet)->getID());
 
     CfgMgr::instance().clear();
 
@@ -1335,11 +1344,11 @@ TEST_F(Dhcp4ParserTest, reconfigureRemoveSubnet) {
     ASSERT_TRUE(subnets);
     ASSERT_EQ(3, subnets->size()); // We expect 4 subnets
 
-    EXPECT_EQ(1, subnets->at(0)->getID());
+    auto subnet_it = subnets->begin();
+    EXPECT_EQ(1, (*subnet_it)->getID());
     // The second subnet (with subnet-id = 2) is no longer there
-    EXPECT_EQ(3, subnets->at(1)->getID());
-    EXPECT_EQ(4, subnets->at(2)->getID());
-
+    EXPECT_EQ(3, (*++subnet_it)->getID());
+    EXPECT_EQ(4, (*++subnet_it)->getID());
 }
 
 /// @todo: implement subnet removal test as part of #3281.
@@ -1869,26 +1878,28 @@ TEST_F(Dhcp4ParserTest, multiplePools) {
     ASSERT_EQ(2, subnets->size()); // We expect 2 subnets
 
     // Check the first subnet
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_V4);
+    auto subnet = subnets->begin();
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_V4);
     ASSERT_EQ(2, pools1.size());
     EXPECT_EQ("type=V4, 192.0.2.0-192.0.2.15",
               pools1[0]->toText());
     EXPECT_EQ("type=V4, 192.0.2.200-192.0.2.255",
               pools1[1]->toText());
     // There shouldn't be any TA or PD pools
-    EXPECT_THROW(subnets->at(0)->getPools(Lease::TYPE_TA), BadValue);
-    EXPECT_THROW(subnets->at(0)->getPools(Lease::TYPE_PD), BadValue);
+    EXPECT_THROW((*subnet)->getPools(Lease::TYPE_TA), BadValue);
+    EXPECT_THROW((*subnet)->getPools(Lease::TYPE_PD), BadValue);
 
     // Check the second subnet
-    const PoolCollection& pools2 = subnets->at(1)->getPools(Lease::TYPE_V4);
+    ++subnet;
+    const PoolCollection& pools2 = (*subnet)->getPools(Lease::TYPE_V4);
     ASSERT_EQ(2, pools2.size());
     EXPECT_EQ("type=V4, 192.0.3.0-192.0.3.127",
               pools2[0]->toText());
     EXPECT_EQ("type=V4, 192.0.3.128-192.0.3.255",
               pools2[1]->toText());
     // There shouldn't be any TA or PD pools
-    EXPECT_THROW(subnets->at(0)->getPools(Lease::TYPE_TA).empty(), BadValue);
-    EXPECT_THROW(subnets->at(0)->getPools(Lease::TYPE_PD).empty(), BadValue);
+    EXPECT_THROW((*subnet)->getPools(Lease::TYPE_TA).empty(), BadValue);
+    EXPECT_THROW((*subnet)->getPools(Lease::TYPE_PD).empty(), BadValue);
 }
 
 // Test verifies that a subnet with pool values that do not belong to that
@@ -4742,47 +4753,51 @@ TEST_F(Dhcp4ParserTest, classifySubnets) {
     // everyone).
     ClientClasses classes;
     classes.insert("alpha");
-    EXPECT_TRUE (subnets->at(0)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(1)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(2)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(3)->clientSupported(classes));
+    auto subnet0 = subnets->begin();
+    auto subnet1 = std::next(subnet0);
+    auto subnet2 = std::next(subnet1);
+    auto subnet3 = std::next(subnet2);
+    EXPECT_TRUE ((*subnet0)->clientSupported(classes));
+    EXPECT_FALSE((*subnet1)->clientSupported(classes));
+    EXPECT_FALSE((*subnet2)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet3)->clientSupported(classes));
 
     // Let's check if client belonging to beta class is supported in subnet[1]
     // and not supported in any other subnet  (except subnet[3], which allows
     // everyone).
     classes.clear();
     classes.insert("beta");
-    EXPECT_FALSE(subnets->at(0)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(1)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(2)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(3)->clientSupported(classes));
+    EXPECT_FALSE((*subnet0)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet1)->clientSupported(classes));
+    EXPECT_FALSE((*subnet2)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet3)->clientSupported(classes));
 
     // Let's check if client belonging to gamma class is supported in subnet[2]
     // and not supported in any other subnet  (except subnet[3], which allows
     // everyone).
     classes.clear();
     classes.insert("gamma");
-    EXPECT_FALSE(subnets->at(0)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(1)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(2)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(3)->clientSupported(classes));
+    EXPECT_FALSE((*subnet0)->clientSupported(classes));
+    EXPECT_FALSE((*subnet1)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet2)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet3)->clientSupported(classes));
 
     // Let's check if client belonging to some other class (not mentioned in
     // the config) is supported only in subnet[3], which allows everyone.
     classes.clear();
     classes.insert("delta");
-    EXPECT_FALSE(subnets->at(0)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(1)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(2)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(3)->clientSupported(classes));
+    EXPECT_FALSE((*subnet0)->clientSupported(classes));
+    EXPECT_FALSE((*subnet1)->clientSupported(classes));
+    EXPECT_FALSE((*subnet2)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet3)->clientSupported(classes));
 
     // Finally, let's check class-less client. He should be allowed only in
     // the last subnet, which does not have any class restrictions.
     classes.clear();
-    EXPECT_FALSE(subnets->at(0)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(1)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(2)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(3)->clientSupported(classes));
+    EXPECT_FALSE((*subnet0)->clientSupported(classes));
+    EXPECT_FALSE((*subnet1)->clientSupported(classes));
+    EXPECT_FALSE((*subnet2)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet3)->clientSupported(classes));
 }
 
 // Goal of this test is to verify that multiple pools can be configured
@@ -4823,7 +4838,7 @@ TEST_F(Dhcp4ParserTest, classifyPools) {
         CfgMgr::instance().getStagingCfg()->getCfgSubnets4()->getAll();
     ASSERT_TRUE(subnets);
     ASSERT_EQ(1, subnets->size());
-    const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_V4);
+    const PoolCollection& pools = (*subnets->begin())->getPools(Lease::TYPE_V4);
     ASSERT_EQ(4, pools.size()); // We expect 4 pools
 
     // Let's check if client belonging to alpha class is supported in pool[0]
@@ -6602,7 +6617,7 @@ TEST_F(Dhcp4ParserTest, comments) {
     const Subnet4Collection* subs = net->getAllSubnets();
     ASSERT_TRUE(subs);
     ASSERT_EQ(1, subs->size());
-    Subnet4Ptr sub = subs->at(0);
+    Subnet4Ptr sub = *subs->begin();
     ASSERT_TRUE(sub);
     EXPECT_EQ(100, sub->getID());
     EXPECT_EQ("192.0.1.0/24", sub->toText());
index 6bb98b2e36e129d9b2a8011ab7b016a7c32ff1ef..b694bab3942037d1db54614942a494c0192d348d 100644 (file)
@@ -106,7 +106,7 @@ Dhcpv4SrvTest::acquireAndDecline(Dhcp4Client& client,
         CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getAll();
     ASSERT_EQ(1, subnets->size());
     std::stringstream name;
-    name << "subnet[" << subnets->at(0)->getID() << "].declined-addresses";
+    name << "subnet[" << (*subnets->begin())->getID() << "].declined-addresses";
 
     // Set the subnet specific statistic explicitly to zero.
     isc::stats::StatsMgr::instance().setValue(name.str(), static_cast<int64_t>(0));
index 340d26fb8fe24bf7cd300e5097a6c23cc38d2e01..9d889cc3c9aa816782e21ab1bbf9590df2b7f0a6 100644 (file)
@@ -1720,7 +1720,7 @@ TEST_F(Dhcpv4SrvTest, discoverEchoClientId) {
     const Subnet4Collection* subnets = cfg->getCfgSubnets4()->getAll();
     ASSERT_EQ(1, subnets->size());
     CfgMgr::instance().clear();
-    CfgMgr::instance().getStagingCfg()->getCfgSubnets4()->add(subnets->at(0));
+    CfgMgr::instance().getStagingCfg()->getCfgSubnets4()->add(*subnets->begin());
     CfgMgr::instance().getStagingCfg()->setEchoClientId(false);
     CfgMgr::instance().commit();
 
@@ -1797,7 +1797,7 @@ TEST_F(Dhcpv4SrvTest, requestEchoClientId) {
     const Subnet4Collection* subnets = cfg->getCfgSubnets4()->getAll();
     ASSERT_EQ(1, subnets->size());
     CfgMgr::instance().clear();
-    CfgMgr::instance().getStagingCfg()->getCfgSubnets4()->add(subnets->at(0));
+    CfgMgr::instance().getStagingCfg()->getCfgSubnets4()->add(*subnets->begin());
     CfgMgr::instance().getStagingCfg()->setEchoClientId(false);
     CfgMgr::instance().commit();
 
@@ -3547,8 +3547,8 @@ TEST_F(Dhcpv4SrvTest, relayOverride) {
     ASSERT_EQ(2, subnets->size());
 
     // Let's get them for easy reference
-    Subnet4Ptr subnet1 = (*subnets)[0];
-    Subnet4Ptr subnet2 = (*subnets)[1];
+    Subnet4Ptr subnet1 = *subnets->begin();
+    Subnet4Ptr subnet2 = *std::next(subnets->begin());
     ASSERT_TRUE(subnet1);
     ASSERT_TRUE(subnet2);
 
@@ -3633,8 +3633,8 @@ TEST_F(Dhcpv4SrvTest, relayOverrideAndClientClass) {
     ASSERT_EQ(2, subnets->size());
 
     // Let's get them for easy reference
-    Subnet4Ptr subnet1 = (*subnets)[0];
-    Subnet4Ptr subnet2 = (*subnets)[1];
+    Subnet4Ptr subnet1 = *subnets->begin();
+    Subnet4Ptr subnet2 = *std::next(subnets->begin());
     ASSERT_TRUE(subnet1);
     ASSERT_TRUE(subnet2);
 
@@ -3695,9 +3695,12 @@ TEST_F(Dhcpv4SrvTest, relayLinkSelect) {
     ASSERT_EQ(3, subnets->size());
 
     // Let's get them for easy reference
-    Subnet4Ptr subnet1 = (*subnets)[0];
-    Subnet4Ptr subnet2 = (*subnets)[1];
-    Subnet4Ptr subnet3 = (*subnets)[2];
+    auto subnet_it = subnets->begin();
+    Subnet4Ptr subnet1 = *subnet_it;
+    ++subnet_it;
+    Subnet4Ptr subnet2 = *subnet_it;
+    ++subnet_it;
+    Subnet4Ptr subnet3 = *subnet_it;
     ASSERT_TRUE(subnet1);
     ASSERT_TRUE(subnet2);
     ASSERT_TRUE(subnet3);
@@ -3814,9 +3817,12 @@ TEST_F(Dhcpv4SrvTest, subnetSelect) {
     ASSERT_EQ(3, subnets->size());
 
     // Let's get them for easy reference
-    Subnet4Ptr subnet1 = (*subnets)[0];
-    Subnet4Ptr subnet2 = (*subnets)[1];
-    Subnet4Ptr subnet3 = (*subnets)[2];
+    auto subnet_it = subnets->begin();
+    Subnet4Ptr subnet1 = *subnet_it;
+    ++subnet_it;
+    Subnet4Ptr subnet2 = *subnet_it;
+    ++subnet_it;
+    Subnet4Ptr subnet3 = *subnet_it;
     ASSERT_TRUE(subnet1);
     ASSERT_TRUE(subnet2);
     ASSERT_TRUE(subnet3);
@@ -4154,7 +4160,7 @@ TEST_F(Dhcpv4SrvTest, userContext) {
     ASSERT_EQ(1, subnets->size());
 
     // Let's get the subnet and check its context.
-    Subnet4Ptr subnet1 = (*subnets)[0];
+    Subnet4Ptr subnet1 = *subnets->begin();
     ASSERT_TRUE(subnet1);
     ASSERT_TRUE(subnet1->getContext());
     EXPECT_EQ("{ \"secure\": false }", subnet1->getContext()->str());
index cac614e0f3759f0938c1acb5f5397b30298b85b7..98755403bede26502e0d1e9e1da7affe457b2957 100644 (file)
@@ -2877,12 +2877,12 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"4o6-interface-id\": \"\",\n"
 "                \"4o6-subnet\": \"\",\n"
 "                \"calculate-tee-times\": false,\n"
-"                \"id\": 1024,\n"
+"                \"id\": 1,\n"
 "                \"option-data\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
+"                        \"pool\": \"192.0.4.101-192.0.4.150\"\n"
 "                    }\n"
 "                ],\n"
 "                \"rebind-timer\": 2000,\n"
@@ -2892,7 +2892,7 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.2.0/24\",\n"
+"                \"subnet\": \"192.0.4.0/24\",\n"
 "                \"t1-percent\": 0.5,\n"
 "                \"t2-percent\": 0.875,\n"
 "                \"valid-lifetime\": 4000\n"
@@ -2902,12 +2902,12 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"4o6-interface-id\": \"\",\n"
 "                \"4o6-subnet\": \"\",\n"
 "                \"calculate-tee-times\": false,\n"
-"                \"id\": 100,\n"
+"                \"id\": 34,\n"
 "                \"option-data\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.3.101-192.0.3.150\"\n"
+"                        \"pool\": \"192.0.5.101-192.0.5.150\"\n"
 "                    }\n"
 "                ],\n"
 "                \"rebind-timer\": 2000,\n"
@@ -2917,7 +2917,7 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.3.0/24\",\n"
+"                \"subnet\": \"192.0.5.0/24\",\n"
 "                \"t1-percent\": 0.5,\n"
 "                \"t2-percent\": 0.875,\n"
 "                \"valid-lifetime\": 4000\n"
@@ -2927,12 +2927,12 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"4o6-interface-id\": \"\",\n"
 "                \"4o6-subnet\": \"\",\n"
 "                \"calculate-tee-times\": false,\n"
-"                \"id\": 1,\n"
+"                \"id\": 100,\n"
 "                \"option-data\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.4.101-192.0.4.150\"\n"
+"                        \"pool\": \"192.0.3.101-192.0.3.150\"\n"
 "                    }\n"
 "                ],\n"
 "                \"rebind-timer\": 2000,\n"
@@ -2942,7 +2942,7 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.4.0/24\",\n"
+"                \"subnet\": \"192.0.3.0/24\",\n"
 "                \"t1-percent\": 0.5,\n"
 "                \"t2-percent\": 0.875,\n"
 "                \"valid-lifetime\": 4000\n"
@@ -2952,12 +2952,12 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"4o6-interface-id\": \"\",\n"
 "                \"4o6-subnet\": \"\",\n"
 "                \"calculate-tee-times\": false,\n"
-"                \"id\": 34,\n"
+"                \"id\": 1024,\n"
 "                \"option-data\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"192.0.5.101-192.0.5.150\"\n"
+"                        \"pool\": \"192.0.2.1-192.0.2.100\"\n"
 "                    }\n"
 "                ],\n"
 "                \"rebind-timer\": 2000,\n"
@@ -2967,7 +2967,7 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"192.0.5.0/24\",\n"
+"                \"subnet\": \"192.0.2.0/24\",\n"
 "                \"t1-percent\": 0.5,\n"
 "                \"t2-percent\": 0.875,\n"
 "                \"valid-lifetime\": 4000\n"
index 06cc6d333df9477e711f07105cbb9aa6124d6e17..28385223ab60ef3b55bba503ed22903bda8eb53e 100644 (file)
@@ -563,7 +563,7 @@ public:
 
         // Let's change to a different subnet
         if (subnets->size() > 1) {
-            subnet = (*subnets)[1]; // Let's pick the other subnet
+            subnet = *std::next(subnets->begin()); // Let's pick the other subnet
             callout_handle.setArgument("subnet4", subnet);
         }
 
@@ -1617,15 +1617,15 @@ TEST_F(HooksDhcpv4SrvTest, subnet4SelectSimple) {
     // The server is supposed to pick the first subnet, because of matching
     // interface. Check that the value is reported properly.
     ASSERT_TRUE(callback_subnet4_);
-    EXPECT_EQ(exp_subnets->front().get(), callback_subnet4_.get());
+    EXPECT_EQ(exp_subnets->begin()->get(), callback_subnet4_.get());
 
     // Server is supposed to report two subnets
     ASSERT_EQ(exp_subnets->size(), callback_subnet4collection_->size());
     ASSERT_GE(exp_subnets->size(), 2);
 
     // Compare that the available subnets are reported as expected
-    EXPECT_TRUE((*exp_subnets)[0].get() == (*callback_subnet4collection_)[0].get());
-    EXPECT_TRUE((*exp_subnets)[1].get() == (*callback_subnet4collection_)[1].get());
+    EXPECT_TRUE((*exp_subnets->begin())->get() == (*callback_subnet4collection_->begin())->get());
+    EXPECT_TRUE((*std::next(exp_subnets->begin()))->get() == (*std::next(callback_subnet4collection_->begin()))->get());
 
     // Pkt passed to a callout must be configured to copy retrieved options.
     EXPECT_TRUE(callback_qry_options_copy_);
@@ -1698,8 +1698,10 @@ TEST_F(HooksDhcpv4SrvTest, subnet4SelectChange) {
 
     // Advertised address must belong to the second pool (in subnet's range,
     // in dynamic pool)
-    EXPECT_TRUE((*subnets)[1]->inRange(addr));
-    EXPECT_TRUE((*subnets)[1]->inPool(Lease::TYPE_V4, addr));
+    auto subnet = subnets->begin();
+    ++subnet;
+    EXPECT_TRUE((*subnet)->inRange(addr));
+    EXPECT_TRUE((*subnet)->inPool(Lease::TYPE_V4, addr));
 
     // Check if the callout handle state was reset after the callout.
     checkCalloutHandleReset(sol);
index c8b43945abca9bb627f974272f8244a9a119ee5a..d6054e07f95a90d372eecd3d1adc6009b0559d38 100644 (file)
@@ -431,35 +431,37 @@ TEST_F(JSONFileBackendTest, jsonFile) {
     ASSERT_TRUE(subnets);
     ASSERT_EQ(3, subnets->size()); // We expect 3 subnets.
 
-
     // Check subnet 1.
-    EXPECT_EQ("192.0.2.0", subnets->at(0)->get().first.toText());
-    EXPECT_EQ(24, subnets->at(0)->get().second);
+    auto subnet = subnets->begin();
+    EXPECT_EQ("192.0.2.0", (*subnet)->get().first.toText());
+    EXPECT_EQ(24, (*subnet)->get().second);
 
     // Check pools in the first subnet.
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_V4);
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_V4);
     ASSERT_EQ(1, pools1.size());
     EXPECT_EQ("192.0.2.1", pools1.at(0)->getFirstAddress().toText());
     EXPECT_EQ("192.0.2.100", pools1.at(0)->getLastAddress().toText());
     EXPECT_EQ(Lease::TYPE_V4, pools1.at(0)->getType());
 
     // Check subnet 2.
-    EXPECT_EQ("192.0.3.0", subnets->at(1)->get().first.toText());
-    EXPECT_EQ(24, subnets->at(1)->get().second);
+    ++subnet;
+    EXPECT_EQ("192.0.3.0", (*subnet)->get().first.toText());
+    EXPECT_EQ(24, (*subnet)->get().second);
 
     // Check pools in the second subnet.
-    const PoolCollection& pools2 = subnets->at(1)->getPools(Lease::TYPE_V4);
+    const PoolCollection& pools2 = (*subnet)->getPools(Lease::TYPE_V4);
     ASSERT_EQ(1, pools2.size());
     EXPECT_EQ("192.0.3.101", pools2.at(0)->getFirstAddress().toText());
     EXPECT_EQ("192.0.3.150", pools2.at(0)->getLastAddress().toText());
     EXPECT_EQ(Lease::TYPE_V4, pools2.at(0)->getType());
 
     // And finally check subnet 3.
-    EXPECT_EQ("192.0.4.0", subnets->at(2)->get().first.toText());
-    EXPECT_EQ(24, subnets->at(2)->get().second);
+    ++subnet;
+    EXPECT_EQ("192.0.4.0", (*subnet)->get().first.toText());
+    EXPECT_EQ(24, (*subnet)->get().second);
 
     // ... and it's only pool.
-    const PoolCollection& pools3 = subnets->at(2)->getPools(Lease::TYPE_V4);
+    const PoolCollection& pools3 = (*subnet)->getPools(Lease::TYPE_V4);
     EXPECT_EQ("192.0.4.101", pools3.at(0)->getFirstAddress().toText());
     EXPECT_EQ("192.0.4.150", pools3.at(0)->getLastAddress().toText());
     EXPECT_EQ(Lease::TYPE_V4, pools3.at(0)->getType());
@@ -503,11 +505,12 @@ TEST_F(JSONFileBackendTest, hashComments) {
     ASSERT_EQ(1, subnets->size());
 
     // Check subnet 1.
-    EXPECT_EQ("192.0.2.0", subnets->at(0)->get().first.toText());
-    EXPECT_EQ(22, subnets->at(0)->get().second);
+    auto subnet = subnets->begin();
+    EXPECT_EQ("192.0.2.0", (*subnet)->get().first.toText());
+    EXPECT_EQ(22, (*subnet)->get().second);
 
     // Check pools in the first subnet.
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_V4);
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_V4);
     ASSERT_EQ(1, pools1.size());
     EXPECT_EQ("192.0.2.0", pools1.at(0)->getFirstAddress().toText());
     EXPECT_EQ("192.0.2.255", pools1.at(0)->getLastAddress().toText());
@@ -552,11 +555,12 @@ TEST_F(JSONFileBackendTest, cppLineComments) {
     ASSERT_EQ(1, subnets->size());
 
     // Check subnet 1.
-    EXPECT_EQ("192.0.2.0", subnets->at(0)->get().first.toText());
-    EXPECT_EQ(22, subnets->at(0)->get().second);
+    auto subnet = subnets->begin();
+    EXPECT_EQ("192.0.2.0", (*subnet)->get().first.toText());
+    EXPECT_EQ(22, (*subnet)->get().second);
 
     // Check pools in the first subnet.
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_V4);
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_V4);
     ASSERT_EQ(1, pools1.size());
     EXPECT_EQ("192.0.2.0", pools1.at(0)->getFirstAddress().toText());
     EXPECT_EQ("192.0.2.255", pools1.at(0)->getLastAddress().toText());
@@ -601,11 +605,12 @@ TEST_F(JSONFileBackendTest, cBlockComments) {
     ASSERT_EQ(1, subnets->size());
 
     // Check subnet 1.
-    EXPECT_EQ("192.0.2.0", subnets->at(0)->get().first.toText());
-    EXPECT_EQ(22, subnets->at(0)->get().second);
+    auto subnet = subnets->begin();
+    EXPECT_EQ("192.0.2.0", (*subnet)->get().first.toText());
+    EXPECT_EQ(22, (*subnet)->get().second);
 
     // Check pools in the first subnet.
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_V4);
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_V4);
     ASSERT_EQ(1, pools1.size());
     EXPECT_EQ("192.0.2.0", pools1.at(0)->getFirstAddress().toText());
     EXPECT_EQ("192.0.2.255", pools1.at(0)->getLastAddress().toText());
@@ -650,11 +655,12 @@ TEST_F(JSONFileBackendTest, include) {
     ASSERT_EQ(1, subnets->size());
 
     // Check subnet 1.
-    EXPECT_EQ("192.0.2.0", subnets->at(0)->get().first.toText());
-    EXPECT_EQ(22, subnets->at(0)->get().second);
+    auto subnet = subnets->begin();
+    EXPECT_EQ("192.0.2.0", (*subnet)->get().first.toText());
+    EXPECT_EQ(22, (*subnet)->get().second);
 
     // Check pools in the first subnet.
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_V4);
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_V4);
     ASSERT_EQ(1, pools1.size());
     EXPECT_EQ("192.0.2.0", pools1.at(0)->getFirstAddress().toText());
     EXPECT_EQ("192.0.2.255", pools1.at(0)->getLastAddress().toText());
index b018d33154272d16ccc2c879f7a0b39818f609ae..f2f66f32cf9f7baac2ae70d5bb75c4b693d87ab0 100644 (file)
@@ -141,7 +141,7 @@ ReleaseTest::acquireAndRelease(const std::string& hw_address_1,
     const Subnet4Collection* subnets =
         CfgMgr::instance().getCurrentCfg()->getCfgSubnets4()->getAll();
     ASSERT_EQ(1, subnets->size());
-    name << "subnet[" << subnets->at(0)->getID() << "].assigned-addresses";
+    name << "subnet[" << (*subnets->begin())->getID() << "].assigned-addresses";
 
     ObservationPtr assigned_cnt = StatsMgr::instance().getObservation(name.str());
     ASSERT_TRUE(assigned_cnt);
index 70185fc96858d46ee9eef159be1a298cc63dd38f..51d7e8674e718e4b7d81dc8721d905a7897fa12f 100644 (file)
@@ -1286,8 +1286,8 @@ TEST_F(ClassifyTest, relayOverrideAndClientClass) {
     ASSERT_EQ(2, subnets->size());
 
     // Let's get them for easy reference
-    Subnet6Ptr subnet1 = (*subnets)[0];
-    Subnet6Ptr subnet2 = (*subnets)[1];
+    Subnet6Ptr subnet1 = *subnets->begin();
+    Subnet6Ptr subnet2 = *std::next(subnets->begin());
     ASSERT_TRUE(subnet1);
     ASSERT_TRUE(subnet2);
 
index b171d589847020e4f614a21df5548ca0675cfce0..d508a277f949302ab8b7a2fba497a0fa6e8134ed 100644 (file)
@@ -961,7 +961,12 @@ public:
         ASSERT_TRUE(subnets);
         ASSERT_GE(subnets->size(), subnet_index + 1);
 
-        const PoolCollection pools = subnets->at(subnet_index)->getPools(type);
+        auto subnet = subnets->begin();
+        // std::advance is not available for subnets iterators.
+        for (size_t i = 0; i < subnet_index; ++i) {
+            subnet = std::next(subnet);
+        }
+        const PoolCollection pools = (*subnet)->getPools(type);
         ASSERT_GE(pools.size(), pool_index + 1);
 
         pool = pools.at(pool_index);
@@ -1297,10 +1302,11 @@ TEST_F(Dhcp6ParserTest, multipleSubnets) {
         ASSERT_EQ(4, subnets->size()); // We expect 4 subnets
 
         // Check subnet-ids of each subnet (it should be monotonously increasing)
-        EXPECT_EQ(1, subnets->at(0)->getID());
-        EXPECT_EQ(2, subnets->at(1)->getID());
-        EXPECT_EQ(3, subnets->at(2)->getID());
-        EXPECT_EQ(4, subnets->at(3)->getID());
+        auto subnet = subnets->begin();
+        EXPECT_EQ(1, (*subnet)->getID());
+        EXPECT_EQ(2, (*++subnet)->getID());
+        EXPECT_EQ(3, (*++subnet)->getID());
+        EXPECT_EQ(4, (*++subnet)->getID());
 
         // Repeat reconfiguration process 10 times and check that the subnet-id
         // is set to the same value. Technically, just two iterations would be
@@ -1357,10 +1363,12 @@ TEST_F(Dhcp6ParserTest, multipleSubnetsExplicitIDs) {
         ASSERT_EQ(4, subnets->size()); // We expect 4 subnets
 
         // Check that subnet ids are as expected.
-        EXPECT_EQ(1024, subnets->at(0)->getID());
-        EXPECT_EQ(100, subnets->at(1)->getID());
-        EXPECT_EQ(1, subnets->at(2)->getID());
-        EXPECT_EQ(34, subnets->at(3)->getID());
+        // Now the subnet order is the subnet id one.
+        auto subnet = subnets->begin();
+        EXPECT_EQ(1, (*subnet)->getID());
+        EXPECT_EQ(34, (*++subnet)->getID());
+        EXPECT_EQ(100, (*++subnet)->getID());
+        EXPECT_EQ(1024, (*++subnet)->getID());
 
         // Repeat reconfiguration process 10 times and check that the subnet-id
         // is set to the same value.
@@ -1508,9 +1516,10 @@ TEST_F(Dhcp6ParserTest, reconfigureRemoveSubnet) {
     ASSERT_TRUE(subnets);
     ASSERT_EQ(3, subnets->size()); // We expect 3 subnets now (4th is removed)
 
-    EXPECT_EQ(1, subnets->at(0)->getID());
-    EXPECT_EQ(2, subnets->at(1)->getID());
-    EXPECT_EQ(3, subnets->at(2)->getID());
+    auto subnet = subnets->begin();
+    EXPECT_EQ(1, (*subnet)->getID());
+    EXPECT_EQ(2, (*++subnet)->getID());
+    EXPECT_EQ(3, (*++subnet)->getID());
 
     /// CASE 2: Configure 4 subnets, then reconfigure and remove one
     /// from in between (not first, not last)
@@ -1532,10 +1541,11 @@ TEST_F(Dhcp6ParserTest, reconfigureRemoveSubnet) {
     ASSERT_TRUE(subnets);
     ASSERT_EQ(3, subnets->size()); // We expect 4 subnets
 
-    EXPECT_EQ(1, subnets->at(0)->getID());
+    subnet = subnets->begin();
+    EXPECT_EQ(1, (*subnet)->getID());
     // The second subnet (with subnet-id = 2) is no longer there
-    EXPECT_EQ(3, subnets->at(1)->getID());
-    EXPECT_EQ(4, subnets->at(2)->getID());
+    EXPECT_EQ(3, (*++subnet)->getID());
+    EXPECT_EQ(4, (*++subnet)->getID());
 }
 
 // This test checks if it is possible to override global values
@@ -1928,26 +1938,28 @@ TEST_F(Dhcp6ParserTest, multiplePools) {
     ASSERT_EQ(2, subnets->size()); // We expect 2 subnets
 
     // Check the first subnet
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_NA);
+    auto subnet = subnets->begin();
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_NA);
     ASSERT_EQ(2, pools1.size());
     EXPECT_EQ("type=IA_NA, 2001:db8:1::-2001:db8:1::ffff:ffff, delegated_len=128",
               pools1[0]->toText());
     EXPECT_EQ("type=IA_NA, 2001:db8:1:0:abcd::-2001:db8:1:0:abcd::ffff, delegated_len=128",
               pools1[1]->toText());
     // There shouldn't be any TA or PD pools
-    EXPECT_TRUE(subnets->at(0)->getPools(Lease::TYPE_TA).empty());
-    EXPECT_TRUE(subnets->at(0)->getPools(Lease::TYPE_PD).empty());
+    EXPECT_TRUE((*subnet)->getPools(Lease::TYPE_TA).empty());
+    EXPECT_TRUE((*subnet)->getPools(Lease::TYPE_PD).empty());
 
     // Check the second subnet
-    const PoolCollection& pools2 = subnets->at(1)->getPools(Lease::TYPE_NA);
+    ++subnet;
+    const PoolCollection& pools2 = (*subnet)->getPools(Lease::TYPE_NA);
     ASSERT_EQ(2, pools2.size());
     EXPECT_EQ("type=IA_NA, 2001:db8:2::1-2001:db8:2::ff, delegated_len=128",
               pools2[0]->toText());
     EXPECT_EQ("type=IA_NA, 2001:db8:2::300-2001:db8:2::3ff, delegated_len=128",
               pools2[1]->toText());
     // There shouldn't be any TA or PD pools
-    EXPECT_TRUE(subnets->at(0)->getPools(Lease::TYPE_TA).empty());
-    EXPECT_TRUE(subnets->at(0)->getPools(Lease::TYPE_PD).empty());
+    EXPECT_TRUE((*subnet)->getPools(Lease::TYPE_TA).empty());
+    EXPECT_TRUE((*subnet)->getPools(Lease::TYPE_PD).empty());
 }
 
 // Test verifies that a subnet with pool values that do not belong to that
@@ -4615,47 +4627,51 @@ TEST_F(Dhcp6ParserTest, classifySubnets) {
     // everyone).
     ClientClasses classes;
     classes.insert("alpha");
-    EXPECT_TRUE (subnets->at(0)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(1)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(2)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(3)->clientSupported(classes));
+    auto subnet0 = subnets->begin();
+    auto subnet1 = std::next(subnet0);
+    auto subnet2 = std::next(subnet1);
+    auto subnet3 = std::next(subnet2);
+    EXPECT_TRUE ((*subnet0)->clientSupported(classes));
+    EXPECT_FALSE((*subnet1)->clientSupported(classes));
+    EXPECT_FALSE((*subnet2)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet3)->clientSupported(classes));
 
     // Let's check if client belonging to beta class is supported in subnet[1]
     // and not supported in any other subnet  (except subnet[3], which allows
     // everyone).
     classes.clear();
     classes.insert("beta");
-    EXPECT_FALSE(subnets->at(0)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(1)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(2)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(3)->clientSupported(classes));
+    EXPECT_FALSE((*subnet0)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet1)->clientSupported(classes));
+    EXPECT_FALSE((*subnet2)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet3)->clientSupported(classes));
 
     // Let's check if client belonging to gamma class is supported in subnet[2]
     // and not supported in any other subnet  (except subnet[3], which allows
     // everyone).
     classes.clear();
     classes.insert("gamma");
-    EXPECT_FALSE(subnets->at(0)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(1)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(2)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(3)->clientSupported(classes));
+    EXPECT_FALSE((*subnet0)->clientSupported(classes));
+    EXPECT_FALSE((*subnet1)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet2)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet3)->clientSupported(classes));
 
     // Let's check if client belonging to some other class (not mentioned in
     // the config) is supported only in subnet[3], which allows everyone.
     classes.clear();
     classes.insert("delta");
-    EXPECT_FALSE(subnets->at(0)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(1)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(2)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(3)->clientSupported(classes));
+    EXPECT_FALSE((*subnet0)->clientSupported(classes));
+    EXPECT_FALSE((*subnet1)->clientSupported(classes));
+    EXPECT_FALSE((*subnet2)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet3)->clientSupported(classes));
 
     // Finally, let's check class-less client. He should be allowed only in
     // the last subnet, which does not have any class restrictions.
     classes.clear();
-    EXPECT_FALSE(subnets->at(0)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(1)->clientSupported(classes));
-    EXPECT_FALSE(subnets->at(2)->clientSupported(classes));
-    EXPECT_TRUE (subnets->at(3)->clientSupported(classes));
+    EXPECT_FALSE((*subnet0)->clientSupported(classes));
+    EXPECT_FALSE((*subnet1)->clientSupported(classes));
+    EXPECT_FALSE((*subnet2)->clientSupported(classes));
+    EXPECT_TRUE ((*subnet3)->clientSupported(classes));
 }
 
 // Goal of this test is to verify that multiple pools can be configured
@@ -4697,7 +4713,7 @@ TEST_F(Dhcp6ParserTest, classifyPools) {
         CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->getAll();
     ASSERT_TRUE(subnets);
     ASSERT_EQ(1, subnets->size());
-    const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_NA);
+    const PoolCollection& pools = (*subnets->begin())->getPools(Lease::TYPE_NA);
     ASSERT_EQ(4, pools.size()); // We expect 4 pools
 
     // Let's check if client belonging to alpha class is supported in pool[0]
@@ -4795,7 +4811,7 @@ TEST_F(Dhcp6ParserTest, classifyPdPools) {
         CfgMgr::instance().getStagingCfg()->getCfgSubnets6()->getAll();
     ASSERT_TRUE(subnets);
     ASSERT_EQ(1, subnets->size());
-    const PoolCollection& pools = subnets->at(0)->getPools(Lease::TYPE_PD);
+    const PoolCollection& pools = (*subnets->begin())->getPools(Lease::TYPE_PD);
     ASSERT_EQ(4, pools.size()); // We expect 4 pools
 
     // Let's check if client belonging to alpha class is supported in pool[0]
@@ -7045,8 +7061,9 @@ TEST_F(Dhcp6ParserTest, sharedNetworksRapidCommit) {
     const Subnet6Collection * subs = net->getAllSubnets();
     ASSERT_TRUE(subs);
     ASSERT_EQ(2, subs->size());
-    EXPECT_TRUE(subs->at(0)->getRapidCommit());
-    EXPECT_TRUE(subs->at(1)->getRapidCommit());
+    auto sub = subs->begin();
+    EXPECT_TRUE((*sub)->getRapidCommit());
+    EXPECT_TRUE((*std::next(sub))->getRapidCommit());
 
     // Ok, now check the second shared network. It doesn't have
     // anything defined on shared-network or subnet level, so
@@ -7059,7 +7076,8 @@ TEST_F(Dhcp6ParserTest, sharedNetworksRapidCommit) {
     EXPECT_EQ(1, subs->size());
 
     // This subnet should derive its renew-timer from global scope.
-    EXPECT_FALSE(subs->at(0)->getRapidCommit());
+    sub = subs->begin();
+    EXPECT_FALSE((*sub)->getRapidCommit());
 }
 
 // Tests that non-matching rapid-commit setting for subnets belonging to a
@@ -7250,7 +7268,7 @@ TEST_F(Dhcp6ParserTest, comments) {
     const Subnet6Collection* subs = net->getAllSubnets();
     ASSERT_TRUE(subs);
     ASSERT_EQ(1, subs->size());
-    Subnet6Ptr sub = subs->at(0);
+    Subnet6Ptr sub = *subs->begin();
     ASSERT_TRUE(sub);
 
     // Check subnet user context.
index 53be0f515a4f5f31170f32fae1572bf1f53ea4e8..dd7f584f08acce5952ad52f70923f106c160f0b2 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2015-2017 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2015-2020 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -88,7 +88,8 @@ Dhcpv6SrvTest::acquireAndDecline(Dhcp6Client& client,
     ASSERT_EQ(1, subnets->size());
 
     // Let's generate the subnet specific statistic
-    std::string name = StatsMgr::generateName("subnet", subnets->at(0)->getID(),
+    std::string name = StatsMgr::generateName("subnet",
+                                              (*subnets->begin())->getID(),
                                               "declined-addresses");
 
     // Set this statistic explicitly to zero.
index 41ad4d80ad158ba62f0e1287ec98621f1247dcc2..b47e242068e0a2c6ad65cafd5c6949326c213fcc 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2015 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2020 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -60,8 +60,10 @@ Dhcpv6MessageTest::requestLease(const std::string& config,
 
     // Check if the lease belongs to one of the available pools.
     bool pool_found = false;
-    for (int i = 0; i < subnets_num; ++i) {
-        if ((*subnets)[i]->getPool(lease_client.type_, lease_client.addr_)) {
+    auto subnet = subnets->begin();
+    for (int i = 0; i < subnets_num; ++i, ++subnet) {
+        ASSERT_TRUE(subnet != subnets->end());
+        if ((*subnet)->getPool(lease_client.type_, lease_client.addr_)) {
             pool_found = true;
             break;
         }
index 65d7179ac661924c1d9062ccdd55d0405b21e5d5..a8053657072d13ebe8bf045e72cd8383f9feb7ee 100644 (file)
@@ -2287,8 +2287,8 @@ TEST_F(Dhcpv6SrvTest, relayOverride) {
     ASSERT_EQ(2, subnets->size());
 
     // Let's get them for easy reference
-    Subnet6Ptr subnet1 = (*subnets)[0];
-    Subnet6Ptr subnet2 = (*subnets)[1];
+    Subnet6Ptr subnet1 = *subnets->begin();
+    Subnet6Ptr subnet2 = *std::next(subnets->begin());
     ASSERT_TRUE(subnet1);
     ASSERT_TRUE(subnet2);
 
@@ -2804,7 +2804,7 @@ TEST_F(Dhcpv6SrvTest, userContext) {
     ASSERT_EQ(1, subnets->size());
 
     // Let's get the subnet and check its context.
-    Subnet6Ptr subnet1 = (*subnets)[0];
+    Subnet6Ptr subnet1 = (*subnets->begin());
     ASSERT_TRUE(subnet1);
     ASSERT_TRUE(subnet1->getContext());
     EXPECT_EQ("{ \"secure\": false }", subnet1->getContext()->str());
index 3263c7bfe53d766f4282a1c1f35f9f53b6d1798d..f7b675dfdf02c62553daa27dc38480e5d6f5f265 100644 (file)
@@ -641,7 +641,12 @@ public:
         ASSERT_TRUE(subnets);
         const Subnet6Collection* subnet_col = subnets->getAll();
         ASSERT_EQ(subnet_idx + 1, subnet_col->size());
-        subnet_ = subnet_col->at(subnet_idx);
+        auto subnet_it = subnet_col->begin();
+        // std::advance is not available for this iterator.
+        for (int i = 0; i < subnet_idx; ++i) {
+            subnet_it = std::next(subnet_it);
+        }
+        subnet_ = *subnet_it;
         ASSERT_TRUE(subnet_);
 
         const PoolCollection& pool_col = subnet_->getPools(type);
index f61123ad196b7e0ce9634074d04d7e5b32a30022..bc13a2953c9f9cc97fca8c083e4f25cb144e2cfb 100644 (file)
@@ -2434,13 +2434,13 @@ const char* UNPARSED_CONFIGS[] = {
 "        \"subnet6\": [\n"
 "            {\n"
 "                \"calculate-tee-times\": true,\n"
-"                \"id\": 1024,\n"
+"                \"id\": 1,\n"
 "                \"option-data\": [ ],\n"
 "                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"2001:db8:1::/80\"\n"
+"                        \"pool\": \"2001:db8:3::/80\"\n"
 "                    }\n"
 "                ],\n"
 "                \"preferred-lifetime\": 3000,\n"
@@ -2452,20 +2452,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"2001:db8:1::/64\",\n"
+"                \"subnet\": \"2001:db8:3::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
 "                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
 "                \"calculate-tee-times\": true,\n"
-"                \"id\": 100,\n"
+"                \"id\": 34,\n"
 "                \"option-data\": [ ],\n"
 "                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"2001:db8:2::/80\"\n"
+"                        \"pool\": \"2001:db8:4::/80\"\n"
 "                    }\n"
 "                ],\n"
 "                \"preferred-lifetime\": 3000,\n"
@@ -2477,20 +2477,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"2001:db8:2::/64\",\n"
+"                \"subnet\": \"2001:db8:4::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
 "                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
 "                \"calculate-tee-times\": true,\n"
-"                \"id\": 1,\n"
+"                \"id\": 100,\n"
 "                \"option-data\": [ ],\n"
 "                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"2001:db8:3::/80\"\n"
+"                        \"pool\": \"2001:db8:2::/80\"\n"
 "                    }\n"
 "                ],\n"
 "                \"preferred-lifetime\": 3000,\n"
@@ -2502,20 +2502,20 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"2001:db8:3::/64\",\n"
+"                \"subnet\": \"2001:db8:2::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
 "                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
 "            },\n"
 "            {\n"
 "                \"calculate-tee-times\": true,\n"
-"                \"id\": 34,\n"
+"                \"id\": 1024,\n"
 "                \"option-data\": [ ],\n"
 "                \"pd-pools\": [ ],\n"
 "                \"pools\": [\n"
 "                    {\n"
 "                        \"option-data\": [ ],\n"
-"                        \"pool\": \"2001:db8:4::/80\"\n"
+"                        \"pool\": \"2001:db8:1::/80\"\n"
 "                    }\n"
 "                ],\n"
 "                \"preferred-lifetime\": 3000,\n"
@@ -2527,7 +2527,7 @@ const char* UNPARSED_CONFIGS[] = {
 "                \"renew-timer\": 1000,\n"
 "                \"reservations\": [ ],\n"
 "                \"store-extended-info\": false,\n"
-"                \"subnet\": \"2001:db8:4::/64\",\n"
+"                \"subnet\": \"2001:db8:1::/64\",\n"
 "                \"t1-percent\": 0.5,\n"
 "                \"t2-percent\": 0.8,\n"
 "                \"valid-lifetime\": 4000\n"
index e472c3ff911634786f7e0a55275ca3672e96a1e1..14730a7b01e83db25b0645122ac451ab81b4158f 100644 (file)
@@ -535,7 +535,7 @@ public:
 
         // Let's change to a different subnet
         if (subnets->size() > 1) {
-            subnet = (*subnets)[1]; // Let's pick the other subnet
+            subnet = *std::next(subnets->begin()); // Let's pick the other subnet
             callout_handle.setArgument("subnet6", subnet);
         }
 
@@ -1697,14 +1697,14 @@ TEST_F(HooksDhcpv6SrvTest, subnet6Select) {
     // The server is supposed to pick the first subnet, because of matching
     // interface. Check that the value is reported properly.
     ASSERT_TRUE(callback_subnet6_);
-    EXPECT_EQ(callback_subnet6_.get(), exp_subnets->front().get());
+    EXPECT_EQ(callback_subnet6_.get(), exp_subnets->begin()->get());
 
     // Server is supposed to report two subnets
     ASSERT_EQ(exp_subnets->size(), callback_subnet6collection_->size());
 
     // Compare that the available subnets are reported as expected
-    EXPECT_TRUE((*exp_subnets)[0].get() == (*callback_subnet6collection_)[0].get());
-    EXPECT_TRUE((*exp_subnets)[1].get() == (*callback_subnet6collection_)[1].get());
+    EXPECT_TRUE((*exp_subnets->begin())->get() == (*callback_subnet6collection_->begin())->get());
+    EXPECT_TRUE((*std::next(exp_subnets->begin()))->get() == (*std::next(callback_subnet6collection_->begin()))->get());
 
     // Pkt passed to a callout must be configured to copy retrieved options.
     EXPECT_TRUE(callback_qry_options_copy_);
@@ -1788,8 +1788,10 @@ TEST_F(HooksDhcpv6SrvTest, subnet6SselectChange) {
 
     // Advertised address must belong to the second pool (in subnet's range,
     // in dynamic pool)
-    EXPECT_TRUE((*subnets)[1]->inRange(addr_opt->getAddress()));
-    EXPECT_TRUE((*subnets)[1]->inPool(Lease::TYPE_NA, addr_opt->getAddress()));
+    auto subnet = subnets->begin();
+    ++subnet;
+    EXPECT_TRUE((*subnet)->inRange(addr_opt->getAddress()));
+    EXPECT_TRUE((*subnet)->inPool(Lease::TYPE_NA, addr_opt->getAddress()));
 
     // Check if the callout handle state was reset after the callout.
     checkCalloutHandleReset(sol);
index 4290f74da3858bac563bf07383f8920466e817ee..720cf9d6598425cce2a4776f04d3153436fb3187 100644 (file)
@@ -418,33 +418,39 @@ TEST_F(JSONFileBackendTest, jsonFile) {
 
 
     // Check subnet 1.
-    EXPECT_EQ("2001:db8:1::", subnets->at(0)->get().first.toText());
-    EXPECT_EQ(64, subnets->at(0)->get().second);
+    auto subnet = subnets->begin();
+    ASSERT_TRUE(subnet != subnets->end());
+    EXPECT_EQ("2001:db8:1::", (*subnet)->get().first.toText());
+    EXPECT_EQ(64, (*subnet)->get().second);
 
     // Check pools in the first subnet.
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_NA);
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_NA);
     ASSERT_EQ(1, pools1.size());
     EXPECT_EQ("2001:db8:1::", pools1.at(0)->getFirstAddress().toText());
     EXPECT_EQ("2001:db8:1::ffff:ffff:ffff", pools1.at(0)->getLastAddress().toText());
     EXPECT_EQ(Lease::TYPE_NA, pools1.at(0)->getType());
 
     // Check subnet 2.
-    EXPECT_EQ("2001:db8:2::", subnets->at(1)->get().first.toText());
-    EXPECT_EQ(64, subnets->at(1)->get().second);
+    ++subnet;
+    ASSERT_TRUE(subnet != subnets->end());
+    EXPECT_EQ("2001:db8:2::", (*subnet)->get().first.toText());
+    EXPECT_EQ(64, (*subnet)->get().second);
 
     // Check pools in the second subnet.
-    const PoolCollection& pools2 = subnets->at(1)->getPools(Lease::TYPE_NA);
+    const PoolCollection& pools2 = (*subnet)->getPools(Lease::TYPE_NA);
     ASSERT_EQ(1, pools2.size());
     EXPECT_EQ("2001:db8:2::", pools2.at(0)->getFirstAddress().toText());
     EXPECT_EQ("2001:db8:2::ffff:ffff:ffff", pools2.at(0)->getLastAddress().toText());
     EXPECT_EQ(Lease::TYPE_NA, pools2.at(0)->getType());
 
     // And finally check subnet 3.
-    EXPECT_EQ("2001:db8:3::", subnets->at(2)->get().first.toText());
-    EXPECT_EQ(64, subnets->at(2)->get().second);
+    ++subnet;
+    ASSERT_TRUE(subnet != subnets->end());
+    EXPECT_EQ("2001:db8:3::", (*subnet)->get().first.toText());
+    EXPECT_EQ(64, (*subnet)->get().second);
 
     // ... and it's only pool.
-    const PoolCollection& pools3 = subnets->at(2)->getPools(Lease::TYPE_NA);
+    const PoolCollection& pools3 = (*subnet)->getPools(Lease::TYPE_NA);
     EXPECT_EQ("2001:db8:3::", pools3.at(0)->getFirstAddress().toText());
     EXPECT_EQ("2001:db8:3::ffff:ffff:ffff", pools3.at(0)->getLastAddress().toText());
     EXPECT_EQ(Lease::TYPE_NA, pools3.at(0)->getType());
@@ -489,11 +495,13 @@ TEST_F(JSONFileBackendTest, hashComments) {
     ASSERT_EQ(1, subnets->size());
 
     // Check subnet 1.
-    EXPECT_EQ("2001:db8:1::", subnets->at(0)->get().first.toText());
-    EXPECT_EQ(64, subnets->at(0)->get().second);
+    auto subnet = subnets->begin();
+    ASSERT_TRUE(subnet != subnets->end());
+    EXPECT_EQ("2001:db8:1::", (*subnet)->get().first.toText());
+    EXPECT_EQ(64, (*subnet)->get().second);
 
     // Check pools in the first subnet.
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_NA);
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_NA);
     ASSERT_EQ(1, pools1.size());
     EXPECT_EQ("2001:db8:1::", pools1.at(0)->getFirstAddress().toText());
     EXPECT_EQ("2001:db8:1::ffff:ffff:ffff", pools1.at(0)->getLastAddress().toText());
@@ -539,11 +547,13 @@ TEST_F(JSONFileBackendTest, cppLineComments) {
     ASSERT_EQ(1, subnets->size());
 
     // Check subnet 1.
-    EXPECT_EQ("2001:db8:1::", subnets->at(0)->get().first.toText());
-    EXPECT_EQ(64, subnets->at(0)->get().second);
+    auto subnet = subnets->begin();
+    ASSERT_TRUE(subnet != subnets->end());
+    EXPECT_EQ("2001:db8:1::", (*subnet)->get().first.toText());
+    EXPECT_EQ(64, (*subnet)->get().second);
 
     // Check pools in the first subnet.
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_NA);
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_NA);
     ASSERT_EQ(1, pools1.size());
     EXPECT_EQ("2001:db8:1::", pools1.at(0)->getFirstAddress().toText());
     EXPECT_EQ("2001:db8:1::ffff:ffff:ffff", pools1.at(0)->getLastAddress().toText());
@@ -589,11 +599,13 @@ TEST_F(JSONFileBackendTest, cBlockComments) {
     ASSERT_EQ(1, subnets->size());
 
     // Check subnet 1.
-    EXPECT_EQ("2001:db8:1::", subnets->at(0)->get().first.toText());
-    EXPECT_EQ(64, subnets->at(0)->get().second);
+    auto subnet = subnets->begin();
+    ASSERT_TRUE(subnet != subnets->end());
+    EXPECT_EQ("2001:db8:1::", (*subnet)->get().first.toText());
+    EXPECT_EQ(64, (*subnet)->get().second);
 
     // Check pools in the first subnet.
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_NA);
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_NA);
     ASSERT_EQ(1, pools1.size());
     EXPECT_EQ("2001:db8:1::", pools1.at(0)->getFirstAddress().toText());
     EXPECT_EQ("2001:db8:1::ffff:ffff:ffff", pools1.at(0)->getLastAddress().toText());
@@ -639,11 +651,13 @@ TEST_F(JSONFileBackendTest, include) {
     ASSERT_EQ(1, subnets->size());
 
     // Check subnet 1.
-    EXPECT_EQ("2001:db8:1::", subnets->at(0)->get().first.toText());
-    EXPECT_EQ(64, subnets->at(0)->get().second);
+    auto subnet = subnets->begin();
+    ASSERT_TRUE(subnet != subnets->end());
+    EXPECT_EQ("2001:db8:1::", (*subnet)->get().first.toText());
+    EXPECT_EQ(64, (*subnet)->get().second);
 
     // Check pools in the first subnet.
-    const PoolCollection& pools1 = subnets->at(0)->getPools(Lease::TYPE_NA);
+    const PoolCollection& pools1 = (*subnet)->getPools(Lease::TYPE_NA);
     ASSERT_EQ(1, pools1.size());
     EXPECT_EQ("2001:db8:1::", pools1.at(0)->getFirstAddress().toText());
     EXPECT_EQ("2001:db8:1::ffff:ffff:ffff", pools1.at(0)->getLastAddress().toText());
index 98be42566cba6b925fbfbfca9123653d4f859490..445c79a0cd239d4533e17525b697c59a83003827 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2014-2019 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2014-2020 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -263,7 +263,8 @@ TEST_F(SARRTest, directClientPrefixHint) {
     EXPECT_NE("2001:db8:3:33::", lease_client.addr_.toText());
     EXPECT_NE("2001:db8:3:33::34", lease_client.addr_.toText());
     // Check that the assigned prefix belongs to the pool.
-    (*subnets)[0]->inPool(Lease::TYPE_PD, lease_client.addr_);
+    ASSERT_TRUE(!subnets->empty());
+    (*subnets->begin())->inPool(Lease::TYPE_PD, lease_client.addr_);
     EXPECT_EQ(64, lease_client.prefixlen_);
     EXPECT_EQ(3000, lease_client.preferred_lft_);
     EXPECT_EQ(4000, lease_client.valid_lft_);
index ac3f24abd71d06f7f82a5abf397c5131f9a54462..fc7cebc4a45fa8f3b00e0fdffeed77ae37268d80 100644 (file)
@@ -530,7 +530,7 @@ public:
                 // server_tag at 64
 
                 // Subnet ready. Add it to the list.
-                auto ret = subnets.push_back(last_subnet);
+                auto ret = subnets.insert(last_subnet);
 
                 // subnets is a multi index container with unique indexes
                 // but these indexes are unique too in the database,
@@ -618,7 +618,7 @@ public:
         // check if it has matching server tags and toss it if it
         // doesn't. We skip matching the server tags if we're asking
         // for ANY subnet.
-        auto& subnet_index = subnets.get<SubnetRandomAccessIndexTag>();
+        auto& subnet_index = subnets.get<SubnetSubnetIdIndexTag>();
         tossNonMatchingElements(server_selector, subnet_index);
     }
 
index db5f56d89f8185f5b6ef53fa301ddaf9667388e9..8cae812c6cbaf585f71924cb6c6e7eeee929f541 100644 (file)
@@ -568,7 +568,7 @@ public:
                 // server_tag (87 / last)
 
                 // Subnet ready. Add it to the list.
-                auto ret = subnets.push_back(last_subnet);
+                auto ret = subnets.insert(last_subnet);
 
                 // subnets is a multi index container with unique indexes
                 // but these indexes are unique too in the database,
@@ -724,7 +724,7 @@ public:
         // check if it has matching server tags and toss it if it
         // doesn't. We skip matching the server tags if we're asking
         // for ANY subnet.
-        auto& subnet_index = subnets.get<SubnetRandomAccessIndexTag>();
+        auto& subnet_index = subnets.get<SubnetSubnetIdIndexTag>();
         tossNonMatchingElements(server_selector, subnet_index);
     }
 
index aa0705ae0de9e8a0ced068e422e01d65b7545909..84704ffe665d487afee7fdcf6dbfd0c425c34fa5 100644 (file)
@@ -1479,11 +1479,12 @@ TEST_F(MySqlConfigBackendDHCPv4Test, getAllSubnets4) {
     ASSERT_EQ(test_subnets_.size() - 1, subnets.size());
 
     // See if the subnets are returned ok.
-    for (auto i = 0; i < subnets.size(); ++i) {
-        ASSERT_EQ(1, subnets[i]->getServerTags().size());
-        EXPECT_EQ("all", subnets[i]->getServerTags().begin()->get());
+    auto subnet_it = subnets.begin();
+    for (auto i = 0; i < subnets.size(); ++i, ++subnet_it) {
+        ASSERT_EQ(1, (*subnet_it)->getServerTags().size());
+        EXPECT_EQ("all", (*subnet_it)->getServerTags().begin()->get());
         EXPECT_EQ(test_subnets_[i + 1]->toElement()->str(),
-                  subnets[i]->toElement()->str());
+                  (*subnet_it)->toElement()->str());
     }
 
     // Attempt to remove the non existing subnet should  return 0.
@@ -1998,7 +1999,7 @@ TEST_F(MySqlConfigBackendDHCPv4Test, getSharedNetworkSubnets4) {
 
     // Returned subnet should match test subnet #1.
     EXPECT_TRUE(isEquivalent(test_subnets_[1]->toElement(),
-                             subnets[0]->toElement()));
+                             (*subnets.begin())->toElement()));
 
     // All subnets should also be returned for ANY server.
     subnets = cbptr_->getSharedNetworkSubnets4(ServerSelector::ANY(), "level1");
@@ -2006,11 +2007,11 @@ TEST_F(MySqlConfigBackendDHCPv4Test, getSharedNetworkSubnets4) {
 
     // Returned subnet should match test subnet #1.
     EXPECT_TRUE(isEquivalent(test_subnets_[1]->toElement(),
-                             subnets[0]->toElement()));
+                             (*subnets.begin())->toElement()));
 
     // Check server tag
-    ASSERT_EQ(1, subnets[0]->getServerTags().size());
-    EXPECT_EQ("all", subnets[0]->getServerTags().begin()->get());
+    ASSERT_EQ(1, (*subnets.begin())->getServerTags().size());
+    EXPECT_EQ("all", (*subnets.begin())->getServerTags().begin()->get());
 
     // Fetch all subnets belonging to shared network level2.
     subnets = cbptr_->getSharedNetworkSubnets4(ServerSelector::ALL(), "level2");
@@ -2021,8 +2022,9 @@ TEST_F(MySqlConfigBackendDHCPv4Test, getSharedNetworkSubnets4) {
     test_list->add(test_subnets_[3]->toElement());
 
     ElementPtr returned_list = Element::createList();
-    returned_list->add(subnets[0]->toElement());
-    returned_list->add(subnets[1]->toElement());
+    auto subnet = subnets.begin();
+    returned_list->add((*subnet)->toElement());
+    returned_list->add((*++subnet)->toElement());
 
     EXPECT_TRUE(isEquivalent(returned_list, test_list));
 
@@ -2031,8 +2033,9 @@ TEST_F(MySqlConfigBackendDHCPv4Test, getSharedNetworkSubnets4) {
     ASSERT_EQ(2, subnets.size());
 
     returned_list = Element::createList();
-    returned_list->add(subnets[0]->toElement());
-    returned_list->add(subnets[1]->toElement());
+    subnet = subnets.begin();
+    returned_list->add((*subnet)->toElement());
+    returned_list->add((*++subnet)->toElement());
 
     EXPECT_TRUE(isEquivalent(returned_list, test_list));
 }
index a6c05460d2a1b20913c0f67d29945d2d584849dd..a3ffc69e0d323dd9725384a600b734594f1de421 100644 (file)
@@ -1508,11 +1508,12 @@ TEST_F(MySqlConfigBackendDHCPv6Test, getAllSubnets6) {
     ASSERT_EQ(test_subnets_.size() - 1, subnets.size());
 
     // See if the subnets are returned ok.
-    for (auto i = 0; i < subnets.size(); ++i) {
+    auto subnet_it = subnets.begin();
+    for (auto i = 0; i < subnets.size(); ++i, ++subnet_it) {
         EXPECT_EQ(test_subnets_[i + 1]->toElement()->str(),
-                  subnets[i]->toElement()->str());
-        ASSERT_EQ(1, subnets[i]->getServerTags().size());
-        EXPECT_EQ("all", subnets[i]->getServerTags().begin()->get());
+                  (*subnet_it)->toElement()->str());
+        ASSERT_EQ(1, (*subnet_it)->getServerTags().size());
+        EXPECT_EQ("all", (*subnet_it)->getServerTags().begin()->get());
     }
 
     // Attempt to remove the non existing subnet should  return 0.
@@ -2028,7 +2029,7 @@ TEST_F(MySqlConfigBackendDHCPv6Test, getSharedNetworkSubnets6) {
 
     // Returned subnet should match test subnet #1.
     EXPECT_TRUE(isEquivalent(test_subnets_[1]->toElement(),
-                             subnets[0]->toElement()));
+                             (*subnets.begin())->toElement()));
 
     // All subnets should also be returned for ANY server.
     subnets = cbptr_->getSharedNetworkSubnets6(ServerSelector::ANY(), "level1");
@@ -2036,7 +2037,7 @@ TEST_F(MySqlConfigBackendDHCPv6Test, getSharedNetworkSubnets6) {
 
     // Returned subnet should match test subnet #1.
     EXPECT_TRUE(isEquivalent(test_subnets_[1]->toElement(),
-                             subnets[0]->toElement()));
+                             (*subnets.begin())->toElement()));
 
     // Fetch all subnets belonging to shared network level2.
     subnets = cbptr_->getSharedNetworkSubnets6(ServerSelector::ALL(), "level2");
@@ -2047,8 +2048,9 @@ TEST_F(MySqlConfigBackendDHCPv6Test, getSharedNetworkSubnets6) {
     test_list->add(test_subnets_[3]->toElement());
 
     ElementPtr returned_list = Element::createList();
-    returned_list->add(subnets[0]->toElement());
-    returned_list->add(subnets[1]->toElement());
+    auto subnet = subnets.begin();
+    returned_list->add((*subnet)->toElement());
+    returned_list->add((*++subnet)->toElement());
 
     EXPECT_TRUE(isEquivalent(returned_list, test_list));
 
@@ -2057,8 +2059,9 @@ TEST_F(MySqlConfigBackendDHCPv6Test, getSharedNetworkSubnets6) {
     ASSERT_EQ(2, subnets.size());
 
     returned_list = Element::createList();
-    returned_list->add(subnets[0]->toElement());
-    returned_list->add(subnets[1]->toElement());
+    subnet = subnets.begin();
+    returned_list->add((*subnet)->toElement());
+    returned_list->add((*++subnet)->toElement());
 
     EXPECT_TRUE(isEquivalent(returned_list, test_list));
 }
index 433f4b3671018165d15cabb10d2a8639d0d5d165..6559ddb0ab68600109a16e0fa2b3aff861a0897d 100644 (file)
@@ -73,7 +73,7 @@ int subnet4_select(CalloutHandle& handle) {
             // User is not in the registry, so assign them to the last subnet
             // in the collection.  By convention we are assuming this is the
             // restricted subnet.
-            Subnet4Ptr subnet = subnets->back();
+            Subnet4Ptr subnet = *subnets->rbegin();
             handle.setArgument("subnet4", subnet);
         }
     } catch (const std::exception& ex) {
@@ -133,7 +133,7 @@ int subnet6_select(CalloutHandle& handle) {
             // User is not in the registry, so assign them to the last subnet
             // in the collection.  By convention we are assuming this is the
             // restricted subnet.
-            Subnet6Ptr subnet = subnets->back();
+            Subnet6Ptr subnet = *subnets->rbegin();
             handle.setArgument("subnet6", subnet);
         }
     } catch (const std::exception& ex) {
index d2d26e285370fc07a80048f37a6d4f3d553471ac..eda3bd2240e2d71df0cbd2bd09b90f0b753504dc 100644 (file)
@@ -38,7 +38,7 @@ CfgSubnets4::add(const Subnet4Ptr& subnet) {
 
     LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE, DHCPSRV_CFGMGR_ADD_SUBNET4)
               .arg(subnet->toText());
-    static_cast<void>(subnets_.push_back(subnet));
+    static_cast<void>(subnets_.insert(subnet));
 }
 
 Subnet4Ptr
@@ -159,7 +159,7 @@ CfgSubnets4::merge(CfgOptionDefPtr cfg_def, CfgSharedNetworks4Ptr networks,
         }
 
         // Add the "other" subnet to the our collection of subnets.
-        static_cast<void>(subnets_.push_back(*other_subnet));
+        static_cast<void>(subnets_.insert(*other_subnet));
 
         // If it belongs to a shared network, find the network and
         // add the subnet to it
index 91769cc654471f8f6d7539beecb5423afe358565..0474269525169e6bb914608603ea8063fa1eeab3 100644 (file)
@@ -38,7 +38,7 @@ CfgSubnets6::add(const Subnet6Ptr& subnet) {
 
     LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE, DHCPSRV_CFGMGR_ADD_SUBNET6)
               .arg(subnet->toText());
-    static_cast<void>(subnets_.push_back(subnet));
+    static_cast<void>(subnets_.insert(subnet));
 }
 
 Subnet6Ptr
@@ -161,7 +161,7 @@ CfgSubnets6::merge(CfgOptionDefPtr cfg_def, CfgSharedNetworks6Ptr networks,
         }
 
         // Add the "other" subnet to the our collection of subnets.
-        static_cast<void>(subnets_.push_back(*other_subnet));
+        static_cast<void>(subnets_.insert(*other_subnet));
 
         // If it belongs to a shared network, find the network and
         // add the subnet to it
index 923cedb10735945ea3d72105c563805df7de7237..bae6d42309416e2d57dcf9fce0b4808ccccb4c88 100644 (file)
@@ -971,7 +971,7 @@ Subnets4ListConfigParser::parse(Subnet4Collection& subnets,
         Subnet4Ptr subnet = parser.parse(subnet_json);
         if (subnet) {
             try {
-                auto ret = subnets.push_back(subnet);
+                auto ret = subnets.insert(subnet);
                 if (!ret.second) {
                     isc_throw(Unexpected,
                               "can't store subnet because of conflict");
@@ -1366,7 +1366,7 @@ Subnets6ListConfigParser::parse(Subnet6Collection& subnets,
         Subnet6Ptr subnet = parser.parse(subnet_json);
         if (subnet) {
             try {
-                auto ret = subnets.push_back(subnet);
+                auto ret = subnets.insert(subnet);
                 if (!ret.second) {
                     isc_throw(Unexpected,
                               "can't store subnet because of conflict");
index a9b628da6de1d52fe5b8546c97bf4759f1d90fcc..cc495b4154f9cd14988757f4fdca9633b35349c9 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2017-2019 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2017-2020 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -69,7 +69,7 @@ public:
         }
 
         // Add a subnet to the collection of subnets for this shared network.
-        static_cast<void>(subnets.push_back(subnet));
+        static_cast<void>(subnets.insert(subnet));
     }
 
     /// @brief Replaces IPv4 subnet in a shared network.
@@ -246,17 +246,13 @@ public:
         // subnet must exist in this container, thus we throw if the iterator
         // is not found.
         const auto& index = subnets.template get<SubnetSubnetIdIndexTag>();
-        auto subnet_id_it = index.find(current_subnet);
-        if (subnet_id_it == index.cend()) {
+        auto subnet_it = index.find(current_subnet);
+        if (subnet_it == index.cend()) {
             isc_throw(BadValue, "no such subnet " << current_subnet
                       << " within shared network");
         }
 
-        // We need to transform this iterator (by subnet id) to a random access
-        // index iterator. Multi index container has a nice way of doing it.
-        auto subnet_it = subnets.template project<SubnetRandomAccessIndexTag>(subnet_id_it);
-
-        // Step to a next subnet within random access index.
+        // Step to a next subnet.
         if (++subnet_it == subnets.cend()) {
             // If we reached the end of the container, start over from the
             // beginning.
index e2ac1b364842257cb20973f49f0f1099169085d3..c164e9b6202d2a5fe5019fe0a997ebba6c107ea3 100644 (file)
@@ -801,9 +801,6 @@ private:
 ///
 //@{
 
-/// @brief Tag for the random access index.
-struct SubnetRandomAccessIndexTag { };
-
 /// @brief Tag for the index for searching by subnet identifier.
 struct SubnetSubnetIdIndexTag { };
 
@@ -844,30 +841,25 @@ typedef boost::multi_index_container<
     Subnet4Ptr,
     // The following holds all indexes.
     boost::multi_index::indexed_by<
-        // First is the random access index allowing for accessing
-        // objects just like we'd do with a vector.
-        boost::multi_index::random_access<
-            boost::multi_index::tag<SubnetRandomAccessIndexTag>
-        >,
-        // Second index allows for searching using subnet identifier.
+        // First index allows for searching using subnet identifier.
         boost::multi_index::ordered_unique<
             boost::multi_index::tag<SubnetSubnetIdIndexTag>,
             boost::multi_index::const_mem_fun<Subnet, SubnetID, &Subnet::getID>
         >,
-        // Third index allows for searching using an output from toText function.
+        // Second index allows for searching using an output from toText function.
         boost::multi_index::ordered_unique<
             boost::multi_index::tag<SubnetPrefixIndexTag>,
             boost::multi_index::const_mem_fun<Subnet, std::string, &Subnet::toText>
         >,
 
-        // Fourth index allows for searching using an output from getServerId.
+        // Third index allows for searching using an output from getServerId.
         boost::multi_index::ordered_non_unique<
             boost::multi_index::tag<SubnetServerIdIndexTag>,
             boost::multi_index::const_mem_fun<Network4, asiolink::IOAddress,
                                               &Network4::getServerId>
         >,
 
-        // Fifth index allows for searching using subnet modification time.
+        // Forth index allows for searching using subnet modification time.
         boost::multi_index::ordered_non_unique<
             boost::multi_index::tag<SubnetModificationTimeIndexTag>,
             boost::multi_index::const_mem_fun<data::BaseStampedElement,
@@ -904,22 +896,17 @@ typedef boost::multi_index_container<
     Subnet6Ptr,
     // The following holds all indexes.
     boost::multi_index::indexed_by<
-        // First is the random access index allowing for accessing
-        // objects just like we'd do with a vector.
-        boost::multi_index::random_access<
-            boost::multi_index::tag<SubnetRandomAccessIndexTag>
-        >,
-        // Second index allows for searching using subnet identifier.
+        // First index allows for searching using subnet identifier.
         boost::multi_index::ordered_unique<
             boost::multi_index::tag<SubnetSubnetIdIndexTag>,
             boost::multi_index::const_mem_fun<Subnet, SubnetID, &Subnet::getID>
         >,
-        // Third index allows for searching using an output from toText function.
+        // Second index allows for searching using an output from toText function.
         boost::multi_index::ordered_unique<
             boost::multi_index::tag<SubnetPrefixIndexTag>,
             boost::multi_index::const_mem_fun<Subnet, std::string, &Subnet::toText>
         >,
-        // Fourth index allows for searching using subnet modification time.
+        // Third index allows for searching using subnet modification time.
         boost::multi_index::ordered_non_unique<
             boost::multi_index::tag<SubnetModificationTimeIndexTag>,
             boost::multi_index::const_mem_fun<data::BaseStampedElement,
index 6b064a42989289cd7fa20d5b941b3159a906ec3a..77aa41870fa07596dde2bef66d32227b077f6828 100644 (file)
@@ -180,7 +180,7 @@ TEST(CfgSubnets4Test, replaceSubnet) {
     ASSERT_TRUE(replaced);
     EXPECT_TRUE(replaced == subnet2);
     ASSERT_EQ(3, cfg.getAll()->size());
-    Subnet4Ptr returned = cfg.getAll()->at(1);
+    Subnet4Ptr returned = cfg.getSubnet(SubnetID(2));
     ASSERT_TRUE(returned);
     EXPECT_TRUE(returned == subnet);
 
@@ -189,7 +189,7 @@ TEST(CfgSubnets4Test, replaceSubnet) {
     ASSERT_TRUE(replaced);
     EXPECT_TRUE(replaced == subnet);
     ASSERT_EQ(3, cfg.getAll()->size());
-    returned = cfg.getAll()->at(1);
+    returned = cfg.getSubnet(SubnetID(2));
     ASSERT_TRUE(returned);
     EXPECT_TRUE(returned == subnet2);
 
@@ -198,7 +198,7 @@ TEST(CfgSubnets4Test, replaceSubnet) {
                              26, 10, 20, 1000,  SubnetID(2)));
     replaced = cfg.replace(subnet);
     EXPECT_FALSE(replaced);
-    returned = cfg.getAll()->at(1);
+    returned = cfg.getSubnet(SubnetID(2));
     ASSERT_TRUE(returned);
     EXPECT_TRUE(returned == subnet2);
 
@@ -208,7 +208,7 @@ TEST(CfgSubnets4Test, replaceSubnet) {
     replaced = cfg.replace(subnet);
     ASSERT_TRUE(replaced);
     EXPECT_TRUE(replaced == subnet2);
-    returned = cfg.getAll()->at(1);
+    returned = cfg.getSubnet(SubnetID(2));
     ASSERT_TRUE(returned);
     EXPECT_TRUE(returned == subnet);
 }
index bc2979a59822d67e03a9cc26b140abd828ab72d7..d2b50cf24a52b5ee5c3d4c50d8fe9223e0db8170 100644 (file)
@@ -183,7 +183,7 @@ TEST(CfgSubnets6Test, replaceSubnet) {
     ASSERT_TRUE(replaced);
     EXPECT_TRUE(replaced == subnet2);
     ASSERT_EQ(3, cfg.getAll()->size());
-    Subnet6Ptr returned = cfg.getAll()->at(1);
+    Subnet6Ptr returned = cfg.getSubnet(SubnetID(2));
     ASSERT_TRUE(returned);
     EXPECT_TRUE(returned == subnet);
 
@@ -192,7 +192,7 @@ TEST(CfgSubnets6Test, replaceSubnet) {
     ASSERT_TRUE(replaced);
     EXPECT_TRUE(replaced == subnet);
     ASSERT_EQ(3, cfg.getAll()->size());
-    returned = cfg.getAll()->at(1);
+    returned = cfg.getSubnet(SubnetID(2));
     ASSERT_TRUE(returned);
     EXPECT_TRUE(returned == subnet2);
 
@@ -201,7 +201,7 @@ TEST(CfgSubnets6Test, replaceSubnet) {
                              48, 10, 20, 30, 1000,  SubnetID(2)));
     replaced = cfg.replace(subnet);
     EXPECT_FALSE(replaced);
-    returned = cfg.getAll()->at(1);
+    returned = cfg.getSubnet(SubnetID(2));
     ASSERT_TRUE(returned);
     EXPECT_TRUE(returned == subnet2);
 
@@ -211,7 +211,7 @@ TEST(CfgSubnets6Test, replaceSubnet) {
     replaced = cfg.replace(subnet);
     ASSERT_TRUE(replaced);
     EXPECT_TRUE(replaced == subnet2);
-    returned = cfg.getAll()->at(1);
+    returned = cfg.getSubnet(SubnetID(2));
     ASSERT_TRUE(returned);
     EXPECT_TRUE(returned == subnet);
 }
index ee83c601de64aa1f09485ba69a2e42e7927c5e11..0464209d6d0d5f05cc70b145df3483996f1d1755 100644 (file)
@@ -128,7 +128,8 @@ TEST(SharedNetwork4Test, addSubnet4) {
 
     // Retrieve the subnet from the network and make sure it is returned
     // as expected.
-    Subnet4Ptr returned_subnet = network->getAllSubnets()->front();
+    ASSERT_FALSE(network->getAllSubnets()->empty());
+    Subnet4Ptr returned_subnet = *network->getAllSubnets()->begin();
     ASSERT_TRUE(returned_subnet);
     EXPECT_EQ(subnet->getID(), returned_subnet->getID());
     SharedNetwork4Ptr network1;
@@ -184,16 +185,23 @@ TEST(SharedNetwork4Test, replaceSubnet4) {
 
     // Subnets did not changed.
     ASSERT_EQ(3, network->getAllSubnets()->size());
-    Subnet4Ptr returned_subnet = network->getAllSubnets()->at(0);
+    auto returned_it = network->getAllSubnets()->begin();
+    Subnet4Ptr returned_subnet = *returned_it;
     ASSERT_TRUE(returned_subnet);
-    EXPECT_EQ(15, returned_subnet->getID());
-    returned_subnet = network->getAllSubnets()->at(2);
+    EXPECT_EQ(1, returned_subnet->getID());
+    ++returned_it;
+    returned_subnet = *returned_it;
     ASSERT_TRUE(returned_subnet);
     EXPECT_EQ(10, returned_subnet->getID());
-    // Finish by the second subnet.
-    returned_subnet = network->getAllSubnets()->at(1);
+    ++returned_it;
+    returned_subnet = *returned_it;
     ASSERT_TRUE(returned_subnet);
-    EXPECT_EQ(1, returned_subnet->getID());
+    EXPECT_EQ(15, returned_subnet->getID());
+
+    // Reset the returned subnet to the subnet with subnet id 1.
+    returned_subnet = *network->getAllSubnets()->begin();
+    ASSERT_TRUE(returned_subnet);
+    ASSERT_EQ(1, returned_subnet->getID());
 
     // Create another subnet with the same ID than the second subnet.
     subnet.reset(new Subnet4(IOAddress("192.168.0.0"), 24, 100, 200, 300,
@@ -209,7 +217,7 @@ TEST(SharedNetwork4Test, replaceSubnet4) {
     EXPECT_FALSE(network1);
 
     ASSERT_EQ(3, network->getAllSubnets()->size());
-    returned_subnet = network->getAllSubnets()->at(1);
+    returned_subnet = *network->getAllSubnets()->begin();
     ASSERT_TRUE(returned_subnet);
     ASSERT_EQ(1, returned_subnet->getID());
     EXPECT_EQ(100, returned_subnet->getT1());
@@ -220,12 +228,13 @@ TEST(SharedNetwork4Test, replaceSubnet4) {
     EXPECT_TRUE(network == network1);
 
     // Other subnets did not changed.
-    returned_subnet = network->getAllSubnets()->at(0);
-    ASSERT_TRUE(returned_subnet);
-    EXPECT_EQ(15, returned_subnet->getID());
-    returned_subnet = network->getAllSubnets()->at(2);
+    returned_it = network->getAllSubnets()->begin();
+    returned_subnet = *++returned_it;
     ASSERT_TRUE(returned_subnet);
     EXPECT_EQ(10, returned_subnet->getID());
+    returned_subnet = *++returned_it;
+    ASSERT_TRUE(returned_subnet);
+    EXPECT_EQ(15, returned_subnet->getID());
 
     // Create another network and try to replace a subnet to it. It should fail
     // because the subnet is already associated with the first network.
@@ -237,7 +246,7 @@ TEST(SharedNetwork4Test, replaceSubnet4) {
                              SubnetID(1)));
     EXPECT_TRUE(network->replace(subnet));
     ASSERT_EQ(3, network->getAllSubnets()->size());
-    returned_subnet = network->getAllSubnets()->at(1);
+    returned_subnet = *network->getAllSubnets()->begin();
     ASSERT_TRUE(returned_subnet);
     ASSERT_EQ(1, returned_subnet->getID());
     EXPECT_EQ("192.168.10.0/24", returned_subnet->toText());
@@ -247,7 +256,7 @@ TEST(SharedNetwork4Test, replaceSubnet4) {
                              SubnetID(1)));
     EXPECT_FALSE(network->replace(subnet));
     ASSERT_EQ(3, network->getAllSubnets()->size());
-    returned_subnet = network->getAllSubnets()->at(1);
+    returned_subnet = *network->getAllSubnets()->begin();
     ASSERT_TRUE(returned_subnet);
     ASSERT_EQ(1, returned_subnet->getID());
     EXPECT_EQ("192.168.10.0/24", returned_subnet->toText());
@@ -276,8 +285,7 @@ TEST(SharedNetwork4Test, delSubnet4) {
     ASSERT_NO_THROW(network->del(subnet1->getID()));
     // We should be left with only one subnet.
     ASSERT_EQ(1, network->getAllSubnets()->size());
-    Subnet4Ptr subnet_returned = network->getAllSubnets()->front();
-    ASSERT_TRUE(subnet_returned);
+    Subnet4Ptr subnet_returned = *network->getAllSubnets()->begin();
     EXPECT_EQ(subnet2->getID(), subnet_returned->getID());
 
     // Check that shared network has been cleared for the removed subnet.
@@ -848,7 +856,7 @@ TEST(SharedNetwork6Test, addSubnet6) {
 
     // Retrieve the subnet from the network and make sure it is returned
     // as expected.
-    Subnet6Ptr returned_subnet = network->getAllSubnets()->front();
+    Subnet6Ptr returned_subnet = *network->getAllSubnets()->begin();
     ASSERT_TRUE(returned_subnet);
     EXPECT_EQ(subnet->getID(), returned_subnet->getID());
     SharedNetwork6Ptr network1;
@@ -904,16 +912,23 @@ TEST(SharedNetwork6Test, replaceSubnet6) {
 
     // Subnets did not changed.
     ASSERT_EQ(3, network->getAllSubnets()->size());
-    Subnet6Ptr returned_subnet = network->getAllSubnets()->at(0);
+    auto returned_it = network->getAllSubnets()->begin();
+    Subnet6Ptr returned_subnet = *returned_it;
     ASSERT_TRUE(returned_subnet);
-    EXPECT_EQ(15, returned_subnet->getID());
-    returned_subnet = network->getAllSubnets()->at(2);
+    EXPECT_EQ(1, returned_subnet->getID());
+    ++returned_it;
+    returned_subnet = *returned_it;
     ASSERT_TRUE(returned_subnet);
     EXPECT_EQ(10, returned_subnet->getID());
-    // Finish by the second subnet.
-    returned_subnet = network->getAllSubnets()->at(1);
+    ++returned_it;
+    returned_subnet = *returned_it;
     ASSERT_TRUE(returned_subnet);
-    EXPECT_EQ(1, returned_subnet->getID());
+    EXPECT_EQ(15, returned_subnet->getID());
+
+    // Reset the returned subnet to the subnet with subnet id 1.
+    returned_subnet = *network->getAllSubnets()->begin();
+    ASSERT_TRUE(returned_subnet);
+    ASSERT_EQ(1, returned_subnet->getID());
 
     // Create another subnet with the same ID than the second subnet.
     subnet.reset(new Subnet6(IOAddress("2001:db8:2::"), 64, 100, 200, 300, 400,
@@ -930,7 +945,7 @@ TEST(SharedNetwork6Test, replaceSubnet6) {
     EXPECT_FALSE(network1);
 
     ASSERT_EQ(3, network->getAllSubnets()->size());
-    returned_subnet = network->getAllSubnets()->at(1);
+    returned_subnet = *network->getAllSubnets()->begin();
     ASSERT_TRUE(returned_subnet);
     ASSERT_EQ(1, returned_subnet->getID());
     EXPECT_EQ(100, returned_subnet->getT1());
@@ -942,12 +957,13 @@ TEST(SharedNetwork6Test, replaceSubnet6) {
     EXPECT_TRUE(network == network1);
 
     // Other subnets did not changed.
-    returned_subnet = network->getAllSubnets()->at(0);
-    ASSERT_TRUE(returned_subnet);
-    EXPECT_EQ(15, returned_subnet->getID());
-    returned_subnet = network->getAllSubnets()->at(2);
+    returned_it = network->getAllSubnets()->begin();
+    returned_subnet = *++returned_it;
     ASSERT_TRUE(returned_subnet);
     EXPECT_EQ(10, returned_subnet->getID());
+    returned_subnet = *++returned_it;
+    ASSERT_TRUE(returned_subnet);
+    EXPECT_EQ(15, returned_subnet->getID());
 
     // Create another network and try to replace a subnet to it. It should fail
     // because the subnet is already associated with the first network.
@@ -959,7 +975,7 @@ TEST(SharedNetwork6Test, replaceSubnet6) {
                              400, SubnetID(1)));
     EXPECT_TRUE(network->replace(subnet));
     ASSERT_EQ(3, network->getAllSubnets()->size());
-    returned_subnet = network->getAllSubnets()->at(1);
+    returned_subnet = *network->getAllSubnets()->begin();
     ASSERT_TRUE(returned_subnet);
     ASSERT_EQ(1, returned_subnet->getID());
     EXPECT_EQ("2001:db8:10::/64", returned_subnet->toText());
@@ -969,7 +985,7 @@ TEST(SharedNetwork6Test, replaceSubnet6) {
                              SubnetID(1)));
     EXPECT_FALSE(network->replace(subnet));
     ASSERT_EQ(3, network->getAllSubnets()->size());
-    returned_subnet = network->getAllSubnets()->at(1);
+    returned_subnet = *network->getAllSubnets()->begin();
     ASSERT_TRUE(returned_subnet);
     ASSERT_EQ(1, returned_subnet->getID());
     EXPECT_EQ("2001:db8:10::/64", returned_subnet->toText());
@@ -998,7 +1014,7 @@ TEST(SharedNetwork6Test, delSubnet6) {
     ASSERT_NO_THROW(network->del(subnet1->getID()));
     // We should be left with only one subnet.
     ASSERT_EQ(1, network->getAllSubnets()->size());
-    Subnet6Ptr subnet_returned = network->getAllSubnets()->front();
+    Subnet6Ptr subnet_returned = *network->getAllSubnets()->begin();
     ASSERT_TRUE(subnet_returned);
     EXPECT_EQ(subnet2->getID(), subnet_returned->getID());
 
index b2a5d7d9c84ac6260eb25c7ac1a5177db5923dfa..8fa89046a09a8fe512d12e5c3229ed3a168af9b0 100644 (file)
@@ -59,7 +59,7 @@ public:
             Subnet4Ptr subnet(new Subnet4(IOAddress(0xC0000000 | (i << 2)),
                                           24, def_triplet, def_triplet,
                                           4000));
-            test_subnets4_.push_back(subnet);
+            test_subnets4_.insert(subnet);
         }
         // Create IPv6 subnets.
         IOAddress prefix("2001:db8:1::");
@@ -72,7 +72,7 @@ public:
             ++prefix_bytes[5];
             prefix = IOAddress::fromBytes(prefix.getFamily(), &prefix_bytes[0]);
             Subnet6Ptr subnet(new Subnet6(prefix, 64, 1000, 2000, 3000, 4000));
-            test_subnets6_.push_back(subnet);
+            test_subnets6_.insert(subnet);
         }
 
         // Build our reference dictionary of client classes
@@ -142,7 +142,12 @@ SrvConfigTest::addSubnet4(const unsigned int index) {
         FAIL() << "Subnet index " << index << "out of range (0.."
                << TEST_SUBNETS_NUM << "): " << "unable to add IPv4 subnet";
     }
-    conf_.getCfgSubnets4()->add(test_subnets4_[index]);
+    // std::advance is not available for this iterator.
+    auto it = test_subnets4_.begin();
+    for (unsigned int i = 0; i < index; ++i, ++it) {
+        ASSERT_FALSE(it == test_subnets4_.end());
+    }
+    conf_.getCfgSubnets4()->add(*it);
 }
 
 void
@@ -151,7 +156,12 @@ SrvConfigTest::addSubnet6(const unsigned int index) {
         FAIL() << "Subnet index " << index << "out of range (0.."
                << TEST_SUBNETS_NUM << "): " << "unable to add IPv6 subnet";
     }
-    conf_.getCfgSubnets6()->add(test_subnets6_[index]);
+    // std::advance is not available for this iterator.
+    auto it = test_subnets6_.begin();
+    for (unsigned int i = 0; i < index; ++i, ++it) {
+        ASSERT_FALSE(it == test_subnets6_.end());
+    }
+    conf_.getCfgSubnets6()->add(*it);
 }
 
 void
index 082493f03aebf903efa2d30ae0406df6f9095370..139f89e87e164405bb4dee3e2d364df15a43b23d 100644 (file)
@@ -1801,10 +1801,10 @@ TEST(SubnetFetcherTest, getSubnet4ById) {
     EXPECT_FALSE(subnet);
 
     subnet.reset(new Subnet4(IOAddress("192.0.2.0"), 24, 1, 2, 3, 1024));
-    EXPECT_NO_THROW(collection.push_back(subnet));
+    EXPECT_NO_THROW(collection.insert(subnet));
 
     subnet.reset(new Subnet4(IOAddress("192.0.3.0"), 24, 1, 2, 3, 2048));
-    EXPECT_NO_THROW(collection.push_back(subnet));
+    EXPECT_NO_THROW(collection.insert(subnet));
 
     subnet = SubnetFetcher4::get(collection, SubnetID(1024));
     ASSERT_TRUE(subnet);
@@ -1827,10 +1827,10 @@ TEST(SubnetFetcherTest, getSubnet6ById) {
     EXPECT_FALSE(subnet);
 
     subnet.reset(new Subnet6(IOAddress("2001:db8:1::"), 64, 1, 2, 3, 4, 1024));
-    EXPECT_NO_THROW(collection.push_back(subnet));
+    EXPECT_NO_THROW(collection.insert(subnet));
 
     subnet.reset(new Subnet6(IOAddress("2001:db8:2::"), 64, 1, 2, 3, 4, 2048));
-    EXPECT_NO_THROW(collection.push_back(subnet));
+    EXPECT_NO_THROW(collection.insert(subnet));
 
     subnet = SubnetFetcher6::get(collection, SubnetID(1024));
     ASSERT_TRUE(subnet);
index 0cbe3dd38c1a61fd35297d7cd2fa4a456109370b..d9a06e73c7d19d7ef85e689b65b477308edbbb0b 100644 (file)
@@ -87,12 +87,12 @@ TestConfigBackendDHCPv4::getAllSubnets4(const db::ServerSelector& server_selecto
     Subnet4Collection subnets;
     for (auto subnet : subnets_) {
         if (server_selector.amAny()) {
-            subnets.push_back(subnet);
+            subnets.insert(subnet);
             continue;
         }
         if (server_selector.amUnassigned()) {
             if (subnet->getServerTags().empty()) {
-                subnets.push_back(subnet);
+                subnets.insert(subnet);
             }
             continue;
         }
@@ -100,7 +100,7 @@ TestConfigBackendDHCPv4::getAllSubnets4(const db::ServerSelector& server_selecto
         auto tags = server_selector.getTags();
         for (auto tag : tags) {
             if (subnet->hasServerTag(ServerTag(tag))) {
-                subnets.push_back(subnet);
+                subnets.insert(subnet);
                 got = true;
                 break;
             }
@@ -109,7 +109,7 @@ TestConfigBackendDHCPv4::getAllSubnets4(const db::ServerSelector& server_selecto
             continue;
         }
         if (subnet->hasAllServerTag()) {
-            subnets.push_back(subnet);
+            subnets.insert(subnet);
         }
     }
     return (subnets);
@@ -123,12 +123,12 @@ TestConfigBackendDHCPv4::getModifiedSubnets4(const db::ServerSelector& server_se
     auto lb = index.lower_bound(modification_time);
     for (auto subnet = lb; subnet != index.end(); ++subnet) {
         if (server_selector.amAny()) {
-            subnets.push_back(*subnet);
+            subnets.insert(*subnet);
             continue;
         }
         if (server_selector.amUnassigned()) {
             if ((*subnet)->getServerTags().empty()) {
-                subnets.push_back(*subnet);
+                subnets.insert(*subnet);
             }
             continue;
         }
@@ -136,7 +136,7 @@ TestConfigBackendDHCPv4::getModifiedSubnets4(const db::ServerSelector& server_se
         auto tags = server_selector.getTags();
         for (auto tag : tags) {
             if ((*subnet)->hasServerTag(ServerTag(tag))) {
-                subnets.push_back(*subnet);
+                subnets.insert(*subnet);
                 got = true;
                 break;
             }
@@ -145,7 +145,7 @@ TestConfigBackendDHCPv4::getModifiedSubnets4(const db::ServerSelector& server_se
             continue;
         }
         if ((*subnet)->hasAllServerTag()) {
-            subnets.push_back(*subnet);
+            subnets.insert(*subnet);
         }
     }
     return (subnets);
@@ -188,7 +188,7 @@ TestConfigBackendDHCPv4::getSharedNetworkSubnets4(const db::ServerSelector& serv
         subnet->getSharedNetwork(network);
         if (((network && (network->getName() == shared_network_name)) ||
              (subnet->getSharedNetworkName() == shared_network_name))) {
-            subnets.push_back(subnet);
+            subnets.insert(subnet);
         }
     }
     return (subnets);
@@ -890,8 +890,7 @@ uint64_t
 TestConfigBackendDHCPv4::deleteSharedNetworkSubnets4(const db::ServerSelector& server_selector,
                                                      const std::string& shared_network_name) {
     uint64_t cnt = 0;
-    auto& index = subnets_.get<SubnetRandomAccessIndexTag>();
-    for (auto subnet = index.begin(); subnet != index.end(); ) {
+    for (auto subnet = subnets_.begin(); subnet != subnets_.end(); ) {
         // Skip subnets which do not match the server selector.
         if (server_selector.amUnassigned() &&
            !(*subnet)->getServerTags().empty()) {
@@ -921,7 +920,7 @@ TestConfigBackendDHCPv4::deleteSharedNetworkSubnets4(const db::ServerSelector& s
 
         if ((network && (network->getName() == shared_network_name)) ||
             ((*subnet)->getSharedNetworkName() == shared_network_name)) {
-            subnet = index.erase(subnet);
+            subnet = subnets_.erase(subnet);
             ++cnt;
         } else {
             ++subnet;
index 3cdf0013346573fdd3cc90aaa092876e8b1a751f..cbc207535886a602aff3d907d4eec2a536ebb90e 100644 (file)
@@ -86,12 +86,12 @@ TestConfigBackendDHCPv6::getAllSubnets6(const db::ServerSelector& server_selecto
     Subnet6Collection subnets;
     for (auto subnet : subnets_) {
         if (server_selector.amAny()) {
-            subnets.push_back(subnet);
+            subnets.insert(subnet);
             continue;
         }
         if (server_selector.amUnassigned()) {
             if (subnet->getServerTags().empty()) {
-                subnets.push_back(subnet);
+                subnets.insert(subnet);
             }
             continue;
         }
@@ -99,7 +99,7 @@ TestConfigBackendDHCPv6::getAllSubnets6(const db::ServerSelector& server_selecto
         auto tags = server_selector.getTags();
         for (auto tag : tags) {
             if (subnet->hasServerTag(ServerTag(tag))) {
-                subnets.push_back(subnet);
+                subnets.insert(subnet);
                 got = true;
                 break;
             }
@@ -108,7 +108,7 @@ TestConfigBackendDHCPv6::getAllSubnets6(const db::ServerSelector& server_selecto
             continue;
         }
         if (subnet->hasAllServerTag()) {
-            subnets.push_back(subnet);
+            subnets.insert(subnet);
         }
     }
     return (subnets);
@@ -122,12 +122,12 @@ TestConfigBackendDHCPv6::getModifiedSubnets6(const db::ServerSelector& server_se
     auto lb = index.lower_bound(modification_time);
     for (auto subnet = lb; subnet != index.end(); ++subnet) {
         if (server_selector.amAny()) {
-            subnets.push_back(*subnet);
+            subnets.insert(*subnet);
             continue;
         }
         if (server_selector.amUnassigned()) {
             if ((*subnet)->getServerTags().empty()) {
-                subnets.push_back(*subnet);
+                subnets.insert(*subnet);
             }
             continue;
         }
@@ -135,7 +135,7 @@ TestConfigBackendDHCPv6::getModifiedSubnets6(const db::ServerSelector& server_se
         auto tags = server_selector.getTags();
         for (auto tag : tags) {
             if ((*subnet)->hasServerTag(ServerTag(tag))) {
-                subnets.push_back(*subnet);
+                subnets.insert(*subnet);
                 got = true;
                 break;
             }
@@ -144,7 +144,7 @@ TestConfigBackendDHCPv6::getModifiedSubnets6(const db::ServerSelector& server_se
             continue;
         }
         if ((*subnet)->hasAllServerTag()) {
-            subnets.push_back(*subnet);
+            subnets.insert(*subnet);
         }
     }
     return (subnets);
@@ -187,7 +187,7 @@ TestConfigBackendDHCPv6::getSharedNetworkSubnets6(const db::ServerSelector& serv
         subnet->getSharedNetwork(network);
         if (((network && (network->getName() == shared_network_name)) ||
              (subnet->getSharedNetworkName() == shared_network_name))) {
-            subnets.push_back(subnet);
+            subnets.insert(subnet);
         }
     }
     return (subnets);
@@ -943,8 +943,7 @@ uint64_t
 TestConfigBackendDHCPv6::deleteSharedNetworkSubnets6(const db::ServerSelector& server_selector,
                                                      const std::string& shared_network_name) {
     uint64_t cnt = 0;
-    auto& index = subnets_.get<SubnetRandomAccessIndexTag>();
-    for (auto subnet = index.begin(); subnet != index.end(); ) {
+    for (auto subnet = subnets_.begin(); subnet != subnets_.end(); ) {
         // Skip subnets which do not match the server selector.
         if (server_selector.amUnassigned() &&
            !(*subnet)->getServerTags().empty()) {
@@ -974,7 +973,7 @@ TestConfigBackendDHCPv6::deleteSharedNetworkSubnets6(const db::ServerSelector& s
 
         if ((network && (network->getName() == shared_network_name)) ||
             ((*subnet)->getSharedNetworkName() == shared_network_name)) {
-            subnet = index.erase(subnet);
+            subnet = subnets_.erase(subnet);
             ++cnt;
         } else {
             ++subnet;