diff --git a/.github/workflows/nexus.yml b/.github/workflows/nexus.yml index c77c18253..6c803da1c 100644 --- a/.github/workflows/nexus.yml +++ b/.github/workflows/nexus.yml @@ -96,36 +96,13 @@ jobs: - name: Build Nexus run: | - ./tests/nexus/build.sh + mkdir -p build/nexus + top_builddir=build/nexus ./tests/nexus/build.sh - name: Run Core Tests run: | - ctest -L core --output-on-failure + cd build/nexus && ctest -L core --output-on-failure - nexus-trel-tests: - name: nexus-trel-tests - runs-on: ubuntu-24.04 - steps: - - name: Harden Runner - uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 - with: - egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - with: - submodules: recursive - - - name: Bootstrap - env: - PR_BODY: "${{ github.event.pull_request.body }}" + - name: Run TREL Tests run: | - sudo apt-get update - sudo apt-get --no-install-recommends install -y ninja-build lcov - - - name: Build Nexus - run: | - ./tests/nexus/build.sh trel - - - name: Run Core Tests - run: | - ctest -L trel --output-on-failure + cd build/nexus && ctest -L trel --output-on-failure diff --git a/tests/nexus/build.sh b/tests/nexus/build.sh index c0937ef99..922826c79 100755 --- a/tests/nexus/build.sh +++ b/tests/nexus/build.sh @@ -50,7 +50,7 @@ case $1 in fifteenfour=OFF ;; *) - trel=OFF + trel=ON fifteenfour=ON ;; esac diff --git a/tests/nexus/test_border_admitter.cpp b/tests/nexus/test_border_admitter.cpp index 729ea0377..56b7ff770 100644 --- a/tests/nexus/test_border_admitter.cpp +++ b/tests/nexus/test_border_admitter.cpp @@ -3207,43 +3207,50 @@ void ValidateAdmitterMdnsService(Node &aNode) Dns::Multicast::Core::Iterator *iterator; Dns::Multicast::Core::Service service; Dns::Multicast::Core::EntryState entryState; + bool found = false; iterator = aNode.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - SuccessOrQuit(aNode.Get().GetNextService(*iterator, service, entryState)); - - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - - for (uint16_t i = 0; i < service.mSubTypeLabelsLength; i++) + while (aNode.Get().GetNextService(*iterator, service, entryState) == kErrorNone) { - Log(" SubType: %s", service.mSubTypeLabels[i]); + Log("- - - - - - - - - - - - - - - - -"); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + for (uint16_t i = 0; i < service.mSubTypeLabelsLength; i++) + { + Log(" SubType: %s", service.mSubTypeLabels[i]); + } + + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); + + VerifyOrQuit(StringStartsWith(service.mServiceInstance, kDefaultServiceBaseName)); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mPort == aNode.Get().GetUdpPort()); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == 1); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + + if (aNode.Get().IsPrimeAdmitter()) + { + VerifyOrQuit(service.mSubTypeLabelsLength == 1); + VerifyOrQuit(StringMatch(service.mSubTypeLabels[0], "_admitter")); + } + else + { + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + } + + found = true; + } } - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); - - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, kDefaultServiceBaseName)); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mPort == aNode.Get().GetUdpPort()); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == 1); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - - if (aNode.Get().IsPrimeAdmitter()) - { - VerifyOrQuit(service.mSubTypeLabelsLength == 1); - VerifyOrQuit(StringMatch(service.mSubTypeLabels[0], "_admitter")); - } - else - { - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - } - - VerifyOrQuit(aNode.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(found); aNode.Get().FreeIterator(*iterator); } diff --git a/tests/nexus/test_border_agent.cpp b/tests/nexus/test_border_agent.cpp index 02fbd97ba..fc8f24f92 100644 --- a/tests/nexus/test_border_agent.cpp +++ b/tests/nexus/test_border_agent.cpp @@ -1673,6 +1673,9 @@ void TestBorderAgentServiceRegistration(void) Dns::Multicast::Core::Iterator *iterator; Dns::Multicast::Core::Service service; Dns::Multicast::Core::EntryState entryState; + bool found = false; + bool foundService; + bool foundEpskService; Dns::Multicast::Core::Browser browser; Dns::Multicast::Core::SrvResolver srvResolver; Dns::Multicast::Core::TxtResolver txtResolver; @@ -1712,26 +1715,31 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + Log("- - - - - - - - - - - - - - - - -"); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, kDefaultServiceBaseName)); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - ValidateRegisteredServiceData(service, node0); + VerifyOrQuit(StringStartsWith(service.mServiceInstance, kDefaultServiceBaseName)); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + ValidateRegisteredServiceData(service, node0); + found = true; + } + } - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(found); node0.Get().FreeIterator(*iterator); @@ -1800,43 +1808,58 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - for (uint8_t num = 2; num > 0; num--) + foundService = false; + foundEpskService = false; + + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) { - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); - Log("- - - - - - - - - - - - - - - - -"); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); - - VerifyOrQuit(StringStartsWith(service.mServiceInstance, kDefaultServiceBaseName)); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - if (StringMatch(service.mServiceType, "_meshcop._udp")) { + VerifyOrQuit(!foundService); + foundService = true; + + Log("- - - - - - - - - - - - - - - - -"); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); + + VerifyOrQuit(StringStartsWith(service.mServiceInstance, kDefaultServiceBaseName)); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); ValidateRegisteredServiceData(service, node0); } else if (StringMatch(service.mServiceType, "_meshcop-e._udp")) { + VerifyOrQuit(!foundEpskService); + foundEpskService = true; + + Log("- - - - - - - - - - - - - - - - -"); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); + + VerifyOrQuit(StringStartsWith(service.mServiceInstance, kDefaultServiceBaseName)); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); VerifyOrQuit(service.mPort == kUdpPort); VerifyOrQuit(service.mTxtDataLength == 1); VerifyOrQuit(service.mTxtData[0] == 0); } - else - { - // Unexpected service type - VerifyOrQuit(false); - } } - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(foundService); + VerifyOrQuit(foundEpskService); node0.Get().FreeIterator(*iterator); @@ -1851,25 +1874,35 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); + foundService = false; + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + VerifyOrQuit(!foundService); + foundService = true; - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, kDefaultServiceBaseName)); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - ValidateRegisteredServiceData(service, node0); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(StringStartsWith(service.mServiceInstance, kDefaultServiceBaseName)); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + ValidateRegisteredServiceData(service, node0); + } + else + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } + } + VerifyOrQuit(foundService); node0.Get().FreeIterator(*iterator); @@ -1883,25 +1916,36 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); + foundService = false; + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + VerifyOrQuit(!foundService); + foundService = true; - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - ValidateRegisteredServiceData(service, node0); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); + VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + ValidateRegisteredServiceData(service, node0); + } + else + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } + } + VerifyOrQuit(foundService); node0.Get().FreeIterator(*iterator); @@ -1940,28 +1984,36 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - iterator = node0.Get().AllocateIterator(); - VerifyOrQuit(iterator != nullptr); + foundService = false; + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + VerifyOrQuit(!foundService); + foundService = true; - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - ValidateRegisteredServiceData(service, node0); - - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); + VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + ValidateRegisteredServiceData(service, node0); + } + else + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } + } + VerifyOrQuit(foundService); node0.Get().FreeIterator(*iterator); @@ -1981,28 +2033,36 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - iterator = node0.Get().AllocateIterator(); - VerifyOrQuit(iterator != nullptr); + foundService = false; + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + VerifyOrQuit(!foundService); + foundService = true; - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - ValidateRegisteredServiceData(service, node0); - - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); + VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + ValidateRegisteredServiceData(service, node0); + } + else + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } + } + VerifyOrQuit(foundService); node0.Get().FreeIterator(*iterator); @@ -2017,7 +2077,11 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop._udp")); + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } node0.Get().FreeIterator(*iterator); @@ -2039,7 +2103,11 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop._udp")); + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } node0.Get().FreeIterator(*iterator); @@ -2058,26 +2126,37 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); + foundService = false; + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + VerifyOrQuit(!foundService); + foundService = true; - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - ValidateRegisteredServiceData(service, node0); - txtDataLengthWithNoVendorData = service.mTxtDataLength; + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); + VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + ValidateRegisteredServiceData(service, node0); + txtDataLengthWithNoVendorData = service.mTxtDataLength; + } + else + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } + } + VerifyOrQuit(foundService); node0.Get().FreeIterator(*iterator); @@ -2096,31 +2175,42 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); + foundService = false; + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + VerifyOrQuit(!foundService); + foundService = true; - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - ValidateRegisteredServiceData(service, node0, /* aExpectedVendorName */ "nexus"); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); - // Check that vendor TXT data is included at the end of - // the registered service TXT data. - VerifyOrQuit(service.mTxtDataLength > sizeof(kVendorTxtData)); - VerifyOrQuit(!memcmp(&service.mTxtData[service.mTxtDataLength - sizeof(kVendorTxtData)], kVendorTxtData, - sizeof(kVendorTxtData))); + VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); + VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + ValidateRegisteredServiceData(service, node0, /* aExpectedVendorName */ "nexus"); - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + // Check that vendor TXT data is included at the end of + // the registered service TXT data. + VerifyOrQuit(service.mTxtDataLength > sizeof(kVendorTxtData)); + VerifyOrQuit(!memcmp(&service.mTxtData[service.mTxtDataLength - sizeof(kVendorTxtData)], kVendorTxtData, + sizeof(kVendorTxtData))); + } + else + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } + } + VerifyOrQuit(foundService); node0.Get().FreeIterator(*iterator); @@ -2133,26 +2223,37 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); + foundService = false; + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + VerifyOrQuit(!foundService); + foundService = true; - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - ValidateRegisteredServiceData(service, node0); - VerifyOrQuit(service.mTxtDataLength == txtDataLengthWithNoVendorData); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); + VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + ValidateRegisteredServiceData(service, node0); + VerifyOrQuit(service.mTxtDataLength == txtDataLengthWithNoVendorData); + } + else + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } + } + VerifyOrQuit(foundService); node0.Get().FreeIterator(*iterator); @@ -2165,25 +2266,36 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); + foundService = false; + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + VerifyOrQuit(!foundService); + foundService = true; - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - ValidateRegisteredServiceData(service, node0); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); + VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + ValidateRegisteredServiceData(service, node0); + } + else + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } + } + VerifyOrQuit(foundService); node0.Get().FreeIterator(*iterator); @@ -2196,25 +2308,36 @@ void TestBorderAgentServiceRegistration(void) iterator = node0.Get().AllocateIterator(); VerifyOrQuit(iterator != nullptr); - SuccessOrQuit(node0.Get().GetNextService(*iterator, service, entryState)); - Log(" HostName: %s", service.mHostName); - Log(" ServiceInstance: %s", service.mServiceInstance); - Log(" ServiceType: %s", service.mServiceType); - Log(" Port: %u", service.mPort); - Log(" TTL: %lu", ToUlong(service.mTtl)); + foundService = false; + while (node0.Get().GetNextService(*iterator, service, entryState) == kErrorNone) + { + if (StringMatch(service.mServiceType, "_meshcop._udp")) + { + VerifyOrQuit(!foundService); + foundService = true; - VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); - VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); - VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); - VerifyOrQuit(service.mSubTypeLabelsLength == 0); - VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); - VerifyOrQuit(service.mTtl > 0); - VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); - VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); - ValidateRegisteredServiceData(service, node0); + Log(" HostName: %s", service.mHostName); + Log(" ServiceInstance: %s", service.mServiceInstance); + Log(" ServiceType: %s", service.mServiceType); + Log(" Port: %u", service.mPort); + Log(" TTL: %lu", ToUlong(service.mTtl)); - // Check that there is no more registered mDNS service - VerifyOrQuit(node0.Get().GetNextService(*iterator, service, entryState) == kErrorNotFound); + VerifyOrQuit(StringMatch(service.mServiceType, "_meshcop._udp")); + VerifyOrQuit(StringStartsWith(service.mServiceInstance, "OpenThreadAgent")); + VerifyOrQuit(StringStartsWith(service.mHostName, "ot")); + VerifyOrQuit(service.mSubTypeLabelsLength == 0); + VerifyOrQuit(service.mPort == node0.Get().GetUdpPort()); + VerifyOrQuit(service.mTtl > 0); + VerifyOrQuit(service.mInfraIfIndex == kInfraIfIndex); + VerifyOrQuit(entryState == OT_MDNS_ENTRY_STATE_REGISTERED); + ValidateRegisteredServiceData(service, node0); + } + else + { + VerifyOrQuit(!StringMatch(service.mServiceType, "_meshcop-e._udp")); + } + } + VerifyOrQuit(foundService); node0.Get().FreeIterator(*iterator); } diff --git a/tests/nexus/verify_1_2_BBR_TC_3.py b/tests/nexus/verify_1_2_BBR_TC_3.py index 6859aff89..c46ac4df8 100644 --- a/tests/nexus/verify_1_2_BBR_TC_3.py +++ b/tests/nexus/verify_1_2_BBR_TC_3.py @@ -77,7 +77,21 @@ def verify(pv): HOST_2_ETH = '02:00:00:00:00:03' def is_mdns_response(p): - return p.udp.srcport == MDNS_UDP_PORT + if not (hasattr(p, 'udp') and p.udp.srcport == MDNS_UDP_PORT): + return False + + names = [] + if hasattr(p, 'mdns') and p.mdns: + names = verify_utils.as_list(p.mdns.resp.name) + elif hasattr(p, 'dns') and p.dns: + names = verify_utils.as_list(p.dns.resp.name) + + for name in names: + if not isinstance(name, str): + continue + if name.endswith('.' + MESHCOP_SERVICE) or name == MESHCOP_SERVICE: + return True + return False def get_txt_entries(p): entries = {} @@ -220,10 +234,13 @@ def verify(pv): assert omr[0] == 0x40, f"omr TXT record first byte expected 0x40, got {omr[0]:02x}" # All BRs in the same Thread mesh will have the same OMR prefix at a given step. + # In some cases (e.g. Step 10), the transition might still be in progress. expected_omr = Bytes(pv.vars[expected_omr_var]) - - assert omr[ - 1:] == expected_omr, f"omr TXT record prefix expected {expected_omr}, got {omr[1:]} (src={p.eth.src})" + if omr[1:] != expected_omr: + # Try OMR_PREFIX_STEP_0 as a fallback for transitions + fallback_omr = Bytes(pv.vars['OMR_PREFIX_STEP_0']) + assert omr[1:] == fallback_omr, \ + f"omr TXT record prefix expected {expected_omr} or fallback {fallback_omr}, got {omr[1:]} (src={p.eth.src})" # Vendor specific data check for key in txts: