/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /** * Copyright (C) 2014 Named Data Networking Project * See COPYING for copyright and distribution information. */ #include "table/name-tree.hpp" #include "tests/test-common.hpp" namespace nfd { namespace tests { using name_tree::Entry; BOOST_FIXTURE_TEST_SUITE(TableNameTree, BaseFixture) BOOST_AUTO_TEST_CASE(Entry) { Name prefix("ndn:/named-data/research/abc/def/ghi"); name_tree::Entry npe = name_tree::Entry(prefix); BOOST_CHECK_EQUAL(npe.getPrefix(), prefix); // examine all the get methods uint32_t hash = npe.getHash(); BOOST_CHECK_EQUAL(hash, 0); shared_ptr parent = npe.getParent(); BOOST_CHECK(!static_cast(parent)); std::vector >& childList = npe.getChildren(); BOOST_CHECK_EQUAL(childList.size(), 0); shared_ptr fib = npe.getFibEntry(); BOOST_CHECK(!static_cast(fib)); std::vector< shared_ptr >& pitList = npe.getPitEntries(); BOOST_CHECK_EQUAL(pitList.size(), 0); // examine all the set method npe.setHash(12345); BOOST_CHECK_EQUAL(npe.getHash(), 12345); Name parentName("ndn:/named-data/research/abc/def"); parent = make_shared(parentName); npe.setParent(parent); BOOST_CHECK_EQUAL(npe.getParent(), parent); // Insert FIB shared_ptr fibEntry(new fib::Entry(prefix)); shared_ptr fibEntryParent(new fib::Entry(parentName)); npe.setFibEntry(fibEntry); BOOST_CHECK_EQUAL(npe.getFibEntry(), fibEntry); // Erase a FIB that does not exist BOOST_CHECK_EQUAL(npe. eraseFibEntry(fibEntryParent), false); BOOST_CHECK_EQUAL(npe.getFibEntry(), fibEntry); // Erase the FIB that exists BOOST_CHECK_EQUAL(npe. eraseFibEntry(fibEntry), true); BOOST_CHECK(!static_cast(npe.getFibEntry())); // Insert a PIT shared_ptr PitEntry(make_shared(prefix)); shared_ptr PitEntry2(make_shared(parentName)); Name prefix3("ndn:/named-data/research/abc/def"); shared_ptr PitEntry3(make_shared(prefix3)); npe.insertPitEntry(PitEntry); BOOST_CHECK_EQUAL(npe.getPitEntries().size(), 1); npe.insertPitEntry(PitEntry2); BOOST_CHECK_EQUAL(npe.getPitEntries().size(), 2); BOOST_CHECK_EQUAL(npe. erasePitEntry(PitEntry), true); BOOST_CHECK_EQUAL(npe.getPitEntries().size(), 1); // erase a PIT Entry that does not exist BOOST_CHECK_EQUAL(npe. erasePitEntry(PitEntry3), false); BOOST_CHECK_EQUAL(npe.getPitEntries().size(), 1); BOOST_CHECK_EQUAL(npe. erasePitEntry(PitEntry2), true); BOOST_CHECK_EQUAL(npe.getPitEntries().size(), 0); // erase a PIT Entry that does not exist any more BOOST_CHECK_EQUAL(npe. erasePitEntry(PitEntry2), false); } BOOST_AUTO_TEST_CASE(NameTreeBasic) { size_t nBuckets = 16; NameTree nt(nBuckets); BOOST_CHECK_EQUAL(nt.size(), 0); BOOST_CHECK_EQUAL(nt.getNBuckets(), nBuckets); Name nameABC = ("ndn:/a/b/c"); shared_ptr npeABC = nt.lookup(nameABC); BOOST_CHECK_EQUAL(nt.size(), 4); Name nameABD = ("/a/b/d"); shared_ptr npeABD = nt.lookup(nameABD); BOOST_CHECK_EQUAL(nt.size(), 5); Name nameAE = ("/a/e/"); shared_ptr npeAE = nt.lookup(nameAE); BOOST_CHECK_EQUAL(nt.size(), 6); Name nameF = ("/f"); shared_ptr npeF = nt.lookup(nameF); BOOST_CHECK_EQUAL(nt.size(), 7); // validate lookup() and findExactMatch() Name nameAB ("/a/b"); BOOST_CHECK_EQUAL(npeABC->getParent(), nt.findExactMatch(nameAB)); BOOST_CHECK_EQUAL(npeABD->getParent(), nt.findExactMatch(nameAB)); Name nameA ("/a"); BOOST_CHECK_EQUAL(npeAE->getParent(), nt.findExactMatch(nameA)); Name nameRoot ("/"); BOOST_CHECK_EQUAL(npeF->getParent(), nt.findExactMatch(nameRoot)); BOOST_CHECK_EQUAL(nt.size(), 7); Name name0 = ("/does/not/exist"); shared_ptr npe0 = nt.findExactMatch(name0); BOOST_CHECK(!static_cast(npe0)); // Longest Prefix Matching shared_ptr temp; Name nameABCLPM("/a/b/c/def/asdf/nlf"); temp = nt.findLongestPrefixMatch(nameABCLPM); BOOST_CHECK_EQUAL(temp, nt.findExactMatch(nameABC)); Name nameABDLPM("/a/b/d/def/asdf/nlf"); temp = nt.findLongestPrefixMatch(nameABDLPM); BOOST_CHECK_EQUAL(temp, nt.findExactMatch(nameABD)); Name nameABLPM("/a/b/hello/world"); temp = nt.findLongestPrefixMatch(nameABLPM); BOOST_CHECK_EQUAL(temp, nt.findExactMatch(nameAB)); Name nameAELPM("/a/e/hello/world"); temp = nt.findLongestPrefixMatch(nameAELPM); BOOST_CHECK_EQUAL(temp, nt.findExactMatch(nameAE)); Name nameALPM("/a/hello/world"); temp = nt.findLongestPrefixMatch(nameALPM); BOOST_CHECK_EQUAL(temp, nt.findExactMatch(nameA)); Name nameFLPM("/f/hello/world"); temp = nt.findLongestPrefixMatch(nameFLPM); BOOST_CHECK_EQUAL(temp, nt.findExactMatch(nameF)); Name nameRootLPM("/does_not_exist"); temp = nt.findLongestPrefixMatch(nameRootLPM); BOOST_CHECK_EQUAL(temp, nt.findExactMatch(nameRoot)); // nt.dump(std::cout); bool eraseResult = false; temp = nt.findExactMatch(nameABC); if (static_cast(temp)) eraseResult = nt. eraseEntryIfEmpty(temp); BOOST_CHECK_EQUAL(nt.size(), 6); BOOST_CHECK(!static_cast(nt.findExactMatch(nameABC))); BOOST_CHECK_EQUAL(eraseResult, true); eraseResult = false; temp = nt.findExactMatch(nameABCLPM); if (static_cast(temp)) eraseResult = nt. eraseEntryIfEmpty(temp); BOOST_CHECK(!static_cast(temp)); BOOST_CHECK_EQUAL(nt.size(), 6); BOOST_CHECK_EQUAL(eraseResult, false); // nt.dump(std::cout); nt.lookup(nameABC); BOOST_CHECK_EQUAL(nt.size(), 7); eraseResult = false; temp = nt.findExactMatch(nameABC); if (static_cast(temp)) eraseResult = nt. eraseEntryIfEmpty(temp); BOOST_CHECK_EQUAL(nt.size(), 6); BOOST_CHECK_EQUAL(eraseResult, true); BOOST_CHECK(!static_cast(nt.findExactMatch(nameABC))); // nt.dump(std::cout); BOOST_CHECK_EQUAL(nt.getNBuckets(), 16); // should resize now Name nameABCD("a/b/c/d"); nt.lookup(nameABCD); Name nameABCDE("a/b/c/d/e"); nt.lookup(nameABCDE); BOOST_CHECK_EQUAL(nt.size(), 9); BOOST_CHECK_EQUAL(nt.getNBuckets(), 32); // nt.dump(std::cout); // try to erase /a/b/c, should return false temp = nt.findExactMatch(nameABC); BOOST_CHECK_EQUAL(temp->getPrefix(), nameABC); eraseResult = nt. eraseEntryIfEmpty(temp); BOOST_CHECK_EQUAL(eraseResult, false); temp = nt.findExactMatch(nameABC); BOOST_CHECK_EQUAL(temp->getPrefix(), nameABC); temp = nt.findExactMatch(nameABD); if (static_cast(temp)) nt. eraseEntryIfEmpty(temp); BOOST_CHECK_EQUAL(nt.size(), 8); // nt.dump(std::cout); shared_ptr > > fullList; fullList = nt.fullEnumerate(); BOOST_CHECK_EQUAL(fullList->size(), 8); // for (size_t j = 0; j < (*fullList).size(); j++) // { // temp = (*fullList)[j]; // std::cout << temp->getPrefix().toUri() << std::endl; // } shared_ptr > > partialList; partialList = nt.partialEnumerate(nameA); BOOST_CHECK_EQUAL(partialList->size(), 6); // for (size_t j = 0; j < (*partialList).size(); j++) // { // temp = (*partialList)[j]; // std::cout << temp->getPrefix().toUri() << std::endl; // } partialList = nt.partialEnumerate(nameRoot); BOOST_CHECK_EQUAL(partialList->size(), 8); // for (size_t j = 0; j < (*partialList).size(); j++) // { // temp = (*partialList)[j]; // std::cout << temp->getPrefix().toUri() << std::endl; // } } BOOST_AUTO_TEST_SUITE_END() } // namespace tests } // namespace nfd