Merge "Refine NetworkCallbackTest"
This commit is contained in:
@@ -25,4 +25,5 @@ interface IMyService {
|
|||||||
String getRestrictBackgroundStatus();
|
String getRestrictBackgroundStatus();
|
||||||
void sendNotification(int notificationId, String notificationType);
|
void sendNotification(int notificationId, String notificationType);
|
||||||
void registerNetworkCallback(in INetworkCallback cb);
|
void registerNetworkCallback(in INetworkCallback cb);
|
||||||
|
void unregisterNetworkCallback();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,9 +17,11 @@
|
|||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
|
import android.net.NetworkCapabilities;
|
||||||
|
|
||||||
interface INetworkCallback {
|
interface INetworkCallback {
|
||||||
void onBlockedStatusChanged(in Network network, boolean blocked);
|
void onBlockedStatusChanged(in Network network, boolean blocked);
|
||||||
void onAvailable(in Network network);
|
void onAvailable(in Network network);
|
||||||
void onLost(in Network network);
|
void onLost(in Network network);
|
||||||
|
void onCapabilitiesChanged(in Network network, in NetworkCapabilities cap);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -711,6 +711,10 @@ public abstract class AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
mServiceClient.registerNetworkCallback(cb);
|
mServiceClient.registerNetworkCallback(cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void unregisterNetworkCallback() throws Exception {
|
||||||
|
mServiceClient.unregisterNetworkCallback();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a {@link NotificationListenerService} implementation that will execute the
|
* Registers a {@link NotificationListenerService} implementation that will execute the
|
||||||
* notification actions right after the notification is sent.
|
* notification actions right after the notification is sent.
|
||||||
|
|||||||
@@ -100,4 +100,8 @@ public class MyServiceClient {
|
|||||||
public void registerNetworkCallback(INetworkCallback cb) throws RemoteException {
|
public void registerNetworkCallback(INetworkCallback cb) throws RemoteException {
|
||||||
mService.registerNetworkCallback(cb);
|
mService.registerNetworkCallback(cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void unregisterNetworkCallback() throws RemoteException {
|
||||||
|
mService.unregisterNetworkCallback();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,18 +16,23 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
||||||
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setRestrictBackground;
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setRestrictBackground;
|
||||||
import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE;
|
import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE;
|
||||||
import static com.android.cts.net.hostside.Property.DATA_SAVER_MODE;
|
import static com.android.cts.net.hostside.Property.DATA_SAVER_MODE;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
|
import android.net.NetworkCapabilities;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -35,15 +40,18 @@ import java.util.concurrent.LinkedBlockingQueue;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCase {
|
public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCase {
|
||||||
|
|
||||||
private Network mNetwork;
|
private Network mNetwork;
|
||||||
private final TestNetworkCallback mTestNetworkCallback = new TestNetworkCallback();
|
private final TestNetworkCallback mTestNetworkCallback = new TestNetworkCallback();
|
||||||
|
@Rule
|
||||||
|
public final MeterednessConfigurationRule mMeterednessConfiguration
|
||||||
|
= new MeterednessConfigurationRule();
|
||||||
|
|
||||||
enum CallbackState {
|
enum CallbackState {
|
||||||
NONE,
|
NONE,
|
||||||
AVAILABLE,
|
AVAILABLE,
|
||||||
LOST,
|
LOST,
|
||||||
BLOCKED_STATUS
|
BLOCKED_STATUS,
|
||||||
|
CAPABILITIES
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class CallbackInfo {
|
private static class CallbackInfo {
|
||||||
@@ -75,7 +83,7 @@ public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCa
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class TestNetworkCallback extends INetworkCallback.Stub {
|
private class TestNetworkCallback extends INetworkCallback.Stub {
|
||||||
private static final int TEST_CALLBACK_TIMEOUT_MS = 200;
|
private static final int TEST_CALLBACK_TIMEOUT_MS = 5_000;
|
||||||
|
|
||||||
private final LinkedBlockingQueue<CallbackInfo> mCallbacks = new LinkedBlockingQueue<>();
|
private final LinkedBlockingQueue<CallbackInfo> mCallbacks = new LinkedBlockingQueue<>();
|
||||||
|
|
||||||
@@ -117,12 +125,21 @@ public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCa
|
|||||||
setLastCallback(CallbackState.BLOCKED_STATUS, network, blocked);
|
setLastCallback(CallbackState.BLOCKED_STATUS, network, blocked);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCapabilitiesChanged(Network network, NetworkCapabilities cap) {
|
||||||
|
setLastCallback(CallbackState.CAPABILITIES, network, cap);
|
||||||
|
}
|
||||||
|
|
||||||
public void expectLostCallback(Network expectedNetwork) {
|
public void expectLostCallback(Network expectedNetwork) {
|
||||||
expectCallback(CallbackState.LOST, expectedNetwork, null);
|
expectCallback(CallbackState.LOST, expectedNetwork, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void expectAvailableCallback(Network expectedNetwork) {
|
public Network expectAvailableCallbackAndGetNetwork() {
|
||||||
expectCallback(CallbackState.AVAILABLE, expectedNetwork, null);
|
final CallbackInfo cb = nextCallback(TEST_CALLBACK_TIMEOUT_MS);
|
||||||
|
if (cb.state != CallbackState.AVAILABLE) {
|
||||||
|
fail("Network is not available");
|
||||||
|
}
|
||||||
|
return cb.network;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void expectBlockedStatusCallback(Network expectedNetwork, boolean expectBlocked) {
|
public void expectBlockedStatusCallback(Network expectedNetwork, boolean expectBlocked) {
|
||||||
@@ -130,15 +147,28 @@ public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCa
|
|||||||
expectBlocked);
|
expectBlocked);
|
||||||
}
|
}
|
||||||
|
|
||||||
void assertNoCallback() {
|
public void waitBlockedStatusCallback(Network expectedNetwork, boolean expectBlocked) {
|
||||||
CallbackInfo cb = null;
|
final long deadline = System.currentTimeMillis() + TEST_CALLBACK_TIMEOUT_MS;
|
||||||
try {
|
do {
|
||||||
cb = mCallbacks.poll(TEST_CALLBACK_TIMEOUT_MS, TimeUnit.MILLISECONDS);
|
final CallbackInfo cb = nextCallback((int) (deadline - System.currentTimeMillis()));
|
||||||
} catch (InterruptedException e) {
|
if (cb.state == CallbackState.BLOCKED_STATUS) {
|
||||||
// Expected.
|
assertEquals(expectBlocked, (Boolean) cb.arg);
|
||||||
}
|
return;
|
||||||
if (cb != null) {
|
}
|
||||||
assertNull("Unexpected callback: " + cb, cb);
|
} while (System.currentTimeMillis() <= deadline);
|
||||||
|
fail("Didn't receive onBlockedStatusChanged()");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void expectCapabilitiesCallback(Network expectedNetwork, boolean hasCapability,
|
||||||
|
int capability) {
|
||||||
|
final CallbackInfo cb = nextCallback(TEST_CALLBACK_TIMEOUT_MS);
|
||||||
|
final NetworkCapabilities cap = (NetworkCapabilities) cb.arg;
|
||||||
|
assertEquals(expectedNetwork, cb.network);
|
||||||
|
assertEquals(CallbackState.CAPABILITIES, cb.state);
|
||||||
|
if (hasCapability) {
|
||||||
|
assertTrue(cap.hasCapability(capability));
|
||||||
|
} else {
|
||||||
|
assertFalse(cap.hasCapability(capability));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -147,13 +177,28 @@ public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCa
|
|||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
|
||||||
mNetwork = mCm.getActiveNetwork();
|
|
||||||
|
|
||||||
registerBroadcastReceiver();
|
registerBroadcastReceiver();
|
||||||
|
|
||||||
removeRestrictBackgroundWhitelist(mUid);
|
removeRestrictBackgroundWhitelist(mUid);
|
||||||
removeRestrictBackgroundBlacklist(mUid);
|
removeRestrictBackgroundBlacklist(mUid);
|
||||||
assertRestrictBackgroundChangedReceived(0);
|
assertRestrictBackgroundChangedReceived(0);
|
||||||
|
|
||||||
|
// Initial state
|
||||||
|
setBatterySaverMode(false);
|
||||||
|
setRestrictBackground(false);
|
||||||
|
|
||||||
|
// Make wifi a metered network.
|
||||||
|
mMeterednessConfiguration.configureNetworkMeteredness(true);
|
||||||
|
|
||||||
|
// Register callback
|
||||||
|
registerNetworkCallback((INetworkCallback.Stub) mTestNetworkCallback);
|
||||||
|
// Once the wifi is marked as metered, the wifi will reconnect. Wait for onAvailable()
|
||||||
|
// callback to ensure wifi is connected before the test and store the default network.
|
||||||
|
mNetwork = mTestNetworkCallback.expectAvailableCallbackAndGetNetwork();
|
||||||
|
// Check that the network is metered.
|
||||||
|
mTestNetworkCallback.expectCapabilitiesCallback(mNetwork, false /* hasCapability */,
|
||||||
|
NET_CAPABILITY_NOT_METERED);
|
||||||
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@@ -162,102 +207,80 @@ public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCa
|
|||||||
|
|
||||||
setRestrictBackground(false);
|
setRestrictBackground(false);
|
||||||
setBatterySaverMode(false);
|
setBatterySaverMode(false);
|
||||||
|
unregisterNetworkCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiredProperties({DATA_SAVER_MODE})
|
@RequiredProperties({DATA_SAVER_MODE})
|
||||||
@Test
|
@Test
|
||||||
public void testOnBlockedStatusChanged_dataSaver() throws Exception {
|
public void testOnBlockedStatusChanged_dataSaver() throws Exception {
|
||||||
// Initial state
|
|
||||||
setBatterySaverMode(false);
|
|
||||||
setRestrictBackground(false);
|
|
||||||
|
|
||||||
final MeterednessConfigurationRule meterednessConfiguration
|
|
||||||
= new MeterednessConfigurationRule();
|
|
||||||
meterednessConfiguration.configureNetworkMeteredness(true);
|
|
||||||
try {
|
try {
|
||||||
// Register callback
|
|
||||||
registerNetworkCallback((INetworkCallback.Stub) mTestNetworkCallback);
|
|
||||||
mTestNetworkCallback.expectAvailableCallback(mNetwork);
|
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
|
||||||
|
|
||||||
// Enable restrict background
|
// Enable restrict background
|
||||||
setRestrictBackground(true);
|
setRestrictBackground(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
mTestNetworkCallback.waitBlockedStatusCallback(mNetwork, true);
|
||||||
|
|
||||||
// Add to whitelist
|
// Add to whitelist
|
||||||
addRestrictBackgroundWhitelist(mUid);
|
addRestrictBackgroundWhitelist(mUid);
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
mTestNetworkCallback.waitBlockedStatusCallback(mNetwork, false);
|
||||||
|
|
||||||
// Remove from whitelist
|
// Remove from whitelist
|
||||||
removeRestrictBackgroundWhitelist(mUid);
|
removeRestrictBackgroundWhitelist(mUid);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
mTestNetworkCallback.waitBlockedStatusCallback(mNetwork, true);
|
||||||
} finally {
|
} finally {
|
||||||
meterednessConfiguration.resetNetworkMeteredness();
|
mMeterednessConfiguration.resetNetworkMeteredness();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set to non-metered network
|
// Set to non-metered network
|
||||||
meterednessConfiguration.configureNetworkMeteredness(false);
|
mMeterednessConfiguration.configureNetworkMeteredness(false);
|
||||||
|
mTestNetworkCallback.expectCapabilitiesCallback(mNetwork, true /* hasCapability */,
|
||||||
|
NET_CAPABILITY_NOT_METERED);
|
||||||
try {
|
try {
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
mTestNetworkCallback.waitBlockedStatusCallback(mNetwork, false);
|
||||||
|
|
||||||
// Disable restrict background, should not trigger callback
|
// Disable restrict background, should not trigger callback
|
||||||
setRestrictBackground(false);
|
setRestrictBackground(false);
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
mTestNetworkCallback.assertNoCallback();
|
|
||||||
} finally {
|
} finally {
|
||||||
meterednessConfiguration.resetNetworkMeteredness();
|
mMeterednessConfiguration.resetNetworkMeteredness();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiredProperties({BATTERY_SAVER_MODE})
|
@RequiredProperties({BATTERY_SAVER_MODE})
|
||||||
@Test
|
@Test
|
||||||
public void testOnBlockedStatusChanged_powerSaver() throws Exception {
|
public void testOnBlockedStatusChanged_powerSaver() throws Exception {
|
||||||
// Set initial state.
|
|
||||||
setBatterySaverMode(false);
|
|
||||||
setRestrictBackground(false);
|
|
||||||
|
|
||||||
final MeterednessConfigurationRule meterednessConfiguration
|
|
||||||
= new MeterednessConfigurationRule();
|
|
||||||
meterednessConfiguration.configureNetworkMeteredness(true);
|
|
||||||
try {
|
try {
|
||||||
// Register callback
|
|
||||||
registerNetworkCallback((INetworkCallback.Stub) mTestNetworkCallback);
|
|
||||||
mTestNetworkCallback.expectAvailableCallback(mNetwork);
|
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
|
||||||
|
|
||||||
// Enable Power Saver
|
// Enable Power Saver
|
||||||
setBatterySaverMode(true);
|
setBatterySaverMode(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
mTestNetworkCallback.waitBlockedStatusCallback(mNetwork, true);
|
||||||
|
|
||||||
// Disable Power Saver
|
// Disable Power Saver
|
||||||
setBatterySaverMode(false);
|
setBatterySaverMode(false);
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
mTestNetworkCallback.waitBlockedStatusCallback(mNetwork, false);
|
||||||
} finally {
|
} finally {
|
||||||
meterednessConfiguration.resetNetworkMeteredness();
|
mMeterednessConfiguration.resetNetworkMeteredness();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set to non-metered network
|
// Set to non-metered network
|
||||||
meterednessConfiguration.configureNetworkMeteredness(false);
|
mMeterednessConfiguration.configureNetworkMeteredness(false);
|
||||||
|
mTestNetworkCallback.expectCapabilitiesCallback(mNetwork, true /* hasCapability */,
|
||||||
|
NET_CAPABILITY_NOT_METERED);
|
||||||
try {
|
try {
|
||||||
mTestNetworkCallback.assertNoCallback();
|
|
||||||
|
|
||||||
// Enable Power Saver
|
// Enable Power Saver
|
||||||
setBatterySaverMode(true);
|
setBatterySaverMode(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
mTestNetworkCallback.waitBlockedStatusCallback(mNetwork, true);
|
||||||
|
|
||||||
// Disable Power Saver
|
// Disable Power Saver
|
||||||
setBatterySaverMode(false);
|
setBatterySaverMode(false);
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
mTestNetworkCallback.waitBlockedStatusCallback(mNetwork, false);
|
||||||
} finally {
|
} finally {
|
||||||
meterednessConfiguration.resetNetworkMeteredness();
|
mMeterednessConfiguration.resetNetworkMeteredness();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -127,6 +127,16 @@ public class MyService extends Service {
|
|||||||
unregisterNetworkCallback();
|
unregisterNetworkCallback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCapabilitiesChanged(Network network, NetworkCapabilities cap) {
|
||||||
|
try {
|
||||||
|
cb.onCapabilitiesChanged(network, cap);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
Log.d(TAG, "Cannot send onCapabilitiesChanged: " + e);
|
||||||
|
unregisterNetworkCallback();
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
mCm.registerNetworkCallback(makeWifiNetworkRequest(), mNetworkCallback);
|
mCm.registerNetworkCallback(makeWifiNetworkRequest(), mNetworkCallback);
|
||||||
try {
|
try {
|
||||||
@@ -135,17 +145,21 @@ public class MyService extends Service {
|
|||||||
unregisterNetworkCallback();
|
unregisterNetworkCallback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
private void unregisterNetworkCallback() {
|
@Override
|
||||||
Log.d(TAG, "unregistering network callback");
|
public void unregisterNetworkCallback() {
|
||||||
mCm.unregisterNetworkCallback(mNetworkCallback);
|
Log.d(TAG, "unregistering network callback");
|
||||||
mNetworkCallback = null;
|
if (mNetworkCallback != null) {
|
||||||
}
|
mCm.unregisterNetworkCallback(mNetworkCallback);
|
||||||
|
mNetworkCallback = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private NetworkRequest makeWifiNetworkRequest() {
|
private NetworkRequest makeWifiNetworkRequest() {
|
||||||
return new NetworkRequest.Builder()
|
return new NetworkRequest.Builder()
|
||||||
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
|
||||||
|
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user