catchunks: add --no-version-discovery option

Refs: #5021
Change-Id: I37bb1f86c1a6d63ab28fbe116e75d1047c110217
This commit is contained in:
Davide Pesavento committed 2019-10-20 16:00:16 -04:00
1 parent 97a33b200d
commit 296b385c58
6 files changed
+84 -68

No files matched your search

+12 -26
View File
@@ -42,21 +42,16 @@ using boost::test_tools::output_test_stream;
BOOST_AUTO_TEST_SUITE(Chunks)
BOOST_AUTO_TEST_SUITE(TestConsumer)
BOOST_AUTO_TEST_CASE(OutputDataSequential)
BOOST_AUTO_TEST_CASE(InOrderData)
{
// Test sequential segments in the right order
// Segment order: 0 1 2
// Segment order: 0 1 2 3
std::string name("/ndn/chunks/test");
std::vector<std::string> testStrings {
const std::string name("/ndn/chunks/test");
const std::vector<std::string> testStrings {
"",
"a1b2c3%^&(#$&%^$$/><",
"123456789123456789123456789123456789123456789123456789123456789"
"123456789123456789123456789123456789123456789123456789123456789",
"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. "
"Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur "
"ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla "
@@ -83,24 +78,20 @@ BOOST_AUTO_TEST_CASE(OutputDataSequential)
}
}
BOOST_AUTO_TEST_CASE(OutputDataUnordered)
BOOST_AUTO_TEST_CASE(OutOfOrderData)
{
// Test unordered segments
// Segment order: 1 0 2
std::string name("/ndn/chunks/test");
std::vector<std::string> testStrings {
const std::string name("/ndn/chunks/test");
const std::vector<std::string> testStrings {
"a1b2c3%^&(#$&%^$$/><",
"123456789123456789123456789123456789123456789123456789123456789"
"123456789123456789123456789123456789123456789123456789123456789",
"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. "
"Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur "
"ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla "
"consequat massa Donec pede justo,"
};;
};
util::DummyClientFace face;
output_test_stream output("");
@@ -166,17 +157,12 @@ BOOST_FIXTURE_TEST_CASE(RunBasic, UnitTestTimeFixture)
auto pipeline = make_unique<PipelineInterestsDummy>(face, options);
auto pipelinePtr = pipeline.get();
BOOST_CHECK_EQUAL(pipelinePtr->isPipelineRunning, false);
consumer.run(std::move(discover), std::move(pipeline));
this->advanceClocks(io, 1_ms);
this->advanceClocks(io, time::nanoseconds(1));
// no discovery interest is issued
BOOST_CHECK_EQUAL(face.sentInterests.size(), 0);
// this Data packet answers the discovery Interest, so it must end with a version number
auto data = makeData(prefix.appendVersion(0));
face.receive(*data);
this->advanceClocks(io, time::nanoseconds(1));
BOOST_CHECK_EQUAL(face.sentInterests.size(), 0); // no discovery Interests are issued
BOOST_CHECK_EQUAL(pipelinePtr->isPipelineRunning, true);
}
+62 -38
View File
@@ -44,50 +44,63 @@ public:
void
run(const Name& prefix)
{
BOOST_REQUIRE(!prefix.empty());
discover = make_unique<DiscoverVersion>(face, prefix, opt);
discover->onDiscoverySuccess.connect([this] (const Name& versionedName) {
BOOST_REQUIRE(!versionedName.empty() && versionedName[-1].isVersion());
discoveredVersion = versionedName[-1].toVersion();
isDiscoveryFinished = true;
discoveredName = versionedName;
if (!versionedName.empty() && versionedName[-1].isVersion())
discoveredVersion = versionedName[-1].toVersion();
});
discover->onDiscoveryFailure.connect([this] (const std::string&) {
isDiscoveryFinished = true;
});
discover->run();
advanceClocks(io, time::nanoseconds(1));
advanceClocks(io, 1_ns);
}
protected:
const Name name = "/ndn/chunks/test";
const uint64_t version = 1449227841747;
boost::asio::io_service io;
util::DummyClientFace face{io};
Name name = "/ndn/chunks/test";
Options opt;
unique_ptr<DiscoverVersion> discover;
optional<Name> discoveredName;
optional<uint64_t> discoveredVersion;
bool isDiscoveryFinished = false;
uint64_t version = 1449227841747;
};
BOOST_AUTO_TEST_SUITE(Chunks)
BOOST_FIXTURE_TEST_SUITE(TestDiscoverVersion, DiscoverVersionFixture)
BOOST_AUTO_TEST_CASE(VersionNumberIsProvided)
BOOST_AUTO_TEST_CASE(Disabled)
{
run(Name(name).appendVersion(version));
opt.disableVersionDiscovery = true;
run(name);
// no version discovery interest is expressed
// no version discovery Interest is expressed
BOOST_CHECK_EQUAL(face.sentInterests.size(), 0);
BOOST_CHECK_EQUAL(isDiscoveryFinished, true);
BOOST_CHECK_EQUAL(discoveredName.value(), name);
BOOST_CHECK_EQUAL(discoveredVersion.has_value(), false);
}
BOOST_AUTO_TEST_CASE(NameWithVersion)
{
// start with a name that already contains a version component
Name versionedName = Name(name).appendVersion(version);
run(versionedName);
// no version discovery Interest is expressed
BOOST_CHECK_EQUAL(face.sentInterests.size(), 0);
BOOST_CHECK_EQUAL(discoveredName.value(), versionedName);
BOOST_CHECK_EQUAL(discoveredVersion.value(), version);
}
BOOST_AUTO_TEST_CASE(DiscoverySuccess)
BOOST_AUTO_TEST_CASE(Success)
{
// express a discovery Interest to learn Data version
run(name);
BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
@@ -96,61 +109,66 @@ BOOST_AUTO_TEST_CASE(DiscoverySuccess)
auto lastInterest = face.sentInterests.back();
BOOST_CHECK_EQUAL(lastInterest.getName(), discoveryInterest.getName());
// Send back a metadata packet with a valid versioned name
// send back a metadata packet with a valid versioned name
MetadataObject mobject;
mobject.setVersionedName(Name(name).appendVersion(version));
face.receive(mobject.makeData(lastInterest.getName(), m_keyChain));
advanceClocks(io, time::nanoseconds(1));
advanceClocks(io, 1_ns);
BOOST_CHECK(isDiscoveryFinished);
BOOST_CHECK_EQUAL(discoveredVersion.value(), version);
}
BOOST_AUTO_TEST_CASE(InvalidDiscoveredVersionedName)
{
// issue a discovery Interest to learn Data version
run(name);
BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
// Send back a metadata packet with an invalid versioned name
// send back a metadata packet with an invalid versioned name
MetadataObject mobject;
mobject.setVersionedName(name);
face.receive(mobject.makeData(face.sentInterests.back().getName(), m_keyChain));
// finish discovery process without a resolved version number
BOOST_CHECK(isDiscoveryFinished);
BOOST_CHECK(!discoveredVersion.has_value());
BOOST_CHECK_EQUAL(isDiscoveryFinished, true);
BOOST_CHECK_EQUAL(discoveredName.has_value(), false);
BOOST_CHECK_EQUAL(discoveredVersion.has_value(), false);
}
BOOST_AUTO_TEST_CASE(InvalidMetadataPacket)
{
// issue a discovery Interest to learn Data version
run(name);
BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
// Send back an invalid metadata packet
// send back an invalid metadata packet
Data data(face.sentInterests.back().getName());
data.setFreshnessPeriod(1_s);
data.setContentType(tlv::ContentType_Key);
face.receive(signData(data));
// finish discovery process without a resolved version number
BOOST_CHECK(isDiscoveryFinished);
BOOST_CHECK(!discoveredVersion.has_value());
BOOST_CHECK_EQUAL(isDiscoveryFinished, true);
BOOST_CHECK_EQUAL(discoveredName.has_value(), false);
BOOST_CHECK_EQUAL(discoveredVersion.has_value(), false);
}
BOOST_AUTO_TEST_CASE(Timeout1)
BOOST_AUTO_TEST_CASE(MaxRetriesExceeded)
{
// issue a discovery Interest to learn Data version
opt.maxRetriesOnTimeoutOrNack = 3;
run(name);
BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
// timeout discovery Interests
for (int retries = 0; retries < opt.maxRetriesOnTimeoutOrNack; ++retries) {
advanceClocks(io, opt.interestLifetime);
// timeout or nack discovery Interests
for (int retries = 0; retries < opt.maxRetriesOnTimeoutOrNack * 2; ++retries) {
if (retries % 2 == 0) {
advanceClocks(io, opt.interestLifetime);
}
else {
face.receive(makeNack(face.sentInterests.back(), lp::NackReason::DUPLICATE));
advanceClocks(io, 1_ns);
}
BOOST_CHECK_EQUAL(isDiscoveryFinished, false);
BOOST_REQUIRE_EQUAL(face.sentInterests.size(), retries + 2);
@@ -160,20 +178,27 @@ BOOST_AUTO_TEST_CASE(Timeout1)
advanceClocks(io, opt.interestLifetime);
// finish discovery process without a resolved version number
BOOST_CHECK(isDiscoveryFinished);
BOOST_CHECK(!discoveredVersion.has_value());
BOOST_CHECK_EQUAL(isDiscoveryFinished, true);
BOOST_CHECK_EQUAL(discoveredName.has_value(), false);
BOOST_CHECK_EQUAL(discoveredVersion.has_value(), false);
}
BOOST_AUTO_TEST_CASE(Timeout2)
BOOST_AUTO_TEST_CASE(SuccessAfterNackAndTimeout)
{
// issue a discovery Interest to learn Data version
opt.maxRetriesOnTimeoutOrNack = 3;
run(name);
BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
// timeout discovery Interests
for (int retries = 0; retries < opt.maxRetriesOnTimeoutOrNack; ++retries) {
advanceClocks(io, opt.interestLifetime);
// timeout or nack discovery Interests
for (int retries = 0; retries < opt.maxRetriesOnTimeoutOrNack * 2; ++retries) {
if (retries % 2 == 0) {
advanceClocks(io, opt.interestLifetime);
}
else {
face.receive(makeNack(face.sentInterests.back(), lp::NackReason::DUPLICATE));
advanceClocks(io, 1_ns);
}
BOOST_CHECK_EQUAL(isDiscoveryFinished, false);
BOOST_REQUIRE_EQUAL(face.sentInterests.size(), retries + 2);
@@ -183,9 +208,8 @@ BOOST_AUTO_TEST_CASE(Timeout2)
MetadataObject mobject;
mobject.setVersionedName(Name(name).appendVersion(version));
face.receive(mobject.makeData(face.sentInterests.back().getName(), m_keyChain));
advanceClocks(io, time::nanoseconds(1));
advanceClocks(io, 1_ns);
BOOST_CHECK(isDiscoveryFinished);
BOOST_CHECK_EQUAL(discoveredVersion.value(), version);
}
+1 -1
View File
@@ -44,7 +44,7 @@ DiscoverVersion::DiscoverVersion(Face& face, const Name& prefix, const Options&
void
DiscoverVersion::run()
{
if (!m_prefix.empty() && m_prefix[-1].isVersion()) {
if (m_options.disableVersionDiscovery || (!m_prefix.empty() && m_prefix[-1].isVersion())) {
onDiscoverySuccess(m_prefix);
return;
}
+5 -2
View File
@@ -60,11 +60,14 @@ main(int argc, char* argv[])
("help,h", "print this help message and exit")
("pipeline-type,p", po::value<std::string>(&pipelineType)->default_value(pipelineType),
"type of Interest pipeline to use; valid values are: 'fixed', 'aimd', 'cubic'")
("fresh,f", po::bool_switch(&options.mustBeFresh), "only return fresh content")
("fresh,f", po::bool_switch(&options.mustBeFresh),
"only return fresh content (set MustBeFresh on all outgoing Interests)")
("lifetime,l", po::value<time::milliseconds::rep>()->default_value(options.interestLifetime.count()),
"lifetime of expressed Interests, in milliseconds")
("retries,r", po::value<int>(&options.maxRetriesOnTimeoutOrNack)->default_value(options.maxRetriesOnTimeoutOrNack),
"maximum number of retries in case of Nack or timeout (-1 = no limit)")
("no-version-discovery,D", po::bool_switch(&options.disableVersionDiscovery),
"skip version discovery, even if the supplied name does not end with a version component")
("quiet,q", po::bool_switch(&options.isQuiet), "suppress all diagnostic output, except fatal errors")
("verbose,v", po::bool_switch(&options.isVerbose), "turn on verbose output (per segment information")
("version,V", "print program version and exit")
@@ -79,7 +82,7 @@ main(int argc, char* argv[])
po::options_description adaptivePipeDesc("Adaptive pipeline options (AIMD & CUBIC)");
adaptivePipeDesc.add_options()
("ignore-marks", po::bool_switch(&options.ignoreCongMarks),
"do not decrease the window after receiving a congestion mark")
"do not reduce the window after receiving a congestion mark")
("disable-cwa", po::bool_switch(&options.disableCwa),
"disable Conservative Window Adaptation, i.e., reduce the window on "
"each timeout or congestion mark instead of at most once per RTT")
+1
View File
@@ -37,6 +37,7 @@ struct Options : noncopyable
// Common options
time::milliseconds interestLifetime = DEFAULT_INTEREST_LIFETIME;
int maxRetriesOnTimeoutOrNack = 15;
bool disableVersionDiscovery = false;
bool mustBeFresh = false;
bool isQuiet = false;
bool isVerbose = false;
@@ -51,8 +51,10 @@ PipelineInterests::~PipelineInterests() = default;
void
PipelineInterests::run(const Name& versionedName, DataCallback dataCb, FailureCallback failureCb)
{
BOOST_ASSERT(!versionedName.empty() && versionedName[-1].isVersion());
BOOST_ASSERT(m_options.disableVersionDiscovery ||
(!versionedName.empty() && versionedName[-1].isVersion()));
BOOST_ASSERT(dataCb != nullptr);
m_prefix = versionedName;
m_onData = std::move(dataCb);
m_onFailure = std::move(failureCb);