catchunks: add --no-version-discovery option
Refs: #5021 Change-Id: I37bb1f86c1a6d63ab28fbe116e75d1047c110217
This commit is contained in:
1 parent
97a33b200d
commit
296b385c58
6 files changed
+84
-68
No files matched your search
+12
-26
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user