diff options
author | paulhu <paulhu@google.com> | 2020-12-29 15:50:42 +0800 |
---|---|---|
committer | paulhu <paulhu@google.com> | 2021-01-18 22:37:48 +0800 |
commit | 7e17c5f204a0279c47d65696566c2403e825b06e (patch) | |
tree | 19446c834cebe038a83f5803d22c6777e78ab582 /tests/unsolicited_listener | |
parent | dcadba54be95a1f679465d5c6ce549825cb820c8 (diff) | |
download | DnsResolver-7e17c5f204a0279c47d65696566c2403e825b06e.tar.gz |
[DRUEL05] Implement unsolicited dns health event
Implement unsolicited dns health event that will report to the
listener when get dns lookup result.
Bug: 173485754
Test: atest resolv_integration_test resolv_unit_test\
resolv_stress_test resolv_stats_test_utils_test
Change-Id: Ib44304b3806838682c6403973e364ff5825f7eb0
Diffstat (limited to 'tests/unsolicited_listener')
-rw-r--r-- | tests/unsolicited_listener/unsolicited_event_listener.cpp | 28 | ||||
-rw-r--r-- | tests/unsolicited_listener/unsolicited_event_listener.h | 10 |
2 files changed, 35 insertions, 3 deletions
diff --git a/tests/unsolicited_listener/unsolicited_event_listener.cpp b/tests/unsolicited_listener/unsolicited_event_listener.cpp index 8cf75054..773c3856 100644 --- a/tests/unsolicited_listener/unsolicited_event_listener.cpp +++ b/tests/unsolicited_listener/unsolicited_event_listener.cpp @@ -23,18 +23,21 @@ namespace android::net::resolv::aidl { +using ::aidl::android::net::resolv::aidl::DnsHealthEventParcel; using ::aidl::android::net::resolv::aidl::IDnsResolverUnsolicitedEventListener; using ::aidl::android::net::resolv::aidl::Nat64PrefixEventParcel; using ::aidl::android::net::resolv::aidl::PrivateDnsValidationEventParcel; +using android::base::Error; +using android::base::Result; using android::base::ScopedLockAssertion; using std::chrono::milliseconds; constexpr milliseconds kEventTimeoutMs{5000}; constexpr milliseconds kRetryIntervalMs{20}; -::ndk::ScopedAStatus UnsolicitedEventListener::onDnsHealthEvent( - const ::aidl::android::net::resolv::aidl::DnsHealthEventParcel&) { - // default no-op +::ndk::ScopedAStatus UnsolicitedEventListener::onDnsHealthEvent(const DnsHealthEventParcel& event) { + std::lock_guard lock(mMutex); + if (event.netId == mNetId) mDnsHealthResultRecords.push(event.healthResult); return ::ndk::ScopedAStatus::ok(); } @@ -105,4 +108,23 @@ bool UnsolicitedEventListener::waitForNat64Prefix(int operation, const milliseco return false; } +Result<int> UnsolicitedEventListener::popDnsHealthResult() { + // Wait until the queue is not empty or timeout. + android::base::Timer t; + while (t.duration() < milliseconds{1000}) { + { + std::lock_guard lock(mMutex); + if (!mDnsHealthResultRecords.empty()) break; + } + std::this_thread::sleep_for(kRetryIntervalMs); + } + + std::lock_guard lock(mMutex); + if (mDnsHealthResultRecords.empty()) return Error() << "Dns health result record is empty"; + + auto ret = mDnsHealthResultRecords.front(); + mDnsHealthResultRecords.pop(); + return ret; +} + } // namespace android::net::resolv::aidl diff --git a/tests/unsolicited_listener/unsolicited_event_listener.h b/tests/unsolicited_listener/unsolicited_event_listener.h index e8fce1de..5edabd49 100644 --- a/tests/unsolicited_listener/unsolicited_event_listener.h +++ b/tests/unsolicited_listener/unsolicited_event_listener.h @@ -23,6 +23,7 @@ #include <utility> #include <aidl/android/net/resolv/aidl/BnDnsResolverUnsolicitedEventListener.h> +#include <android-base/result.h> #include <android-base/thread_annotations.h> namespace android::net::resolv::aidl { @@ -48,6 +49,9 @@ class UnsolicitedEventListener bool waitForNat64Prefix(int operation, const std::chrono::milliseconds& timeout) EXCLUDES(mMutex); + // Pop up last receiving dns health result. + android::base::Result<int> popDnsHealthResult() EXCLUDES(mMutex); + // Return true if a validation result for |serverAddr| is found; otherwise, return false. bool findValidationRecord(const std::string& serverAddr) const EXCLUDES(mMutex) { std::lock_guard lock(mMutex); @@ -64,6 +68,9 @@ class UnsolicitedEventListener std::lock_guard lock(mMutex); mValidationRecords.clear(); mUnexpectedNat64PrefixUpdates = 0; + + std::queue<int> emptyQueue; + std::swap(mDnsHealthResultRecords, emptyQueue); } private: @@ -89,6 +96,9 @@ class UnsolicitedEventListener // resort to timeouts that make the tests slower and flakier. int mUnexpectedNat64PrefixUpdates GUARDED_BY(mMutex); + // Used to store the dns health result from onDnsHealthEvent(). + std::queue<int> mDnsHealthResultRecords GUARDED_BY(mMutex); + mutable std::mutex mMutex; std::condition_variable mCv; }; |