interest: drop Selectors from matching functions
matchesData and matchesInterest only consider Name, CanBePrefix,
and MustBeFresh. matchesName is deprecated.
refs #4913
Change-Id: I6f29a98f09f1b6f97e379f4c7d74d9b18da75d0e
diff --git a/tests/unit/ims/in-memory-storage.t.cpp b/tests/unit/ims/in-memory-storage.t.cpp
index 0cb4278..ca1fc35 100644
--- a/tests/unit/ims/in-memory-storage.t.cpp
+++ b/tests/unit/ims/in-memory-storage.t.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2019 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@@ -378,256 +378,6 @@
BOOST_CHECK_EQUAL(ims.size(), 6);
}
-BOOST_AUTO_TEST_CASE_TEMPLATE(ImplicitDigestSelector, T, InMemoryStorages)
-{
- T ims;
-
- Name name("/digest/works");
- shared_ptr<Data> data = makeData(name);
- ims.insert(*data);
-
- shared_ptr<Data> data2 = makeData("/a");
- ims.insert(*data2);
-
- shared_ptr<Data> data3 = makeData("/z/z/z");
- ims.insert(*data3);
-
- ConstBufferPtr digest1 = util::Sha256::computeDigest(data->wireEncode().wire(), data->wireEncode().size());
-
- shared_ptr<Interest> interest = makeInterest("");
- interest->setName(Name(name).appendImplicitSha256Digest(digest1->data(), digest1->size()));
- interest->setMinSuffixComponents(0);
- interest->setMaxSuffixComponents(0);
-
- shared_ptr<const Data> found = ims.find(*interest);
- BOOST_REQUIRE(found != nullptr);
- BOOST_CHECK_EQUAL(found->getName(), name);
-
- shared_ptr<Interest> interest2 = makeInterest("");
- uint8_t digest2[32] = {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1};
- interest2->setName(Name(name).appendImplicitSha256Digest(digest2, 32));
- interest2->setMinSuffixComponents(0);
- interest2->setMaxSuffixComponents(0);
-
- shared_ptr<const Data> notfound = ims.find(*interest2);
- BOOST_CHECK(notfound == nullptr);
-}
-
-BOOST_AUTO_TEST_CASE_TEMPLATE(ChildSelector, T, InMemoryStorages)
-{
- T ims;
-
- shared_ptr<Data> data = makeData("/a");
- ims.insert(*data);
-
- shared_ptr<Data> data2 = makeData("/b");
- ims.insert(*data2);
-
- shared_ptr<Data> data4 = makeData("/d");
- ims.insert(*data4);
-
- shared_ptr<Data> data5 = makeData("/c/c");
- ims.insert(*data5);
-
- shared_ptr<Data> data6 = makeData("/c/f");
- ims.insert(*data6);
-
- shared_ptr<Data> data7 = makeData("/c/n");
- ims.insert(*data7);
-
- shared_ptr<Interest> interest = makeInterest("/c", true);
- interest->setChildSelector(1);
-
- shared_ptr<const Data> found = ims.find(*interest);
- BOOST_REQUIRE(found != nullptr);
- BOOST_CHECK_EQUAL(found->getName(), "/c/n");
-
- shared_ptr<Interest> interest2 = makeInterest("/c", true);
- interest2->setChildSelector(0);
-
- shared_ptr<const Data> found2 = ims.find(*interest2);
- BOOST_REQUIRE(found2 != nullptr);
- BOOST_CHECK_EQUAL(found2->getName(), "/c/c");
-}
-
-BOOST_AUTO_TEST_CASE_TEMPLATE(ChildSelector2, T, InMemoryStorages)
-{
- T ims;
-
- shared_ptr<Data> data = makeData("/a/b/1");
- ims.insert(*data);
-
- shared_ptr<Data> data2 = makeData("/a/b/2");
- ims.insert(*data2);
-
- shared_ptr<Data> data3 = makeData("/a/z/1");
- ims.insert(*data3);
-
- shared_ptr<Data> data4 = makeData("/a/z/2");
- ims.insert(*data4);
-
- shared_ptr<Interest> interest = makeInterest("/a", true);
- interest->setChildSelector(1);
-
- shared_ptr<const Data> found = ims.find(*interest);
- BOOST_REQUIRE(found != nullptr);
- BOOST_CHECK_EQUAL(found->getName(), "/a/z/1");
-}
-
-BOOST_AUTO_TEST_CASE_TEMPLATE(PublisherKeySelector, T, InMemoryStorages)
-{
- T ims;
-
- Name name("/insert/withkey");
- shared_ptr<Data> data = makeData(name);
- ims.insert(*data);
-
- shared_ptr<Interest> interest = makeInterest(name);
- Name keyName("/somewhere/key");
-
- KeyLocator locator(keyName);
- interest->setPublisherPublicKeyLocator(locator);
-
- shared_ptr<const Data> found = ims.find(*interest);
- BOOST_CHECK(found == nullptr);
-}
-
-BOOST_AUTO_TEST_CASE_TEMPLATE(PublisherKeySelector2, T, InMemoryStorages)
-{
- T ims;
- Name name("/insert/withkey");
- shared_ptr<Data> data = makeData(name);
- ims.insert(*data);
-
- Name name2("/insert/withkey2");
- shared_ptr<Data> data2 = make_shared<Data>(name2);
-
- Name keyName("/somewhere/key");
- const KeyLocator locator(keyName);
-
- SignatureSha256WithRsa fakeSignature;
- fakeSignature.setValue(makeEmptyBlock(tlv::SignatureValue));
- fakeSignature.setKeyLocator(locator);
- data2->setSignature(fakeSignature);
- data2->wireEncode();
-
- ims.insert(*data2);
-
- shared_ptr<Interest> interest = makeInterest(name2);
- interest->setPublisherPublicKeyLocator(locator);
-
- shared_ptr<const Data> found = ims.find(*interest);
- BOOST_CHECK(found != nullptr);
- BOOST_CHECK_EQUAL(found->getName(), data2->getName());
-}
-
-BOOST_AUTO_TEST_CASE_TEMPLATE(MinMaxComponentsSelector, T, InMemoryStorages)
-{
- T ims;
-
- shared_ptr<Data> data = makeData("/a");
- ims.insert(*data);
-
- shared_ptr<Data> data2 = makeData("/b");
- ims.insert(*data2);
-
- shared_ptr<Data> data4 = makeData("/d");
- ims.insert(*data4);
-
- shared_ptr<Data> data5 = makeData("/c/c/1/2/3/4/5/6");
- ims.insert(*data5);
-
- shared_ptr<Data> data6 = makeData("/c/c/6/7/8/9");
- ims.insert(*data6);
-
- shared_ptr<Data> data7 = makeData("/c/c/1/2/3");
- ims.insert(*data7);
-
- shared_ptr<Data> data8 = makeData("/c/c/1");
- ims.insert(*data8);
-
- shared_ptr<Interest> interest = makeInterest("/c/c", true);
- interest->setMinSuffixComponents(3);
- interest->setChildSelector(0);
-
- shared_ptr<const Data> found = ims.find(*interest);
- BOOST_REQUIRE(found != nullptr);
- BOOST_CHECK_EQUAL(found->getName(), "/c/c/1/2/3");
-
- shared_ptr<Interest> interest2 = makeInterest("/c/c", true);
- interest2->setMinSuffixComponents(4);
- interest2->setChildSelector(1);
-
- shared_ptr<const Data> found2 = ims.find(*interest2);
- BOOST_REQUIRE(found2 != nullptr);
- BOOST_CHECK_EQUAL(found2->getName(), "/c/c/6/7/8/9");
-
- shared_ptr<Interest> interest3 = makeInterest("/c/c");
- interest3->setMaxSuffixComponents(2);
- interest3->setChildSelector(1);
-
- shared_ptr<const Data> found3 = ims.find(*interest3);
- BOOST_REQUIRE(found3 != nullptr);
- BOOST_CHECK_EQUAL(found3->getName(), "/c/c/1");
-}
-
-BOOST_AUTO_TEST_CASE_TEMPLATE(ExcludeSelector, T, InMemoryStorages)
-{
- T ims;
-
- shared_ptr<Data> data = makeData("/a");
- ims.insert(*data);
-
- shared_ptr<Data> data2 = makeData("/b");
- ims.insert(*data2);
-
- shared_ptr<Data> data3 = makeData("/c/a");
- ims.insert(*data3);
-
- shared_ptr<Data> data4 = makeData("/d");
- ims.insert(*data4);
-
- shared_ptr<Data> data5 = makeData("/c/c");
- ims.insert(*data5);
-
- shared_ptr<Data> data6 = makeData("/c/f");
- ims.insert(*data6);
-
- shared_ptr<Data> data7 = makeData("/c/n");
- ims.insert(*data7);
-
- shared_ptr<Interest> interest = makeInterest("/c", true);
- interest->setChildSelector(1);
- Exclude e;
- e.excludeOne(Name::Component("n"));
- interest->setExclude(e);
-
- shared_ptr<const Data> found = ims.find(*interest);
- BOOST_REQUIRE(found != nullptr);
- BOOST_CHECK_EQUAL(found->getName(), "/c/f");
-
- shared_ptr<Interest> interest2 = makeInterest("/c", true);
- interest2->setChildSelector(0);
- Exclude e2;
- e2.excludeOne(Name::Component("a"));
- interest2->setExclude(e2);
-
- shared_ptr<const Data> found2 = ims.find(*interest2);
- BOOST_REQUIRE(found2 != nullptr);
- BOOST_CHECK_EQUAL(found2->getName(), "/c/c");
-
- shared_ptr<Interest> interest3 = makeInterest("/c", true);
- interest3->setChildSelector(0);
- Exclude e3;
- e3.excludeOne(Name::Component("c"));
- interest3->setExclude(e3);
-
- shared_ptr<const Data> found3 = ims.find(*interest3);
- BOOST_REQUIRE(found3 != nullptr);
- BOOST_CHECK_EQUAL(found3->getName(), "/c/a");
-}
-
using InMemoryStoragesLimited = boost::mpl::vector<InMemoryStorageFifo,
InMemoryStorageLfu,
InMemoryStorageLru>;
@@ -705,13 +455,17 @@
Name
insert(uint32_t id, const Name& name,
+ const std::function<void(Data&)>& modifyData = nullptr,
const time::milliseconds& freshWindow = InMemoryStorage::INFINITE_WINDOW)
{
- shared_ptr<Data> data = makeData(name);
- data->setFreshnessPeriod(99999_ms);
+ auto data = makeData(name);
data->setContent(reinterpret_cast<const uint8_t*>(&id), sizeof(id));
- signData(data);
+ if (modifyData != nullptr) {
+ modifyData(*data);
+ }
+
+ data->wireEncode();
m_ims.insert(*data, freshWindow);
return data->getFullName();
@@ -720,7 +474,7 @@
Interest&
startInterest(const Name& name)
{
- m_interest = makeInterest(name, true);
+ m_interest = makeInterest(name, false);
return *m_interest;
}
@@ -747,38 +501,35 @@
BOOST_FIXTURE_TEST_SUITE(Find, FindFixture)
-BOOST_AUTO_TEST_CASE(EmptyDataName)
-{
- insert(1, "ndn:/");
-
- startInterest("ndn:/");
- BOOST_CHECK_EQUAL(find(), 1);
-}
-
-BOOST_AUTO_TEST_CASE(EmptyInterestName)
-{
- insert(1, "ndn:/A");
-
- startInterest("ndn:/");
- BOOST_CHECK_EQUAL(find(), 1);
-}
-
BOOST_AUTO_TEST_CASE(ExactName)
{
- insert(1, "ndn:/");
- insert(2, "ndn:/A");
- insert(3, "ndn:/A/B");
- insert(4, "ndn:/A/C");
- insert(5, "ndn:/D");
+ insert(1, "/");
+ insert(2, "/A");
+ insert(3, "/A/B");
+ insert(4, "/A/C");
+ insert(5, "/D");
- startInterest("ndn:/A");
+ startInterest("/A");
+ BOOST_CHECK_EQUAL(find(), 2);
+}
+
+BOOST_AUTO_TEST_CASE(ExactName_CanBePrefix)
+{
+ insert(1, "/");
+ insert(2, "/A");
+ insert(3, "/A/B");
+ insert(4, "/A/C");
+ insert(5, "/D");
+
+ startInterest("/A")
+ .setCanBePrefix(true);
BOOST_CHECK_EQUAL(find(), 2);
}
BOOST_AUTO_TEST_CASE(FullName)
{
- Name n1 = insert(1, "ndn:/A");
- Name n2 = insert(2, "ndn:/A");
+ Name n1 = insert(1, "/A");
+ Name n2 = insert(2, "/A");
startInterest(n1);
BOOST_CHECK_EQUAL(find(), 1);
@@ -787,266 +538,71 @@
BOOST_CHECK_EQUAL(find(), 2);
}
-BOOST_AUTO_TEST_CASE(Leftmost)
+BOOST_AUTO_TEST_CASE(FullName_EmptyDataName)
{
- insert(1, "ndn:/A");
- insert(2, "ndn:/B/p/1");
- insert(3, "ndn:/B/p/2");
- insert(4, "ndn:/B/q/1");
- insert(5, "ndn:/B/q/2");
- insert(6, "ndn:/C");
+ Name n1 = insert(1, "/");
+ Name n2 = insert(2, "/");
- startInterest("ndn:/B");
+ startInterest(n1);
+ BOOST_CHECK_EQUAL(find(), 1);
+
+ startInterest(n2);
BOOST_CHECK_EQUAL(find(), 2);
}
-BOOST_AUTO_TEST_CASE(Rightmost)
+BOOST_AUTO_TEST_CASE(PrefixName)
{
- insert(1, "ndn:/A");
- insert(2, "ndn:/B/p/1");
- insert(3, "ndn:/B/p/2");
- insert(4, "ndn:/B/q/1");
- insert(5, "ndn:/B/q/2");
- insert(6, "ndn:/C");
+ insert(1, "/A");
+ insert(2, "/B/p/1");
+ insert(3, "/B/p/2");
+ insert(4, "/B/q/1");
+ insert(5, "/B/q/2");
+ insert(6, "/C");
- startInterest("ndn:/B")
- .setChildSelector(1);
- BOOST_CHECK_EQUAL(find(), 4);
+ startInterest("/B")
+ .setCanBePrefix(true);
+ BOOST_CHECK_EQUAL(find(), 2);
}
-BOOST_AUTO_TEST_CASE(MinSuffixComponents)
+BOOST_AUTO_TEST_CASE(PrefixName_NoCanBePrefix)
{
- insert(1, "ndn:/");
- insert(2, "ndn:/A");
- insert(3, "ndn:/B/1");
- insert(4, "ndn:/C/1/2");
- insert(5, "ndn:/D/1/2/3");
- insert(6, "ndn:/E/1/2/3/4");
+ insert(1, "/B/p/1");
- startInterest("ndn:/")
- .setMinSuffixComponents(0);
- BOOST_CHECK_EQUAL(find(), 1);
-
- startInterest("ndn:/")
- .setMinSuffixComponents(1);
- BOOST_CHECK_EQUAL(find(), 1);
-
- startInterest("ndn:/")
- .setMinSuffixComponents(2);
- BOOST_CHECK_EQUAL(find(), 2);
-
- startInterest("ndn:/")
- .setMinSuffixComponents(3);
- BOOST_CHECK_EQUAL(find(), 3);
-
- startInterest("ndn:/")
- .setMinSuffixComponents(4);
- BOOST_CHECK_EQUAL(find(), 4);
-
- startInterest("ndn:/")
- .setMinSuffixComponents(5);
- BOOST_CHECK_EQUAL(find(), 5);
-
- startInterest("ndn:/")
- .setMinSuffixComponents(6);
- BOOST_CHECK_EQUAL(find(), 6);
-
- startInterest("ndn:/")
- .setMinSuffixComponents(7);
+ startInterest("/B");
BOOST_CHECK_EQUAL(find(), 0);
}
-BOOST_AUTO_TEST_CASE(MaxSuffixComponents)
-{
- insert(1, "ndn:/");
- insert(2, "ndn:/A");
- insert(3, "ndn:/B/2");
- insert(4, "ndn:/C/2/3");
- insert(5, "ndn:/D/2/3/4");
- insert(6, "ndn:/E/2/3/4/5");
-
- startInterest("ndn:/")
- .setChildSelector(1)
- .setMaxSuffixComponents(0);
- BOOST_CHECK_EQUAL(find(), 0);
-
- startInterest("ndn:/")
- .setChildSelector(1)
- .setMaxSuffixComponents(1);
- BOOST_CHECK_EQUAL(find(), 1);
-
- startInterest("ndn:/")
- .setChildSelector(1)
- .setMaxSuffixComponents(2);
- BOOST_CHECK_EQUAL(find(), 2);
-
- startInterest("ndn:/")
- .setChildSelector(1)
- .setMaxSuffixComponents(3);
- BOOST_CHECK_EQUAL(find(), 3);
-
- startInterest("ndn:/")
- .setChildSelector(1)
- .setMaxSuffixComponents(4);
- BOOST_CHECK_EQUAL(find(), 4);
-
- startInterest("ndn:/")
- .setChildSelector(1)
- .setMaxSuffixComponents(5);
- BOOST_CHECK_EQUAL(find(), 5);
-
- startInterest("ndn:/")
- .setChildSelector(1)
- .setMaxSuffixComponents(6);
- BOOST_CHECK_EQUAL(find(), 6);
-
- startInterest("ndn:/")
- .setChildSelector(1)
- .setMaxSuffixComponents(7);
- BOOST_CHECK_EQUAL(find(), 6);
-}
-
-BOOST_AUTO_TEST_CASE(DigestOrder)
-{
- insert(1, "ndn:/A");
- insert(2, "ndn:/A");
- // We don't know which comes first, but there must be some order
-
- startInterest("ndn:/A")
- .setChildSelector(0);
- uint32_t leftmost = find();
-
- startInterest("ndn:/A")
- .setChildSelector(1);
- uint32_t rightmost = find();
-
- BOOST_CHECK_NE(leftmost, rightmost);
-}
-
-BOOST_AUTO_TEST_CASE(DigestExclude)
-{
- insert(1, "ndn:/A");
- Name n2 = insert(2, "ndn:/A");
- insert(3, "ndn:/A/B");
-
- uint8_t digest00[util::Sha256::DIGEST_SIZE];
- std::fill_n(digest00, sizeof(digest00), 0x00);
- uint8_t digestFF[util::Sha256::DIGEST_SIZE];
- std::fill_n(digestFF, sizeof(digestFF), 0xFF);
-
- Exclude excludeDigest;
- excludeDigest.excludeRange(
- name::Component::fromImplicitSha256Digest(digest00, sizeof(digest00)),
- name::Component::fromImplicitSha256Digest(digestFF, sizeof(digestFF)));
-
- startInterest("ndn:/A")
- .setChildSelector(0)
- .setExclude(excludeDigest);
- BOOST_CHECK_EQUAL(find(), 3);
-
- startInterest("ndn:/A")
- .setChildSelector(1)
- .setExclude(excludeDigest);
- BOOST_CHECK_EQUAL(find(), 3);
-
- Exclude excludeGeneric;
- excludeGeneric.excludeAfter(name::Component(static_cast<uint8_t*>(nullptr), 0));
-
- startInterest("ndn:/A")
- .setChildSelector(0)
- .setExclude(excludeGeneric);
- int found1 = find();
- BOOST_CHECK(found1 == 1 || found1 == 2);
-
- startInterest("ndn:/A")
- .setChildSelector(1)
- .setExclude(excludeGeneric);
- int found2 = find();
- BOOST_CHECK(found2 == 1 || found2 == 2);
-
- Exclude exclude2 = excludeGeneric;
- exclude2.excludeOne(n2.get(-1));
-
- startInterest("ndn:/A")
- .setChildSelector(0)
- .setExclude(exclude2);
- BOOST_CHECK_EQUAL(find(), 1);
-
- startInterest("ndn:/A")
- .setChildSelector(1)
- .setExclude(exclude2);
- BOOST_CHECK_EQUAL(find(), 1);
-}
-
BOOST_AUTO_TEST_CASE(MustBeFresh)
{
- Name data1Name = insert(1, "ndn:/A/1", 500_ms);
- insert(2, "ndn:/A/2", 2500_ms);
- insert(3, "ndn:/A/3", 3500_ms);
- insert(4, "ndn:/A/4", 1500_ms);
+ insert(1, "/A/1"); // omitted FreshnessPeriod means FreshnessPeriod = 0 ms
+ insert(2, "/A/2", [] (Data& data) { data.setFreshnessPeriod(0_s); });
+ insert(3, "/A/3", [] (Data& data) { data.setFreshnessPeriod(1_s); }, 1_s);
+ insert(4, "/A/4", [] (Data& data) { data.setFreshnessPeriod(1_h); }, 1_h);
- // @0s, all Data are fresh
- startInterest("ndn:/A/1")
+ // lookup at exact same moment as insertion is not tested because this won't happen in reality
+
+ advanceClocks(500_ms); // @500ms
+ startInterest("/A")
+ .setCanBePrefix(true)
.setMustBeFresh(true);
- BOOST_CHECK_EQUAL(find(), 1);
-
- startInterest("ndn:/A/1")
- .setMustBeFresh(false);
- BOOST_CHECK_EQUAL(find(), 1);
-
- startInterest("ndn:/A")
- .setMustBeFresh(true)
- .setChildSelector(0);
- BOOST_CHECK_EQUAL(find(), 1);
-
- startInterest("ndn:/A")
- .setMustBeFresh(true)
- .setChildSelector(1);
- BOOST_CHECK_EQUAL(find(), 4);
-
- advanceClocks(1000_ms);
- // @1s, /A/1 is stale
- startInterest("ndn:/A/1")
- .setMustBeFresh(true);
- BOOST_CHECK_EQUAL(find(), 0);
- startInterest("ndn:/A/1")
- .setMustBeFresh(false);
- BOOST_CHECK_EQUAL(find(), 1);
-
- // MustBeFresh is ignored when full Name is specified
- startInterest(data1Name)
- .setMustBeFresh(true);
- BOOST_CHECK_EQUAL(find(), 1);
-
- startInterest("ndn:/A")
- .setMustBeFresh(true)
- .setChildSelector(0);
- BOOST_CHECK_EQUAL(find(), 2);
- startInterest("ndn:/A")
- .setMustBeFresh(false)
- .setChildSelector(0);
- BOOST_CHECK_EQUAL(find(), 1);
-
- advanceClocks(1000_ms);
- // @2s, /A/1 and /A/4 are stale
- startInterest("ndn:/A")
- .setMustBeFresh(true)
- .setChildSelector(1);
BOOST_CHECK_EQUAL(find(), 3);
- startInterest("ndn:/A")
- .setMustBeFresh(false)
- .setChildSelector(1);
+
+ advanceClocks(1500_ms); // @2s
+ startInterest("/A")
+ .setCanBePrefix(true)
+ .setMustBeFresh(true);
BOOST_CHECK_EQUAL(find(), 4);
- advanceClocks(2000_ms);
- // @4s, all Data are stale
- startInterest("ndn:/A")
- .setMustBeFresh(true)
- .setChildSelector(0);
- BOOST_CHECK_EQUAL(find(), 0);
- startInterest("ndn:/A")
- .setMustBeFresh(true)
- .setChildSelector(1);
+ advanceClocks(3500_s); // @3502s
+ startInterest("/A")
+ .setCanBePrefix(true)
+ .setMustBeFresh(true);
+ BOOST_CHECK_EQUAL(find(), 4);
+
+ advanceClocks(3500_s); // @7002s
+ startInterest("/A")
+ .setCanBePrefix(true)
+ .setMustBeFresh(true);
BOOST_CHECK_EQUAL(find(), 0);
}