blob: 858598f04704908074cbc018a9e578e914bc3a66 [file] [log] [blame]
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received copies of the GNU General Public License and GNU Lesser
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#include "management/nfd-rib-entry.hpp"
#include "management/nfd-control-command.hpp"
#include "boost-test.hpp"
namespace ndn {
namespace nfd {
BOOST_AUTO_TEST_SUITE(ManagementTestNfdRibEntry)
const uint8_t RouteData[] =
{
0x81, 0x10, 0x69, 0x01, 0x01, 0x6f, 0x01, 0x80, 0x6a, 0x01, 0x64, 0x6c, 0x01, 0x02,
0x6d, 0x02, 0x27, 0x10
};
const uint8_t RouteInfiniteExpirationPeriod[] =
{
0x81, 0x0C, 0x69, 0x01, 0x01, 0x6f, 0x01, 0x80, 0x6a, 0x01, 0x64, 0x6c, 0x01, 0x02
};
const uint8_t RibEntryData[] =
{
// Header + Name
0x80, 0x34, 0x07, 0x0e, 0x08, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
0x08, 0x05, 0x77, 0x6f, 0x72, 0x6c, 0x64,
// Route
0x81, 0x10, 0x69, 0x01, 0x01, 0x6f, 0x01, 0x80, 0x6a, 0x01, 0x64, 0x6c, 0x01, 0x02,
0x6d, 0x02, 0x27, 0x10,
// Route
0x81, 0x10, 0x69, 0x01, 0x02, 0x6f, 0x01, 0x00, 0x6a, 0x01, 0x20, 0x6c, 0x01, 0x01,
0x6d, 0x02, 0x13, 0x88
};
const uint8_t RibEntryInfiniteExpirationPeriod[] =
{
// Header + Name
0x80, 0x30, 0x07, 0x0e, 0x08, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
0x08, 0x05, 0x77, 0x6f, 0x72, 0x6c, 0x64,
// Route
0x81, 0x10, 0x69, 0x01, 0x01, 0x6f, 0x01, 0x80, 0x6a, 0x01, 0x64, 0x6c, 0x01, 0x02,
0x6d, 0x02, 0x27, 0x10,
// Route with no ExpirationPeriod
0x81, 0x0C, 0x69, 0x01, 0x02, 0x6f, 0x01, 0x00, 0x6a, 0x01, 0x20, 0x6c, 0x01, 0x01,
};
BOOST_AUTO_TEST_CASE(RouteEncode)
{
Route route;
route.setFaceId(1);
route.setOrigin(128);
route.setCost(100);
route.setFlags(ndn::nfd::ROUTE_FLAG_CAPTURE);
route.setExpirationPeriod(time::milliseconds(10000));
const Block& wire = route.wireEncode();
BOOST_REQUIRE_EQUAL_COLLECTIONS(RouteData,
RouteData + sizeof(RouteData),
wire.begin(), wire.end());
}
BOOST_AUTO_TEST_CASE(RouteDecode)
{
Route route;
BOOST_REQUIRE_NO_THROW(route.wireDecode(Block(RouteData, sizeof(RouteData))));
BOOST_REQUIRE_EQUAL(route.getFaceId(), 1);
BOOST_REQUIRE_EQUAL(route.getOrigin(), 128);
BOOST_REQUIRE_EQUAL(route.getCost(), 100);
BOOST_REQUIRE_EQUAL(route.getFlags(), static_cast<uint64_t>(ndn::nfd::ROUTE_FLAG_CAPTURE));
BOOST_REQUIRE_EQUAL(route.getExpirationPeriod(), time::milliseconds(10000));
BOOST_REQUIRE_EQUAL(route.hasInfiniteExpirationPeriod(), false);
}
BOOST_AUTO_TEST_CASE(RouteInfiniteExpirationPeriodEncode)
{
Route route;
route.setFaceId(1);
route.setOrigin(128);
route.setCost(100);
route.setFlags(ndn::nfd::ROUTE_FLAG_CAPTURE);
route.setExpirationPeriod(Route::INFINITE_EXPIRATION_PERIOD);
const Block& wire = route.wireEncode();
BOOST_REQUIRE_EQUAL_COLLECTIONS(RouteInfiniteExpirationPeriod,
RouteInfiniteExpirationPeriod + sizeof(RouteInfiniteExpirationPeriod),
wire.begin(), wire.end());
}
BOOST_AUTO_TEST_CASE(RouteInfiniteExpirationPeriodDecode)
{
Route route;
BOOST_REQUIRE_NO_THROW(route.wireDecode(Block(RouteInfiniteExpirationPeriod,
sizeof(RouteInfiniteExpirationPeriod))));
BOOST_REQUIRE_EQUAL(route.getFaceId(), 1);
BOOST_REQUIRE_EQUAL(route.getOrigin(), 128);
BOOST_REQUIRE_EQUAL(route.getCost(), 100);
BOOST_REQUIRE_EQUAL(route.getFlags(), static_cast<uint64_t>(ndn::nfd::ROUTE_FLAG_CAPTURE));
BOOST_REQUIRE_EQUAL(route.getExpirationPeriod(), Route::INFINITE_EXPIRATION_PERIOD);
BOOST_REQUIRE_EQUAL(route.hasInfiniteExpirationPeriod(), true);
}
BOOST_AUTO_TEST_CASE(RouteOutputStream)
{
Route route;
route.setFaceId(1);
route.setOrigin(128);
route.setCost(100);
route.setFlags(ndn::nfd::ROUTE_FLAG_CAPTURE);
route.setExpirationPeriod(time::milliseconds(10000));
std::ostringstream os;
os << route;
BOOST_CHECK_EQUAL(os.str(), "Route(FaceId: 1, Origin: 128, Cost: 100, "
"Flags: 2, ExpirationPeriod: 10000 milliseconds)");
}
BOOST_AUTO_TEST_CASE(RibEntryEncode)
{
RibEntry entry;
entry.setName("/hello/world");
Route route1;
route1.setFaceId(1);
route1.setOrigin(128);
route1.setCost(100);
route1.setFlags(ndn::nfd::ROUTE_FLAG_CAPTURE);
route1.setExpirationPeriod(time::milliseconds(10000));
entry.addRoute(route1);
Route route2;
route2.setFaceId(2);
route2.setOrigin(0);
route2.setCost(32);
route2.setFlags(ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
route2.setExpirationPeriod(time::milliseconds(5000));
entry.addRoute(route2);
const Block& wire = entry.wireEncode();
BOOST_CHECK_EQUAL_COLLECTIONS(RibEntryData,
RibEntryData + sizeof(RibEntryData),
wire.begin(), wire.end());
}
BOOST_AUTO_TEST_CASE(RibEntryDecode)
{
RibEntry entry;
BOOST_REQUIRE_NO_THROW(entry.wireDecode(Block(RibEntryData,
sizeof(RibEntryData))));
BOOST_CHECK_EQUAL(entry.getName(), "/hello/world");
BOOST_CHECK_EQUAL(entry.getRoutes().size(), 2);
std::list<Route> routes = entry.getRoutes();
std::list<Route>::const_iterator it = routes.begin();
BOOST_CHECK_EQUAL(it->getFaceId(), 1);
BOOST_CHECK_EQUAL(it->getOrigin(), 128);
BOOST_CHECK_EQUAL(it->getCost(), 100);
BOOST_CHECK_EQUAL(it->getFlags(), static_cast<uint64_t>(ndn::nfd::ROUTE_FLAG_CAPTURE));
BOOST_CHECK_EQUAL(it->getExpirationPeriod(), time::milliseconds(10000));
BOOST_CHECK_EQUAL(it->hasInfiniteExpirationPeriod(), false);
++it;
BOOST_CHECK_EQUAL(it->getFaceId(), 2);
BOOST_CHECK_EQUAL(it->getOrigin(), 0);
BOOST_CHECK_EQUAL(it->getCost(), 32);
BOOST_CHECK_EQUAL(it->getFlags(), static_cast<uint64_t>(ndn::nfd::ROUTE_FLAG_CHILD_INHERIT));
BOOST_CHECK_EQUAL(it->getExpirationPeriod(), time::milliseconds(5000));
BOOST_CHECK_EQUAL(it->hasInfiniteExpirationPeriod(), false);
}
BOOST_AUTO_TEST_CASE(RibEntryInfiniteExpirationPeriodEncode)
{
RibEntry entry;
entry.setName("/hello/world");
Route route1;
route1.setFaceId(1);
route1.setOrigin(128);
route1.setCost(100);
route1.setFlags(ndn::nfd::ROUTE_FLAG_CAPTURE);
route1.setExpirationPeriod(time::milliseconds(10000));
entry.addRoute(route1);
Route route2;
route2.setFaceId(2);
route2.setOrigin(0);
route2.setCost(32);
route2.setFlags(ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
route2.setExpirationPeriod(Route::INFINITE_EXPIRATION_PERIOD);
entry.addRoute(route2);
const Block& wire = entry.wireEncode();
BOOST_CHECK_EQUAL_COLLECTIONS(RibEntryInfiniteExpirationPeriod,
RibEntryInfiniteExpirationPeriod +
sizeof(RibEntryInfiniteExpirationPeriod),
wire.begin(), wire.end());
}
BOOST_AUTO_TEST_CASE(RibEntryInfiniteExpirationPeriodDecode)
{
RibEntry entry;
BOOST_REQUIRE_NO_THROW(entry.wireDecode(Block(RibEntryInfiniteExpirationPeriod,
sizeof(RibEntryInfiniteExpirationPeriod))));
BOOST_CHECK_EQUAL(entry.getName(), "/hello/world");
BOOST_CHECK_EQUAL(entry.getRoutes().size(), 2);
std::list<Route> routes = entry.getRoutes();
std::list<Route>::const_iterator it = routes.begin();
BOOST_CHECK_EQUAL(it->getFaceId(), 1);
BOOST_CHECK_EQUAL(it->getOrigin(), 128);
BOOST_CHECK_EQUAL(it->getCost(), 100);
BOOST_CHECK_EQUAL(it->getFlags(), static_cast<uint64_t>(ndn::nfd::ROUTE_FLAG_CAPTURE));
BOOST_CHECK_EQUAL(it->getExpirationPeriod(), time::milliseconds(10000));
BOOST_CHECK_EQUAL(it->hasInfiniteExpirationPeriod(), false);
++it;
BOOST_CHECK_EQUAL(it->getFaceId(), 2);
BOOST_CHECK_EQUAL(it->getOrigin(), 0);
BOOST_CHECK_EQUAL(it->getCost(), 32);
BOOST_CHECK_EQUAL(it->getFlags(), static_cast<uint64_t>(ndn::nfd::ROUTE_FLAG_CHILD_INHERIT));
BOOST_CHECK_EQUAL(it->getExpirationPeriod(), Route::INFINITE_EXPIRATION_PERIOD);
BOOST_CHECK_EQUAL(it->hasInfiniteExpirationPeriod(), true);
}
BOOST_AUTO_TEST_CASE(RibEntryClear)
{
RibEntry entry;
entry.setName("/hello/world");
Route route1;
route1.setFaceId(1);
route1.setOrigin(128);
route1.setCost(100);
route1.setFlags(ndn::nfd::ROUTE_FLAG_CAPTURE);
route1.setExpirationPeriod(time::milliseconds(10000));
entry.addRoute(route1);
BOOST_REQUIRE_EQUAL(entry.getRoutes().size(), 1);
std::list<Route> routes = entry.getRoutes();
std::list<Route>::const_iterator it = routes.begin();
BOOST_CHECK_EQUAL(it->getFaceId(), 1);
BOOST_CHECK_EQUAL(it->getOrigin(), 128);
BOOST_CHECK_EQUAL(it->getCost(), 100);
BOOST_CHECK_EQUAL(it->getFlags(), static_cast<uint64_t>(ndn::nfd::ROUTE_FLAG_CAPTURE));
BOOST_CHECK_EQUAL(it->getExpirationPeriod(), time::milliseconds(10000));
BOOST_CHECK_EQUAL(it->hasInfiniteExpirationPeriod(), false);
entry.clearRoutes();
BOOST_CHECK_EQUAL(entry.getRoutes().size(), 0);
Route route2;
route2.setFaceId(2);
route2.setOrigin(0);
route2.setCost(32);
route2.setFlags(ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
route2.setExpirationPeriod(Route::INFINITE_EXPIRATION_PERIOD);
entry.addRoute(route2);
BOOST_REQUIRE_EQUAL(entry.getRoutes().size(), 1);
routes = entry.getRoutes();
it = routes.begin();
BOOST_CHECK_EQUAL(it->getFaceId(), 2);
BOOST_CHECK_EQUAL(it->getOrigin(), 0);
BOOST_CHECK_EQUAL(it->getCost(), 32);
BOOST_CHECK_EQUAL(it->getFlags(), static_cast<uint64_t>(ndn::nfd::ROUTE_FLAG_CHILD_INHERIT));
BOOST_CHECK_EQUAL(it->getExpirationPeriod(), Route::INFINITE_EXPIRATION_PERIOD);
BOOST_CHECK_EQUAL(it->hasInfiniteExpirationPeriod(), true);
}
BOOST_AUTO_TEST_CASE(RibEntryOutputStream)
{
RibEntry entry;
entry.setName("/hello/world");
Route route1;
route1.setFaceId(1);
route1.setOrigin(128);
route1.setCost(100);
route1.setFlags(ndn::nfd::ROUTE_FLAG_CAPTURE);
route1.setExpirationPeriod(time::milliseconds(10000));
entry.addRoute(route1);
Route route2;
route2.setFaceId(2);
route2.setOrigin(0);
route2.setCost(32);
route2.setFlags(ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
route2.setExpirationPeriod(Route::INFINITE_EXPIRATION_PERIOD);
entry.addRoute(route2);
std::ostringstream os;
os << entry;
BOOST_CHECK_EQUAL(os.str(), "RibEntry{\n"
" Name: /hello/world\n"
" Route(FaceId: 1, Origin: 128, Cost: 100, "
"Flags: 2, ExpirationPeriod: 10000 milliseconds)\n"
" Route(FaceId: 2, Origin: 0, Cost: 32, "
"Flags: 1, ExpirationPeriod: Infinity)\n"
"}");
}
BOOST_AUTO_TEST_SUITE_END()
} // namespace nfd
} // namespace ndn