diff options
author | Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> | 2024-03-22 06:31:18 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-03-22 06:31:18 +0000 |
commit | d9e60db7f6a7050f7491fc09d52c2f9c781df428 (patch) | |
tree | 02038c4d80697f5308feca2e957ddc1fa34efba1 | |
parent | 3a0016cf10debf5ce282bc290a38cdb179cd50bd (diff) | |
parent | c454733426ce9f70ebd95cb53bef4840887f25e9 (diff) | |
download | ot-br-posix-d9e60db7f6a7050f7491fc09d52c2f9c781df428.tar.gz |
Merge "[Thread] register state callback in initialize()" into main
5 files changed, 69 insertions, 31 deletions
diff --git a/src/android/aidl/com/android/server/thread/openthread/IOtDaemon.aidl b/src/android/aidl/com/android/server/thread/openthread/IOtDaemon.aidl index 2fa3625a..7a4df4eb 100644 --- a/src/android/aidl/com/android/server/thread/openthread/IOtDaemon.aidl +++ b/src/android/aidl/com/android/server/thread/openthread/IOtDaemon.aidl @@ -82,7 +82,9 @@ oneway interface IOtDaemon { } /** - * Initializes this service with Thread tunnel interface FD. + * Initializes this service. + * + * <p>This API MUST be called before all other APIs of this interface. * * @param tunFd the Thread tunnel interface FD which can be used to transmit/receive * packets to/from Thread PAN @@ -91,12 +93,14 @@ oneway interface IOtDaemon { * on AIL by {@link NsdManager} * @param meshcopTxts the MeshCoP TXT values set by the system_server to override the default * ones + * @param callback the callback for receiving OtDaemonState changes */ void initialize( in ParcelFileDescriptor tunFd, in boolean enabled, in INsdPublisher nsdPublisher, - in MeshcopTxtAttributes meshcopTxts); + in MeshcopTxtAttributes meshcopTxts, + in IOtDaemonCallback callback); /** Terminates the ot-daemon process. */ void terminate(); diff --git a/src/android/java/com/android/server/thread/openthread/testing/FakeOtDaemon.java b/src/android/java/com/android/server/thread/openthread/testing/FakeOtDaemon.java index 37b58099..be093fb3 100644 --- a/src/android/java/com/android/server/thread/openthread/testing/FakeOtDaemon.java +++ b/src/android/java/com/android/server/thread/openthread/testing/FakeOtDaemon.java @@ -105,6 +105,9 @@ public final class FakeOtDaemon extends IOtDaemon.Stub { mThreadEnabled = OT_STATE_DISABLED; mNsdPublisher = null; mIsInitialized = false; + + mCallback = null; + mCallbackListenerId = null; } @Override @@ -141,7 +144,8 @@ public final class FakeOtDaemon extends IOtDaemon.Stub { ParcelFileDescriptor tunFd, boolean enabled, INsdPublisher nsdPublisher, - MeshcopTxtAttributes overriddenMeshcopTxts) + MeshcopTxtAttributes overriddenMeshcopTxts, + IOtDaemonCallback callback) throws RemoteException { mIsInitialized = true; mTunFd = tunFd; @@ -152,6 +156,8 @@ public final class FakeOtDaemon extends IOtDaemon.Stub { mOverriddenMeshcopTxts.vendorOui = overriddenMeshcopTxts.vendorOui.clone(); mOverriddenMeshcopTxts.vendorName = overriddenMeshcopTxts.vendorName; mOverriddenMeshcopTxts.modelName = overriddenMeshcopTxts.modelName; + + registerStateCallback(callback, PROACTIVE_LISTENER_ID); } /** Returns {@code true} if {@link initialize} has been called to initialize this object. */ @@ -161,11 +167,14 @@ public final class FakeOtDaemon extends IOtDaemon.Stub { @Override public void terminate() throws RemoteException { - resetStates(); - if (mDeathRecipient != null) { - mDeathRecipient.binderDied(); - mDeathRecipient = null; - } + mHandler.post( + () -> { + resetStates(); + if (mDeathRecipient != null) { + mDeathRecipient.binderDied(); + mDeathRecipient = null; + } + }); } public int getEnabledState() { @@ -207,6 +216,11 @@ public final class FakeOtDaemon extends IOtDaemon.Stub { return mOverriddenMeshcopTxts; } + @Nullable + public IOtDaemonCallback getCallback() { + return mCallback; + } + @Override public void setThreadEnabled(boolean enabled, IOtStatusReceiver receiver) { mHandler.post( diff --git a/src/android/otdaemon_server.cpp b/src/android/otdaemon_server.cpp index aa4b9a08..ac64e21a 100644 --- a/src/android/otdaemon_server.cpp +++ b/src/android/otdaemon_server.cpp @@ -380,10 +380,11 @@ void OtDaemonServer::Process(const MainloopContext &aMainloop) } } -Status OtDaemonServer::initialize(const ScopedFileDescriptor &aTunFd, - const bool enabled, - const std::shared_ptr<INsdPublisher> &aINsdPublisher, - const MeshcopTxtAttributes &aMeshcopTxts) +Status OtDaemonServer::initialize(const ScopedFileDescriptor &aTunFd, + const bool enabled, + const std::shared_ptr<INsdPublisher> &aINsdPublisher, + const MeshcopTxtAttributes &aMeshcopTxts, + const std::shared_ptr<IOtDaemonCallback> &aCallback) { otbrLogInfo("OT daemon is initialized by system server (tunFd=%d, enabled=%s)", aTunFd.get(), enabled ? "true" : "false"); @@ -395,18 +396,22 @@ Status OtDaemonServer::initialize(const ScopedFileDescriptor &aTunFd, mINsdPublisher = aINsdPublisher; mMeshcopTxts = aMeshcopTxts; - mTaskRunner.Post( - [enabled, aINsdPublisher, aMeshcopTxts, this]() { initializeInternal(enabled, mINsdPublisher, mMeshcopTxts); }); + mTaskRunner.Post([enabled, aINsdPublisher, aMeshcopTxts, aCallback, this]() { + initializeInternal(enabled, mINsdPublisher, mMeshcopTxts, aCallback); + }); return Status::ok(); } -void OtDaemonServer::initializeInternal(const bool enabled, - const std::shared_ptr<INsdPublisher> &aINsdPublisher, - const MeshcopTxtAttributes &aMeshcopTxts) +void OtDaemonServer::initializeInternal(const bool enabled, + const std::shared_ptr<INsdPublisher> &aINsdPublisher, + const MeshcopTxtAttributes &aMeshcopTxts, + const std::shared_ptr<IOtDaemonCallback> &aCallback) { std::string instanceName = aMeshcopTxts.vendorName + " " + aMeshcopTxts.modelName; + registerStateCallbackInternal(aCallback, -1 /* listenerId */); + mMdnsPublisher.SetINsdPublisher(aINsdPublisher); mBorderAgent.SetMeshCopServiceValues(instanceName, aMeshcopTxts.modelName, aMeshcopTxts.vendorName, aMeshcopTxts.vendorOui); @@ -424,9 +429,11 @@ void OtDaemonServer::initializeInternal(const bool en Status OtDaemonServer::terminate(void) { - otbrLogWarning("Terminating ot-daemon process..."); - - exit(0); + mTaskRunner.Post([]() { + otbrLogWarning("Terminating ot-daemon process..."); + exit(0); + }); + return Status::ok(); } void OtDaemonServer::updateThreadEnabledState(const int enabled, const std::shared_ptr<IOtStatusReceiver> &aReceiver) diff --git a/src/android/otdaemon_server.hpp b/src/android/otdaemon_server.hpp index 9ac97a71..b24129c1 100644 --- a/src/android/otdaemon_server.hpp +++ b/src/android/otdaemon_server.hpp @@ -93,13 +93,15 @@ private: // Implements IOtDaemon.aidl - Status initialize(const ScopedFileDescriptor &aTunFd, - const bool enabled, - const std::shared_ptr<INsdPublisher> &aNsdPublisher, - const MeshcopTxtAttributes &aMeshcopTxts) override; - void initializeInternal(const bool enabled, - const std::shared_ptr<INsdPublisher> &aINsdPublisher, - const MeshcopTxtAttributes &aMeshcopTxts); + Status initialize(const ScopedFileDescriptor &aTunFd, + const bool enabled, + const std::shared_ptr<INsdPublisher> &aNsdPublisher, + const MeshcopTxtAttributes &aMeshcopTxts, + const std::shared_ptr<IOtDaemonCallback> &aCallback) override; + void initializeInternal(const bool enabled, + const std::shared_ptr<INsdPublisher> &aINsdPublisher, + const MeshcopTxtAttributes &aMeshcopTxts, + const std::shared_ptr<IOtDaemonCallback> &aCallback); Status terminate(void) override; Status setThreadEnabled(const bool enabled, const std::shared_ptr<IOtStatusReceiver> &aReceiver) override; void setThreadEnabledInternal(const bool enabled, const std::shared_ptr<IOtStatusReceiver> &aReceiver); diff --git a/tests/android/java/com/android/server/thread/openthread/testing/FakeOtDaemonTest.java b/tests/android/java/com/android/server/thread/openthread/testing/FakeOtDaemonTest.java index 115adca4..eaf02afb 100644 --- a/tests/android/java/com/android/server/thread/openthread/testing/FakeOtDaemonTest.java +++ b/tests/android/java/com/android/server/thread/openthread/testing/FakeOtDaemonTest.java @@ -37,6 +37,8 @@ import static com.google.common.io.BaseEncoding.base16; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -103,6 +105,7 @@ public final class FakeOtDaemonTest { private TestLooper mTestLooper; @Mock private ParcelFileDescriptor mMockTunFd; @Mock private INsdPublisher mMockNsdPublisher; + @Mock private IOtDaemonCallback mMockCallback; private MeshcopTxtAttributes mOverriddenMeshcopTxts; @Before @@ -118,12 +121,14 @@ public final class FakeOtDaemonTest { } @Test - public void initialize_succeed_argumentsAreSet() throws Exception { + public void initialize_succeed_argumentsAreSetAndCallbackIsInvoked() throws Exception { mOverriddenMeshcopTxts.vendorName = TEST_VENDOR_NAME; mOverriddenMeshcopTxts.vendorOui = TEST_VENDOR_OUI; mOverriddenMeshcopTxts.modelName = TEST_MODEL_NAME; - mFakeOtDaemon.initialize(mMockTunFd, true, mMockNsdPublisher, mOverriddenMeshcopTxts); + mFakeOtDaemon.initialize( + mMockTunFd, true, mMockNsdPublisher, mOverriddenMeshcopTxts, mMockCallback); + mTestLooper.dispatchAll(); MeshcopTxtAttributes meshcopTxts = mFakeOtDaemon.getOverriddenMeshcopTxtAttributes(); assertThat(meshcopTxts).isNotNull(); @@ -133,12 +138,16 @@ public final class FakeOtDaemonTest { assertThat(mFakeOtDaemon.getTunFd()).isEqualTo(mMockTunFd); assertThat(mFakeOtDaemon.getEnabledState()).isEqualTo(OT_STATE_ENABLED); assertThat(mFakeOtDaemon.getNsdPublisher()).isEqualTo(mMockNsdPublisher); + assertThat(mFakeOtDaemon.getStateCallback()).isEqualTo(mMockCallback); assertThat(mFakeOtDaemon.isInitialized()).isTrue(); + verify(mMockCallback, times(1)).onStateChanged(any(), anyLong()); + verify(mMockCallback, times(1)).onBackboneRouterStateChanged(any()); } @Test public void registerStateCallback_noStateChange_callbackIsInvoked() throws Exception { - mFakeOtDaemon.initialize(mMockTunFd, true, mMockNsdPublisher, mOverriddenMeshcopTxts); + mFakeOtDaemon.initialize( + mMockTunFd, true, mMockNsdPublisher, mOverriddenMeshcopTxts, mMockCallback); final AtomicReference<OtDaemonState> stateRef = new AtomicReference<>(); final AtomicLong listenerIdRef = new AtomicLong(); final AtomicReference<BackboneRouterState> bbrStateRef = new AtomicReference<>(); @@ -306,9 +315,11 @@ public final class FakeOtDaemonTest { public void terminate_statesAreResetAndDeathCallbackIsInvoked() throws Exception { DeathRecipient mockDeathRecipient = mock(DeathRecipient.class); mFakeOtDaemon.linkToDeath(mockDeathRecipient, 0); - mFakeOtDaemon.initialize(mMockTunFd, true, mMockNsdPublisher, mOverriddenMeshcopTxts); + mFakeOtDaemon.initialize( + mMockTunFd, true, mMockNsdPublisher, mOverriddenMeshcopTxts, mMockCallback); mFakeOtDaemon.terminate(); + mTestLooper.dispatchAll(); assertThat(mFakeOtDaemon.isInitialized()).isFalse(); OtDaemonState state = mFakeOtDaemon.getState(); |