Merge "[CS] Support "instant failure" from factories"
This commit is contained in:
@@ -154,6 +154,7 @@ import android.test.mock.MockContentResolver;
|
||||
import android.text.TextUtils;
|
||||
import android.util.ArraySet;
|
||||
import android.util.Log;
|
||||
import android.util.SparseArray;
|
||||
|
||||
import androidx.test.InstrumentationRegistry;
|
||||
import androidx.test.filters.SmallTest;
|
||||
@@ -761,6 +762,10 @@ public class ConnectivityServiceTest {
|
||||
// mExpectations is non-null.
|
||||
private boolean mExpectingAdditions;
|
||||
|
||||
// Used to collect the networks requests managed by this factory. This is a duplicate of
|
||||
// the internal information stored in the NetworkFactory (which is private).
|
||||
private SparseArray<NetworkRequest> mNetworkRequests = new SparseArray<>();
|
||||
|
||||
public MockNetworkFactory(Looper looper, Context context, String logTag,
|
||||
NetworkCapabilities filter) {
|
||||
super(looper, context, logTag, filter);
|
||||
@@ -802,6 +807,7 @@ public class ConnectivityServiceTest {
|
||||
}
|
||||
|
||||
// Add the request.
|
||||
mNetworkRequests.put(request.requestId, request);
|
||||
super.handleAddRequest(request, score);
|
||||
|
||||
// Reduce the number of request additions we're waiting for.
|
||||
@@ -819,6 +825,7 @@ public class ConnectivityServiceTest {
|
||||
}
|
||||
|
||||
// Remove the request.
|
||||
mNetworkRequests.remove(request.requestId);
|
||||
super.handleRemoveRequest(request);
|
||||
|
||||
// Reduce the number of request removals we're waiting for.
|
||||
@@ -828,6 +835,11 @@ public class ConnectivityServiceTest {
|
||||
}
|
||||
}
|
||||
|
||||
// Trigger releasing the request as unfulfillable
|
||||
public void triggerUnfulfillable(NetworkRequest r) {
|
||||
super.releaseRequestAsUnfulfillableByAnyFactory(r);
|
||||
}
|
||||
|
||||
private void assertNoExpectations() {
|
||||
if (mExpectations != null) {
|
||||
fail("Can't add expectation, " + mExpectations.getCount() + " already pending");
|
||||
@@ -860,9 +872,11 @@ public class ConnectivityServiceTest {
|
||||
mExpectations = null;
|
||||
}
|
||||
|
||||
public void waitForNetworkRequests(final int count) throws InterruptedException {
|
||||
public SparseArray<NetworkRequest> waitForNetworkRequests(final int count)
|
||||
throws InterruptedException {
|
||||
waitForRequests();
|
||||
assertEquals(count, getMyRequestCount());
|
||||
return mNetworkRequests;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3636,6 +3650,55 @@ public class ConnectivityServiceTest {
|
||||
networkCallback.assertNoCallback();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the callback flow for a factory releasing a request as unfulfillable.
|
||||
*/
|
||||
@Test
|
||||
public void testUnfulfillableNetworkRequest() throws Exception {
|
||||
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
||||
NetworkCapabilities.TRANSPORT_WIFI).build();
|
||||
final TestNetworkCallback networkCallback = new TestNetworkCallback();
|
||||
|
||||
final HandlerThread handlerThread = new HandlerThread("testUnfulfillableNetworkRequest");
|
||||
handlerThread.start();
|
||||
NetworkCapabilities filter = new NetworkCapabilities()
|
||||
.addTransportType(TRANSPORT_WIFI)
|
||||
.addCapability(NET_CAPABILITY_INTERNET);
|
||||
final MockNetworkFactory testFactory = new MockNetworkFactory(handlerThread.getLooper(),
|
||||
mServiceContext, "testFactory", filter);
|
||||
testFactory.setScoreFilter(40);
|
||||
|
||||
// Register the factory and expect it to receive the default request.
|
||||
testFactory.expectAddRequests(1);
|
||||
testFactory.register();
|
||||
SparseArray<NetworkRequest> requests = testFactory.waitForNetworkRequests(1);
|
||||
|
||||
assertEquals(1, requests.size()); // have 1 request at this point
|
||||
int origRequestId = requests.valueAt(0).requestId;
|
||||
|
||||
// Now file the test request and expect it.
|
||||
testFactory.expectAddRequests(1);
|
||||
mCm.requestNetwork(nr, networkCallback);
|
||||
requests = testFactory.waitForNetworkRequests(2); // have 2 requests at this point
|
||||
|
||||
int newRequestId = 0;
|
||||
for (int i = 0; i < requests.size(); ++i) {
|
||||
if (requests.valueAt(i).requestId != origRequestId) {
|
||||
newRequestId = requests.valueAt(i).requestId;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Simulate the factory releasing the request as unfulfillable and expect onUnavailable!
|
||||
testFactory.expectRemoveRequests(1);
|
||||
testFactory.triggerUnfulfillable(requests.get(newRequestId));
|
||||
networkCallback.expectCallback(CallbackState.UNAVAILABLE, null);
|
||||
testFactory.waitForRequests();
|
||||
|
||||
testFactory.unregister();
|
||||
handlerThread.quit();
|
||||
}
|
||||
|
||||
private static class TestKeepaliveCallback extends PacketKeepaliveCallback {
|
||||
|
||||
public static enum CallbackType { ON_STARTED, ON_STOPPED, ON_ERROR };
|
||||
|
||||
Reference in New Issue
Block a user