Add callback registration in ConnectivityService.
ConnectivityDiagnosticsManager will send callbacks to ConnectivityService for registering and unregistering them with the system. ConnectivityService needs to do the processing for persisting (and deleting) these callbacks on the ConnectivityService Thread, so messages are sent to the Connectivity Diagnostics Handler, which runs on the ConnectivityService Thread. Bug: 146444622 Bug: 143187964 Bug: 147848028 Test: compiles Test: atest FrameworksNetTests Change-Id: Ia5c8f90a60c050504e8676de9564a7607a9b03bc
This commit is contained in:
@@ -27,12 +27,18 @@ import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.PersistableBundle;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -52,15 +58,27 @@ public class ConnectivityDiagnosticsManagerTest {
|
||||
|
||||
private static final Executor INLINE_EXECUTOR = x -> x.run();
|
||||
|
||||
@Mock private Context mContext;
|
||||
@Mock private IConnectivityManager mService;
|
||||
@Mock private ConnectivityDiagnosticsCallback mCb;
|
||||
|
||||
private ConnectivityDiagnosticsBinder mBinder;
|
||||
private ConnectivityDiagnosticsManager mManager;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = mock(Context.class);
|
||||
mService = mock(IConnectivityManager.class);
|
||||
mCb = mock(ConnectivityDiagnosticsCallback.class);
|
||||
|
||||
mBinder = new ConnectivityDiagnosticsBinder(mCb, INLINE_EXECUTOR);
|
||||
mManager = new ConnectivityDiagnosticsManager(mContext, mService);
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() {
|
||||
// clear ConnectivityDiagnosticsManager callbacks map
|
||||
ConnectivityDiagnosticsManager.sCallbacks.clear();
|
||||
}
|
||||
|
||||
private ConnectivityReport createSampleConnectivityReport() {
|
||||
@@ -245,4 +263,53 @@ public class ConnectivityDiagnosticsManagerTest {
|
||||
// latch without waiting.
|
||||
verify(mCb).onNetworkConnectivityReported(eq(n), eq(connectivity));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRegisterConnectivityDiagnosticsCallback() throws Exception {
|
||||
final NetworkRequest request = new NetworkRequest.Builder().build();
|
||||
|
||||
mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
|
||||
|
||||
verify(mService).registerConnectivityDiagnosticsCallback(
|
||||
any(ConnectivityDiagnosticsBinder.class), eq(request));
|
||||
assertTrue(ConnectivityDiagnosticsManager.sCallbacks.containsKey(mCb));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRegisterDuplicateConnectivityDiagnosticsCallback() throws Exception {
|
||||
final NetworkRequest request = new NetworkRequest.Builder().build();
|
||||
|
||||
mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
|
||||
|
||||
try {
|
||||
mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
|
||||
fail("Duplicate callback registration should fail");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUnregisterConnectivityDiagnosticsCallback() throws Exception {
|
||||
final NetworkRequest request = new NetworkRequest.Builder().build();
|
||||
mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
|
||||
|
||||
mManager.unregisterConnectivityDiagnosticsCallback(mCb);
|
||||
|
||||
verify(mService).unregisterConnectivityDiagnosticsCallback(
|
||||
any(ConnectivityDiagnosticsBinder.class));
|
||||
assertFalse(ConnectivityDiagnosticsManager.sCallbacks.containsKey(mCb));
|
||||
|
||||
// verify that re-registering is successful
|
||||
mManager.registerConnectivityDiagnosticsCallback(request, INLINE_EXECUTOR, mCb);
|
||||
verify(mService, times(2)).registerConnectivityDiagnosticsCallback(
|
||||
any(ConnectivityDiagnosticsBinder.class), eq(request));
|
||||
assertTrue(ConnectivityDiagnosticsManager.sCallbacks.containsKey(mCb));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUnregisterUnknownConnectivityDiagnosticsCallback() throws Exception {
|
||||
mManager.unregisterConnectivityDiagnosticsCallback(mCb);
|
||||
|
||||
verifyNoMoreInteractions(mService);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,6 +139,7 @@ import android.net.ConnectivityManager.PacketKeepalive;
|
||||
import android.net.ConnectivityManager.PacketKeepaliveCallback;
|
||||
import android.net.ConnectivityManager.TooManyRequestsException;
|
||||
import android.net.ConnectivityThread;
|
||||
import android.net.IConnectivityDiagnosticsCallback;
|
||||
import android.net.IDnsResolver;
|
||||
import android.net.IIpConnectivityMetrics;
|
||||
import android.net.INetd;
|
||||
@@ -180,6 +181,7 @@ import android.os.Bundle;
|
||||
import android.os.ConditionVariable;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
import android.os.IBinder;
|
||||
import android.os.INetworkManagementService;
|
||||
import android.os.Looper;
|
||||
import android.os.Parcel;
|
||||
@@ -210,6 +212,7 @@ import com.android.internal.util.ArrayUtils;
|
||||
import com.android.internal.util.WakeupMessage;
|
||||
import com.android.internal.util.test.BroadcastInterceptingContext;
|
||||
import com.android.internal.util.test.FakeSettingsProvider;
|
||||
import com.android.server.ConnectivityService.ConnectivityDiagnosticsCallbackInfo;
|
||||
import com.android.server.connectivity.ConnectivityConstants;
|
||||
import com.android.server.connectivity.DefaultNetworkMetrics;
|
||||
import com.android.server.connectivity.IpConnectivityMetrics;
|
||||
@@ -322,6 +325,8 @@ public class ConnectivityServiceTest {
|
||||
@Mock UserManager mUserManager;
|
||||
@Mock NotificationManager mNotificationManager;
|
||||
@Mock AlarmManager mAlarmManager;
|
||||
@Mock IConnectivityDiagnosticsCallback mConnectivityDiagnosticsCallback;
|
||||
@Mock IBinder mIBinder;
|
||||
|
||||
private ArgumentCaptor<ResolverParamsParcel> mResolverParamsParcelCaptor =
|
||||
ArgumentCaptor.forClass(ResolverParamsParcel.class);
|
||||
@@ -6355,4 +6360,70 @@ public class ConnectivityServiceTest {
|
||||
UserHandle.getAppId(uid));
|
||||
return packageInfo;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRegisterConnectivityDiagnosticsCallbackInvalidRequest() throws Exception {
|
||||
final NetworkRequest request =
|
||||
new NetworkRequest(
|
||||
new NetworkCapabilities(), TYPE_ETHERNET, 0, NetworkRequest.Type.NONE);
|
||||
try {
|
||||
mService.registerConnectivityDiagnosticsCallback(
|
||||
mConnectivityDiagnosticsCallback, request);
|
||||
fail("registerConnectivityDiagnosticsCallback should throw on invalid NetworkRequest");
|
||||
} catch (IllegalArgumentException expected) {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRegisterUnregisterConnectivityDiagnosticsCallback() throws Exception {
|
||||
final NetworkRequest wifiRequest =
|
||||
new NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI).build();
|
||||
|
||||
when(mConnectivityDiagnosticsCallback.asBinder()).thenReturn(mIBinder);
|
||||
|
||||
mService.registerConnectivityDiagnosticsCallback(
|
||||
mConnectivityDiagnosticsCallback, wifiRequest);
|
||||
|
||||
verify(mIBinder, timeout(TIMEOUT_MS))
|
||||
.linkToDeath(any(ConnectivityDiagnosticsCallbackInfo.class), anyInt());
|
||||
assertTrue(
|
||||
mService.mConnectivityDiagnosticsCallbacks.containsKey(
|
||||
mConnectivityDiagnosticsCallback));
|
||||
|
||||
mService.unregisterConnectivityDiagnosticsCallback(mConnectivityDiagnosticsCallback);
|
||||
verify(mIBinder, timeout(TIMEOUT_MS))
|
||||
.unlinkToDeath(any(ConnectivityDiagnosticsCallbackInfo.class), anyInt());
|
||||
assertFalse(
|
||||
mService.mConnectivityDiagnosticsCallbacks.containsKey(
|
||||
mConnectivityDiagnosticsCallback));
|
||||
verify(mConnectivityDiagnosticsCallback, atLeastOnce()).asBinder();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRegisterDuplicateConnectivityDiagnosticsCallback() throws Exception {
|
||||
final NetworkRequest wifiRequest =
|
||||
new NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI).build();
|
||||
when(mConnectivityDiagnosticsCallback.asBinder()).thenReturn(mIBinder);
|
||||
|
||||
mService.registerConnectivityDiagnosticsCallback(
|
||||
mConnectivityDiagnosticsCallback, wifiRequest);
|
||||
|
||||
verify(mIBinder, timeout(TIMEOUT_MS))
|
||||
.linkToDeath(any(ConnectivityDiagnosticsCallbackInfo.class), anyInt());
|
||||
verify(mConnectivityDiagnosticsCallback).asBinder();
|
||||
assertTrue(
|
||||
mService.mConnectivityDiagnosticsCallbacks.containsKey(
|
||||
mConnectivityDiagnosticsCallback));
|
||||
|
||||
// Register the same callback again
|
||||
mService.registerConnectivityDiagnosticsCallback(
|
||||
mConnectivityDiagnosticsCallback, wifiRequest);
|
||||
|
||||
// Block until all other events are done processing.
|
||||
HandlerUtilsKt.waitForIdle(mCsHandlerThread, TIMEOUT_MS);
|
||||
|
||||
assertTrue(
|
||||
mService.mConnectivityDiagnosticsCallbacks.containsKey(
|
||||
mConnectivityDiagnosticsCallback));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user