Merge "Flake fix : Wait setting applied before returning from setConfig"
This commit is contained in:
@@ -19,12 +19,20 @@ package android.net.cts
|
|||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.net.util.NetworkStackUtils
|
import android.net.util.NetworkStackUtils
|
||||||
import android.provider.DeviceConfig
|
import android.provider.DeviceConfig
|
||||||
|
import android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY
|
||||||
|
import android.util.Log
|
||||||
import com.android.testutils.runAsShell
|
import com.android.testutils.runAsShell
|
||||||
|
import com.android.testutils.tryTest
|
||||||
|
import java.util.concurrent.CompletableFuture
|
||||||
|
import java.util.concurrent.Executor
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Collection of utility methods for configuring network validation.
|
* Collection of utility methods for configuring network validation.
|
||||||
*/
|
*/
|
||||||
internal object NetworkValidationTestUtil {
|
internal object NetworkValidationTestUtil {
|
||||||
|
val TAG = NetworkValidationTestUtil::class.simpleName
|
||||||
|
const val TIMEOUT_MS = 20_000L
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear the test network validation URLs.
|
* Clear the test network validation URLs.
|
||||||
@@ -59,10 +67,52 @@ internal object NetworkValidationTestUtil {
|
|||||||
@JvmStatic fun setUrlExpirationDeviceConfig(timestamp: Long?) =
|
@JvmStatic fun setUrlExpirationDeviceConfig(timestamp: Long?) =
|
||||||
setConfig(NetworkStackUtils.TEST_URL_EXPIRATION_TIME, timestamp?.toString())
|
setConfig(NetworkStackUtils.TEST_URL_EXPIRATION_TIME, timestamp?.toString())
|
||||||
|
|
||||||
private fun setConfig(configKey: String, value: String?) {
|
private fun setConfig(configKey: String, value: String?): String? {
|
||||||
runAsShell(Manifest.permission.WRITE_DEVICE_CONFIG) {
|
Log.i(TAG, "Setting config \"$configKey\" to \"$value\"")
|
||||||
DeviceConfig.setProperty(
|
val readWritePermissions = arrayOf(
|
||||||
DeviceConfig.NAMESPACE_CONNECTIVITY, configKey, value, false /* makeDefault */)
|
Manifest.permission.READ_DEVICE_CONFIG,
|
||||||
|
Manifest.permission.WRITE_DEVICE_CONFIG)
|
||||||
|
|
||||||
|
val existingValue = runAsShell(*readWritePermissions) {
|
||||||
|
DeviceConfig.getProperty(NAMESPACE_CONNECTIVITY, configKey)
|
||||||
|
}
|
||||||
|
if (existingValue == value) {
|
||||||
|
// Already the correct value. There may be a race if a change is already in flight,
|
||||||
|
// but if multiple threads update the config there is no way to fix that anyway.
|
||||||
|
Log.i(TAG, "\$configKey\" already had value \"$value\"")
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
val future = CompletableFuture<String>()
|
||||||
|
val listener = DeviceConfig.OnPropertiesChangedListener {
|
||||||
|
// The listener receives updates for any change to any key, so don't react to
|
||||||
|
// changes that do not affect the relevant key
|
||||||
|
if (!it.keyset.contains(configKey)) return@OnPropertiesChangedListener
|
||||||
|
if (it.getString(configKey, null) == value) {
|
||||||
|
future.complete(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tryTest {
|
||||||
|
runAsShell(*readWritePermissions) {
|
||||||
|
DeviceConfig.addOnPropertiesChangedListener(
|
||||||
|
NAMESPACE_CONNECTIVITY,
|
||||||
|
inlineExecutor,
|
||||||
|
listener)
|
||||||
|
DeviceConfig.setProperty(
|
||||||
|
NAMESPACE_CONNECTIVITY,
|
||||||
|
configKey,
|
||||||
|
value,
|
||||||
|
false /* makeDefault */)
|
||||||
|
// Don't drop the permission until the config is applied, just in case
|
||||||
|
future.get(TIMEOUT_MS, TimeUnit.MILLISECONDS)
|
||||||
|
}.also {
|
||||||
|
Log.i(TAG, "Config \"$configKey\" successfully set to \"$value\"")
|
||||||
|
}
|
||||||
|
} cleanup {
|
||||||
|
DeviceConfig.removeOnPropertiesChangedListener(listener)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private val inlineExecutor get() = Executor { r -> r.run() }
|
||||||
|
}
|
||||||
|
|||||||
@@ -476,6 +476,7 @@ public final class CtsNetUtils {
|
|||||||
NetworkCallback callback = new NetworkCallback() {
|
NetworkCallback callback = new NetworkCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onLinkPropertiesChanged(Network n, LinkProperties lp) {
|
public void onLinkPropertiesChanged(Network n, LinkProperties lp) {
|
||||||
|
Log.i(TAG, "Link properties of network " + n + " changed to " + lp);
|
||||||
if (requiresValidatedServer && lp.getValidatedPrivateDnsServers().isEmpty()) {
|
if (requiresValidatedServer && lp.getValidatedPrivateDnsServers().isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user