Merge changes Ie762ce75,I611fd791 am: 21a57f263f am: cc9f695ba0

am: 164854bde2

Change-Id: I1495249f1ced84438dbd5dd0ad6678e2ee4062cb
This commit is contained in:
Hugo Benichi
2017-05-11 14:28:23 +00:00
committed by android-build-merger
4 changed files with 75 additions and 7 deletions

View File

@@ -40,6 +40,7 @@ import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ResultReceiver; import android.os.ResultReceiver;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.ServiceSpecificException;
import android.provider.Settings; import android.provider.Settings;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.util.ArrayMap; import android.util.ArrayMap;
@@ -2695,6 +2696,28 @@ public class ConnectivityManager {
} }
} }
/**
* Constant error codes used by ConnectivityService to communicate about failures and errors
* across a Binder boundary.
* @hide
*/
public interface Errors {
static int TOO_MANY_REQUESTS = 1;
}
/** @hide */
public static class TooManyRequestsException extends RuntimeException {}
private static RuntimeException convertServiceException(ServiceSpecificException e) {
switch (e.errorCode) {
case Errors.TOO_MANY_REQUESTS:
return new TooManyRequestsException();
default:
Log.w(TAG, "Unknown service error code " + e.errorCode);
return new RuntimeException(e);
}
}
private static final int BASE = Protocol.BASE_CONNECTIVITY_MANAGER; private static final int BASE = Protocol.BASE_CONNECTIVITY_MANAGER;
/** @hide */ /** @hide */
public static final int CALLBACK_PRECHECK = BASE + 1; public static final int CALLBACK_PRECHECK = BASE + 1;
@@ -2886,6 +2909,8 @@ public class ConnectivityManager {
} }
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} catch (ServiceSpecificException e) {
throw convertServiceException(e);
} }
return request; return request;
} }
@@ -3127,6 +3152,8 @@ public class ConnectivityManager {
mService.pendingRequestForNetwork(request.networkCapabilities, operation); mService.pendingRequestForNetwork(request.networkCapabilities, operation);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} catch (ServiceSpecificException e) {
throw convertServiceException(e);
} }
} }
@@ -3226,6 +3253,8 @@ public class ConnectivityManager {
mService.pendingListenForNetwork(request.networkCapabilities, operation); mService.pendingListenForNetwork(request.networkCapabilities, operation);
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} catch (ServiceSpecificException e) {
throw convertServiceException(e);
} }
} }

View File

@@ -91,6 +91,7 @@ import android.os.PowerManager;
import android.os.Process; import android.os.Process;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ResultReceiver; import android.os.ResultReceiver;
import android.os.ServiceSpecificException;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
@@ -3951,7 +3952,8 @@ public class ConnectivityService extends IConnectivityManager.Stub
synchronized (mUidToNetworkRequestCount) { synchronized (mUidToNetworkRequestCount) {
int networkRequests = mUidToNetworkRequestCount.get(mUid, 0) + 1; int networkRequests = mUidToNetworkRequestCount.get(mUid, 0) + 1;
if (networkRequests >= MAX_NETWORK_REQUESTS_PER_UID) { if (networkRequests >= MAX_NETWORK_REQUESTS_PER_UID) {
throw new IllegalArgumentException("Too many NetworkRequests filed"); throw new ServiceSpecificException(
ConnectivityManager.Errors.TOO_MANY_REQUESTS);
} }
mUidToNetworkRequestCount.put(mUid, networkRequests); mUidToNetworkRequestCount.put(mUid, networkRequests);
} }

View File

@@ -45,6 +45,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.PendingIntent;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.content.Context; import android.content.Context;
@@ -66,8 +67,6 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@SmallTest @SmallTest
public class ConnectivityManagerTest { public class ConnectivityManagerTest {
@@ -296,6 +295,43 @@ public class ConnectivityManagerTest {
manager.requestNetwork(request, callback); manager.requestNetwork(request, callback);
} }
@Test
public void testArgumentValidation() throws Exception {
ConnectivityManager manager = new ConnectivityManager(mCtx, mService);
NetworkRequest request = mock(NetworkRequest.class);
NetworkCallback callback = mock(NetworkCallback.class);
Handler handler = mock(Handler.class);
NetworkCallback nullCallback = null;
PendingIntent nullIntent = null;
mustFail(() -> { manager.requestNetwork(null, callback); });
mustFail(() -> { manager.requestNetwork(request, nullCallback); });
mustFail(() -> { manager.requestNetwork(request, callback, null); });
mustFail(() -> { manager.requestNetwork(request, callback, -1); });
mustFail(() -> { manager.requestNetwork(request, nullIntent); });
mustFail(() -> { manager.registerNetworkCallback(null, callback, handler); });
mustFail(() -> { manager.registerNetworkCallback(request, null, handler); });
mustFail(() -> { manager.registerNetworkCallback(request, callback, null); });
mustFail(() -> { manager.registerNetworkCallback(request, nullIntent); });
mustFail(() -> { manager.registerDefaultNetworkCallback(null, handler); });
mustFail(() -> { manager.registerDefaultNetworkCallback(callback, null); });
mustFail(() -> { manager.unregisterNetworkCallback(nullCallback); });
mustFail(() -> { manager.unregisterNetworkCallback(nullIntent); });
mustFail(() -> { manager.releaseNetworkRequest(nullIntent); });
}
static void mustFail(Runnable fn) {
try {
fn.run();
fail();
} catch (Exception expected) {
}
}
static Message makeMessage(NetworkRequest req, int messageType) { static Message makeMessage(NetworkRequest req, int messageType) {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putParcelable(NetworkRequest.class.getSimpleName(), req); bundle.putParcelable(NetworkRequest.class.getSimpleName(), req);

View File

@@ -44,6 +44,7 @@ import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback; import android.net.ConnectivityManager.NetworkCallback;
import android.net.ConnectivityManager.PacketKeepalive; import android.net.ConnectivityManager.PacketKeepalive;
import android.net.ConnectivityManager.PacketKeepaliveCallback; import android.net.ConnectivityManager.PacketKeepaliveCallback;
import android.net.ConnectivityManager.TooManyRequestsException;
import android.net.INetworkPolicyManager; import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService; import android.net.INetworkStatsService;
import android.net.IpPrefix; import android.net.IpPrefix;
@@ -3055,7 +3056,7 @@ public class ConnectivityServiceTest extends AndroidTestCase {
networkCallbacks.add(networkCallback); networkCallbacks.add(networkCallback);
} }
fail("Registering " + MAX_REQUESTS + " NetworkRequests did not throw exception"); fail("Registering " + MAX_REQUESTS + " NetworkRequests did not throw exception");
} catch (IllegalArgumentException expected) {} } catch (TooManyRequestsException expected) {}
for (NetworkCallback networkCallback : networkCallbacks) { for (NetworkCallback networkCallback : networkCallbacks) {
mCm.unregisterNetworkCallback(networkCallback); mCm.unregisterNetworkCallback(networkCallback);
} }
@@ -3068,7 +3069,7 @@ public class ConnectivityServiceTest extends AndroidTestCase {
networkCallbacks.add(networkCallback); networkCallbacks.add(networkCallback);
} }
fail("Registering " + MAX_REQUESTS + " NetworkCallbacks did not throw exception"); fail("Registering " + MAX_REQUESTS + " NetworkCallbacks did not throw exception");
} catch (IllegalArgumentException expected) {} } catch (TooManyRequestsException expected) {}
for (NetworkCallback networkCallback : networkCallbacks) { for (NetworkCallback networkCallback : networkCallbacks) {
mCm.unregisterNetworkCallback(networkCallback); mCm.unregisterNetworkCallback(networkCallback);
} }
@@ -3084,7 +3085,7 @@ public class ConnectivityServiceTest extends AndroidTestCase {
} }
fail("Registering " + MAX_REQUESTS + fail("Registering " + MAX_REQUESTS +
" PendingIntent NetworkRequests did not throw exception"); " PendingIntent NetworkRequests did not throw exception");
} catch (IllegalArgumentException expected) {} } catch (TooManyRequestsException expected) {}
for (PendingIntent pendingIntent : pendingIntents) { for (PendingIntent pendingIntent : pendingIntents) {
mCm.unregisterNetworkCallback(pendingIntent); mCm.unregisterNetworkCallback(pendingIntent);
} }
@@ -3099,7 +3100,7 @@ public class ConnectivityServiceTest extends AndroidTestCase {
} }
fail("Registering " + MAX_REQUESTS + fail("Registering " + MAX_REQUESTS +
" PendingIntent NetworkCallbacks did not throw exception"); " PendingIntent NetworkCallbacks did not throw exception");
} catch (IllegalArgumentException expected) {} } catch (TooManyRequestsException expected) {}
for (PendingIntent pendingIntent : pendingIntents) { for (PendingIntent pendingIntent : pendingIntents) {
mCm.unregisterNetworkCallback(pendingIntent); mCm.unregisterNetworkCallback(pendingIntent);
} }