aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com>2024-03-22 06:31:18 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-03-22 06:31:18 +0000
commitd9e60db7f6a7050f7491fc09d52c2f9c781df428 (patch)
tree02038c4d80697f5308feca2e957ddc1fa34efba1
parent3a0016cf10debf5ce282bc290a38cdb179cd50bd (diff)
parentc454733426ce9f70ebd95cb53bef4840887f25e9 (diff)
downloadot-br-posix-d9e60db7f6a7050f7491fc09d52c2f9c781df428.tar.gz
Merge "[Thread] register state callback in initialize()" into main
-rw-r--r--src/android/aidl/com/android/server/thread/openthread/IOtDaemon.aidl8
-rw-r--r--src/android/java/com/android/server/thread/openthread/testing/FakeOtDaemon.java26
-rw-r--r--src/android/otdaemon_server.cpp31
-rw-r--r--src/android/otdaemon_server.hpp16
-rw-r--r--tests/android/java/com/android/server/thread/openthread/testing/FakeOtDaemonTest.java19
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();