Skip to content

Commit

Permalink
LocalPeer: add tests and fix retention
Browse files Browse the repository at this point in the history
  • Loading branch information
DavidB137 committed Sep 8, 2024
1 parent 5adcd9c commit 986f8f9
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 2 deletions.
8 changes: 6 additions & 2 deletions include/kvik/local_peer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,12 @@ namespace kvik
inline const RetainedLocalPeer retain() const
{
RetainedLocalPeer rlp;
std::copy_n(addr.addr.begin(), rlp.addr.max_size(), rlp.addr.begin());
rlp.addrLen = addr.addr.size();

// Copy address (at most 32 bytes of address)
uint8_t sizeToCopy = std::min(addr.addr.size(), rlp.addr.max_size());
std::copy_n(addr.addr.begin(), sizeToCopy, rlp.addr.begin());

rlp.addrLen = sizeToCopy;
rlp.channel = channel;
return rlp;
}
Expand Down
100 changes: 100 additions & 0 deletions test/tests/local_peer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/**
* @file local_peer.cpp
* @author Dávid Benko ([email protected])
* @copyright Copyright (c) 2024
*/

#include "kvik/local_peer.hpp"

#include <catch2/catch_test_macros.hpp>

using namespace kvik;

TEST_CASE("Comparison", "[LocalPeer]")
{
LocalPeer peer1;
LocalPeer peer2;

SECTION("Equality")
{
REQUIRE(peer1 == peer2);
}

SECTION("Different address")
{
peer2.addr.addr.push_back(0x01);
REQUIRE(peer1 != peer2);
}

SECTION("Different channel")
{
// Treated as additional data
peer2.channel = 1;
REQUIRE(peer1 == peer2);
}
}

TEST_CASE("Empty", "[LocalPeer]")
{
LocalPeer peer;

SECTION("Initially empty")
{
REQUIRE(peer.empty());
}

SECTION("Address not empty")
{
peer.addr.addr.push_back(0x01);
REQUIRE(!peer.addr.empty());
REQUIRE(!peer.empty());
}
}

TEST_CASE("Retain empty", "[LocalPeer]")
{
LocalPeer peer;

RetainedLocalPeer retainedPeer = peer.retain();

REQUIRE(retainedPeer.addrLen == 0);
REQUIRE(retainedPeer.channel == 0);
}

TEST_CASE("Retain", "[LocalPeer]")
{
LocalAddr addr({{0x10, 0x20, 0x30}});
LocalPeer peer = {
.addr = addr,
.channel = 100,
};

RetainedLocalPeer retainedPeer = peer.retain();

REQUIRE(retainedPeer.addr[0] == 0x10);
REQUIRE(retainedPeer.addr[1] == 0x20);
REQUIRE(retainedPeer.addr[2] == 0x30);
REQUIRE(retainedPeer.addrLen == 3);
REQUIRE(retainedPeer.channel == 100);
}

TEST_CASE("Retain super long address", "[LocalPeer]")
{
size_t maxRetainedAddrSize = RetainedLocalPeer().addr.max_size();

LocalPeer peer = {
.channel = 100,
};

for (size_t i = 0; i < 3 * maxRetainedAddrSize; i++) {
peer.addr.addr.push_back(0x01);
}

RetainedLocalPeer retainedPeer = peer.retain();

for (size_t i = 0; i < maxRetainedAddrSize; i++) {
REQUIRE(retainedPeer.addr[i] == 0x01);
}
REQUIRE(retainedPeer.addrLen == maxRetainedAddrSize);
REQUIRE(retainedPeer.channel == 100);
}

0 comments on commit 986f8f9

Please sign in to comment.