From d41d7b6af2619ee549f98358ee3981e0582974f5 Mon Sep 17 00:00:00 2001 From: Manidhar Date: Tue, 8 Aug 2023 05:12:53 +0000 Subject: [PATCH] Skip tests in CtsNetTestCases module if feature not supported Test cases are accessing wifi when WiFi feature not enabled. This change skips the test from executing based on WiFi feature availabiliy. Bug: 262228635 Test: Executed all CtsNetTestCases tests on system with and without WiFi feature Change-Id: I97872cf7b73eed12dba064697150f09c81f494b6 --- .../net/cts/BatteryStatsManagerTest.java | 48 ++++++++++++------- .../net/cts/ConnectivityManagerTest.java | 24 +++++++--- .../android/net/cts/util/CtsNetUtils.java | 39 +++++++++++++++ 3 files changed, 87 insertions(+), 24 deletions(-) diff --git a/tests/cts/net/src/android/net/cts/BatteryStatsManagerTest.java b/tests/cts/net/src/android/net/cts/BatteryStatsManagerTest.java index 3c71c90574..466514c099 100644 --- a/tests/cts/net/src/android/net/cts/BatteryStatsManagerTest.java +++ b/tests/cts/net/src/android/net/cts/BatteryStatsManagerTest.java @@ -18,6 +18,7 @@ package android.net.cts; import static android.Manifest.permission.UPDATE_DEVICE_STATS; import static android.content.pm.PackageManager.FEATURE_TELEPHONY; +import static android.content.pm.PackageManager.FEATURE_WIFI; import static androidx.test.InstrumentationRegistry.getContext; @@ -118,8 +119,10 @@ public class BatteryStatsManagerTest{ // side effect is the point of using --write here. executeShellCommand("dumpsys batterystats --write"); - // Make sure wifi is disabled. - mCtsNetUtils.ensureWifiDisconnected(null /* wifiNetworkToCheck */); + if (mPm.hasSystemFeature(FEATURE_WIFI)) { + // Make sure wifi is disabled. + mCtsNetUtils.ensureWifiDisconnected(null /* wifiNetworkToCheck */); + } verifyGetCellBatteryStats(); verifyGetWifiBatteryStats(); @@ -128,6 +131,9 @@ public class BatteryStatsManagerTest{ // Reset battery settings. executeShellCommand("dumpsys batterystats disable no-auto-reset"); executeShellCommand("cmd battery reset"); + if (mPm.hasSystemFeature(FEATURE_WIFI)) { + mCtsNetUtils.ensureWifiConnected(); + } } } @@ -153,23 +159,31 @@ public class BatteryStatsManagerTest{ // The mobile battery stats are updated when a network stops being the default network. // ConnectivityService will call BatteryStatsManager.reportMobileRadioPowerState when // removing data activity tracking. - mCtsNetUtils.ensureWifiConnected(); + try { + mCtsNetUtils.setMobileDataEnabled(false); - // There's rate limit to update mobile battery so if ConnectivityService calls - // BatteryStatsManager.reportMobileRadioPowerState when default network changed, - // the mobile stats might not be updated. But if the mobile update due to other - // reasons (plug/unplug, battery level change, etc) will be unaffected. Thus here - // dumps the battery stats to trigger a full sync of data. - executeShellCommand("dumpsys batterystats"); + // There's rate limit to update mobile battery so if ConnectivityService calls + // BatteryStatsManager.reportMobileRadioPowerState when default network changed, + // the mobile stats might not be updated. But if the mobile update due to other + // reasons (plug/unplug, battery level change, etc) will be unaffected. Thus here + // dumps the battery stats to trigger a full sync of data. + executeShellCommand("dumpsys batterystats"); - // Check cellular battery stats are updated. - runAsShell(UPDATE_DEVICE_STATS, - () -> assertStatsEventually(mBsm::getCellularBatteryStats, - cellularStatsAfter -> cellularBatteryStatsIncreased( - cellularStatsBefore, cellularStatsAfter))); + // Check cellular battery stats are updated. + runAsShell(UPDATE_DEVICE_STATS, + () -> assertStatsEventually(mBsm::getCellularBatteryStats, + cellularStatsAfter -> cellularBatteryStatsIncreased( + cellularStatsBefore, cellularStatsAfter))); + } finally { + mCtsNetUtils.setMobileDataEnabled(true); + } } private void verifyGetWifiBatteryStats() throws Exception { + if (!mPm.hasSystemFeature(FEATURE_WIFI)) { + return; + } + final Network wifiNetwork = mCtsNetUtils.ensureWifiConnected(); final URL url = new URL(TEST_URL); @@ -199,9 +213,9 @@ public class BatteryStatsManagerTest{ @Test public void testReportNetworkInterfaceForTransports_throwsSecurityException() throws Exception { - Network wifiNetwork = mCtsNetUtils.ensureWifiConnected(); - final String iface = mCm.getLinkProperties(wifiNetwork).getInterfaceName(); - final int[] transportType = mCm.getNetworkCapabilities(wifiNetwork).getTransportTypes(); + final Network network = mCm.getActiveNetwork(); + final String iface = mCm.getLinkProperties(network).getInterfaceName(); + final int[] transportType = mCm.getNetworkCapabilities(network).getTransportTypes(); assertThrows(SecurityException.class, () -> mBsm.reportNetworkInterfaceForTransports(iface, transportType)); } diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java index e9786649fb..ed46f64a62 100644 --- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java +++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java @@ -1025,11 +1025,13 @@ public class ConnectivityManagerTest { final String goodPrivateDnsServer = "dns.google"; mCtsNetUtils.storePrivateDnsSetting(); final TestableNetworkCallback cb = new TestableNetworkCallback(); - registerNetworkCallback(makeWifiNetworkRequest(), cb); + final NetworkRequest networkRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_INTERNET).build(); + registerNetworkCallback(networkRequest, cb); + final Network networkForPrivateDns = mCm.getActiveNetwork(); try { // Verifying the good private DNS sever mCtsNetUtils.setPrivateDnsStrictMode(goodPrivateDnsServer); - final Network networkForPrivateDns = mCtsNetUtils.ensureWifiConnected(); cb.eventuallyExpect(CallbackEntry.NETWORK_CAPS_UPDATED, NETWORK_CALLBACK_TIMEOUT_MS, entry -> hasPrivateDnsValidated(entry, networkForPrivateDns)); @@ -1040,8 +1042,11 @@ public class ConnectivityManagerTest { .isPrivateDnsBroken()) && networkForPrivateDns.equals(entry.getNetwork())); } finally { mCtsNetUtils.restorePrivateDnsSetting(); - // Toggle wifi to make sure it is re-validated - reconnectWifi(); + // Toggle network to make sure it is re-validated + mCm.reportNetworkConnectivity(networkForPrivateDns, true); + cb.eventuallyExpect(CallbackEntry.NETWORK_CAPS_UPDATED, NETWORK_CALLBACK_TIMEOUT_MS, + entry -> !(((CallbackEntry.CapabilitiesChanged) entry).getCaps() + .isPrivateDnsBroken()) && networkForPrivateDns.equals(entry.getNetwork())); } } @@ -1306,9 +1311,12 @@ public class ConnectivityManagerTest { @AppModeFull(reason = "Cannot get WifiManager in instant app mode") @Test public void testRequestNetworkCallback_onUnavailable() { - final boolean previousWifiEnabledState = mWifiManager.isWifiEnabled(); - if (previousWifiEnabledState) { - mCtsNetUtils.ensureWifiDisconnected(null); + boolean previousWifiEnabledState = false; + if (mPackageManager.hasSystemFeature(FEATURE_WIFI)) { + previousWifiEnabledState = mWifiManager.isWifiEnabled(); + if (previousWifiEnabledState) { + mCtsNetUtils.ensureWifiDisconnected(null); + } } final TestNetworkCallback callback = new TestNetworkCallback(); @@ -1344,6 +1352,8 @@ public class ConnectivityManagerTest { @AppModeFull(reason = "Cannot get WifiManager in instant app mode") @Test public void testToggleWifiConnectivityAction() throws Exception { + assumeTrue(mPackageManager.hasSystemFeature(FEATURE_WIFI)); + // toggleWifi calls connectToWifi and disconnectFromWifi, which both wait for // CONNECTIVITY_ACTION broadcasts. mCtsNetUtils.toggleWifi(); diff --git a/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java b/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java index 21f1358ab7..aa09b8462c 100644 --- a/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java +++ b/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java @@ -16,6 +16,7 @@ package android.net.cts.util; +import static android.Manifest.permission.MODIFY_PHONE_STATE; import static android.Manifest.permission.NETWORK_SETTINGS; import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; @@ -54,6 +55,8 @@ import android.os.ConditionVariable; import android.os.IBinder; import android.system.Os; import android.system.OsConstants; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; @@ -566,6 +569,42 @@ public final class CtsNetUtils { return testableNetworks.toArray(new Network[0]); } + /** + * Enables or disables the mobile data and waits for the state to change. + * + * @param enabled - true to enable, false to disable the mobile data. + */ + public void setMobileDataEnabled(boolean enabled) throws InterruptedException { + final TelephonyManager tm = mContext.getSystemService(TelephonyManager.class) + .createForSubscriptionId(SubscriptionManager.getDefaultDataSubscriptionId()); + final NetworkRequest request = new NetworkRequest.Builder() + .addTransportType(TRANSPORT_CELLULAR) + .addCapability(NET_CAPABILITY_INTERNET) + .build(); + final TestNetworkCallback callback = new TestNetworkCallback(); + mCm.requestNetwork(request, callback); + + try { + if (!enabled) { + assertNotNull("Cannot disable mobile data unless mobile data is connected", + callback.waitForAvailable()); + } + + runAsShell(MODIFY_PHONE_STATE, () -> tm.setDataEnabledForReason( + TelephonyManager.DATA_ENABLED_REASON_USER, enabled)); + if (enabled) { + assertNotNull("Enabling mobile data did not connect mobile data", + callback.waitForAvailable()); + } else { + assertNotNull("Disabling mobile data did not disconnect mobile data", + callback.waitForLost()); + } + + } finally { + mCm.unregisterNetworkCallback(callback); + } + } + /** * Receiver that captures the last connectivity change's network type and state. Recognizes * both {@code CONNECTIVITY_ACTION} and {@code NETWORK_CALLBACK_ACTION} intents.