Merge "Use real ProxyTracker in ConnectivityServiceTest"

This commit is contained in:
Aaron Huang
2021-11-22 05:25:28 +00:00
committed by Gerrit Code Review

View File

@@ -249,6 +249,8 @@ import android.net.NetworkStack;
import android.net.NetworkStateSnapshot; import android.net.NetworkStateSnapshot;
import android.net.NetworkTestResultParcelable; import android.net.NetworkTestResultParcelable;
import android.net.OemNetworkPreferences; import android.net.OemNetworkPreferences;
import android.net.PacProxyManager;
import android.net.Proxy;
import android.net.ProxyInfo; import android.net.ProxyInfo;
import android.net.QosCallbackException; import android.net.QosCallbackException;
import android.net.QosFilter; import android.net.QosFilter;
@@ -478,6 +480,7 @@ public class ConnectivityServiceTest {
private Context mContext; private Context mContext;
private NetworkPolicyCallback mPolicyCallback; private NetworkPolicyCallback mPolicyCallback;
private WrappedMultinetworkPolicyTracker mPolicyTracker; private WrappedMultinetworkPolicyTracker mPolicyTracker;
private ProxyTracker mProxyTracker;
private HandlerThread mAlarmManagerThread; private HandlerThread mAlarmManagerThread;
private TestNetIdManager mNetIdManager; private TestNetIdManager mNetIdManager;
private QosCallbackMockHelper mQosCallbackMockHelper; private QosCallbackMockHelper mQosCallbackMockHelper;
@@ -511,7 +514,7 @@ public class ConnectivityServiceTest {
@Mock VpnProfileStore mVpnProfileStore; @Mock VpnProfileStore mVpnProfileStore;
@Mock SystemConfigManager mSystemConfigManager; @Mock SystemConfigManager mSystemConfigManager;
@Mock Resources mResources; @Mock Resources mResources;
@Mock ProxyTracker mProxyTracker; @Mock PacProxyManager mPacProxyManager;
// BatteryStatsManager is final and cannot be mocked with regular mockito, so just mock the // BatteryStatsManager is final and cannot be mocked with regular mockito, so just mock the
// underlying binder calls. // underlying binder calls.
@@ -613,6 +616,7 @@ public class ConnectivityServiceTest {
if (Context.SYSTEM_CONFIG_SERVICE.equals(name)) return mSystemConfigManager; if (Context.SYSTEM_CONFIG_SERVICE.equals(name)) return mSystemConfigManager;
if (Context.NETWORK_STATS_SERVICE.equals(name)) return mStatsManager; if (Context.NETWORK_STATS_SERVICE.equals(name)) return mStatsManager;
if (Context.BATTERY_STATS_SERVICE.equals(name)) return mBatteryStatsManager; if (Context.BATTERY_STATS_SERVICE.equals(name)) return mBatteryStatsManager;
if (Context.PAC_PROXY_SERVICE.equals(name)) return mPacProxyManager;
return super.getSystemService(name); return super.getSystemService(name);
} }
@@ -1703,6 +1707,8 @@ public class ConnectivityServiceTest {
mCsHandlerThread = new HandlerThread("TestConnectivityService"); mCsHandlerThread = new HandlerThread("TestConnectivityService");
mVMSHandlerThread = new HandlerThread("TestVpnManagerService"); mVMSHandlerThread = new HandlerThread("TestVpnManagerService");
mProxyTracker = new ProxyTracker(mServiceContext, mock(Handler.class),
16 /* EVENT_PROXY_HAS_CHANGED */);
initMockedResources(); initMockedResources();
final Context mockResContext = mock(Context.class); final Context mockResContext = mock(Context.class);
@@ -2135,6 +2141,39 @@ public class ConnectivityServiceTest {
return expected; return expected;
} }
private ExpectedBroadcast expectProxyChangeAction(ProxyInfo proxy) {
return registerPacProxyBroadcastThat(intent -> {
final ProxyInfo actualProxy = (ProxyInfo) intent.getExtra(Proxy.EXTRA_PROXY_INFO,
ProxyInfo.buildPacProxy(Uri.EMPTY));
return proxy.equals(actualProxy);
});
}
private ExpectedBroadcast registerPacProxyBroadcast() {
return registerPacProxyBroadcastThat(intent -> true);
}
private ExpectedBroadcast registerPacProxyBroadcastThat(
@NonNull final Predicate<Intent> filter) {
final IntentFilter intentFilter = new IntentFilter(Proxy.PROXY_CHANGE_ACTION);
// AtomicReference allows receiver to access expected even though it is constructed later.
final AtomicReference<ExpectedBroadcast> expectedRef = new AtomicReference<>();
final BroadcastReceiver receiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
final ProxyInfo proxy = (ProxyInfo) intent.getExtra(
Proxy.EXTRA_PROXY_INFO, ProxyInfo.buildPacProxy(Uri.EMPTY));
Log.d(TAG, "Receive PROXY_CHANGE_ACTION, proxy = " + proxy);
if (filter.test(intent)) {
expectedRef.get().complete(intent);
}
}
};
final ExpectedBroadcast expected = new ExpectedBroadcast(receiver);
expectedRef.set(expected);
mServiceContext.registerReceiver(receiver, intentFilter);
return expected;
}
private boolean extraInfoInBroadcastHasExpectedNullness(NetworkInfo ni) { private boolean extraInfoInBroadcastHasExpectedNullness(NetworkInfo ni) {
final DetailedState state = ni.getDetailedState(); final DetailedState state = ni.getDetailedState();
if (state == DetailedState.CONNECTED && ni.getExtraInfo() == null) return false; if (state == DetailedState.CONNECTED && ni.getExtraInfo() == null) return false;
@@ -9945,7 +9984,7 @@ public class ConnectivityServiceTest {
final ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("test", 8888); final ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("test", 8888);
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
final Network wifiNetwork = mWiFiNetworkAgent.getNetwork(); final Network wifiNetwork = mWiFiNetworkAgent.getNetwork();
doReturn(testProxyInfo).when(mService.mProxyTracker).getGlobalProxy(); mProxyTracker.setGlobalProxy(testProxyInfo);
assertEquals(testProxyInfo, mService.getProxyForNetwork(wifiNetwork)); assertEquals(testProxyInfo, mService.getProxyForNetwork(wifiNetwork));
} }
@@ -11353,6 +11392,7 @@ public class ConnectivityServiceTest {
assertNull(mService.getProxyForNetwork(null)); assertNull(mService.getProxyForNetwork(null));
assertNull(mCm.getDefaultProxy()); assertNull(mCm.getDefaultProxy());
final ExpectedBroadcast b1 = registerPacProxyBroadcast();
final LinkProperties lp = new LinkProperties(); final LinkProperties lp = new LinkProperties();
lp.setInterfaceName("tun0"); lp.setInterfaceName("tun0");
lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null)); lp.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), null));
@@ -11362,9 +11402,10 @@ public class ConnectivityServiceTest {
mMockVpn.establish(lp, VPN_UID, vpnRanges); mMockVpn.establish(lp, VPN_UID, vpnRanges);
assertVpnUidRangesUpdated(true, vpnRanges, VPN_UID); assertVpnUidRangesUpdated(true, vpnRanges, VPN_UID);
// VPN is connected but proxy is not set, so there is no need to send proxy broadcast. // VPN is connected but proxy is not set, so there is no need to send proxy broadcast.
verify(mProxyTracker, never()).sendProxyBroadcast(); b1.expectNoBroadcast(500);
// Update to new range which is old range minus APP1, i.e. only APP2 // Update to new range which is old range minus APP1, i.e. only APP2
final ExpectedBroadcast b2 = registerPacProxyBroadcast();
final Set<UidRange> newRanges = new HashSet<>(asList( final Set<UidRange> newRanges = new HashSet<>(asList(
new UidRange(vpnRange.start, APP1_UID - 1), new UidRange(vpnRange.start, APP1_UID - 1),
new UidRange(APP1_UID + 1, vpnRange.stop))); new UidRange(APP1_UID + 1, vpnRange.stop)));
@@ -11375,37 +11416,37 @@ public class ConnectivityServiceTest {
assertVpnUidRangesUpdated(false, vpnRanges, VPN_UID); assertVpnUidRangesUpdated(false, vpnRanges, VPN_UID);
// Uid has changed but proxy is not set, so there is no need to send proxy broadcast. // Uid has changed but proxy is not set, so there is no need to send proxy broadcast.
verify(mProxyTracker, never()).sendProxyBroadcast(); b2.expectNoBroadcast(500);
final ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("test", 8888); final ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("test", 8888);
final ExpectedBroadcast b3 = registerPacProxyBroadcast();
lp.setHttpProxy(testProxyInfo); lp.setHttpProxy(testProxyInfo);
mMockVpn.sendLinkProperties(lp); mMockVpn.sendLinkProperties(lp);
waitForIdle(); waitForIdle();
// Proxy is set, so send a proxy broadcast. // Proxy is set, so send a proxy broadcast.
verify(mProxyTracker, times(1)).sendProxyBroadcast(); b3.expectBroadcast();
reset(mProxyTracker);
final ExpectedBroadcast b4 = registerPacProxyBroadcast();
mMockVpn.setUids(vpnRanges); mMockVpn.setUids(vpnRanges);
waitForIdle(); waitForIdle();
// Uid has changed and proxy is already set, so send a proxy broadcast. // Uid has changed and proxy is already set, so send a proxy broadcast.
verify(mProxyTracker, times(1)).sendProxyBroadcast(); b4.expectBroadcast();
reset(mProxyTracker);
final ExpectedBroadcast b5 = registerPacProxyBroadcast();
// Proxy is removed, send a proxy broadcast. // Proxy is removed, send a proxy broadcast.
lp.setHttpProxy(null); lp.setHttpProxy(null);
mMockVpn.sendLinkProperties(lp); mMockVpn.sendLinkProperties(lp);
waitForIdle(); waitForIdle();
verify(mProxyTracker, times(1)).sendProxyBroadcast(); b5.expectBroadcast();
reset(mProxyTracker);
// Proxy is added in WiFi(default network), setDefaultProxy will be called. // Proxy is added in WiFi(default network), setDefaultProxy will be called.
final LinkProperties wifiLp = mCm.getLinkProperties(mWiFiNetworkAgent.getNetwork()); final LinkProperties wifiLp = mCm.getLinkProperties(mWiFiNetworkAgent.getNetwork());
assertNotNull(wifiLp); assertNotNull(wifiLp);
final ExpectedBroadcast b6 = expectProxyChangeAction(testProxyInfo);
wifiLp.setHttpProxy(testProxyInfo); wifiLp.setHttpProxy(testProxyInfo);
mWiFiNetworkAgent.sendLinkProperties(wifiLp); mWiFiNetworkAgent.sendLinkProperties(wifiLp);
waitForIdle(); waitForIdle();
verify(mProxyTracker, times(1)).setDefaultProxy(eq(testProxyInfo)); b6.expectBroadcast();
reset(mProxyTracker);
} }
@Test @Test
@@ -11424,18 +11465,21 @@ public class ConnectivityServiceTest {
lp.setHttpProxy(testProxyInfo); lp.setHttpProxy(testProxyInfo);
final UidRange vpnRange = PRIMARY_UIDRANGE; final UidRange vpnRange = PRIMARY_UIDRANGE;
final Set<UidRange> vpnRanges = Collections.singleton(vpnRange); final Set<UidRange> vpnRanges = Collections.singleton(vpnRange);
final ExpectedBroadcast b1 = registerPacProxyBroadcast();
mMockVpn.setOwnerAndAdminUid(VPN_UID); mMockVpn.setOwnerAndAdminUid(VPN_UID);
mMockVpn.registerAgent(false, vpnRanges, lp); mMockVpn.registerAgent(false, vpnRanges, lp);
// In any case, the proxy broadcast won't be sent before VPN goes into CONNECTED state. // In any case, the proxy broadcast won't be sent before VPN goes into CONNECTED state.
// Otherwise, the app that calls ConnectivityManager#getDefaultProxy() when it receives the // Otherwise, the app that calls ConnectivityManager#getDefaultProxy() when it receives the
// proxy broadcast will get null. // proxy broadcast will get null.
verify(mProxyTracker, never()).sendProxyBroadcast(); b1.expectNoBroadcast(500);
final ExpectedBroadcast b2 = registerPacProxyBroadcast();
mMockVpn.connect(true /* validated */, true /* hasInternet */, false /* isStrictMode */); mMockVpn.connect(true /* validated */, true /* hasInternet */, false /* isStrictMode */);
waitForIdle(); waitForIdle();
assertVpnUidRangesUpdated(true, vpnRanges, VPN_UID); assertVpnUidRangesUpdated(true, vpnRanges, VPN_UID);
// Vpn is connected with proxy, so the proxy broadcast will be sent to inform the apps to // Vpn is connected with proxy, so the proxy broadcast will be sent to inform the apps to
// update their proxy data. // update their proxy data.
verify(mProxyTracker, times(1)).sendProxyBroadcast(); b2.expectBroadcast();
} }
@Test @Test
@@ -11464,10 +11508,10 @@ public class ConnectivityServiceTest {
final LinkProperties cellularLp = new LinkProperties(); final LinkProperties cellularLp = new LinkProperties();
cellularLp.setInterfaceName(MOBILE_IFNAME); cellularLp.setInterfaceName(MOBILE_IFNAME);
final ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("test", 8888); final ProxyInfo testProxyInfo = ProxyInfo.buildDirectProxy("test", 8888);
final ExpectedBroadcast b = registerPacProxyBroadcast();
cellularLp.setHttpProxy(testProxyInfo); cellularLp.setHttpProxy(testProxyInfo);
mCellNetworkAgent.sendLinkProperties(cellularLp); mCellNetworkAgent.sendLinkProperties(cellularLp);
waitForIdle(); b.expectBroadcast();
verify(mProxyTracker, times(1)).sendProxyBroadcast();
} }
@Test @Test