face: remove deprecated PendingInterestId, InterestFilterId, RegisteredPrefixId
Plus some refactoring in Face::Impl
Refs: #4885
Change-Id: I5c46aaef35eb618d6f4934d4629c473c7fdde456
diff --git a/tests/unit/face.t.cpp b/tests/unit/face.t.cpp
index eb01f8f..ef1cab3 100644
--- a/tests/unit/face.t.cpp
+++ b/tests/unit/face.t.cpp
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
- * Copyright (c) 2013-2019 Regents of the University of California.
+ * Copyright (c) 2013-2020 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@@ -43,7 +43,7 @@
template<typename PrefixRegReply = WantPrefixRegReply>
class FaceFixture : public IdentityManagementTimeFixture
{
-public:
+protected:
FaceFixture()
: face(io, m_keyChain, {true, !std::is_same<PrefixRegReply, NoPrefixRegReply>::value})
{
@@ -59,8 +59,8 @@
const RegisterPrefixFailureCallback& failure)> f)
{
boost::logic::tribool result = boost::logic::indeterminate;
- f([&] (const Name&) { result = true; },
- [&] (const Name&, const std::string&) { result = false; });
+ f([&] (auto) { result = true; },
+ [&] (auto, auto) { result = false; });
advanceClocks(1_ms);
BOOST_REQUIRE(!boost::logic::indeterminate(result));
@@ -75,22 +75,23 @@
const UnregisterPrefixFailureCallback& failure)> f)
{
boost::logic::tribool result = boost::logic::indeterminate;
- f([&] { result = true; }, [&] (const std::string&) { result = false; });
+ f([&] { result = true; },
+ [&] (auto) { result = false; });
advanceClocks(1_ms);
BOOST_REQUIRE(!boost::logic::indeterminate(result));
return static_cast<bool>(result);
}
-public:
+protected:
DummyClientFace face;
};
BOOST_FIXTURE_TEST_SUITE(TestFace, FaceFixture<>)
-BOOST_AUTO_TEST_SUITE(Consumer)
+BOOST_AUTO_TEST_SUITE(ExpressInterest)
-BOOST_AUTO_TEST_CASE(ExpressInterestData)
+BOOST_AUTO_TEST_CASE(ReplyData)
{
size_t nData = 0;
face.expressInterest(*makeInterest("/Hello/World", true, 50_ms),
@@ -122,21 +123,17 @@
BOOST_CHECK_EQUAL(nTimeouts, 1);
}
-BOOST_AUTO_TEST_CASE(ExpressMultipleInterestData)
+BOOST_AUTO_TEST_CASE(MultipleData)
{
size_t nData = 0;
face.expressInterest(*makeInterest("/Hello/World", true, 50_ms),
- [&] (const Interest& i, const Data& d) {
- ++nData;
- },
+ [&] (const auto&, const auto&) { ++nData; },
bind([] { BOOST_FAIL("Unexpected Nack"); }),
bind([] { BOOST_FAIL("Unexpected timeout"); }));
face.expressInterest(*makeInterest("/Hello/World/a", true, 50_ms),
- [&] (const Interest& i, const Data& d) {
- ++nData;
- },
+ [&] (const auto&, const auto&) { ++nData; },
bind([] { BOOST_FAIL("Unexpected Nack"); }),
bind([] { BOOST_FAIL("Unexpected timeout"); }));
@@ -151,7 +148,7 @@
BOOST_CHECK_EQUAL(face.sentData.size(), 0);
}
-BOOST_AUTO_TEST_CASE(ExpressInterestEmptyDataCallback)
+BOOST_AUTO_TEST_CASE(EmptyDataCallback)
{
face.expressInterest(*makeInterest("/Hello/World", true),
nullptr,
@@ -165,7 +162,7 @@
} while (false));
}
-BOOST_AUTO_TEST_CASE(ExpressInterestTimeout)
+BOOST_AUTO_TEST_CASE(Timeout)
{
size_t nTimeouts = 0;
face.expressInterest(*makeInterest("/Hello/World", false, 50_ms),
@@ -184,7 +181,7 @@
BOOST_CHECK_EQUAL(face.sentNacks.size(), 0);
}
-BOOST_AUTO_TEST_CASE(ExpressInterestEmptyTimeoutCallback)
+BOOST_AUTO_TEST_CASE(EmptyTimeoutCallback)
{
face.expressInterest(*makeInterest("/Hello/World", false, 50_ms),
bind([] { BOOST_FAIL("Unexpected Data"); }),
@@ -197,7 +194,7 @@
} while (false));
}
-BOOST_AUTO_TEST_CASE(ExpressInterestNack)
+BOOST_AUTO_TEST_CASE(ReplyNack)
{
size_t nNacks = 0;
@@ -223,24 +220,20 @@
BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
}
-BOOST_AUTO_TEST_CASE(ExpressMultipleInterestNack)
+BOOST_AUTO_TEST_CASE(MultipleNacks)
{
size_t nNacks = 0;
auto interest = makeInterest("/Hello/World", false, 50_ms, 1);
face.expressInterest(*interest,
bind([] { BOOST_FAIL("Unexpected Data"); }),
- [&] (const Interest& i, const lp::Nack& n) {
- ++nNacks;
- },
+ [&] (const auto&, const auto&) { ++nNacks; },
bind([] { BOOST_FAIL("Unexpected timeout"); }));
interest->setNonce(2);
face.expressInterest(*interest,
bind([] { BOOST_FAIL("Unexpected Data"); }),
- [&] (const Interest& i, const lp::Nack& n) {
- ++nNacks;
- },
+ [&] (const auto&, const auto&) { ++nNacks; },
bind([] { BOOST_FAIL("Unexpected timeout"); }));
advanceClocks(40_ms);
@@ -253,7 +246,7 @@
BOOST_CHECK_EQUAL(face.sentInterests.size(), 2);
}
-BOOST_AUTO_TEST_CASE(ExpressInterestEmptyNackCallback)
+BOOST_AUTO_TEST_CASE(EmptyNackCallback)
{
face.expressInterest(*makeInterest("/Hello/World"),
bind([] { BOOST_FAIL("Unexpected Data"); }),
@@ -267,24 +260,67 @@
} while (false));
}
-BOOST_AUTO_TEST_CASE(CancelPendingInterestHandle)
+BOOST_AUTO_TEST_CASE(PutDataFromDataCallback) // Bug 4596
+{
+ face.expressInterest(*makeInterest("/localhost/notification/1"),
+ [&] (const auto&, const auto&) {
+ face.put(*makeData("/chronosync/sampleDigest/1"));
+ }, nullptr, nullptr);
+ advanceClocks(10_ms);
+ BOOST_CHECK_EQUAL(face.sentInterests.back().getName(), "/localhost/notification/1");
+
+ face.receive(*makeInterest("/chronosync/sampleDigest", true));
+ advanceClocks(10_ms);
+
+ face.put(*makeData("/localhost/notification/1"));
+ advanceClocks(10_ms);
+ BOOST_CHECK_EQUAL(face.sentData.back().getName(), "/chronosync/sampleDigest/1");
+}
+
+BOOST_AUTO_TEST_CASE(DestroyWithPendingInterest)
+{
+ auto face2 = make_unique<DummyClientFace>(io, m_keyChain);
+ face2->expressInterest(*makeInterest("/Hello/World", false, 50_ms),
+ nullptr, nullptr, nullptr);
+ advanceClocks(50_ms, 2);
+ face2.reset();
+
+ advanceClocks(50_ms, 2); // should not crash - Bug 2518
+
+ // avoid "test case [...] did not check any assertions" message from Boost.Test
+ BOOST_CHECK(true);
+}
+
+BOOST_AUTO_TEST_CASE(Handle)
{
auto hdl = face.expressInterest(*makeInterest("/Hello/World", true, 50_ms),
bind([] { BOOST_FAIL("Unexpected data"); }),
bind([] { BOOST_FAIL("Unexpected nack"); }),
bind([] { BOOST_FAIL("Unexpected timeout"); }));
- advanceClocks(10_ms);
-
+ advanceClocks(1_ms);
hdl.cancel();
- advanceClocks(10_ms);
-
+ advanceClocks(1_ms);
face.receive(*makeData("/Hello/World/%21"));
advanceClocks(200_ms, 5);
+ // cancel after destructing face
+ auto face2 = make_unique<DummyClientFace>(io, m_keyChain);
+ auto hdl2 = face2->expressInterest(*makeInterest("/Hello/World", true, 50_ms),
+ bind([] { BOOST_FAIL("Unexpected data"); }),
+ bind([] { BOOST_FAIL("Unexpected nack"); }),
+ bind([] { BOOST_FAIL("Unexpected timeout"); }));
+ advanceClocks(1_ms);
+ face2.reset();
+ advanceClocks(1_ms);
+ hdl2.cancel(); // should not crash
+ advanceClocks(1_ms);
+
// avoid "test case [...] did not check any assertions" message from Boost.Test
BOOST_CHECK(true);
}
+BOOST_AUTO_TEST_SUITE_END() // ExpressInterest
+
BOOST_AUTO_TEST_CASE(RemoveAllPendingInterests)
{
face.expressInterest(*makeInterest("/Hello/World/0", false, 50_ms),
@@ -309,40 +345,6 @@
advanceClocks(200_ms, 5);
}
-BOOST_AUTO_TEST_CASE(DestructionWithoutCancellingPendingInterests) // Bug #2518
-{
- {
- DummyClientFace face2(io, m_keyChain);
- face2.expressInterest(*makeInterest("/Hello/World", false, 50_ms),
- nullptr, nullptr, nullptr);
- advanceClocks(50_ms, 2);
- }
-
- advanceClocks(50_ms, 2); // should not crash
-
- // avoid "test case [...] did not check any assertions" message from Boost.Test
- BOOST_CHECK(true);
-}
-
-BOOST_AUTO_TEST_CASE(DataCallbackPutData) // Bug 4596
-{
- face.expressInterest(*makeInterest("/localhost/notification/1"),
- [&] (const Interest& i, const Data& d) {
- face.put(*makeData("/chronosync/sampleDigest/1"));
- }, nullptr, nullptr);
- advanceClocks(10_ms);
- BOOST_CHECK_EQUAL(face.sentInterests.back().getName(), "/localhost/notification/1");
-
- face.receive(*makeInterest("/chronosync/sampleDigest", true));
- advanceClocks(10_ms);
-
- face.put(*makeData("/localhost/notification/1"));
- advanceClocks(10_ms);
- BOOST_CHECK_EQUAL(face.sentData.back().getName(), "/chronosync/sampleDigest/1");
-}
-
-BOOST_AUTO_TEST_SUITE_END() // Consumer
-
BOOST_AUTO_TEST_SUITE(Producer)
BOOST_AUTO_TEST_CASE(PutData)
@@ -511,7 +513,72 @@
BOOST_CHECK_EQUAL(hasNack, true);
}
-BOOST_AUTO_TEST_CASE(SetUnsetInterestFilter)
+BOOST_AUTO_TEST_SUITE_END() // Producer
+
+BOOST_AUTO_TEST_SUITE(RegisterPrefix)
+
+BOOST_FIXTURE_TEST_CASE(Failure, FaceFixture<NoPrefixRegReply>)
+{
+ BOOST_CHECK(!runPrefixReg([&] (const auto& success, const auto& failure) {
+ face.registerPrefix("/Hello/World", success, failure);
+ this->advanceClocks(5_s, 20); // wait for command timeout
+ }));
+}
+
+BOOST_AUTO_TEST_CASE(Handle)
+{
+ RegisteredPrefixHandle hdl;
+ auto doReg = [&] {
+ return runPrefixReg([&] (const auto& success, const auto& failure) {
+ hdl = face.registerPrefix("/Hello/World", success, failure);
+ });
+ };
+ auto doUnreg = [&] {
+ return runPrefixUnreg([&] (const auto& success, const auto& failure) {
+ hdl.unregister(success, failure);
+ });
+ };
+
+ // despite the "undefined behavior" warning, we try not to crash, but no API guarantee for this
+ BOOST_CHECK(!doUnreg());
+
+ // cancel after unregister
+ BOOST_CHECK(doReg());
+ BOOST_CHECK(doUnreg());
+ hdl.cancel();
+ advanceClocks(1_ms);
+
+ // unregister after cancel
+ BOOST_CHECK(doReg());
+ hdl.cancel();
+ advanceClocks(1_ms);
+ BOOST_CHECK(!doUnreg());
+
+ // cancel after destructing face
+ auto face2 = make_unique<DummyClientFace>(io, m_keyChain);
+ hdl = face2->registerPrefix("/Hello/World/2", nullptr,
+ bind([] { BOOST_FAIL("Unexpected registerPrefix failure"); }));
+ advanceClocks(1_ms);
+ face2.reset();
+ advanceClocks(1_ms);
+ hdl.cancel(); // should not crash
+ advanceClocks(1_ms);
+
+ // unregister after destructing face
+ auto face3 = make_unique<DummyClientFace>(io, m_keyChain);
+ hdl = face3->registerPrefix("/Hello/World/3", nullptr,
+ bind([] { BOOST_FAIL("Unexpected registerPrefix failure"); }));
+ advanceClocks(1_ms);
+ face3.reset();
+ advanceClocks(1_ms);
+ BOOST_CHECK(!doUnreg());
+}
+
+BOOST_AUTO_TEST_SUITE_END() // RegisterPrefix
+
+BOOST_AUTO_TEST_SUITE(SetInterestFilter)
+
+BOOST_AUTO_TEST_CASE(SetAndCancel)
{
size_t nInterests = 0;
size_t nRegs = 0;
@@ -543,15 +610,9 @@
face.receive(*makeInterest("/Hello/World/%21/3"));
BOOST_CHECK_EQUAL(nInterests, 2);
-
- face.unsetInterestFilter(static_cast<const RegisteredPrefixId*>(nullptr));
- advanceClocks(25_ms, 4);
-
- face.unsetInterestFilter(static_cast<const InterestFilterId*>(nullptr));
- advanceClocks(25_ms, 4);
}
-BOOST_AUTO_TEST_CASE(SetInterestFilterEmptyInterestCallback)
+BOOST_AUTO_TEST_CASE(EmptyInterestCallback)
{
face.setInterestFilter("/A", nullptr);
advanceClocks(1_ms);
@@ -562,7 +623,7 @@
} while (false));
}
-BOOST_AUTO_TEST_CASE(SetUnsetInterestFilterWithoutSucessCallback)
+BOOST_AUTO_TEST_CASE(WithoutSuccessCallback)
{
size_t nInterests = 0;
auto hdl = face.setInterestFilter("/Hello/World",
@@ -590,15 +651,9 @@
face.receive(*makeInterest("/Hello/World/%21/3"));
BOOST_CHECK_EQUAL(nInterests, 2);
-
- face.unsetInterestFilter(static_cast<const RegisteredPrefixId*>(nullptr));
- advanceClocks(25_ms, 4);
-
- face.unsetInterestFilter(static_cast<const InterestFilterId*>(nullptr));
- advanceClocks(25_ms, 4);
}
-BOOST_FIXTURE_TEST_CASE(SetInterestFilterFail, FaceFixture<NoPrefixRegReply>)
+BOOST_FIXTURE_TEST_CASE(Failure, FaceFixture<NoPrefixRegReply>)
{
// don't enable registration reply
size_t nRegFailed = 0;
@@ -614,7 +669,7 @@
BOOST_CHECK_EQUAL(nRegFailed, 1);
}
-BOOST_FIXTURE_TEST_CASE(SetInterestFilterFailWithoutSuccessCallback, FaceFixture<NoPrefixRegReply>)
+BOOST_FIXTURE_TEST_CASE(FailureWithoutSuccessCallback, FaceFixture<NoPrefixRegReply>)
{
// don't enable registration reply
size_t nRegFailed = 0;
@@ -629,31 +684,6 @@
BOOST_CHECK_EQUAL(nRegFailed, 1);
}
-BOOST_FIXTURE_TEST_CASE(RegisterUnregisterPrefixFail, FaceFixture<NoPrefixRegReply>)
-{
- BOOST_CHECK(!runPrefixReg([&] (const auto& success, const auto& failure) {
- face.registerPrefix("/Hello/World", success, failure);
- this->advanceClocks(5_s, 20); // wait for command timeout
- }));
-}
-
-BOOST_AUTO_TEST_CASE(RegisterUnregisterPrefixHandle)
-{
- RegisteredPrefixHandle hdl;
- BOOST_CHECK(!runPrefixUnreg([&] (const auto& success, const auto& failure) {
- // despite the "undefined behavior" warning, we try not to crash, but no API guarantee for this
- hdl.unregister(success, failure);
- }));
-
- BOOST_CHECK(runPrefixReg([&] (const auto& success, const auto& failure) {
- hdl = face.registerPrefix("/Hello/World", success, failure);
- }));
-
- BOOST_CHECK(runPrefixUnreg([&] (const auto& success, const auto& failure) {
- hdl.unregister(success, failure);
- }));
-}
-
BOOST_AUTO_TEST_CASE(SimilarFilters)
{
size_t nInInterests1 = 0;
@@ -684,21 +714,7 @@
BOOST_CHECK_EQUAL(nInInterests3, 0);
}
-BOOST_AUTO_TEST_CASE(SetRegexFilterError)
-{
- face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
- [] (const Name&, const Interest&) {
- BOOST_FAIL("InterestFilter::Error should have been triggered");
- },
- nullptr,
- bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
-
- advanceClocks(25_ms, 4);
-
- BOOST_REQUIRE_THROW(face.receive(*makeInterest("/Hello/World/XXX/b/c")), InterestFilter::Error);
-}
-
-BOOST_AUTO_TEST_CASE(SetRegexFilter)
+BOOST_AUTO_TEST_CASE(RegexFilter)
{
size_t nInInterests = 0;
face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
@@ -721,7 +737,21 @@
BOOST_CHECK_EQUAL(nInInterests, 2);
}
-BOOST_AUTO_TEST_CASE(SetRegexFilterAndRegister)
+BOOST_AUTO_TEST_CASE(RegexFilterError)
+{
+ face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
+ [] (const Name&, const Interest&) {
+ BOOST_FAIL("InterestFilter::Error should have been triggered");
+ },
+ nullptr,
+ bind([] { BOOST_FAIL("Unexpected setInterestFilter failure"); }));
+
+ advanceClocks(25_ms, 4);
+
+ BOOST_CHECK_THROW(face.receive(*makeInterest("/Hello/World/XXX/b/c")), InterestFilter::Error);
+}
+
+BOOST_AUTO_TEST_CASE(RegexFilterAndRegisterPrefix)
{
size_t nInInterests = 0;
face.setInterestFilter(InterestFilter("/Hello/World", "<><b><c>?"),
@@ -748,7 +778,7 @@
BOOST_CHECK_EQUAL(nInInterests, 2);
}
-BOOST_FIXTURE_TEST_CASE(SetInterestFilterNoReg, FaceFixture<NoPrefixRegReply>) // Bug 2318
+BOOST_FIXTURE_TEST_CASE(WithoutRegisterPrefix, FaceFixture<NoPrefixRegReply>) // Bug 2318
{
// This behavior is specific to DummyClientFace.
// Regular Face won't accept incoming packets until something is sent.
@@ -763,10 +793,10 @@
BOOST_CHECK_EQUAL(hit, 1);
}
-BOOST_AUTO_TEST_CASE(SetInterestFilterHandle)
+BOOST_AUTO_TEST_CASE(Handle)
{
int hit = 0;
- auto hdl = face.setInterestFilter(Name("/"), bind([&hit] { ++hit; }));
+ InterestFilterHandle hdl = face.setInterestFilter(Name("/"), bind([&hit] { ++hit; }));
face.processEvents(-1_ms);
face.receive(*makeInterest("/A"));
@@ -779,11 +809,18 @@
face.receive(*makeInterest("/B"));
face.processEvents(-1_ms);
BOOST_CHECK_EQUAL(hit, 1);
+
+ // cancel after destructing face
+ auto face2 = make_unique<DummyClientFace>(io, m_keyChain);
+ InterestFilterHandle hdl2 = face2->setInterestFilter("/Hello/World/2", nullptr);
+ advanceClocks(1_ms);
+ face2.reset();
+ advanceClocks(1_ms);
+ hdl2.cancel(); // should not crash
+ advanceClocks(1_ms);
}
-BOOST_AUTO_TEST_SUITE_END() // Producer
-
-BOOST_AUTO_TEST_SUITE(IoRoutines)
+BOOST_AUTO_TEST_SUITE_END() // SetInterestFilter
BOOST_AUTO_TEST_CASE(ProcessEvents)
{
@@ -813,8 +850,6 @@
BOOST_CHECK(true);
}
-BOOST_AUTO_TEST_SUITE_END() // IoRoutines
-
BOOST_AUTO_TEST_SUITE(Transport)
using ndn::Transport;