From 6593d2c9fdb23ecdf729b3322cd632b15fab066d Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Fri, 27 Sep 2024 12:41:27 -0700 Subject: [PATCH] [test] enhance `test_dns_client` to include addr resolution query (#10766) This commit updates `test_dns_client` to validate independent address resolution queries (in addition to the existing service resolution tests). Specifically, it adds test cases for `ResolveIp4Address()` and scenarios where the server responds with an error RCODE. --- tests/unit/test_dns_client.cpp | 110 +++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/tests/unit/test_dns_client.cpp b/tests/unit/test_dns_client.cpp index b4947f585..244b04bf6 100644 --- a/tests/unit/test_dns_client.cpp +++ b/tests/unit/test_dns_client.cpp @@ -39,6 +39,7 @@ #include "common/arg_macros.hpp" #include "common/array.hpp" +#include "common/clearable.hpp" #include "common/string.hpp" #include "common/time.hpp" #include "instance/instance.hpp" @@ -353,6 +354,64 @@ const char *ServiceModeToString(Dns::Client::QueryConfig::ServiceMode aMode) //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +static constexpr uint16_t kMaxAddresses = 10; + +struct AddressInfo +{ + void Reset(void) { ClearAllBytes(*this); } + + uint16_t mCallbackCount; + Error mError; + Dns::Name::Buffer mHostName; + Ip6::Address mHostAddresses[kMaxAddresses]; + uint8_t mNumHostAddresses; +}; + +static AddressInfo sAddressInfo; + +void AddressCallback(otError aError, const otDnsAddressResponse *aResponse, void *aContext) +{ + const Dns::Client::AddressResponse &response = AsCoreType(aResponse); + + Log("AddressCallback"); + Log(" Error: %s", ErrorToString(aError)); + + VerifyOrQuit(aContext == sInstance); + + sAddressInfo.mCallbackCount++; + sAddressInfo.mError = aError; + + SuccessOrExit(aError); + + SuccessOrQuit(response.GetHostName(sAddressInfo.mHostName, sizeof(sAddressInfo.mHostName))); + Log(" HostName: %s", sAddressInfo.mHostName); + + for (uint16_t index = 0;; index++) + { + Error error; + uint32_t ttl; + + VerifyOrQuit(index < kMaxAddresses); + + error = response.GetAddress(index, sAddressInfo.mHostAddresses[index], ttl); + + if (error == kErrorNotFound) + { + sAddressInfo.mNumHostAddresses = index; + break; + } + + SuccessOrQuit(error); + + Log(" %2u) %s ttl:%lu", index + 1, sAddressInfo.mHostAddresses[index].ToString().AsCString(), ToUlong(ttl)); + } + +exit: + return; +} + +//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + struct BrowseInfo { void Reset(void) { mCallbackCount = 0; } @@ -498,6 +557,7 @@ void TestDnsClient(void) }; Array addresses; + NetworkData::ExternalRouteConfig routeConfig; Srp::Server *srpServer; Srp::Client *srpClient; Srp::Client::Service service1; @@ -514,6 +574,22 @@ void TestDnsClient(void) InitTest(); + Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "); + Log("Add a route prefix (with NAT64 flag) to network data"); + + routeConfig.Clear(); + SuccessOrQuit(AsCoreType(&routeConfig.mPrefix.mPrefix).FromString("64:ff9b::")); + routeConfig.mPrefix.mLength = 96; + routeConfig.mPreference = NetworkData::kRoutePreferenceMedium; + routeConfig.mNat64 = true; + routeConfig.mStable = true; + + SuccessOrQuit(otBorderRouterAddRoute(sInstance, &routeConfig)); + SuccessOrQuit(otBorderRouterRegister(sInstance)); + + Log("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "); + Log("Add addresses on Thread netif"); + for (const char *addrString : kAddresses) { otNetifAddress netifAddr; @@ -583,6 +659,40 @@ void TestDnsClient(void) VerifyOrQuit(dnsClient->GetDefaultConfig().GetServiceMode() == Dns::Client::QueryConfig::kServiceModeSrvTxtOptimize); + //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Validate DNS Client `ResolveAddress()` + + sAddressInfo.Reset(); + Log("ResolveAddress(%s)", kHostFullName); + SuccessOrQuit(dnsClient->ResolveAddress(kHostFullName, AddressCallback, sInstance)); + AdvanceTime(100); + VerifyOrQuit(sAddressInfo.mCallbackCount == 1); + SuccessOrQuit(sAddressInfo.mError); + VerifyOrQuit(sAddressInfo.mNumHostAddresses == GetArrayLength(kAddresses)); + + for (uint8_t index = 0; index < sAddressInfo.mNumHostAddresses; index++) + { + VerifyOrQuit(addresses.Contains(sAddressInfo.mHostAddresses[index])); + } + + //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Validate DNS Client `ResolveIp4Address()` + + sAddressInfo.Reset(); + Log("ResolveIp4Address(%s)", kHostFullName); + SuccessOrQuit(dnsClient->ResolveIp4Address(kHostFullName, AddressCallback, sInstance)); + AdvanceTime(100); + VerifyOrQuit(sAddressInfo.mCallbackCount == 1); + SuccessOrQuit(sAddressInfo.mError); + VerifyOrQuit(sAddressInfo.mNumHostAddresses == 0); + + sAddressInfo.Reset(); + Log("ResolveIp4Address(%s)", "badname"); + SuccessOrQuit(dnsClient->ResolveIp4Address("badname", AddressCallback, sInstance)); + AdvanceTime(100); + VerifyOrQuit(sAddressInfo.mCallbackCount == 1); + VerifyOrQuit(sAddressInfo.mError != kErrorNone); + //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Validate DNS Client `Browse()`