Skip to content

Commit

Permalink
Add some tests
Browse files Browse the repository at this point in the history
  • Loading branch information
vivien-apple committed Dec 14, 2022
1 parent 8cc387f commit ae63eeb
Showing 1 changed file with 157 additions and 4 deletions.
161 changes: 157 additions & 4 deletions src/lib/address_resolve/tests/TestAddressResolve_DefaultImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,169 @@

#include <nlunit-test.h>

using namespace chip;
using namespace chip::AddressResolve;

namespace {

void TestSingleResolveResult(nlTestSuite * inSuite, void * inContext)
constexpr uint8_t kNumberOfAvailableSlots = CHIP_CONFIG_MDNS_RESOLVE_LOOKUP_RESULTS;

Transport::PeerAddress GetAddressWithLowScore(uint16_t port = CHIP_PORT, Inet::InterfaceId interfaceId = Inet::InterfaceId::Null())
{
// Embedded IPv4
Inet::IPAddress ipAddress;
Inet::IPAddress::FromString("0:0:0:0:0:0:111.22.33.44", ipAddress);

return Transport::PeerAddress::UDP(ipAddress, port, interfaceId);
}

Transport::PeerAddress GetAddressWithMediumScore(uint16_t port = CHIP_PORT,
Inet::InterfaceId interfaceId = Inet::InterfaceId::Null())
{
NL_TEST_ASSERT(inSuite, true);
// Unique Local
Inet::IPAddress ipAddress;
Inet::IPAddress::FromString("fdff:aabb:ccdd:1::4", ipAddress);

return Transport::PeerAddress::UDP(ipAddress, port, interfaceId);
}

Transport::PeerAddress GetAddressWithHighScore(uint16_t port = CHIP_PORT, Inet::InterfaceId interfaceId = Inet::InterfaceId::Null())
{
// Global Unicast
Inet::IPAddress ipAddress;
Inet::IPAddress::FromString("2001::aabb:ccdd:2233:4455", ipAddress);

return Transport::PeerAddress::UDP(ipAddress, port, interfaceId);
}

void TestLookupResult(nlTestSuite * inSuite, void * inContext)
{
ResolveResult lowResult;
lowResult.address = GetAddressWithLowScore();

ResolveResult mediumResult;
mediumResult.address = GetAddressWithMediumScore();

ResolveResult highResult;
highResult.address = GetAddressWithHighScore();

ResolveResult outResult;

AddressResolve::NodeLookupHandle handle;

auto now = System::SystemClock().GetMonotonicTimestamp();
auto request = NodeLookupRequest(chip::PeerId(1, 2));
handle.ResetForLookup(now, request);

// Check that no result exists.
NL_TEST_ASSERT(inSuite, !handle.HasLookupResult());

// Fill a single slot.
handle.LookupResult(lowResult);

// Check that a result exists.
NL_TEST_ASSERT(inSuite, handle.HasLookupResult());

// Check that the result match what has been inserted.
outResult = handle.TakeLookupResult();
NL_TEST_ASSERT(inSuite, lowResult.address == outResult.address);

// Check that the result has been consumed properly
NL_TEST_ASSERT(inSuite, !handle.HasLookupResult());

handle.ResetForLookup(now, request);

// Fill all the possible slots.
for (auto i = 0; i < kNumberOfAvailableSlots; i++)
{
handle.LookupResult(lowResult);
}

// Read back all results and validate that they match the input.
for (auto i = 0; i < kNumberOfAvailableSlots; i++)
{
NL_TEST_ASSERT(inSuite, handle.HasLookupResult());
outResult = handle.TakeLookupResult();
NL_TEST_ASSERT(inSuite, lowResult.address == outResult.address);
}

// Check that the results has been consumed properly.
NL_TEST_ASSERT(inSuite, !handle.HasLookupResult());

handle.ResetForLookup(now, request);

// Fill all the possible slots by giving it 2 times more results than the available slots.
for (auto i = 0; i < kNumberOfAvailableSlots * 2; i++)
{
handle.LookupResult(lowResult);
}

// Read back all results and validate that they match the input.
for (auto i = 0; i < kNumberOfAvailableSlots; i++)
{
NL_TEST_ASSERT(inSuite, handle.HasLookupResult());
outResult = handle.TakeLookupResult();
NL_TEST_ASSERT(inSuite, lowResult.address == outResult.address);
}

// Check that the results has been consumed properly.
NL_TEST_ASSERT(inSuite, !handle.HasLookupResult());

handle.ResetForLookup(now, request);

// Fill all the possible slots.
for (auto i = 0; i < kNumberOfAvailableSlots; i++)
{
handle.LookupResult(lowResult);
}

// Add a result with a medium score and ensure it sits at the top.
handle.LookupResult(mediumResult);
NL_TEST_ASSERT(inSuite, handle.HasLookupResult());
outResult = handle.TakeLookupResult();
NL_TEST_ASSERT(inSuite, mediumResult.address == outResult.address);

handle.ResetForLookup(now, request);

// Fill all the possible slots.
for (auto i = 0; i < kNumberOfAvailableSlots; i++)
{
handle.LookupResult(lowResult);
}

// Add a result with a medium score and a result with a high score and ensure the result with the high score comes first.
handle.LookupResult(mediumResult);
handle.LookupResult(highResult);
NL_TEST_ASSERT(inSuite, handle.HasLookupResult());
outResult = handle.TakeLookupResult();
NL_TEST_ASSERT(inSuite, highResult.address == outResult.address);

if (kNumberOfAvailableSlots > 1)
{
// Ensure the second result is the medium result.
NL_TEST_ASSERT(inSuite, handle.HasLookupResult());
outResult = handle.TakeLookupResult();
NL_TEST_ASSERT(inSuite, mediumResult.address == outResult.address);
}

if (kNumberOfAvailableSlots > 2)
{
// Ensure that all the other results are low results.
for (auto i = 2; i < kNumberOfAvailableSlots; i++)
{
NL_TEST_ASSERT(inSuite, handle.HasLookupResult());
outResult = handle.TakeLookupResult();
NL_TEST_ASSERT(inSuite, lowResult.address == outResult.address);
}
}

// Check that the results has been consumed properly.
NL_TEST_ASSERT(inSuite, !handle.HasLookupResult());
}

const nlTest sTests[] = {
NL_TEST_DEF("TestSingleResolveResult", TestSingleResolveResult), //
NL_TEST_SENTINEL() //
NL_TEST_DEF("TestLookupResult", TestLookupResult), //
NL_TEST_SENTINEL() //
};

} // namespace
Expand Down

0 comments on commit ae63eeb

Please sign in to comment.