Add template binder call for registering OEM netd unsolicited listener

Bug: 131045919
Test: built, flashed, booted
        system/netd/tests/runtests.sh pass

Change-Id: Id391b3000842ccb4769f0f99bfffcd36a4cdfa35
diff --git a/tests/binder_test.cpp b/tests/binder_test.cpp
index a4ea0fd..1f6e5f7 100644
--- a/tests/binder_test.cpp
+++ b/tests/binder_test.cpp
@@ -43,8 +43,11 @@
 #include <android-base/macros.h>
 #include <android-base/stringprintf.h>
 #include <android-base/strings.h>
+#include <binder/IPCThreadState.h>
 #include <bpf/BpfMap.h>
 #include <bpf/BpfUtils.h>
+#include <com/android/internal/net/BnOemNetdUnsolicitedEventListener.h>
+#include <com/android/internal/net/IOemNetd.h>
 #include <cutils/multiuser.h>
 #include <gtest/gtest.h>
 #include <logwrap/logwrap.h>
@@ -57,7 +60,6 @@
 #include "XfrmController.h"
 #include "android/net/INetd.h"
 #include "binder/IServiceManager.h"
-#include "com/android/internal/net/IOemNetd.h"
 #include "netdutils/Stopwatch.h"
 #include "netdutils/Syscalls.h"
 #include "tun_interface.h"
@@ -3035,7 +3037,7 @@
     EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
 }
 
-TEST_F(BinderTest, OemNetdIsAlive) {
+TEST_F(BinderTest, OemNetdRelated) {
     sp<IBinder> binder;
     binder::Status status = mNetd->getOemNetd(&binder);
     EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
@@ -3043,9 +3045,47 @@
     if (binder != nullptr) {
         oemNetd = android::interface_cast<com::android::internal::net::IOemNetd>(binder);
     }
+    ASSERT_NE(nullptr, oemNetd.get());
 
     TimedOperation t("OemNetd isAlive RPC");
     bool isAlive = false;
     oemNetd->isAlive(&isAlive);
     ASSERT_TRUE(isAlive);
+
+    class TestOemUnsolListener
+        : public com::android::internal::net::BnOemNetdUnsolicitedEventListener {
+      public:
+        android::binder::Status onRegistered() override {
+            std::lock_guard lock(mCvMutex);
+            mCv.notify_one();
+            return android::binder::Status::ok();
+        }
+        std::condition_variable& getCv() { return mCv; }
+        std::mutex& getCvMutex() { return mCvMutex; }
+
+      private:
+        std::mutex mCvMutex;
+        std::condition_variable mCv;
+    };
+
+    // Start the Binder thread pool.
+    android::ProcessState::self()->startThreadPool();
+
+    android::sp<TestOemUnsolListener> testListener = new TestOemUnsolListener();
+
+    auto& cv = testListener->getCv();
+    auto& cvMutex = testListener->getCvMutex();
+
+    {
+        std::unique_lock lock(cvMutex);
+
+        status = oemNetd->registerOemUnsolicitedEventListener(
+                ::android::interface_cast<
+                        com::android::internal::net::IOemNetdUnsolicitedEventListener>(
+                        testListener));
+        EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
+
+        // Wait for receiving expected events.
+        EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lock, std::chrono::seconds(2)));
+    }
 }