Fix NetworkCallback#onAvailable does not match SSID

The test checks whether the client is connected to the hotspot
by register network callback with specified hotspot SSID in the
WifiNetworkSpecifier. However, SSID is not matched when
WifiNetworkAgentSpecifier#canBeSatisfiedBy due to privacy
consideraions.

Thus, manually match SSID is needed to make sure the client
is connected to the hotspot to ensure follow-up tests
can be performed correctly.

Test: m connectivity_multi_devices_snippet && \
      atest CtsConnectivityMultiDevicesTestCases:ConnectivityMultiDevicesTest \
      --rerun-until-failure 100
Bug: 335368434
Change-Id: Ic8dcb7e5c1cf346e4b149367048b6e914894b6d4
This commit is contained in:
Junyu Lai 2024-04-22 16:22:36 +08:00
commit b99caadfab

View file

@ -16,6 +16,7 @@
package com.google.snippet.connectivity
import android.Manifest.permission.NETWORK_SETTINGS
import android.Manifest.permission.OVERRIDE_WIFI_CONFIG
import android.content.pm.PackageManager.FEATURE_TELEPHONY
import android.content.pm.PackageManager.FEATURE_WIFI
@ -30,20 +31,24 @@ import android.net.wifi.ScanResult
import android.net.wifi.SoftApConfiguration
import android.net.wifi.SoftApConfiguration.SECURITY_TYPE_WPA2_PSK
import android.net.wifi.WifiConfiguration
import android.net.wifi.WifiInfo
import android.net.wifi.WifiManager
import android.net.wifi.WifiNetworkSpecifier
import android.net.wifi.WifiSsid
import androidx.test.platform.app.InstrumentationRegistry
import com.android.testutils.AutoReleaseNetworkCallbackRule
import com.android.testutils.ConnectUtil
import com.android.testutils.NetworkCallbackHelper
import com.android.testutils.RecorderCallback.CallbackEntry.Available
import com.android.testutils.RecorderCallback.CallbackEntry.CapabilitiesChanged
import com.android.testutils.TestableNetworkCallback
import com.android.testutils.runAsShell
import com.google.android.mobly.snippet.Snippet
import com.google.android.mobly.snippet.rpc.Rpc
import org.junit.Rule
class ConnectivityMultiDevicesSnippet : Snippet {
@get:Rule
val networkCallbackRule = AutoReleaseNetworkCallbackRule()
private val context = InstrumentationRegistry.getInstrumentation().getTargetContext()
private val wifiManager = context.getSystemService(WifiManager::class.java)!!
private val cm = context.getSystemService(ConnectivityManager::class.java)!!
@ -90,8 +95,6 @@ class ConnectivityMultiDevicesSnippet : Snippet {
@Suppress("DEPRECATION")
fun connectToWifi(ssid: String, passphrase: String, requireValidation: Boolean): Network {
val specifier = WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.setWpa2Passphrase(passphrase)
.setBand(ScanResult.WIFI_BAND_24_GHZ)
.build()
val wifiConfig = WifiConfiguration()
@ -102,27 +105,28 @@ class ConnectivityMultiDevicesSnippet : Snippet {
wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP)
wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP)
// Register network callback for the specific wifi.
// Add the test configuration and connect to it.
val connectUtil = ConnectUtil(context)
connectUtil.connectToWifiConfig(wifiConfig)
// Implement manual SSID matching. Specifying the SSID in
// NetworkSpecifier is ineffective
// (see WifiNetworkAgentSpecifier#canBeSatisfiedBy for details).
// Note that holding permission is necessary when waiting for
// the callbacks. The handler thread checks permission; if
// it's not present, the SSID will be redacted.
val networkCallback = TestableNetworkCallback()
val wifiRequest = NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI)
.setNetworkSpecifier(specifier)
.build()
cm.registerNetworkCallback(wifiRequest, networkCallback)
try {
// Add the test configuration and connect to it.
val connectUtil = ConnectUtil(context)
connectUtil.connectToWifiConfig(wifiConfig)
val event = networkCallback.expect<Available>()
if (requireValidation) {
networkCallback.eventuallyExpect<CapabilitiesChanged> {
it.caps.hasCapability(NET_CAPABILITY_VALIDATED)
}
}
return event.network
} finally {
cm.unregisterNetworkCallback(networkCallback)
val wifiRequest = NetworkRequest.Builder().addTransportType(TRANSPORT_WIFI).build()
return runAsShell(NETWORK_SETTINGS) {
// Register the network callback is needed here.
// This is to avoid the race condition where callback is fired before
// acquiring permission.
networkCallbackRule.registerNetworkCallback(wifiRequest, networkCallback)
return@runAsShell networkCallback.eventuallyExpect<CapabilitiesChanged> {
// Remove double quotes.
val ssidFromCaps = (WifiInfo::sanitizeSsid)(it.caps.ssid)
ssidFromCaps == ssid && it.caps.hasCapability(NET_CAPABILITY_VALIDATED)
}.network
}
}