From ae4c414c1f8985fb19ed619eca42c50972e237cf Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Wed, 8 Sep 2021 10:02:55 +0900 Subject: [PATCH] Wait for validation of WiFi in OEM pref test OEM_NETWORK_PREFERENCE_TEST prefers NOT_METERED&VALIDATED networks then TEST networks. If the WiFi isn't validated by the time the preference is set, then the TEST network is preferred and the test fails. The best solution is simply to wait for the WiFi network to validate before setting the preference. Besides, some of the *wait* methods wait for validation and some don't, creating confusion. Make this explicit on the setWifiMeteredStatusAndWait method with a boolean argument, which forces all users to make an explicit choice. testSetOemNetworkPreferenceForTestOnlyPref is not affected, as it does not change WiFi meteredness. Bug: 195365654 Test: testSetOemNetworkPreferenceForTestPref Change-Id: Icb9d7ff1ca5c3d93286ea3a79c27f15630d17ee6 --- .../net/cts/ConnectivityManagerTest.java | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java index 65dffbde59..a470c820b8 100644 --- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java +++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java @@ -1082,7 +1082,8 @@ public class ConnectivityManagerTest { } private Network waitForActiveNetworkMetered(final int targetTransportType, - final boolean requestedMeteredness, final boolean useSystemDefault) + final boolean requestedMeteredness, final boolean waitForValidation, + final boolean useSystemDefault) throws Exception { final CompletableFuture networkFuture = new CompletableFuture<>(); final NetworkCallback networkCallback = new NetworkCallback() { @@ -1091,7 +1092,8 @@ public class ConnectivityManagerTest { if (!nc.hasTransport(targetTransportType)) return; final boolean metered = !nc.hasCapability(NET_CAPABILITY_NOT_METERED); - if (metered == requestedMeteredness) { + final boolean validated = nc.hasCapability(NET_CAPABILITY_VALIDATED); + if (metered == requestedMeteredness && (!waitForValidation || validated)) { networkFuture.complete(network); } } @@ -1120,11 +1122,13 @@ public class ConnectivityManagerTest { } } - private Network setWifiMeteredStatusAndWait(String ssid, boolean isMetered) throws Exception { + private Network setWifiMeteredStatusAndWait(String ssid, boolean isMetered, + boolean waitForValidation) throws Exception { setWifiMeteredStatus(ssid, Boolean.toString(isMetered) /* metered */); mCtsNetUtils.ensureWifiConnected(); return waitForActiveNetworkMetered(TRANSPORT_WIFI, isMetered /* requestedMeteredness */, + waitForValidation, true /* useSystemDefault */); } @@ -1187,9 +1191,10 @@ public class ConnectivityManagerTest { int newMeteredPreference = findNextPrefValue(resolver); Settings.Global.putString(resolver, NETWORK_METERED_MULTIPATH_PREFERENCE, Integer.toString(newMeteredPreference)); - // Wifi meterness changes from unmetered to metered will disconnect and reconnect since - // R. - final Network network = setWifiMeteredStatusAndWait(ssid, true); + // Wifi meteredness changes from unmetered to metered will disconnect and reconnect + // since R. + final Network network = setWifiMeteredStatusAndWait(ssid, true /* isMetered */, + false /* waitForValidation */); assertEquals(ssid, unquoteSSID(mWifiManager.getConnectionInfo().getSSID())); assertEquals(mCm.getNetworkCapabilities(network).hasCapability( NET_CAPABILITY_NOT_METERED), false); @@ -1206,7 +1211,7 @@ public class ConnectivityManagerTest { oldMeteredPreference, newMeteredPreference); // No disconnect from unmetered to metered. - setWifiMeteredStatusAndWait(ssid, false); + setWifiMeteredStatusAndWait(ssid, false /* isMetered */, false /* waitForValidation */); assertEquals(mCm.getNetworkCapabilities(network).hasCapability( NET_CAPABILITY_NOT_METERED), true); assertMultipathPreferenceIsEventually(network, newMeteredPreference, @@ -2322,8 +2327,10 @@ public class ConnectivityManagerTest { final boolean oldMeteredValue = wifiNetworkCapabilities.isMetered(); try { - // This network will be used for unmetered. - setWifiMeteredStatusAndWait(ssid, false /* isMetered */); + // This network will be used for unmetered. Wait for it to be validated because + // OEM_NETWORK_PREFERENCE_TEST only prefers NOT_METERED&VALIDATED to a network with + // TRANSPORT_TEST, like OEM_NETWORK_PREFERENCE_OEM_PAID. + setWifiMeteredStatusAndWait(ssid, false /* isMetered */, true /* waitForValidation */); setOemNetworkPreferenceForMyPackage(OemNetworkPreferences.OEM_NETWORK_PREFERENCE_TEST); registerTestOemNetworkPreferenceCallbacks(defaultCallback, systemDefaultCallback); @@ -2332,9 +2339,10 @@ public class ConnectivityManagerTest { waitForAvailable(defaultCallback, wifiNetwork); waitForAvailable(systemDefaultCallback, wifiNetwork); - // Validate when setting unmetered to metered, unmetered is lost and replaced by the - // network with the TEST transport. - setWifiMeteredStatusAndWait(ssid, true /* isMetered */); + // Validate that when setting unmetered to metered, unmetered is lost and replaced by + // the network with the TEST transport. Also wait for validation here, in case there + // is a bug that's only visible when the network is validated. + setWifiMeteredStatusAndWait(ssid, true /* isMetered */, true /* waitForValidation */); defaultCallback.expectCallback(CallbackEntry.LOST, wifiNetwork, NETWORK_CALLBACK_TIMEOUT_MS); waitForAvailable(defaultCallback, tnt.getNetwork()); @@ -2350,7 +2358,7 @@ public class ConnectivityManagerTest { NETWORK_CALLBACK_TIMEOUT_MS); waitForAvailable(defaultCallback); - setWifiMeteredStatusAndWait(ssid, oldMeteredValue); + setWifiMeteredStatusAndWait(ssid, oldMeteredValue, false /* waitForValidation */); // Cleanup any prior test state from setOemNetworkPreference clearOemNetworkPreference();