nlsr: Add support for sources to NamePrefixList
Added support for string sources to NamePrefixList entries. Required was
some tweaking of the API, and refactoring usage around the codebase.
Change-Id: I44813e024a88dc1f591f427b0fad568a7d5353ab
refs: #4177
diff --git a/tests/publisher/publisher-fixture.hpp b/tests/publisher/publisher-fixture.hpp
index c52f378..9156c7b 100644
--- a/tests/publisher/publisher-fixture.hpp
+++ b/tests/publisher/publisher-fixture.hpp
@@ -140,7 +140,7 @@
std::list<ndn::Name>::const_iterator it = tlvLsa.getNames().begin();
- for (const ndn::Name& name : lsa.getNpl().getNameList()) {
+ for (const ndn::Name& name : lsa.getNpl().getNames()) {
BOOST_CHECK_EQUAL(*it, name);
++it;
}
diff --git a/tests/test-lsdb.cpp b/tests/test-lsdb.cpp
index abd58d4..2dd6f3e 100644
--- a/tests/test-lsdb.cpp
+++ b/tests/test-lsdb.cpp
@@ -74,10 +74,11 @@
void
areNamePrefixListsEqual(NamePrefixList& lhs, NamePrefixList& rhs)
{
+
typedef std::list<ndn::Name> NameList;
- NameList& lhsList = lhs.getNameList();
- NameList& rhsList = rhs.getNameList();
+ NameList lhsList = lhs.getNames();
+ NameList rhsList = rhs.getNames();
BOOST_REQUIRE_EQUAL(lhsList.size(), rhsList.size());
@@ -274,7 +275,8 @@
BOOST_REQUIRE_EQUAL(lsdb.doesLsaExist(otherRouter + "/name", NameLsa::TYPE_STRING), true);
NamePrefixList& nameList = lsdb.findNameLsa(otherRouter + "/name")->getNpl();
- areNamePrefixListsEqual(nameList, prefixes);
+ BOOST_CHECK_EQUAL(nameList, prefixes);
+ //areNamePrefixListsEqual(nameList, prefixes);
// Add a prefix: name3
ndn::Name name3("/ndn/name3");
@@ -284,7 +286,7 @@
lsdb.installNameLsa(addLsa);
// Lsa should include name1, name2, and name3
- areNamePrefixListsEqual(nameList, prefixes);
+ BOOST_CHECK_EQUAL(nameList, prefixes);
// Remove a prefix: name2
prefixes.remove(name2);
@@ -293,7 +295,7 @@
lsdb.installNameLsa(removeLsa);
// Lsa should include name1 and name3
- areNamePrefixListsEqual(nameList, prefixes);
+ BOOST_CHECK_EQUAL(nameList, prefixes);
// Add and remove a prefix: add name2, remove name3
prefixes.insert(name2);
@@ -303,7 +305,7 @@
lsdb.installNameLsa(addAndRemoveLsa);
// Lsa should include name1 and name2
- areNamePrefixListsEqual(nameList, prefixes);
+ BOOST_CHECK_EQUAL(nameList, prefixes);
// Install a completely new list of prefixes
ndn::Name name4("/ndn/name4");
@@ -317,7 +319,7 @@
lsdb.installNameLsa(newLsa);
// Lsa should include name4 and name5
- areNamePrefixListsEqual(nameList, newPrefixes);
+ BOOST_CHECK_EQUAL(nameList, newPrefixes);
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/tests/test-name-prefix-list.cpp b/tests/test-name-prefix-list.cpp
index b07517f..eef0c18 100644
--- a/tests/test-name-prefix-list.cpp
+++ b/tests/test-name-prefix-list.cpp
@@ -16,19 +16,19 @@
*
* You should have received a copy of the GNU General Public License along with
* NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
- *
- * \author Ashlesh Gawande <agawande@memphis.edu>
- *
**/
+
#include "name-prefix-list.hpp"
#include <boost/test/unit_test.hpp>
namespace nlsr {
-
namespace test {
BOOST_AUTO_TEST_SUITE(TestNpl)
+/*
+ The NamePrefixList can have names inserted and removed from it.
+ */
BOOST_AUTO_TEST_CASE(NplSizeAndRemove)
{
NamePrefixList npl1;
@@ -46,6 +46,10 @@
BOOST_CHECK_EQUAL(npl1.getSize(), 1);
}
+/*
+ Two NamePrefixLists will be considered equal if they contain the
+ same names. Sources for names are ignored.
+ */
BOOST_AUTO_TEST_CASE(OperatorEquals)
{
NamePrefixList list1;
@@ -65,6 +69,106 @@
BOOST_CHECK_EQUAL(list1, list2);
}
+/*
+ The NamePrefixList will provide a container of all the names it has,
+ without the sources for those names.
+ */
+BOOST_AUTO_TEST_CASE(GetNames)
+{
+ NamePrefixList list;
+ const ndn::Name name1{"/ndn/test/prefix1"};
+ const ndn::Name name2{"/ndn/test/prefix2"};
+ const ndn::Name name3{"/ndn/test/prefix3"};
+ list.insert(name1);
+ list.insert(name2);
+ list.insert(name3);
+
+ std::vector<ndn::Name> referenceNames{name1, name2, name3};
+
+ auto names = list.getNames();
+ BOOST_REQUIRE_EQUAL(names.size(), 3);
+ // Verify that all of the names are in the list.
+ for (const auto& name : names) {
+ bool didMatch = false;
+ for (const auto& referenceName : referenceNames) {
+ didMatch = didMatch || (name == referenceName);
+ }
+ BOOST_CHECK(didMatch);
+ }
+}
+
+/*
+ The NamePrefixList will count the number of sources for a given
+ name, with zero for a non-existent name.
+ */
+BOOST_AUTO_TEST_CASE(countSources)
+{
+ NamePrefixList list;
+ const ndn::Name name1{"/ndn/test/prefix1"};
+ const ndn::Name invalidName{"/not/a/prefix"};
+ list.insert(name1, "nlsr.conf");
+ list.insert(name1, "readvertise");
+ list.insert(name1, "prefix-update");
+
+ BOOST_CHECK_EQUAL(list.countSources(name1), 3);
+ BOOST_CHECK_EQUAL(list.countSources(invalidName), 0);
+}
+
+/*
+ The NamePrefixList will return a container with all the sources for
+ a given name, with an empty container for a non-existent name.
+ */
+BOOST_AUTO_TEST_CASE(getSources)
+{
+ NamePrefixList list;
+ const ndn::Name name1{"/ndn/test/prefix1"};
+ const ndn::Name invalidName{"/not/a/prefix"};
+
+ list.insert(name1, "nlsr.conf");
+ list.insert(name1, "readvertise");
+ list.insert(name1, "prefix-update");
+ std::vector<std::string> referenceSources{"nlsr.conf", "readvertise", "prefix-update"};
+
+ const std::vector<std::string> sources = list.getSources(name1);
+ BOOST_REQUIRE_EQUAL(list.countSources(name1), 3);
+ for (const auto& source : sources) {
+ bool didMatch = false;
+ for (const auto& referenceSource : referenceSources) {
+ didMatch = didMatch || (source == referenceSource);
+ }
+ BOOST_CHECK(didMatch);
+ }
+
+ std::vector<std::string> noSources = list.getSources(invalidName);
+ BOOST_REQUIRE_EQUAL(noSources.size(), 0);
+}
+
+/*
+ The NamePrefixList will not delete a name as long as it at least one
+ source.
+ */
+BOOST_AUTO_TEST_CASE(RemainingSourcesAfterRemoval)
+{
+ NamePrefixList list;
+ const ndn::Name name1{"/ndn/test/prefix1"};
+ list.insert(name1, "nlsr.conf");
+ list.insert(name1, "readvertise");
+ list.insert(name1, "prefix-update");
+
+ list.remove(name1, "prefix-update");
+
+ std::vector<std::string> referenceSources{"nlsr.conf", "readvertise", "prefix-update"};
+ const std::vector<std::string> sources = list.getSources(name1);
+ BOOST_REQUIRE_EQUAL(list.countSources(name1), 2);
+ for (const auto& source : sources) {
+ bool didMatch = false;
+ for (const auto& referenceSource : referenceSources) {
+ didMatch = didMatch || (source == referenceSource);
+ }
+ BOOST_CHECK(didMatch);
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()
} // namespace test
diff --git a/tests/update/test-nfd-rib-command-processor.cpp b/tests/update/test-nfd-rib-command-processor.cpp
index bb4db42..20856fe 100644
--- a/tests/update/test-nfd-rib-command-processor.cpp
+++ b/tests/update/test-nfd-rib-command-processor.cpp
@@ -150,10 +150,10 @@
face.receive(*command);
this->advanceClocks(ndn::time::milliseconds(10));
- BOOST_CHECK_EQUAL(namePrefixes.getNameList().size(), 1);
- auto itr = std::find(namePrefixes.getNameList().begin(), namePrefixes.getNameList().end(),
- prefixName);
- if (itr == namePrefixes.getNameList().end()) {
+ BOOST_CHECK_EQUAL(namePrefixes.getNames().size(), 1);
+ std::list<ndn::Name> names = namePrefixes.getNames();
+ auto itr = std::find(names.begin(), names.end(), prefixName);
+ if (itr == namePrefixes.getNames().end()) {
BOOST_FAIL("Prefix was not inserted!");
}
BOOST_CHECK_EQUAL((*itr), prefixName);
@@ -167,7 +167,7 @@
ndn::Name prefixName("/test/prefixA");
ndn::nfd::ControlParameters parameters;
- namePrefixes.getNameList().push_back(prefixName);
+ namePrefixes.insert(prefixName);
shared_ptr<ndn::Interest> command = makeInterest(name.append(parameters.setName(prefixName)
.wireEncode()), 0);
@@ -175,7 +175,7 @@
face.receive(ndn::Interest(name));
this->advanceClocks(ndn::time::milliseconds(10));
- BOOST_CHECK_EQUAL(namePrefixes.getNameList().size(), 0);
+ BOOST_CHECK_EQUAL(namePrefixes.getNames().size(), 0);
BOOST_CHECK(wasRoutingUpdatePublished());
BOOST_CHECK(nameLsaSeqNoBeforeInterest < nlsr.getLsdb().getSequencingManager().getNameLsaSeq());
}
@@ -192,7 +192,7 @@
face.receive(ndn::Interest(name));
this->advanceClocks(ndn::time::milliseconds(10));
- BOOST_CHECK_EQUAL(namePrefixes.getNameList().size(), 0);
+ BOOST_CHECK_EQUAL(namePrefixes.getNames().size(), 0);
// Cannot use routingUpdatePublish test now since in
// initialize nlsr calls buildOwnNameLsa which publishes the routing update
diff --git a/tests/update/test-prefix-update-processor.cpp b/tests/update/test-prefix-update-processor.cpp
index 19deaf6..32cacb5 100644
--- a/tests/update/test-prefix-update-processor.cpp
+++ b/tests/update/test-prefix-update-processor.cpp
@@ -253,7 +253,7 @@
NamePrefixList& namePrefixList = nlsr.getNamePrefixList();
BOOST_REQUIRE_EQUAL(namePrefixList.getSize(), 1);
- BOOST_CHECK_EQUAL(namePrefixList.getNameList().front(), parameters.getName());
+ BOOST_CHECK_EQUAL(namePrefixList.getNames().front(), parameters.getName());
BOOST_CHECK(wasRoutingUpdatePublished());
BOOST_CHECK(nameLsaSeqNoBeforeInterest < nlsr.getLsdb().getSequencingManager().getNameLsaSeq());