| /* -*- 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 <boost/test/unit_test.hpp> |
| |
| namespace nfd { |
| |
| using name_tree::Entry; |
| |
| BOOST_AUTO_TEST_SUITE(TableNameTree) |
| |
| 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<name_tree::Entry> parent = npe.getParent(); |
| BOOST_CHECK(!static_cast<bool>(parent)); |
| |
| std::vector<shared_ptr<name_tree::Entry> >& childList = npe.getChildren(); |
| BOOST_CHECK_EQUAL(childList.size(), 0); |
| |
| shared_ptr<fib::Entry> fib = npe.getFibEntry(); |
| BOOST_CHECK(!static_cast<bool>(fib)); |
| |
| std::vector< shared_ptr<pit::Entry> >& 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<name_tree::Entry>(parentName); |
| npe.setParent(parent); |
| BOOST_CHECK_EQUAL(npe.getParent(), parent); |
| |
| // Insert FIB |
| |
| shared_ptr<fib::Entry> fibEntry(new fib::Entry(prefix)); |
| shared_ptr<fib::Entry> 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<bool>(npe.getFibEntry())); |
| |
| // Insert a PIT |
| |
| shared_ptr<pit::Entry> PitEntry(make_shared<pit::Entry>(prefix)); |
| shared_ptr<pit::Entry> PitEntry2(make_shared<pit::Entry>(parentName)); |
| |
| Name prefix3("ndn:/named-data/research/abc/def"); |
| shared_ptr<pit::Entry> PitEntry3(make_shared<pit::Entry>(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<name_tree::Entry> npeABC = nt.lookup(nameABC); |
| BOOST_CHECK_EQUAL(nt.size(), 4); |
| |
| Name nameABD = ("/a/b/d"); |
| shared_ptr<name_tree::Entry> npeABD = nt.lookup(nameABD); |
| BOOST_CHECK_EQUAL(nt.size(), 5); |
| |
| Name nameAE = ("/a/e/"); |
| shared_ptr<name_tree::Entry> npeAE = nt.lookup(nameAE); |
| BOOST_CHECK_EQUAL(nt.size(), 6); |
| |
| Name nameF = ("/f"); |
| shared_ptr<name_tree::Entry> 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<name_tree::Entry> npe0 = nt.findExactMatch(name0); |
| BOOST_CHECK(!static_cast<bool>(npe0)); |
| |
| |
| // Longest Prefix Matching |
| |
| shared_ptr<name_tree::Entry> 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<bool>(temp)) |
| eraseResult = nt. |
| eraseEntryIfEmpty(temp); |
| BOOST_CHECK_EQUAL(nt.size(), 6); |
| BOOST_CHECK(!static_cast<bool>(nt.findExactMatch(nameABC))); |
| BOOST_CHECK_EQUAL(eraseResult, true); |
| |
| eraseResult = false; |
| temp = nt.findExactMatch(nameABCLPM); |
| if (static_cast<bool>(temp)) |
| eraseResult = nt. |
| eraseEntryIfEmpty(temp); |
| BOOST_CHECK(!static_cast<bool>(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<bool>(temp)) |
| eraseResult = nt. |
| eraseEntryIfEmpty(temp); |
| BOOST_CHECK_EQUAL(nt.size(), 6); |
| BOOST_CHECK_EQUAL(eraseResult, true); |
| BOOST_CHECK(!static_cast<bool>(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<bool>(temp)) |
| nt. |
| eraseEntryIfEmpty(temp); |
| BOOST_CHECK_EQUAL(nt.size(), 8); |
| |
| // nt.dump(std::cout); |
| |
| shared_ptr<std::vector<shared_ptr<name_tree::Entry> > > 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<std::vector<shared_ptr<name_tree::Entry> > > 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 nfd |
| |
| |