diff --git a/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkControllerTest.java b/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkControllerTest.java index e02e74da67..7a6c9aa558 100644 --- a/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkControllerTest.java +++ b/thread/tests/cts/src/android/net/thread/cts/ThreadNetworkControllerTest.java @@ -24,6 +24,8 @@ import static android.net.thread.ThreadNetworkException.ERROR_REJECTED_BY_PEER; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; +import static com.android.testutils.TestPermissionUtil.runAsShell; + import static com.google.common.truth.Truth.assertThat; import static com.google.common.util.concurrent.MoreExecutors.directExecutor; @@ -34,6 +36,10 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; import android.Manifest.permission; import android.content.Context; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkCapabilities; +import android.net.NetworkRequest; import android.net.thread.ActiveOperationalDataset; import android.net.thread.OperationalDatasetTimestamp; import android.net.thread.PendingOperationalDataset; @@ -74,6 +80,8 @@ import java.util.concurrent.Executors; @RunWith(DevSdkIgnoreRunner.class) @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU) // Thread is available on only U+ public class ThreadNetworkControllerTest { + private static final int JOIN_TIMEOUT_MILLIS = 30 * 1000; + private static final int NETWORK_CALLBACK_TIMEOUT_MILLIS = 10 * 1000; private static final int CALLBACK_TIMEOUT_MILLIS = 1000; private static final String PERMISSION_THREAD_NETWORK_PRIVILEGED = "android.permission.THREAD_NETWORK_PRIVILEGED"; @@ -750,4 +758,36 @@ public class ThreadNetworkControllerTest { assertThat(dataset.getMeshLocalPrefix().getRawAddress()[0]).isEqualTo((byte) 0xfd); } } + + @Test + public void threadNetworkCallback_deviceAttached_threadNetworkIsAvailable() throws Exception { + ThreadNetworkController controller = mManager.getAllThreadNetworkControllers().get(0); + ActiveOperationalDataset activeDataset = newRandomizedDataset("TestNet", controller); + SettableFuture joinFuture = SettableFuture.create(); + SettableFuture networkFuture = SettableFuture.create(); + ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class); + NetworkRequest networkRequest = + new NetworkRequest.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_THREAD) + .build(); + ConnectivityManager.NetworkCallback networkCallback = + new ConnectivityManager.NetworkCallback() { + @Override + public void onAvailable(Network network) { + networkFuture.set(network); + } + }; + + runAsShell( + PERMISSION_THREAD_NETWORK_PRIVILEGED, + () -> controller.join(activeDataset, mExecutor, newOutcomeReceiver(joinFuture))); + runAsShell( + permission.ACCESS_NETWORK_STATE, + () -> cm.registerNetworkCallback(networkRequest, networkCallback)); + + joinFuture.get(JOIN_TIMEOUT_MILLIS, MILLISECONDS); + runAsShell( + permission.ACCESS_NETWORK_STATE, () -> assertThat(isAttached(controller)).isTrue()); + assertThat(networkFuture.get(NETWORK_CALLBACK_TIMEOUT_MILLIS, MILLISECONDS)).isNotNull(); + } }