Merge "Use IDnsResolver instead of INetd for resolver related binder commands"

This commit is contained in:
Luke Huang
2019-03-29 08:45:19 +00:00
committed by Gerrit Code Review
8 changed files with 120 additions and 70 deletions

View File

@@ -63,6 +63,7 @@ import android.net.ConnectionInfo;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.ICaptivePortal; import android.net.ICaptivePortal;
import android.net.IConnectivityManager; import android.net.IConnectivityManager;
import android.net.IDnsResolver;
import android.net.IIpConnectivityMetrics; import android.net.IIpConnectivityMetrics;
import android.net.INetd; import android.net.INetd;
import android.net.INetdEventCallback; import android.net.INetdEventCallback;
@@ -294,6 +295,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
private INetworkManagementService mNMS; private INetworkManagementService mNMS;
@VisibleForTesting @VisibleForTesting
protected IDnsResolver mDnsResolver;
@VisibleForTesting
protected INetd mNetd; protected INetd mNetd;
private INetworkStatsService mStatsService; private INetworkStatsService mStatsService;
private INetworkPolicyManager mPolicyManager; private INetworkPolicyManager mPolicyManager;
@@ -525,6 +528,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
return sMagicDecoderRing.get(what, Integer.toString(what)); return sMagicDecoderRing.get(what, Integer.toString(what));
} }
private static IDnsResolver getDnsResolver() {
return IDnsResolver.Stub
.asInterface(ServiceManager.getService("dnsresolver"));
}
/** Handler thread used for both of the handlers below. */ /** Handler thread used for both of the handlers below. */
@VisibleForTesting @VisibleForTesting
protected final HandlerThread mHandlerThread; protected final HandlerThread mHandlerThread;
@@ -810,13 +818,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
public ConnectivityService(Context context, INetworkManagementService netManager, public ConnectivityService(Context context, INetworkManagementService netManager,
INetworkStatsService statsService, INetworkPolicyManager policyManager) { INetworkStatsService statsService, INetworkPolicyManager policyManager) {
this(context, netManager, statsService, policyManager, new IpConnectivityLog()); this(context, netManager, statsService, policyManager,
getDnsResolver(), new IpConnectivityLog());
} }
@VisibleForTesting @VisibleForTesting
protected ConnectivityService(Context context, INetworkManagementService netManager, protected ConnectivityService(Context context, INetworkManagementService netManager,
INetworkStatsService statsService, INetworkPolicyManager policyManager, INetworkStatsService statsService, INetworkPolicyManager policyManager,
IpConnectivityLog logger) { IDnsResolver dnsresolver, IpConnectivityLog logger) {
if (DBG) log("ConnectivityService starting up"); if (DBG) log("ConnectivityService starting up");
mSystemProperties = getSystemProperties(); mSystemProperties = getSystemProperties();
@@ -853,6 +862,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mPolicyManagerInternal = checkNotNull( mPolicyManagerInternal = checkNotNull(
LocalServices.getService(NetworkPolicyManagerInternal.class), LocalServices.getService(NetworkPolicyManagerInternal.class),
"missing NetworkPolicyManagerInternal"); "missing NetworkPolicyManagerInternal");
mDnsResolver = checkNotNull(dnsresolver, "missing IDnsResolver");
mProxyTracker = makeProxyTracker(); mProxyTracker = makeProxyTracker();
mNetd = NetdService.getInstance(); mNetd = NetdService.getInstance();
@@ -1006,7 +1016,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mMultipathPolicyTracker = new MultipathPolicyTracker(mContext, mHandler); mMultipathPolicyTracker = new MultipathPolicyTracker(mContext, mHandler);
mDnsManager = new DnsManager(mContext, mNMS, mSystemProperties); mDnsManager = new DnsManager(mContext, mDnsResolver, mSystemProperties);
registerPrivateDnsSettingsCallbacks(); registerPrivateDnsSettingsCallbacks();
} }
@@ -3021,9 +3031,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
// NetworkFactories, so network traffic isn't interrupted for an unnecessarily // NetworkFactories, so network traffic isn't interrupted for an unnecessarily
// long time. // long time.
try { try {
mNMS.removeNetwork(nai.network.netId); mNetd.networkDestroy(nai.network.netId);
} catch (Exception e) { } catch (RemoteException | ServiceSpecificException e) {
loge("Exception removing network: " + e); loge("Exception destroying network: " + e);
} }
mDnsManager.removeNetwork(nai.network); mDnsManager.removeNetwork(nai.network);
} }
@@ -5379,8 +5389,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities); final NetworkCapabilities nc = new NetworkCapabilities(networkCapabilities);
final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(), final NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
new Network(reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore, new Network(reserveNetId()), new NetworkInfo(networkInfo), lp, nc, currentScore,
mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mNMS, mContext, mTrackerHandler, new NetworkMisc(networkMisc), this, mNetd, mDnsResolver,
factorySerialNumber); mNMS, factorySerialNumber);
// Make sure the network capabilities reflect what the agent info says. // Make sure the network capabilities reflect what the agent info says.
nai.networkCapabilities = mixInCapabilities(nai, nc); nai.networkCapabilities = mixInCapabilities(nai, nc);
final String extraInfo = networkInfo.getExtraInfo(); final String extraInfo = networkInfo.getExtraInfo();

View File

@@ -30,13 +30,15 @@ import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.IDnsResolver;
import android.net.LinkProperties; import android.net.LinkProperties;
import android.net.Network; import android.net.Network;
import android.net.NetworkUtils; import android.net.NetworkUtils;
import android.net.Uri; import android.net.Uri;
import android.net.shared.PrivateDnsConfig; import android.net.shared.PrivateDnsConfig;
import android.os.Binder; import android.os.Binder;
import android.os.INetworkManagementService; import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.text.TextUtils; import android.text.TextUtils;
@@ -229,7 +231,7 @@ public class DnsManager {
private final Context mContext; private final Context mContext;
private final ContentResolver mContentResolver; private final ContentResolver mContentResolver;
private final INetworkManagementService mNMS; private final IDnsResolver mDnsResolver;
private final MockableSystemProperties mSystemProperties; private final MockableSystemProperties mSystemProperties;
// TODO: Replace these Maps with SparseArrays. // TODO: Replace these Maps with SparseArrays.
private final Map<Integer, PrivateDnsConfig> mPrivateDnsMap; private final Map<Integer, PrivateDnsConfig> mPrivateDnsMap;
@@ -243,10 +245,10 @@ public class DnsManager {
private String mPrivateDnsMode; private String mPrivateDnsMode;
private String mPrivateDnsSpecifier; private String mPrivateDnsSpecifier;
public DnsManager(Context ctx, INetworkManagementService nms, MockableSystemProperties sp) { public DnsManager(Context ctx, IDnsResolver dnsResolver, MockableSystemProperties sp) {
mContext = ctx; mContext = ctx;
mContentResolver = mContext.getContentResolver(); mContentResolver = mContext.getContentResolver();
mNMS = nms; mDnsResolver = dnsResolver;
mSystemProperties = sp; mSystemProperties = sp;
mPrivateDnsMap = new HashMap<>(); mPrivateDnsMap = new HashMap<>();
mPrivateDnsValidationMap = new HashMap<>(); mPrivateDnsValidationMap = new HashMap<>();
@@ -260,6 +262,12 @@ public class DnsManager {
} }
public void removeNetwork(Network network) { public void removeNetwork(Network network) {
try {
mDnsResolver.clearResolverConfiguration(network.netId);
} catch (RemoteException | ServiceSpecificException e) {
Slog.e(TAG, "Error clearing DNS configuration: " + e);
return;
}
mPrivateDnsMap.remove(network.netId); mPrivateDnsMap.remove(network.netId);
mPrivateDnsValidationMap.remove(network.netId); mPrivateDnsValidationMap.remove(network.netId);
} }
@@ -344,10 +352,12 @@ public class DnsManager {
Slog.d(TAG, String.format("setDnsConfigurationForNetwork(%d, %s, %s, %s, %s, %s)", Slog.d(TAG, String.format("setDnsConfigurationForNetwork(%d, %s, %s, %s, %s, %s)",
netId, Arrays.toString(assignedServers), Arrays.toString(domainStrs), netId, Arrays.toString(assignedServers), Arrays.toString(domainStrs),
Arrays.toString(params), tlsHostname, Arrays.toString(tlsServers))); Arrays.toString(params), tlsHostname, Arrays.toString(tlsServers)));
final String[] tlsFingerprints = new String[0];
try { try {
mNMS.setDnsConfigurationForNetwork( mDnsResolver.setResolverConfiguration(
netId, assignedServers, domainStrs, params, tlsHostname, tlsServers); netId, assignedServers, domainStrs, params,
} catch (Exception e) { tlsHostname, tlsServers, tlsFingerprints);
} catch (RemoteException | ServiceSpecificException e) {
Slog.e(TAG, "Error setting DNS configuration: " + e); Slog.e(TAG, "Error setting DNS configuration: " + e);
return; return;
} }

View File

@@ -17,6 +17,7 @@
package com.android.server.connectivity; package com.android.server.connectivity;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IDnsResolver;
import android.net.INetd; import android.net.INetd;
import android.net.InetAddresses; import android.net.InetAddresses;
import android.net.InterfaceConfiguration; import android.net.InterfaceConfiguration;
@@ -65,6 +66,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
NetworkInfo.State.SUSPENDED, NetworkInfo.State.SUSPENDED,
}; };
private final IDnsResolver mDnsResolver;
private final INetd mNetd; private final INetd mNetd;
private final INetworkManagementService mNMService; private final INetworkManagementService mNMService;
@@ -84,7 +86,9 @@ public class Nat464Xlat extends BaseNetworkObserver {
private Inet6Address mIPv6Address; private Inet6Address mIPv6Address;
private State mState = State.IDLE; private State mState = State.IDLE;
public Nat464Xlat(NetworkAgentInfo nai, INetd netd, INetworkManagementService nmService) { public Nat464Xlat(NetworkAgentInfo nai, INetd netd, IDnsResolver dnsResolver,
INetworkManagementService nmService) {
mDnsResolver = dnsResolver;
mNetd = netd; mNetd = netd;
mNMService = nmService; mNMService = nmService;
mNetwork = nai; mNetwork = nai;
@@ -269,7 +273,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
private void startPrefixDiscovery() { private void startPrefixDiscovery() {
try { try {
mNetd.resolverStartPrefix64Discovery(getNetId()); mDnsResolver.startPrefix64Discovery(getNetId());
mState = State.DISCOVERING; mState = State.DISCOVERING;
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
Slog.e(TAG, "Error starting prefix discovery on netId " + getNetId() + ": " + e); Slog.e(TAG, "Error starting prefix discovery on netId " + getNetId() + ": " + e);
@@ -278,7 +282,7 @@ public class Nat464Xlat extends BaseNetworkObserver {
private void stopPrefixDiscovery() { private void stopPrefixDiscovery() {
try { try {
mNetd.resolverStopPrefix64Discovery(getNetId()); mDnsResolver.stopPrefix64Discovery(getNetId());
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
Slog.e(TAG, "Error stopping prefix discovery on netId " + getNetId() + ": " + e); Slog.e(TAG, "Error stopping prefix discovery on netId " + getNetId() + ": " + e);
} }

View File

@@ -17,6 +17,7 @@
package com.android.server.connectivity; package com.android.server.connectivity;
import android.content.Context; import android.content.Context;
import android.net.IDnsResolver;
import android.net.INetd; import android.net.INetd;
import android.net.INetworkMonitor; import android.net.INetworkMonitor;
import android.net.LinkProperties; import android.net.LinkProperties;
@@ -255,7 +256,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info, public NetworkAgentInfo(Messenger messenger, AsyncChannel ac, Network net, NetworkInfo info,
LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler, LinkProperties lp, NetworkCapabilities nc, int score, Context context, Handler handler,
NetworkMisc misc, ConnectivityService connService, INetd netd, NetworkMisc misc, ConnectivityService connService, INetd netd,
INetworkManagementService nms, int factorySerialNumber) { IDnsResolver dnsResolver, INetworkManagementService nms, int factorySerialNumber) {
this.messenger = messenger; this.messenger = messenger;
asyncChannel = ac; asyncChannel = ac;
network = net; network = net;
@@ -263,7 +264,7 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> {
linkProperties = lp; linkProperties = lp;
networkCapabilities = nc; networkCapabilities = nc;
currentScore = score; currentScore = score;
clatd = new Nat464Xlat(this, netd, nms); clatd = new Nat464Xlat(this, netd, dnsResolver, nms);
mConnService = connService; mConnService = connService;
mContext = context; mContext = context;
mHandler = handler; mHandler = handler;

View File

@@ -104,6 +104,7 @@ import android.net.ConnectivityManager.PacketKeepalive;
import android.net.ConnectivityManager.PacketKeepaliveCallback; import android.net.ConnectivityManager.PacketKeepaliveCallback;
import android.net.ConnectivityManager.TooManyRequestsException; import android.net.ConnectivityManager.TooManyRequestsException;
import android.net.ConnectivityThread; import android.net.ConnectivityThread;
import android.net.IDnsResolver;
import android.net.INetd; import android.net.INetd;
import android.net.INetworkMonitor; import android.net.INetworkMonitor;
import android.net.INetworkMonitorCallbacks; import android.net.INetworkMonitorCallbacks;
@@ -240,6 +241,7 @@ public class ConnectivityServiceTest {
private static final String CLAT_PREFIX = "v4-"; private static final String CLAT_PREFIX = "v4-";
private static final String MOBILE_IFNAME = "test_rmnet_data0"; private static final String MOBILE_IFNAME = "test_rmnet_data0";
private static final String WIFI_IFNAME = "test_wlan0"; private static final String WIFI_IFNAME = "test_wlan0";
private static final String[] EMPTY_STRING_ARRAY = new String[0];
private MockContext mServiceContext; private MockContext mServiceContext;
private WrappedConnectivityService mService; private WrappedConnectivityService mService;
@@ -256,6 +258,7 @@ public class ConnectivityServiceTest {
@Mock INetworkManagementService mNetworkManagementService; @Mock INetworkManagementService mNetworkManagementService;
@Mock INetworkStatsService mStatsService; @Mock INetworkStatsService mStatsService;
@Mock INetworkPolicyManager mNpm; @Mock INetworkPolicyManager mNpm;
@Mock IDnsResolver mMockDnsResolver;
@Mock INetd mMockNetd; @Mock INetd mMockNetd;
@Mock NetworkStackClient mNetworkStack; @Mock NetworkStackClient mNetworkStack;
@@ -1053,8 +1056,8 @@ public class ConnectivityServiceTest {
public WrappedConnectivityService(Context context, INetworkManagementService netManager, public WrappedConnectivityService(Context context, INetworkManagementService netManager,
INetworkStatsService statsService, INetworkPolicyManager policyManager, INetworkStatsService statsService, INetworkPolicyManager policyManager,
IpConnectivityLog log, INetd netd) { IpConnectivityLog log, INetd netd, IDnsResolver dnsResolver) {
super(context, netManager, statsService, policyManager, log); super(context, netManager, statsService, policyManager, dnsResolver, log);
mNetd = netd; mNetd = netd;
mLingerDelayMs = TEST_LINGER_DELAY_MS; mLingerDelayMs = TEST_LINGER_DELAY_MS;
} }
@@ -1218,7 +1221,8 @@ public class ConnectivityServiceTest {
mStatsService, mStatsService,
mNpm, mNpm,
mock(IpConnectivityLog.class), mock(IpConnectivityLog.class),
mMockNetd); mMockNetd,
mMockDnsResolver);
final ArgumentCaptor<INetworkPolicyListener> policyListenerCaptor = final ArgumentCaptor<INetworkPolicyListener> policyListenerCaptor =
ArgumentCaptor.forClass(INetworkPolicyListener.class); ArgumentCaptor.forClass(INetworkPolicyListener.class);
@@ -4777,14 +4781,14 @@ public class ConnectivityServiceTest {
ArgumentCaptor<String[]> tlsServers = ArgumentCaptor.forClass(String[].class); ArgumentCaptor<String[]> tlsServers = ArgumentCaptor.forClass(String[].class);
// Clear any interactions that occur as a result of CS starting up. // Clear any interactions that occur as a result of CS starting up.
reset(mNetworkManagementService); reset(mMockDnsResolver);
final String[] EMPTY_STRING_ARRAY = new String[0];
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, never()).setDnsConfigurationForNetwork( verify(mMockDnsResolver, never()).setResolverConfiguration(
anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""), eq(EMPTY_STRING_ARRAY)); anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""),
verifyNoMoreInteractions(mNetworkManagementService); eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
verifyNoMoreInteractions(mMockDnsResolver);
final LinkProperties cellLp = new LinkProperties(); final LinkProperties cellLp = new LinkProperties();
cellLp.setInterfaceName(MOBILE_IFNAME); cellLp.setInterfaceName(MOBILE_IFNAME);
@@ -4801,28 +4805,29 @@ public class ConnectivityServiceTest {
mCellNetworkAgent.connect(false); mCellNetworkAgent.connect(false);
waitForIdle(); waitForIdle();
// CS tells netd about the empty DNS config for this network. // CS tells netd about the empty DNS config for this network.
verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork( verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""), eq(EMPTY_STRING_ARRAY)); anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""),
reset(mNetworkManagementService); eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
reset(mMockDnsResolver);
cellLp.addDnsServer(InetAddress.getByName("2001:db8::1")); cellLp.addDnsServer(InetAddress.getByName("2001:db8::1"));
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork( verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
anyInt(), mStringArrayCaptor.capture(), any(), any(), anyInt(), mStringArrayCaptor.capture(), any(), any(),
eq(""), tlsServers.capture()); eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY));
assertEquals(1, mStringArrayCaptor.getValue().length); assertEquals(1, mStringArrayCaptor.getValue().length);
assertTrue(ArrayUtils.contains(mStringArrayCaptor.getValue(), "2001:db8::1")); assertTrue(ArrayUtils.contains(mStringArrayCaptor.getValue(), "2001:db8::1"));
// Opportunistic mode. // Opportunistic mode.
assertTrue(ArrayUtils.contains(tlsServers.getValue(), "2001:db8::1")); assertTrue(ArrayUtils.contains(tlsServers.getValue(), "2001:db8::1"));
reset(mNetworkManagementService); reset(mMockDnsResolver);
cellLp.addDnsServer(InetAddress.getByName("192.0.2.1")); cellLp.addDnsServer(InetAddress.getByName("192.0.2.1"));
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork( verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
anyInt(), mStringArrayCaptor.capture(), any(), any(), anyInt(), mStringArrayCaptor.capture(), any(), any(),
eq(""), tlsServers.capture()); eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY));
assertEquals(2, mStringArrayCaptor.getValue().length); assertEquals(2, mStringArrayCaptor.getValue().length);
assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
new String[]{"2001:db8::1", "192.0.2.1"})); new String[]{"2001:db8::1", "192.0.2.1"}));
@@ -4830,7 +4835,7 @@ public class ConnectivityServiceTest {
assertEquals(2, tlsServers.getValue().length); assertEquals(2, tlsServers.getValue().length);
assertTrue(ArrayUtils.containsAll(tlsServers.getValue(), assertTrue(ArrayUtils.containsAll(tlsServers.getValue(),
new String[]{"2001:db8::1", "192.0.2.1"})); new String[]{"2001:db8::1", "192.0.2.1"}));
reset(mNetworkManagementService); reset(mMockDnsResolver);
final String TLS_SPECIFIER = "tls.example.com"; final String TLS_SPECIFIER = "tls.example.com";
final String TLS_SERVER6 = "2001:db8:53::53"; final String TLS_SERVER6 = "2001:db8:53::53";
@@ -4840,22 +4845,21 @@ public class ConnectivityServiceTest {
new PrivateDnsConfig(TLS_SPECIFIER, TLS_IPS).toParcel()); new PrivateDnsConfig(TLS_SPECIFIER, TLS_IPS).toParcel());
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork( verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
anyInt(), mStringArrayCaptor.capture(), any(), any(), anyInt(), mStringArrayCaptor.capture(), any(), any(),
eq(TLS_SPECIFIER), eq(TLS_SERVERS)); eq(TLS_SPECIFIER), eq(TLS_SERVERS), eq(EMPTY_STRING_ARRAY));
assertEquals(2, mStringArrayCaptor.getValue().length); assertEquals(2, mStringArrayCaptor.getValue().length);
assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
new String[]{"2001:db8::1", "192.0.2.1"})); new String[]{"2001:db8::1", "192.0.2.1"}));
reset(mNetworkManagementService); reset(mMockDnsResolver);
} }
@Test @Test
public void testPrivateDnsSettingsChange() throws Exception { public void testPrivateDnsSettingsChange() throws Exception {
final String[] EMPTY_STRING_ARRAY = new String[0];
ArgumentCaptor<String[]> tlsServers = ArgumentCaptor.forClass(String[].class); ArgumentCaptor<String[]> tlsServers = ArgumentCaptor.forClass(String[].class);
// Clear any interactions that occur as a result of CS starting up. // Clear any interactions that occur as a result of CS starting up.
reset(mNetworkManagementService); reset(mMockDnsResolver);
// The default on Android is opportunistic mode ("Automatic"). // The default on Android is opportunistic mode ("Automatic").
setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com"); setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
@@ -4868,9 +4872,10 @@ public class ConnectivityServiceTest {
mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
waitForIdle(); waitForIdle();
// CS tells netd about the empty DNS config for this network. // CS tells netd about the empty DNS config for this network.
verify(mNetworkManagementService, never()).setDnsConfigurationForNetwork( verify(mMockDnsResolver, never()).setResolverConfiguration(
anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""), eq(EMPTY_STRING_ARRAY)); anyInt(), eq(EMPTY_STRING_ARRAY), any(), any(), eq(""),
verifyNoMoreInteractions(mNetworkManagementService); eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
verifyNoMoreInteractions(mMockDnsResolver);
final LinkProperties cellLp = new LinkProperties(); final LinkProperties cellLp = new LinkProperties();
cellLp.setInterfaceName(MOBILE_IFNAME); cellLp.setInterfaceName(MOBILE_IFNAME);
@@ -4889,9 +4894,9 @@ public class ConnectivityServiceTest {
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
mCellNetworkAgent.connect(false); mCellNetworkAgent.connect(false);
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork( verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
anyInt(), mStringArrayCaptor.capture(), any(), any(), anyInt(), mStringArrayCaptor.capture(), any(), any(),
eq(""), tlsServers.capture()); eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY));
assertEquals(2, mStringArrayCaptor.getValue().length); assertEquals(2, mStringArrayCaptor.getValue().length);
assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
new String[]{"2001:db8::1", "192.0.2.1"})); new String[]{"2001:db8::1", "192.0.2.1"}));
@@ -4899,7 +4904,7 @@ public class ConnectivityServiceTest {
assertEquals(2, tlsServers.getValue().length); assertEquals(2, tlsServers.getValue().length);
assertTrue(ArrayUtils.containsAll(tlsServers.getValue(), assertTrue(ArrayUtils.containsAll(tlsServers.getValue(),
new String[]{"2001:db8::1", "192.0.2.1"})); new String[]{"2001:db8::1", "192.0.2.1"}));
reset(mNetworkManagementService); reset(mMockDnsResolver);
cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
cellNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, cellNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES,
mCellNetworkAgent); mCellNetworkAgent);
@@ -4911,26 +4916,26 @@ public class ConnectivityServiceTest {
assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName()); assertNull(((LinkProperties)cbi.arg).getPrivateDnsServerName());
setPrivateDnsSettings(PRIVATE_DNS_MODE_OFF, "ignored.example.com"); setPrivateDnsSettings(PRIVATE_DNS_MODE_OFF, "ignored.example.com");
verify(mNetworkManagementService, times(1)).setDnsConfigurationForNetwork( verify(mMockDnsResolver, times(1)).setResolverConfiguration(
anyInt(), mStringArrayCaptor.capture(), any(), any(), anyInt(), mStringArrayCaptor.capture(), any(), any(),
eq(""), eq(EMPTY_STRING_ARRAY)); eq(""), eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
assertEquals(2, mStringArrayCaptor.getValue().length); assertEquals(2, mStringArrayCaptor.getValue().length);
assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
new String[]{"2001:db8::1", "192.0.2.1"})); new String[]{"2001:db8::1", "192.0.2.1"}));
reset(mNetworkManagementService); reset(mMockDnsResolver);
cellNetworkCallback.assertNoCallback(); cellNetworkCallback.assertNoCallback();
setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com"); setPrivateDnsSettings(PRIVATE_DNS_MODE_OPPORTUNISTIC, "ignored.example.com");
verify(mNetworkManagementService, atLeastOnce()).setDnsConfigurationForNetwork( verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
anyInt(), mStringArrayCaptor.capture(), any(), any(), anyInt(), mStringArrayCaptor.capture(), any(), any(),
eq(""), tlsServers.capture()); eq(""), tlsServers.capture(), eq(EMPTY_STRING_ARRAY));
assertEquals(2, mStringArrayCaptor.getValue().length); assertEquals(2, mStringArrayCaptor.getValue().length);
assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(), assertTrue(ArrayUtils.containsAll(mStringArrayCaptor.getValue(),
new String[]{"2001:db8::1", "192.0.2.1"})); new String[]{"2001:db8::1", "192.0.2.1"}));
assertEquals(2, tlsServers.getValue().length); assertEquals(2, tlsServers.getValue().length);
assertTrue(ArrayUtils.containsAll(tlsServers.getValue(), assertTrue(ArrayUtils.containsAll(tlsServers.getValue(),
new String[]{"2001:db8::1", "192.0.2.1"})); new String[]{"2001:db8::1", "192.0.2.1"}));
reset(mNetworkManagementService); reset(mMockDnsResolver);
cellNetworkCallback.assertNoCallback(); cellNetworkCallback.assertNoCallback();
setPrivateDnsSettings(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME, "strict.example.com"); setPrivateDnsSettings(PRIVATE_DNS_MODE_PROVIDER_HOSTNAME, "strict.example.com");
@@ -5761,6 +5766,7 @@ public class ConnectivityServiceTest {
cellLp.addRoute(new RouteInfo((IpPrefix) null, myIpv6.getAddress(), MOBILE_IFNAME)); cellLp.addRoute(new RouteInfo((IpPrefix) null, myIpv6.getAddress(), MOBILE_IFNAME));
cellLp.addRoute(new RouteInfo(myIpv6, null, MOBILE_IFNAME)); cellLp.addRoute(new RouteInfo(myIpv6, null, MOBILE_IFNAME));
reset(mNetworkManagementService); reset(mNetworkManagementService);
reset(mMockDnsResolver);
when(mNetworkManagementService.getInterfaceConfig(CLAT_PREFIX + MOBILE_IFNAME)) when(mNetworkManagementService.getInterfaceConfig(CLAT_PREFIX + MOBILE_IFNAME))
.thenReturn(getClatInterfaceConfig(myIpv4)); .thenReturn(getClatInterfaceConfig(myIpv4));
@@ -5768,7 +5774,7 @@ public class ConnectivityServiceTest {
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
mCellNetworkAgent.connect(true); mCellNetworkAgent.connect(true);
networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent); networkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId); verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId);
// Switching default network updates TCP buffer sizes. // Switching default network updates TCP buffer sizes.
verifyTcpBufferSizeChange(ConnectivityService.DEFAULT_TCP_BUFFER_SIZES); verifyTcpBufferSizeChange(ConnectivityService.DEFAULT_TCP_BUFFER_SIZES);
@@ -5778,17 +5784,22 @@ public class ConnectivityServiceTest {
cellLp.addLinkAddress(myIpv4); cellLp.addLinkAddress(myIpv4);
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
verify(mMockNetd, times(1)).resolverStopPrefix64Discovery(cellNetId); verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId);
verify(mMockDnsResolver, atLeastOnce()).setResolverConfiguration(
eq(cellNetId), eq(EMPTY_STRING_ARRAY), any(), any(),
eq(""), eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
verifyNoMoreInteractions(mMockNetd); verifyNoMoreInteractions(mMockNetd);
verifyNoMoreInteractions(mMockDnsResolver);
reset(mMockNetd); reset(mMockNetd);
reset(mMockDnsResolver);
// Remove IPv4 address. Expect prefix discovery to be started again. // Remove IPv4 address. Expect prefix discovery to be started again.
cellLp.removeLinkAddress(myIpv4); cellLp.removeLinkAddress(myIpv4);
cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME)); cellLp.removeRoute(new RouteInfo(myIpv4, null, MOBILE_IFNAME));
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId); verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId);
// When NAT64 prefix discovery succeeds, LinkProperties are updated and clatd is started. // When NAT64 prefix discovery succeeds, LinkProperties are updated and clatd is started.
Nat464Xlat clat = mService.getNat464Xlat(mCellNetworkAgent); Nat464Xlat clat = mService.getNat464Xlat(mCellNetworkAgent);
@@ -5818,6 +5829,12 @@ public class ConnectivityServiceTest {
assertNotEquals(stackedLpsAfterChange, Collections.EMPTY_LIST); assertNotEquals(stackedLpsAfterChange, Collections.EMPTY_LIST);
assertEquals(makeClatLinkProperties(myIpv4), stackedLpsAfterChange.get(0)); assertEquals(makeClatLinkProperties(myIpv4), stackedLpsAfterChange.get(0));
verify(mMockDnsResolver, times(1)).setResolverConfiguration(
eq(cellNetId), mStringArrayCaptor.capture(), any(), any(),
eq(""), eq(EMPTY_STRING_ARRAY), eq(EMPTY_STRING_ARRAY));
assertEquals(1, mStringArrayCaptor.getValue().length);
assertTrue(ArrayUtils.contains(mStringArrayCaptor.getValue(), "8.8.8.8"));
// Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked // Add ipv4 address, expect that clatd and prefix discovery are stopped and stacked
// linkproperties are cleaned up. // linkproperties are cleaned up.
cellLp.addLinkAddress(myIpv4); cellLp.addLinkAddress(myIpv4);
@@ -5825,7 +5842,7 @@ public class ConnectivityServiceTest {
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME); verify(mMockNetd, times(1)).clatdStop(MOBILE_IFNAME);
verify(mMockNetd, times(1)).resolverStopPrefix64Discovery(cellNetId); verify(mMockDnsResolver, times(1)).stopPrefix64Discovery(cellNetId);
// As soon as stop is called, the linkproperties lose the stacked interface. // As soon as stop is called, the linkproperties lose the stacked interface.
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
@@ -5840,7 +5857,9 @@ public class ConnectivityServiceTest {
networkCallback.assertNoCallback(); networkCallback.assertNoCallback();
verifyNoMoreInteractions(mMockNetd); verifyNoMoreInteractions(mMockNetd);
verifyNoMoreInteractions(mMockDnsResolver);
reset(mMockNetd); reset(mMockNetd);
reset(mMockDnsResolver);
// Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone. // Stopping prefix discovery causes netd to tell us that the NAT64 prefix is gone.
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */, mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, false /* added */,
@@ -5854,7 +5873,7 @@ public class ConnectivityServiceTest {
cellLp.removeDnsServer(InetAddress.getByName("8.8.8.8")); cellLp.removeDnsServer(InetAddress.getByName("8.8.8.8"));
mCellNetworkAgent.sendLinkProperties(cellLp); mCellNetworkAgent.sendLinkProperties(cellLp);
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
verify(mMockNetd, times(1)).resolverStartPrefix64Discovery(cellNetId); verify(mMockDnsResolver, times(1)).startPrefix64Discovery(cellNetId);
mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */, mService.mNetdEventCallback.onNat64PrefixEvent(cellNetId, true /* added */,
kNat64PrefixString, 96); kNat64PrefixString, 96);
networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); networkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent);
@@ -5937,6 +5956,7 @@ public class ConnectivityServiceTest {
// Disconnect cell // Disconnect cell
reset(mNetworkManagementService); reset(mNetworkManagementService);
reset(mMockNetd);
mCellNetworkAgent.disconnect(); mCellNetworkAgent.disconnect();
networkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); networkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent);
// LOST callback is triggered earlier than removing idle timer. Broadcast should also be // LOST callback is triggered earlier than removing idle timer. Broadcast should also be
@@ -5944,8 +5964,9 @@ public class ConnectivityServiceTest {
// unexpectedly before network being removed. // unexpectedly before network being removed.
waitForIdle(); waitForIdle();
verify(mNetworkManagementService, times(0)).removeIdleTimer(eq(MOBILE_IFNAME)); verify(mNetworkManagementService, times(0)).removeIdleTimer(eq(MOBILE_IFNAME));
verify(mNetworkManagementService, times(1)).removeNetwork( verify(mMockNetd, times(1)).networkDestroy(eq(mCellNetworkAgent.getNetwork().netId));
eq(mCellNetworkAgent.getNetwork().netId)); verify(mMockDnsResolver, times(1))
.clearResolverConfiguration(eq(mCellNetworkAgent.getNetwork().netId));
// Disconnect wifi // Disconnect wifi
ConditionVariable cv = waitForConnectivityBroadcasts(1); ConditionVariable cv = waitForConnectivityBroadcasts(1);

View File

@@ -29,13 +29,13 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.net.IDnsResolver;
import android.net.IpPrefix; import android.net.IpPrefix;
import android.net.LinkAddress; import android.net.LinkAddress;
import android.net.LinkProperties; import android.net.LinkProperties;
import android.net.Network; import android.net.Network;
import android.net.RouteInfo; import android.net.RouteInfo;
import android.net.shared.PrivateDnsConfig; import android.net.shared.PrivateDnsConfig;
import android.os.INetworkManagementService;
import android.provider.Settings; import android.provider.Settings;
import android.test.mock.MockContentResolver; import android.test.mock.MockContentResolver;
@@ -73,7 +73,7 @@ public class DnsManagerTest {
MockContentResolver mContentResolver; MockContentResolver mContentResolver;
@Mock Context mCtx; @Mock Context mCtx;
@Mock INetworkManagementService mNMService; @Mock IDnsResolver mMockDnsResolver;
@Mock MockableSystemProperties mSystemProperties; @Mock MockableSystemProperties mSystemProperties;
@Before @Before
@@ -83,7 +83,7 @@ public class DnsManagerTest {
mContentResolver.addProvider(Settings.AUTHORITY, mContentResolver.addProvider(Settings.AUTHORITY,
new FakeSettingsProvider()); new FakeSettingsProvider());
when(mCtx.getContentResolver()).thenReturn(mContentResolver); when(mCtx.getContentResolver()).thenReturn(mContentResolver);
mDnsManager = new DnsManager(mCtx, mNMService, mSystemProperties); mDnsManager = new DnsManager(mCtx, mMockDnsResolver, mSystemProperties);
// Clear the private DNS settings // Clear the private DNS settings
Settings.Global.putString(mContentResolver, PRIVATE_DNS_DEFAULT_MODE, ""); Settings.Global.putString(mContentResolver, PRIVATE_DNS_DEFAULT_MODE, "");

View File

@@ -32,6 +32,7 @@ import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IDnsResolver;
import android.net.INetd; import android.net.INetd;
import android.net.Network; import android.net.Network;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
@@ -69,6 +70,7 @@ public class LingerMonitorTest {
LingerMonitor mMonitor; LingerMonitor mMonitor;
@Mock ConnectivityService mConnService; @Mock ConnectivityService mConnService;
@Mock IDnsResolver mDnsResolver;
@Mock INetd mNetd; @Mock INetd mNetd;
@Mock INetworkManagementService mNMS; @Mock INetworkManagementService mNMS;
@Mock Context mCtx; @Mock Context mCtx;
@@ -353,7 +355,7 @@ public class LingerMonitorTest {
caps.addCapability(0); caps.addCapability(0);
caps.addTransportType(transport); caps.addTransportType(transport);
NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null, NetworkAgentInfo nai = new NetworkAgentInfo(null, null, new Network(netId), info, null,
caps, 50, mCtx, null, mMisc, mConnService, mNetd, mNMS, caps, 50, mCtx, null, mMisc, mConnService, mNetd, mDnsResolver, mNMS,
NetworkFactory.SerialNumber.NONE); NetworkFactory.SerialNumber.NONE);
nai.everValidated = true; nai.everValidated = true;
return nai; return nai;

View File

@@ -27,6 +27,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.IDnsResolver;
import android.net.INetd; import android.net.INetd;
import android.net.InterfaceConfiguration; import android.net.InterfaceConfiguration;
import android.net.IpPrefix; import android.net.IpPrefix;
@@ -63,6 +64,7 @@ public class Nat464XlatTest {
@Mock ConnectivityService mConnectivity; @Mock ConnectivityService mConnectivity;
@Mock NetworkMisc mMisc; @Mock NetworkMisc mMisc;
@Mock IDnsResolver mDnsResolver;
@Mock INetd mNetd; @Mock INetd mNetd;
@Mock INetworkManagementService mNms; @Mock INetworkManagementService mNms;
@Mock InterfaceConfiguration mConfig; @Mock InterfaceConfiguration mConfig;
@@ -72,7 +74,7 @@ public class Nat464XlatTest {
Handler mHandler; Handler mHandler;
Nat464Xlat makeNat464Xlat() { Nat464Xlat makeNat464Xlat() {
return new Nat464Xlat(mNai, mNetd, mNms) { return new Nat464Xlat(mNai, mNetd, mDnsResolver, mNms) {
@Override protected int getNetId() { @Override protected int getNetId() {
return NETID; return NETID;
} }
@@ -205,7 +207,7 @@ public class Nat464XlatTest {
verify(mNms).unregisterObserver(eq(nat)); verify(mNms).unregisterObserver(eq(nat));
assertTrue(c.getValue().getStackedLinks().isEmpty()); assertTrue(c.getValue().getStackedLinks().isEmpty());
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE)); assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
verify(mNetd).resolverStopPrefix64Discovery(eq(NETID)); verify(mDnsResolver).stopPrefix64Discovery(eq(NETID));
assertIdle(nat); assertIdle(nat);
// Stacked interface removed notification arrives and is ignored. // Stacked interface removed notification arrives and is ignored.
@@ -331,7 +333,7 @@ public class Nat464XlatTest {
verify(mNetd).clatdStop(eq(BASE_IFACE)); verify(mNetd).clatdStop(eq(BASE_IFACE));
verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture()); verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture());
verify(mNms).unregisterObserver(eq(nat)); verify(mNms).unregisterObserver(eq(nat));
verify(mNetd).resolverStopPrefix64Discovery(eq(NETID)); verify(mDnsResolver).stopPrefix64Discovery(eq(NETID));
assertTrue(c.getValue().getStackedLinks().isEmpty()); assertTrue(c.getValue().getStackedLinks().isEmpty());
assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE)); assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
assertIdle(nat); assertIdle(nat);
@@ -358,7 +360,7 @@ public class Nat464XlatTest {
verify(mNetd).clatdStop(eq(BASE_IFACE)); verify(mNetd).clatdStop(eq(BASE_IFACE));
verify(mNms).unregisterObserver(eq(nat)); verify(mNms).unregisterObserver(eq(nat));
verify(mNetd).resolverStopPrefix64Discovery(eq(NETID)); verify(mDnsResolver).stopPrefix64Discovery(eq(NETID));
assertIdle(nat); assertIdle(nat);
// In-flight interface up notification arrives: no-op // In-flight interface up notification arrives: no-op
@@ -390,7 +392,7 @@ public class Nat464XlatTest {
verify(mNetd).clatdStop(eq(BASE_IFACE)); verify(mNetd).clatdStop(eq(BASE_IFACE));
verify(mNms).unregisterObserver(eq(nat)); verify(mNms).unregisterObserver(eq(nat));
verify(mNetd).resolverStopPrefix64Discovery(eq(NETID)); verify(mDnsResolver).stopPrefix64Discovery(eq(NETID));
assertIdle(nat); assertIdle(nat);
verifyNoMoreInteractions(mNetd, mNms, mConnectivity); verifyNoMoreInteractions(mNetd, mNms, mConnectivity);