Merge "[VCN13] Implement tracking best matching network" am: f98037abb3 am: 4377c5d40c am: b56ee13b44

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1633519

Change-Id: Ie252014cd9047c27fad3e451b80047493935dc3d
This commit is contained in:
Junyu Lai
2021-03-17 16:08:50 +00:00
committed by Automerger Merge Worker
5 changed files with 128 additions and 15 deletions

View File

@@ -1079,6 +1079,10 @@ public class ConnectivityServiceTest {
public void triggerUnfulfillable(NetworkRequest r) {
super.releaseRequestAsUnfulfillableByAnyFactory(r);
}
public void assertNoRequestChanged() {
assertNull(mRequestHistory.poll(0, r -> true));
}
}
private Set<UidRange> uidRangesForUids(int... uids) {
@@ -11121,11 +11125,99 @@ public class ConnectivityServiceTest {
mCm.unregisterNetworkCallback(cellCb);
}
// Cannot be part of MockNetworkFactory since it requires method of the test.
private void expectNoRequestChanged(@NonNull MockNetworkFactory factory) {
waitForIdle();
factory.assertNoRequestChanged();
}
@Test
public void testRegisterBestMatchingNetworkCallback() throws Exception {
final NetworkRequest request = new NetworkRequest.Builder().build();
assertThrows(UnsupportedOperationException.class,
() -> mCm.registerBestMatchingNetworkCallback(request, new NetworkCallback(),
mCsHandlerThread.getThreadHandler()));
public void testRegisterBestMatchingNetworkCallback_noIssueToFactory() throws Exception {
// Prepare mock mms factory.
final HandlerThread handlerThread = new HandlerThread("MockCellularFactory");
handlerThread.start();
NetworkCapabilities filter = new NetworkCapabilities()
.addTransportType(TRANSPORT_CELLULAR)
.addCapability(NET_CAPABILITY_MMS);
final MockNetworkFactory testFactory = new MockNetworkFactory(handlerThread.getLooper(),
mServiceContext, "testFactory", filter, mCsHandlerThread);
testFactory.setScoreFilter(40);
try {
// Register the factory and expect it will see default request, because all requests
// are sent to all factories.
testFactory.register();
testFactory.expectRequestAdd();
testFactory.assertRequestCountEquals(1);
// The factory won't try to start the network since the default request doesn't
// match the filter (no INTERNET capability).
assertFalse(testFactory.getMyStartRequested());
// Register callback for listening best matching network. Verify that the request won't
// be sent to factory.
final TestNetworkCallback bestMatchingCb = new TestNetworkCallback();
mCm.registerBestMatchingNetworkCallback(
new NetworkRequest.Builder().addCapability(NET_CAPABILITY_MMS).build(),
bestMatchingCb, mCsHandlerThread.getThreadHandler());
bestMatchingCb.assertNoCallback();
expectNoRequestChanged(testFactory);
testFactory.assertRequestCountEquals(1);
assertFalse(testFactory.getMyStartRequested());
// Fire a normal mms request, verify the factory will only see the request.
final TestNetworkCallback mmsNetworkCallback = new TestNetworkCallback();
final NetworkRequest mmsRequest = new NetworkRequest.Builder()
.addCapability(NET_CAPABILITY_MMS).build();
mCm.requestNetwork(mmsRequest, mmsNetworkCallback);
testFactory.expectRequestAdd();
testFactory.assertRequestCountEquals(2);
assertTrue(testFactory.getMyStartRequested());
// Unregister best matching callback, verify factory see no change.
mCm.unregisterNetworkCallback(bestMatchingCb);
expectNoRequestChanged(testFactory);
testFactory.assertRequestCountEquals(2);
assertTrue(testFactory.getMyStartRequested());
} finally {
testFactory.terminate();
}
}
@Test
public void testRegisterBestMatchingNetworkCallback_trackBestNetwork() throws Exception {
final TestNetworkCallback bestMatchingCb = new TestNetworkCallback();
mCm.registerBestMatchingNetworkCallback(
new NetworkRequest.Builder().addCapability(NET_CAPABILITY_TRUSTED).build(),
bestMatchingCb, mCsHandlerThread.getThreadHandler());
mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
mCellNetworkAgent.connect(true);
bestMatchingCb.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
mWiFiNetworkAgent.connect(true);
bestMatchingCb.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent);
// Change something on cellular to trigger capabilities changed, since the callback
// only cares about the best network, verify it received nothing from cellular.
mCellNetworkAgent.addCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED);
bestMatchingCb.assertNoCallback();
// Make cellular the best network again, verify the callback now tracks cellular.
mWiFiNetworkAgent.adjustScore(-50);
bestMatchingCb.expectAvailableCallbacksValidated(mCellNetworkAgent);
// Make cellular temporary non-trusted, which will not satisfying the request.
// Verify the callback switch from/to the other network accordingly.
mCellNetworkAgent.removeCapability(NET_CAPABILITY_TRUSTED);
bestMatchingCb.expectAvailableCallbacksValidated(mWiFiNetworkAgent);
mCellNetworkAgent.addCapability(NET_CAPABILITY_TRUSTED);
bestMatchingCb.expectAvailableDoubleValidatedCallbacks(mCellNetworkAgent);
// Verify the callback doesn't care about wifi disconnect.
mWiFiNetworkAgent.disconnect();
bestMatchingCb.assertNoCallback();
mCellNetworkAgent.disconnect();
bestMatchingCb.expectCallback(CallbackEntry.LOST, mCellNetworkAgent);
}
}