diff options
Diffstat (limited to 'tests/JobScheduler/src/android/jobscheduler/cts/ConnectivityConstraintTest.java')
-rw-r--r-- | tests/JobScheduler/src/android/jobscheduler/cts/ConnectivityConstraintTest.java | 326 |
1 files changed, 16 insertions, 310 deletions
diff --git a/tests/JobScheduler/src/android/jobscheduler/cts/ConnectivityConstraintTest.java b/tests/JobScheduler/src/android/jobscheduler/cts/ConnectivityConstraintTest.java index 00d7517d263..7b0d2616b4a 100644 --- a/tests/JobScheduler/src/android/jobscheduler/cts/ConnectivityConstraintTest.java +++ b/tests/JobScheduler/src/android/jobscheduler/cts/ConnectivityConstraintTest.java @@ -18,48 +18,25 @@ package android.jobscheduler.cts; import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; -import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET; -import static android.net.NetworkCapabilities.TRANSPORT_WIFI; -import static com.android.compatibility.common.util.TestUtils.waitUntil; - -import android.Manifest; import android.annotation.TargetApi; import android.app.job.JobInfo; import android.app.job.JobParameters; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.PackageManager; -import android.location.LocationManager; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkRequest; -import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; import android.platform.test.annotations.RequiresDevice; import android.provider.Settings; import android.util.Log; import com.android.compatibility.common.util.AppStandbyUtils; import com.android.compatibility.common.util.BatteryUtils; -import com.android.compatibility.common.util.CallbackAsserter; -import com.android.compatibility.common.util.ShellIdentityUtils; import com.android.compatibility.common.util.SystemUtil; -import junit.framework.AssertionFailedError; - -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /** * Schedules jobs with the {@link android.app.job.JobScheduler} that have network connectivity * constraints. @@ -70,18 +47,13 @@ import java.util.regex.Pattern; @RequiresDevice // Emulators don't always have access to wifi/network public class ConnectivityConstraintTest extends BaseJobSchedulerTest { private static final String TAG = "ConnectivityConstraintTest"; - private static final String RESTRICT_BACKGROUND_GET_CMD = - "cmd netpolicy get restrict-background"; - private static final String RESTRICT_BACKGROUND_ON_CMD = - "cmd netpolicy set restrict-background true"; - private static final String RESTRICT_BACKGROUND_OFF_CMD = - "cmd netpolicy set restrict-background false"; /** Unique identifier for the job scheduled by this suite of tests. */ public static final int CONNECTIVITY_JOB_ID = ConnectivityConstraintTest.class.hashCode(); /** Wait this long before timing out the test. */ private static final long DEFAULT_TIMEOUT_MILLIS = 30000L; // 30 seconds. + private NetworkingHelper mNetworkingHelper; private WifiManager mWifiManager; private ConnectivityManager mCm; @@ -89,21 +61,8 @@ public class ConnectivityConstraintTest extends BaseJobSchedulerTest { private boolean mHasWifi; /** Whether the device running these tests supports telephony. */ private boolean mHasTelephony; - /** Whether the device running these tests supports ethernet. */ - private boolean mHasEthernet; - /** Track whether WiFi was enabled in case we turn it off. */ - private boolean mInitialWiFiState; - /** Track initial WiFi metered state. */ - private String mInitialWiFiMeteredState; - private String mInitialWiFiSSID; - /** Track whether restrict background policy was enabled in case we turn it off. */ - private boolean mInitialRestrictBackground; - /** Track whether airplane mode was enabled in case we toggle it. */ - private boolean mInitialAirplaneMode; /** Track whether the restricted bucket was enabled in case we toggle it. */ private String mInitialRestrictedBucketEnabled; - /** Track the location mode in case we change it. */ - private String mInitialLocationMode; private JobInfo.Builder mBuilder; @@ -115,30 +74,20 @@ public class ConnectivityConstraintTest extends BaseJobSchedulerTest { mWifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); mCm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE); + mNetworkingHelper = new NetworkingHelper(getInstrumentation(), getContext()); PackageManager packageManager = mContext.getPackageManager(); mHasWifi = packageManager.hasSystemFeature(PackageManager.FEATURE_WIFI); mHasTelephony = packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); - mHasEthernet = packageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET); mBuilder = new JobInfo.Builder(CONNECTIVITY_JOB_ID, kJobServiceComponent); - mInitialLocationMode = Settings.Secure.getString(mContext.getContentResolver(), - Settings.Secure.LOCATION_MODE); if (mHasWifi) { - mInitialWiFiState = mWifiManager.isWifiEnabled(); - ensureSavedWifiNetwork(mWifiManager); - setWifiState(true, mCm, mWifiManager); - mInitialWiFiSSID = getWifiSSID(); - mInitialWiFiMeteredState = getWifiMeteredStatus(mInitialWiFiSSID); + mNetworkingHelper.ensureSavedWifiNetwork(); } - mInitialRestrictBackground = SystemUtil - .runShellCommand(getInstrumentation(), RESTRICT_BACKGROUND_GET_CMD) - .contains("enabled"); mInitialRestrictedBucketEnabled = Settings.Global.getString(mContext.getContentResolver(), Settings.Global.ENABLE_RESTRICTED_BUCKET); setDataSaverEnabled(false); - mInitialAirplaneMode = isAirplaneModeOn(); - setAirplaneMode(false); + mNetworkingHelper.setAllNetworksEnabled(true); // Force the test app out of the never bucket. SystemUtil.runShellCommand("am set-standby-bucket " + TestAppInterface.TEST_APP_PACKAGE + " rare"); @@ -153,31 +102,12 @@ public class ConnectivityConstraintTest extends BaseJobSchedulerTest { BatteryUtils.runDumpsysBatteryReset(); - // Restore initial restrict background data usage policy - setDataSaverEnabled(mInitialRestrictBackground); - // Restore initial restricted bucket setting. Settings.Global.putString(mContext.getContentResolver(), Settings.Global.ENABLE_RESTRICTED_BUCKET, mInitialRestrictedBucketEnabled); // Ensure that we leave WiFi in its previous state. - if (mHasWifi) { - setWifiMeteredState(mInitialWiFiSSID, mInitialWiFiMeteredState); - if (mWifiManager.isWifiEnabled() != mInitialWiFiState) { - try { - setWifiState(mInitialWiFiState, mCm, mWifiManager); - } catch (AssertionFailedError e) { - // Don't fail the test just because wifi state wasn't set in tearDown. - Log.e(TAG, "Failed to return wifi state to " + mInitialWiFiState, e); - } - } - } - - // Restore initial airplane mode status. Do it after setting wifi in case wifi was - // originally metered. - setAirplaneMode(mInitialAirplaneMode); - - setLocationMode(mInitialLocationMode); + mNetworkingHelper.tearDown(); super.tearDown(); } @@ -585,7 +515,7 @@ public class ConnectivityConstraintTest extends BaseJobSchedulerTest { } public void testJobParametersNetwork() throws Exception { - setAirplaneMode(false); + mNetworkingHelper.setAllNetworksEnabled(true); // Everything good. final NetworkRequest nr = new NetworkRequest.Builder() @@ -608,7 +538,7 @@ public class ConnectivityConstraintTest extends BaseJobSchedulerTest { if (!hasEthernetConnection()) { // Deadline passed with no network satisfied. - setAirplaneMode(true); + mNetworkingHelper.setAllNetworksEnabled(false); ji = mBuilder .setRequiredNetwork(nr) .setOverrideDeadline(0) @@ -624,7 +554,7 @@ public class ConnectivityConstraintTest extends BaseJobSchedulerTest { } // No network requested - setAirplaneMode(false); + mNetworkingHelper.setAllNetworksEnabled(true); ji = mBuilder.setRequiredNetwork(null).build(); kTestEnvironment.setExpectedExecutions(1); mJobScheduler.schedule(ji); @@ -875,149 +805,25 @@ public class ConnectivityConstraintTest extends BaseJobSchedulerTest { } private boolean hasEthernetConnection() { - if (!mHasEthernet) return false; - Network[] networks = mCm.getAllNetworks(); - for (Network network : networks) { - if (mCm.getNetworkCapabilities(network).hasTransport(TRANSPORT_ETHERNET)) { - return true; - } - } - return false; - } - - private String unquoteSSID(String ssid) { - // SSID is returned surrounded by quotes if it can be decoded as UTF-8. - // Otherwise it's guaranteed not to start with a quote. - if (ssid.charAt(0) == '"') { - return ssid.substring(1, ssid.length() - 1); - } else { - return ssid; - } - } - - private String getWifiSSID() throws Exception { - // Location needs to be enabled to get the WiFi information. - setLocationMode(String.valueOf(Settings.Secure.LOCATION_MODE_ON)); - final AtomicReference<String> ssid = new AtomicReference<>(); - SystemUtil.runWithShellPermissionIdentity(() -> { - ssid.set(mWifiManager.getConnectionInfo().getSSID()); - }, Manifest.permission.ACCESS_FINE_LOCATION); - return unquoteSSID(ssid.get()); - } - - private void setLocationMode(String mode) throws Exception { - Settings.Secure.putString(mContext.getContentResolver(), - Settings.Secure.LOCATION_MODE, mode); - final LocationManager locationManager = mContext.getSystemService(LocationManager.class); - final boolean wantEnabled = !String.valueOf(Settings.Secure.LOCATION_MODE_OFF).equals(mode); - waitUntil("Location " + (wantEnabled ? "not enabled" : "still enabled"), - () -> wantEnabled == locationManager.isLocationEnabled()); - } - - // Returns "true", "false" or "none" - private String getWifiMeteredStatus(String ssid) { - // Interestingly giving the SSID as an argument to list wifi-networks - // only works iff the network in question has the "false" policy. - // Also unfortunately runShellCommand does not pass the command to the interpreter - // so it's not possible to | grep the ssid. - final String command = "cmd netpolicy list wifi-networks"; - final String policyString = SystemUtil.runShellCommand(command); - - final Matcher m = Pattern.compile("^" + ssid + ";(true|false|none)$", - Pattern.MULTILINE | Pattern.UNIX_LINES).matcher(policyString); - if (!m.find()) { - fail("Unexpected format from cmd netpolicy (when looking for " + ssid + "): " - + policyString); - } - return m.group(1); + return mNetworkingHelper.hasEthernetConnection(); } private void setWifiMeteredState(boolean metered) throws Exception { - if (metered) { - // Make sure unmetered cellular networks don't interfere. - setAirplaneMode(true); - setWifiState(true, mCm, mWifiManager); - } - final String ssid = getWifiSSID(); - setWifiMeteredState(ssid, metered ? "true" : "false"); - } - - // metered should be "true", "false" or "none" - private void setWifiMeteredState(String ssid, String metered) throws Exception { - if (metered.equals(getWifiMeteredStatus(ssid))) { - return; - } - SystemUtil.runShellCommand("cmd netpolicy set metered-network " + ssid + " " + metered); - assertEquals(getWifiMeteredStatus(ssid), metered); + mNetworkingHelper.setWifiMeteredState(metered); } /** * Ensure WiFi is enabled, and block until we've verified that we are in fact connected. */ private void connectToWifi() throws Exception { - setWifiState(true, mCm, mWifiManager); + mNetworkingHelper.setWifiState(true); } /** * Ensure WiFi is disabled, and block until we've verified that we are in fact disconnected. */ private void disconnectFromWifi() throws Exception { - setWifiState(false, mCm, mWifiManager); - } - - /** Ensures that the device has a wifi network saved. */ - static void ensureSavedWifiNetwork(WifiManager wifiManager) { - final List<WifiConfiguration> savedNetworks = - ShellIdentityUtils.invokeMethodWithShellPermissions( - wifiManager, WifiManager::getConfiguredNetworks); - assertFalse("Need at least one saved wifi network", savedNetworks.isEmpty()); - } - - /** - * Set Wifi connection to specific state, and block until we've verified - * that we are in the state. - * Taken from {@link android.net.http.cts.ApacheHttpClientTest}. - */ - static void setWifiState(final boolean enable, - final ConnectivityManager cm, final WifiManager wm) throws Exception { - if (enable != isWiFiConnected(cm, wm)) { - NetworkRequest nr = new NetworkRequest.Builder().clearCapabilities().build(); - NetworkCapabilities nc = new NetworkCapabilities.Builder() - .addTransportType(TRANSPORT_WIFI) - .build(); - NetworkTracker tracker = new NetworkTracker(nc, enable, cm); - cm.registerNetworkCallback(nr, tracker); - - if (enable) { - SystemUtil.runShellCommand("svc wifi enable"); - waitUntil("Failed to enable Wifi", 30 /* seconds */, () -> wm.isWifiEnabled()); - //noinspection deprecation - SystemUtil.runWithShellPermissionIdentity(wm::reconnect, - android.Manifest.permission.NETWORK_SETTINGS); - } else { - SystemUtil.runShellCommand("svc wifi disable"); - } - - tracker.waitForStateChange(); - - assertTrue("Wifi must be " + (enable ? "connected to" : "disconnected from") - + " an access point for this test.", - enable == isWiFiConnected(cm, wm)); - - cm.unregisterNetworkCallback(tracker); - } - } - - static boolean isWiFiConnected(final ConnectivityManager cm, final WifiManager wm) { - if (!wm.isWifiEnabled()) { - return false; - } - final Network network = cm.getActiveNetwork(); - if (network == null) { - return false; - } - final NetworkCapabilities networkCapabilities = cm.getNetworkCapabilities(network); - return networkCapabilities != null && networkCapabilities.hasTransport(TRANSPORT_WIFI); + mNetworkingHelper.setWifiState(false); } /** @@ -1029,13 +835,14 @@ public class ConnectivityConstraintTest extends BaseJobSchedulerTest { * @see #checkDeviceSupportsMobileData() */ private void disconnectWifiToConnectToMobile() throws Exception { - setAirplaneMode(false); + mNetworkingHelper.setAllNetworksEnabled(true); if (mHasWifi && mWifiManager.isWifiEnabled()) { NetworkRequest nr = new NetworkRequest.Builder().clearCapabilities().build(); NetworkCapabilities nc = new NetworkCapabilities.Builder() .addTransportType(TRANSPORT_CELLULAR) .build(); - NetworkTracker tracker = new NetworkTracker(nc, true, mCm); + NetworkingHelper.NetworkTracker tracker = + new NetworkingHelper.NetworkTracker(nc, true, mCm); mCm.registerNetworkCallback(nr, tracker); disconnectFromWifi(); @@ -1052,107 +859,6 @@ public class ConnectivityConstraintTest extends BaseJobSchedulerTest { * If the policy is on, it interferes with tests that relies on metered connection. */ private void setDataSaverEnabled(boolean enabled) throws Exception { - SystemUtil.runShellCommand(getInstrumentation(), - enabled ? RESTRICT_BACKGROUND_ON_CMD : RESTRICT_BACKGROUND_OFF_CMD); - } - - private boolean isAirplaneModeOn() throws Exception { - final String output = SystemUtil.runShellCommand(getInstrumentation(), - "cmd connectivity airplane-mode").trim(); - return "enabled".equals(output); - } - - private void setAirplaneMode(boolean on) throws Exception { - if (isAirplaneModeOn() == on) { - return; - } - final CallbackAsserter airplaneModeBroadcastAsserter = CallbackAsserter.forBroadcast( - new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); - SystemUtil.runShellCommand(getInstrumentation(), - "cmd connectivity airplane-mode " + (on ? "enable" : "disable")); - airplaneModeBroadcastAsserter.assertCalled("Didn't get airplane mode changed broadcast", - 15 /* 15 seconds */); - waitUntil("Networks didn't change to " + (!on ? " on" : " off"), 60 /* seconds */, - () -> { - if (on) { - return mCm.getActiveNetwork() == null - && (!mHasWifi || !isWiFiConnected(mCm, mWifiManager)); - } else { - return mCm.getActiveNetwork() != null; - } - }); - // Wait some time for the network changes to propagate. Can't use - // waitUntil(isAirplaneModeOn() == on) because the response quickly gives the new - // airplane mode status even though the network changes haven't propagated all the way to - // JobScheduler. - Thread.sleep(5000); - } - - private static class NetworkTracker extends ConnectivityManager.NetworkCallback { - private static final int MSG_CHECK_ACTIVE_NETWORK = 1; - private final ConnectivityManager mCm; - - private final CountDownLatch mReceiveLatch = new CountDownLatch(1); - - private final NetworkCapabilities mExpectedCapabilities; - - private final boolean mExpectedConnected; - - private final Handler mHandler = new Handler(Looper.getMainLooper()) { - @Override - public void handleMessage(Message msg) { - if (msg.what == MSG_CHECK_ACTIVE_NETWORK) { - checkActiveNetwork(); - } - } - }; - - private NetworkTracker(NetworkCapabilities expectedCapabilities, boolean expectedConnected, - ConnectivityManager cm) { - mExpectedCapabilities = expectedCapabilities; - mExpectedConnected = expectedConnected; - mCm = cm; - } - - @Override - public void onAvailable(Network network) { - // Available doesn't mean it's the active network. We need to check that separately. - checkActiveNetwork(); - } - - @Override - public void onLost(Network network) { - checkActiveNetwork(); - } - - boolean waitForStateChange() throws InterruptedException { - checkActiveNetwork(); - return mReceiveLatch.await(60, TimeUnit.SECONDS); - } - - private void checkActiveNetwork() { - mHandler.removeMessages(MSG_CHECK_ACTIVE_NETWORK); - if (mReceiveLatch.getCount() == 0) { - return; - } - - Network activeNetwork = mCm.getActiveNetwork(); - if (mExpectedConnected) { - if (activeNetwork != null && mExpectedCapabilities.satisfiedByNetworkCapabilities( - mCm.getNetworkCapabilities(activeNetwork))) { - mReceiveLatch.countDown(); - } else { - mHandler.sendEmptyMessageDelayed(MSG_CHECK_ACTIVE_NETWORK, 5000); - } - } else { - if (activeNetwork == null - || !mExpectedCapabilities.satisfiedByNetworkCapabilities( - mCm.getNetworkCapabilities(activeNetwork))) { - mReceiveLatch.countDown(); - } else { - mHandler.sendEmptyMessageDelayed(MSG_CHECK_ACTIVE_NETWORK, 5000); - } - } - } + mNetworkingHelper.setDataSaverEnabled(enabled); } } |