poke: exit with status 5 if prefix registration fails
Change-Id: I2147570c37146011c9a4e8c024b74bcafdf18e4e
This commit is contained in:
1 parent
e75861eddb
commit
87434bef4b
9 files changed
+78
-44
No files matched your search
@@ -50,6 +50,8 @@ Exit Status
|
||||
|
||||
2: Malformed command line
|
||||
|
||||
5: Prefix registration failed
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(Default, OutputCheck, OutputChecks)
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.back().getForwardingHint().empty(), true);
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.back().getInterestLifetime(), DEFAULT_INTEREST_LIFETIME);
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.back().hasApplicationParameters(), false);
|
||||
BOOST_CHECK(peek->getResultCode() == ResultCode::DATA);
|
||||
BOOST_CHECK(peek->getResult() == NdnPeek::Result::DATA);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE_TEMPLATE(NonDefault, OutputCheck, OutputChecks)
|
||||
@@ -186,7 +186,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(NonDefault, OutputCheck, OutputChecks)
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.back().getForwardingHint().empty(), true);
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.back().getInterestLifetime(), 200_ms);
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.back().hasApplicationParameters(), false);
|
||||
BOOST_CHECK(peek->getResultCode() == ResultCode::DATA);
|
||||
BOOST_CHECK(peek->getResult() == NdnPeek::Result::DATA);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE_TEMPLATE(ReceiveNackWithReason, OutputCheck, OutputChecks)
|
||||
@@ -205,7 +205,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(ReceiveNackWithReason, OutputCheck, OutputChecks)
|
||||
|
||||
OutputCheck::checkOutput(output, nack);
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
|
||||
BOOST_CHECK(peek->getResultCode() == ResultCode::NACK);
|
||||
BOOST_CHECK(peek->getResult() == NdnPeek::Result::NACK);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE_TEMPLATE(ReceiveNackWithoutReason, OutputCheck, OutputChecks)
|
||||
@@ -224,7 +224,7 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(ReceiveNackWithoutReason, OutputCheck, OutputCheck
|
||||
|
||||
OutputCheck::checkOutput(output, nack);
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
|
||||
BOOST_CHECK(peek->getResultCode() == ResultCode::NACK);
|
||||
BOOST_CHECK(peek->getResult() == NdnPeek::Result::NACK);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(NoTimeout)
|
||||
@@ -240,12 +240,12 @@ BOOST_AUTO_TEST_CASE(NoTimeout)
|
||||
this->advanceClocks(io, 100_ms, 9);
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
|
||||
BOOST_CHECK_EQUAL(face.getNPendingInterests(), 1);
|
||||
BOOST_CHECK(peek->getResultCode() == ResultCode::UNKNOWN);
|
||||
BOOST_CHECK(peek->getResult() == NdnPeek::Result::UNKNOWN);
|
||||
|
||||
this->advanceClocks(io, 100_ms, 2);
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
|
||||
BOOST_CHECK_EQUAL(face.getNPendingInterests(), 0);
|
||||
BOOST_CHECK(peek->getResultCode() == ResultCode::TIMEOUT);
|
||||
BOOST_CHECK(peek->getResult() == NdnPeek::Result::TIMEOUT);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(TimeoutLessThanLifetime)
|
||||
@@ -262,7 +262,7 @@ BOOST_AUTO_TEST_CASE(TimeoutLessThanLifetime)
|
||||
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
|
||||
BOOST_CHECK_EQUAL(face.getNPendingInterests(), 0);
|
||||
BOOST_CHECK(peek->getResultCode() == ResultCode::TIMEOUT);
|
||||
BOOST_CHECK(peek->getResult() == NdnPeek::Result::TIMEOUT);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(TimeoutGreaterThanLifetime)
|
||||
@@ -279,7 +279,7 @@ BOOST_AUTO_TEST_CASE(TimeoutGreaterThanLifetime)
|
||||
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.size(), 1);
|
||||
BOOST_CHECK_EQUAL(face.getNPendingInterests(), 0);
|
||||
BOOST_CHECK(peek->getResultCode() == ResultCode::TIMEOUT);
|
||||
BOOST_CHECK(peek->getResult() == NdnPeek::Result::TIMEOUT);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END() // TestNdnPeek
|
||||
|
||||
+28
-10
@@ -36,6 +36,7 @@ namespace tests {
|
||||
|
||||
using namespace ndn::tests;
|
||||
|
||||
template<bool WANT_PREFIX_REG_REPLY = true>
|
||||
class NdnPokeFixture : public IdentityManagementTimeFixture
|
||||
{
|
||||
protected:
|
||||
@@ -60,13 +61,13 @@ protected:
|
||||
|
||||
protected:
|
||||
boost::asio::io_service io;
|
||||
ndn::util::DummyClientFace face{io, m_keyChain, {true, true}};
|
||||
ndn::util::DummyClientFace face{io, m_keyChain, {true, WANT_PREFIX_REG_REPLY}};
|
||||
std::stringstream payload{"Hello, world!\n"};
|
||||
unique_ptr<NdnPoke> poke;
|
||||
};
|
||||
|
||||
BOOST_AUTO_TEST_SUITE(Peek)
|
||||
BOOST_FIXTURE_TEST_SUITE(TestNdnPoke, NdnPokeFixture)
|
||||
BOOST_FIXTURE_TEST_SUITE(TestNdnPoke, NdnPokeFixture<>)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(Basic)
|
||||
{
|
||||
@@ -83,7 +84,7 @@ BOOST_AUTO_TEST_CASE(Basic)
|
||||
this->advanceClocks(io, 1_ms, 10);
|
||||
io.run();
|
||||
|
||||
BOOST_CHECK(poke->didSendData());
|
||||
BOOST_CHECK(poke->getResult() == NdnPoke::Result::DATA_SENT);
|
||||
BOOST_REQUIRE_EQUAL(face.sentData.size(), 1);
|
||||
BOOST_CHECK_EQUAL(face.sentData.back().getName(), "/poke/test");
|
||||
BOOST_CHECK(!face.sentData.back().getFinalBlock());
|
||||
@@ -110,7 +111,7 @@ BOOST_AUTO_TEST_CASE(FreshnessPeriod)
|
||||
this->advanceClocks(io, 1_ms, 10);
|
||||
io.run();
|
||||
|
||||
BOOST_CHECK(poke->didSendData());
|
||||
BOOST_CHECK(poke->getResult() == NdnPoke::Result::DATA_SENT);
|
||||
BOOST_REQUIRE_EQUAL(face.sentData.size(), 1);
|
||||
BOOST_CHECK_EQUAL(face.sentData.back().getName(), "/poke/test");
|
||||
BOOST_CHECK(!face.sentData.back().getFinalBlock());
|
||||
@@ -132,7 +133,7 @@ BOOST_AUTO_TEST_CASE(FinalBlockId)
|
||||
this->advanceClocks(io, 1_ms, 10);
|
||||
io.run();
|
||||
|
||||
BOOST_CHECK(poke->didSendData());
|
||||
BOOST_CHECK(poke->getResult() == NdnPoke::Result::DATA_SENT);
|
||||
BOOST_REQUIRE_EQUAL(face.sentData.size(), 1);
|
||||
BOOST_CHECK_EQUAL(face.sentData.back().getName(), options.name);
|
||||
BOOST_REQUIRE(face.sentData.back().getFinalBlock());
|
||||
@@ -154,7 +155,7 @@ BOOST_AUTO_TEST_CASE(DigestSha256)
|
||||
this->advanceClocks(io, 1_ms, 10);
|
||||
io.run();
|
||||
|
||||
BOOST_CHECK(poke->didSendData());
|
||||
BOOST_CHECK(poke->getResult() == NdnPoke::Result::DATA_SENT);
|
||||
BOOST_REQUIRE_EQUAL(face.sentData.size(), 1);
|
||||
BOOST_CHECK_EQUAL(face.sentData.back().getName(), "/poke/test");
|
||||
BOOST_CHECK(!face.sentData.back().getFinalBlock());
|
||||
@@ -171,7 +172,7 @@ BOOST_AUTO_TEST_CASE(ForceData)
|
||||
poke->start();
|
||||
this->advanceClocks(io, 1_ms, 10);
|
||||
|
||||
BOOST_CHECK(poke->didSendData());
|
||||
BOOST_CHECK(poke->getResult() == NdnPoke::Result::DATA_SENT);
|
||||
BOOST_REQUIRE_EQUAL(face.sentData.size(), 1);
|
||||
BOOST_CHECK_EQUAL(face.sentData.back().getName(), "/poke/test");
|
||||
BOOST_CHECK(!face.sentData.back().getFinalBlock());
|
||||
@@ -194,7 +195,7 @@ BOOST_AUTO_TEST_CASE(Timeout)
|
||||
|
||||
this->advanceClocks(io, 1_s, 4);
|
||||
|
||||
BOOST_CHECK(!poke->didSendData());
|
||||
BOOST_CHECK(poke->getResult() == NdnPoke::Result::UNKNOWN);
|
||||
BOOST_CHECK_EQUAL(face.sentData.size(), 0);
|
||||
|
||||
// Check for prefix unregistration
|
||||
@@ -202,6 +203,23 @@ BOOST_AUTO_TEST_CASE(Timeout)
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.back().getName().getPrefix(4), "/localhost/nfd/rib/unregister");
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(PrefixRegTimeout, NdnPokeFixture<false>)
|
||||
{
|
||||
initialize();
|
||||
|
||||
poke->start();
|
||||
this->advanceClocks(io, 1_ms, 10);
|
||||
|
||||
// Check for prefix registration
|
||||
BOOST_REQUIRE_EQUAL(face.sentInterests.size(), 1);
|
||||
BOOST_CHECK_EQUAL(face.sentInterests.front().getName().getPrefix(4), "/localhost/nfd/rib/register");
|
||||
|
||||
this->advanceClocks(io, 1_s, 10);
|
||||
|
||||
BOOST_CHECK(poke->getResult() == NdnPoke::Result::PREFIX_REG_FAIL);
|
||||
BOOST_CHECK_EQUAL(face.sentData.size(), 0);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(OversizedPacket)
|
||||
{
|
||||
payload << std::string(MAX_NDN_PACKET_SIZE, 'A');
|
||||
@@ -213,8 +231,8 @@ BOOST_AUTO_TEST_CASE(OversizedPacket)
|
||||
face.receive(*makeInterest("/poke/test"));
|
||||
BOOST_CHECK_THROW(face.processEvents(), Face::OversizedPacketError);
|
||||
|
||||
// No point in checking didSendData() here. The exception is thrown from processEvents(),
|
||||
// not from put(), so didSendData() is still set to true even though no packets are sent.
|
||||
// No point in checking getResult() here. The exception is thrown from processEvents(),
|
||||
// not from put(), so the result is still DATA_SENT even though no packets were sent.
|
||||
BOOST_CHECK_EQUAL(face.sentData.size(), 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@ main(int argc, char* argv[])
|
||||
program.start();
|
||||
face.processEvents();
|
||||
|
||||
return static_cast<int>(program.getResultCode());
|
||||
return static_cast<int>(program.getResult());
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "ERROR: " << e.what() << std::endl;
|
||||
|
||||
@@ -79,7 +79,7 @@ NdnPeek::createInterest() const
|
||||
void
|
||||
NdnPeek::onData(const Data& data)
|
||||
{
|
||||
m_resultCode = ResultCode::DATA;
|
||||
m_result = Result::DATA;
|
||||
m_timeoutEvent.cancel();
|
||||
|
||||
if (m_options.isVerbose) {
|
||||
@@ -101,7 +101,7 @@ NdnPeek::onData(const Data& data)
|
||||
void
|
||||
NdnPeek::onNack(const lp::Nack& nack)
|
||||
{
|
||||
m_resultCode = ResultCode::NACK;
|
||||
m_result = Result::NACK;
|
||||
m_timeoutEvent.cancel();
|
||||
|
||||
lp::NackHeader header = nack.getHeader();
|
||||
@@ -123,7 +123,7 @@ NdnPeek::onNack(const lp::Nack& nack)
|
||||
void
|
||||
NdnPeek::onTimeout()
|
||||
{
|
||||
m_resultCode = ResultCode::TIMEOUT;
|
||||
m_result = Result::TIMEOUT;
|
||||
m_timeoutEvent.cancel();
|
||||
|
||||
if (m_options.isVerbose) {
|
||||
|
||||
@@ -55,25 +55,26 @@ struct PeekOptions
|
||||
optional<time::milliseconds> timeout;
|
||||
};
|
||||
|
||||
enum class ResultCode {
|
||||
UNKNOWN = 1,
|
||||
DATA = 0,
|
||||
NACK = 4,
|
||||
TIMEOUT = 3,
|
||||
};
|
||||
|
||||
class NdnPeek : boost::noncopyable
|
||||
{
|
||||
public:
|
||||
NdnPeek(Face& face, const PeekOptions& options);
|
||||
|
||||
enum class Result {
|
||||
DATA = 0,
|
||||
UNKNOWN = 1,
|
||||
// 2 is reserved for "malformed command line"
|
||||
TIMEOUT = 3,
|
||||
NACK = 4,
|
||||
};
|
||||
|
||||
/**
|
||||
* @return the result of NdnPeek execution
|
||||
*/
|
||||
ResultCode
|
||||
getResultCode() const
|
||||
Result
|
||||
getResult() const
|
||||
{
|
||||
return m_resultCode;
|
||||
return m_result;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -112,7 +113,7 @@ private:
|
||||
time::steady_clock::TimePoint m_sendTime;
|
||||
ScopedPendingInterestHandle m_pendingInterest;
|
||||
scheduler::ScopedEventId m_timeoutEvent;
|
||||
ResultCode m_resultCode = ResultCode::UNKNOWN;
|
||||
Result m_result = Result::UNKNOWN;
|
||||
};
|
||||
|
||||
} // namespace peek
|
||||
|
||||
@@ -159,7 +159,7 @@ main(int argc, char* argv[])
|
||||
program.start();
|
||||
face.processEvents();
|
||||
|
||||
return program.didSendData() ? 0 : 1;
|
||||
return static_cast<int>(program.getResult());
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
std::cerr << "ERROR: " << e.what() << std::endl;
|
||||
|
||||
@@ -48,7 +48,7 @@ NdnPoke::start()
|
||||
|
||||
if (m_options.wantForceData) {
|
||||
m_face.put(*data);
|
||||
m_didSendData = true;
|
||||
m_result = Result::DATA_SENT;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ NdnPoke::start()
|
||||
[this, data] (auto&&...) {
|
||||
m_timeoutEvent.cancel();
|
||||
m_face.put(*data);
|
||||
m_didSendData = true;
|
||||
m_result = Result::DATA_SENT;
|
||||
m_registeredPrefix.cancel();
|
||||
},
|
||||
[this] (auto&&) {
|
||||
@@ -64,7 +64,8 @@ NdnPoke::start()
|
||||
m_registeredPrefix.cancel();
|
||||
});
|
||||
},
|
||||
[] (auto&&, const auto& reason) {
|
||||
[this] (auto&&, const auto& reason) {
|
||||
m_result = Result::PREFIX_REG_FAIL;
|
||||
std::cerr << "Prefix registration failure (" << reason << ")\n";
|
||||
});
|
||||
}
|
||||
|
||||
@@ -56,15 +56,27 @@ class NdnPoke : boost::noncopyable
|
||||
public:
|
||||
NdnPoke(Face& face, KeyChain& keyChain, std::istream& input, const PokeOptions& options);
|
||||
|
||||
enum class Result {
|
||||
DATA_SENT = 0,
|
||||
UNKNOWN = 1,
|
||||
// 2 is reserved for "malformed command line"
|
||||
TIMEOUT = 3,
|
||||
// 4 is reserved for "nack"
|
||||
PREFIX_REG_FAIL = 5,
|
||||
};
|
||||
|
||||
/**
|
||||
* @return the result of NdnPoke execution
|
||||
*/
|
||||
Result
|
||||
getResult() const
|
||||
{
|
||||
return m_result;
|
||||
}
|
||||
|
||||
void
|
||||
start();
|
||||
|
||||
bool
|
||||
didSendData() const
|
||||
{
|
||||
return m_didSendData;
|
||||
}
|
||||
|
||||
private:
|
||||
shared_ptr<Data>
|
||||
createData() const;
|
||||
@@ -77,7 +89,7 @@ private:
|
||||
Scheduler m_scheduler;
|
||||
ScopedRegisteredPrefixHandle m_registeredPrefix;
|
||||
scheduler::ScopedEventId m_timeoutEvent;
|
||||
bool m_didSendData = false;
|
||||
Result m_result = Result::UNKNOWN;
|
||||
};
|
||||
|
||||
} // namespace peek
|
||||
|
||||
Reference in new issue
Block a user