Skip to content
This repository has been archived by the owner on Sep 1, 2022. It is now read-only.

Commit

Permalink
Test: NetDb get closest routers unit-tests
Browse files Browse the repository at this point in the history
  • Loading branch information
coneiric committed Jun 16, 2018
1 parent d1acc36 commit 11bf11c
Show file tree
Hide file tree
Showing 2 changed files with 184 additions and 0 deletions.
1 change: 1 addition & 0 deletions tests/unit_tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ add_executable(kovri-tests
core/crypto/rand.cc
core/crypto/util/x509.cc
core/router/identity.cc
core/router/net_db/impl.cc
core/router/transports/ssu/packet.cc
core/util/byte_stream.cc
core/util/config.cc
Expand Down
183 changes: 183 additions & 0 deletions tests/unit_tests/core/router/net_db/impl.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
/** //
* Copyright (c) 2013-2018, The Kovri I2P Router Project //
* //
* All rights reserved. //
* //
* Redistribution and use in source and binary forms, with or without modification, are //
* permitted provided that the following conditions are met: //
* //
* 1. Redistributions of source code must retain the above copyright notice, this list of //
* conditions and the following disclaimer. //
* //
* 2. Redistributions in binary form must reproduce the above copyright notice, this list //
* of conditions and the following disclaimer in the documentation and/or other //
* materials provided with the distribution. //
* //
* 3. Neither the name of the copyright holder nor the names of its contributors may be //
* used to endorse or promote products derived from this software without specific //
* prior written permission. //
* //
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY //
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF //
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL //
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, //
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, //
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS //
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, //
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF //
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //
* //
* Parts of the project are originally copyright (c) 2013-2015 The PurpleI2P Project //
*/

#define BOOST_TEST_DYN_LINK

#include <boost/test/unit_test.hpp>

#include "core/router/identity.h"
#include "core/router/info.h"
#include "core/router/net_db/impl.h"

#include "tests/unit_tests/core/router/identity.h"

struct NetDbFixture : public IdentityExFixture
{
/// @alias RouterCaps
/// @brief Capabilities alias for readability and convenience
using RouterCaps = kovri::core::RouterInfoTraits::Cap;

kovri::core::NetDb m_NetDB;
};

BOOST_FIXTURE_TEST_SUITE(NetDbTests, NetDbFixture)

BOOST_AUTO_TEST_CASE(ValidClosestFloodfill)
{
kovri::core::IdentityEx ident;
BOOST_CHECK(ident.FromBuffer(m_AliceIdentity.data(), m_AliceIdentity.size()));

// Floodfill peer
kovri::core::RouterInfo router{
kovri::core::PrivateKeys::CreateRandomKeys(
kovri::core::SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519),
{{"127.0.0.1", 10701}},
{true, true},
RouterCaps::Floodfill};

// Add reachable floodfill to NetDb
m_NetDB.AddRouterInfo(
router.GetIdentHash(), router.GetBuffer(), router.GetBufferLen());

std::shared_ptr<const kovri::core::RouterInfo> ret_ri;

// Ensure no errors thrown getting valid floodfill
BOOST_CHECK_NO_THROW(
ret_ri = m_NetDB.GetClosestFloodfill(ident.GetIdentHash(), {}));

// Ensure expected floodfill is returned
BOOST_CHECK(ret_ri && ret_ri->GetIdentHash() == router.GetIdentHash());
}

BOOST_AUTO_TEST_CASE(InvalidClosestFloodfill)
{
kovri::core::IdentHash hash;
std::set<kovri::core::IdentHash> ex{};

// Ensure null destination throws
BOOST_CHECK_THROW(
m_NetDB.GetClosestFloodfill(nullptr, ex), std::invalid_argument);

// Ensure zero-initialized destination throws
BOOST_CHECK_THROW(
m_NetDB.GetClosestFloodfill(hash, ex), std::invalid_argument);
}

BOOST_AUTO_TEST_CASE(ValidClosestFloodfills)
{
kovri::core::IdentityEx ident;
BOOST_CHECK(ident.FromBuffer(m_AliceIdentity.data(), m_AliceIdentity.size()));

// Floodfill peer
kovri::core::RouterInfo router{
kovri::core::PrivateKeys::CreateRandomKeys(
kovri::core::SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519),
{{"127.0.0.1", 10701}},
{true, true},
RouterCaps::Floodfill};

// Add reachable floodfill to NetDb
m_NetDB.AddRouterInfo(
router.GetIdentHash(), router.GetBuffer(), router.GetBufferLen());

std::set<kovri::core::IdentHash> ex{};
std::vector<kovri::core::IdentHash> ret_hash;

// Ensure no errors thrown getting valid floodfill(s)
BOOST_CHECK_NO_THROW(
ret_hash = m_NetDB.GetClosestFloodfills(ident.GetIdentHash(), 1, ex));

// Ensure limit is respected
BOOST_CHECK(
m_NetDB.GetClosestFloodfills(ident.GetIdentHash(), 0, ex).empty());

// Ensure expected floodfill is returned
BOOST_CHECK(ret_hash.size() && ret_hash.front() == router.GetIdentHash());
}

BOOST_AUTO_TEST_CASE(InvalidClosestFloodfills)
{
kovri::core::IdentHash hash;
std::set<kovri::core::IdentHash> ex{};

// Ensure null destination throws
BOOST_CHECK_THROW(
m_NetDB.GetClosestFloodfills(nullptr, 1, ex), std::invalid_argument);

// Ensure zero-initialized destination throws
BOOST_CHECK_THROW(
m_NetDB.GetClosestFloodfills(hash, 1, ex), std::invalid_argument);
}

BOOST_AUTO_TEST_CASE(ValidClosestNonFloodfill)
{
kovri::core::IdentityEx ident;
BOOST_CHECK(ident.FromBuffer(m_AliceIdentity.data(), m_AliceIdentity.size()));

// Non-floodfill peer
kovri::core::RouterInfo router{
kovri::core::PrivateKeys::CreateRandomKeys(
kovri::core::SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519),
{{"127.0.0.1", 10701}},
{true, true},
RouterCaps::HighBandwidth};

// Add non-floodfill to NetDb
m_NetDB.AddRouterInfo(
router.GetIdentHash(), router.GetBuffer(), router.GetBufferLen());

std::set<kovri::core::IdentHash> ex{};
std::shared_ptr<const kovri::core::RouterInfo> ret_ri;

// Ensure no errors thrown getting valid non-floodfill
BOOST_CHECK_NO_THROW(
ret_ri = m_NetDB.GetClosestNonFloodfill(ident.GetIdentHash(), ex));

// Ensure expected non-floodfill is returned
BOOST_CHECK(ret_ri && ret_ri->GetIdentHash() == router.GetIdentHash());
}

BOOST_AUTO_TEST_CASE(InvalidClosestNonFloodfill)
{
kovri::core::IdentHash hash;
std::set<kovri::core::IdentHash> ex{};

// Ensure null destination throws
BOOST_CHECK_THROW(
m_NetDB.GetClosestNonFloodfill(nullptr, ex), std::invalid_argument);

// Ensure zero-initialized destination throws
BOOST_CHECK_THROW(
m_NetDB.GetClosestNonFloodfill(hash, ex), std::invalid_argument);
}

BOOST_AUTO_TEST_SUITE_END()

0 comments on commit 11bf11c

Please sign in to comment.