Implement the "actively prefer bad wifi" feature
Test: in progress Change-Id: Ib7aba464a2f32642d434418842306dfcf90b8319
This commit is contained in:
@@ -17,6 +17,7 @@
|
||||
package com.android.server.connectivity
|
||||
|
||||
import android.net.NetworkCapabilities
|
||||
import android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL
|
||||
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
|
||||
import android.net.NetworkCapabilities.TRANSPORT_WIFI
|
||||
import android.net.NetworkScore.KEEP_CONNECTED_NONE
|
||||
@@ -25,25 +26,29 @@ import android.net.NetworkScore.POLICY_TRANSPORT_PRIMARY
|
||||
import android.net.NetworkScore.POLICY_YIELD_TO_BAD_WIFI
|
||||
import android.os.Build
|
||||
import androidx.test.filters.SmallTest
|
||||
import com.android.connectivity.resources.R
|
||||
import com.android.server.connectivity.FullScore.POLICY_AVOIDED_WHEN_UNVALIDATED
|
||||
import com.android.server.connectivity.FullScore.POLICY_EVER_EVALUATED
|
||||
import com.android.server.connectivity.FullScore.POLICY_EVER_VALIDATED
|
||||
import com.android.server.connectivity.FullScore.POLICY_IS_VALIDATED
|
||||
import com.android.testutils.DevSdkIgnoreRule
|
||||
import com.android.testutils.DevSdkIgnoreRunner
|
||||
import org.junit.Rule
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.Parameterized
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
private fun score(vararg policies: Int) = FullScore(
|
||||
policies.fold(0L) { acc, e -> acc or (1L shl e) }, KEEP_CONNECTED_NONE)
|
||||
private fun caps(transport: Int) = NetworkCapabilities.Builder().addTransportType(transport).build()
|
||||
private fun caps(transport: Int, vararg capabilities: Int) =
|
||||
NetworkCapabilities.Builder().addTransportType(transport).apply {
|
||||
capabilities.forEach { addCapability(it) }
|
||||
}.build()
|
||||
|
||||
@SmallTest
|
||||
@RunWith(DevSdkIgnoreRunner::class)
|
||||
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
|
||||
class NetworkRankerTest {
|
||||
private val mRanker = NetworkRanker(NetworkRanker.Configuration(
|
||||
false /* activelyPreferBadWifi */))
|
||||
@RunWith(Parameterized::class)
|
||||
class NetworkRankerTest(private val activelyPreferBadWifi: Boolean) {
|
||||
private val mRanker = NetworkRanker(NetworkRanker.Configuration(activelyPreferBadWifi))
|
||||
|
||||
private class TestScore(private val sc: FullScore, private val nc: NetworkCapabilities)
|
||||
: NetworkRanker.Scoreable {
|
||||
@@ -51,35 +56,91 @@ class NetworkRankerTest {
|
||||
override fun getCapsNoCopy(): NetworkCapabilities = nc
|
||||
}
|
||||
|
||||
@get:Rule
|
||||
val mIgnoreRule: DevSdkIgnoreRule = DevSdkIgnoreRule(ignoreClassUpTo = Build.VERSION_CODES.R)
|
||||
|
||||
companion object {
|
||||
@JvmStatic
|
||||
@Parameterized.Parameters
|
||||
fun ranker() = listOf(true, false)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testYieldToBadWiFiOneCell() {
|
||||
// Only cell, it wins
|
||||
val winner = TestScore(score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
val winner = TestScore(
|
||||
score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED, POLICY_EVER_EVALUATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
val scores = listOf(winner)
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testPreferBadWifiOneCellOneEvaluatingWifi() {
|
||||
// TODO : refactor the tests to name each network like this test
|
||||
val wifi = TestScore(score(), caps(TRANSPORT_WIFI))
|
||||
val cell = TestScore(
|
||||
score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED, POLICY_EVER_EVALUATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
assertEquals(cell, mRanker.getBestNetworkByPolicy(listOf(wifi, cell), null))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testYieldToBadWiFiOneCellOneBadWiFi() {
|
||||
// Bad wifi wins against yielding validated cell
|
||||
val winner = TestScore(score(POLICY_EVER_VALIDATED), caps(TRANSPORT_WIFI))
|
||||
val winner = TestScore(score(POLICY_EVER_VALIDATED, POLICY_EVER_EVALUATED),
|
||||
caps(TRANSPORT_WIFI))
|
||||
val scores = listOf(
|
||||
winner,
|
||||
TestScore(score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
TestScore(
|
||||
score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED, POLICY_EVER_EVALUATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
)
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testPreferBadWifiOneCellOneBadWifi() {
|
||||
val wifi = TestScore(score(POLICY_EVER_EVALUATED), caps(TRANSPORT_WIFI))
|
||||
val cell = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
val scores = listOf(wifi, cell)
|
||||
val winner = if (activelyPreferBadWifi) wifi else cell
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testPreferBadWifiOneCellOneCaptivePortalWifi() {
|
||||
val wifi = TestScore(score(POLICY_EVER_EVALUATED),
|
||||
caps(TRANSPORT_WIFI, NET_CAPABILITY_CAPTIVE_PORTAL))
|
||||
val cell = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
assertEquals(cell, mRanker.getBestNetworkByPolicy(listOf(wifi, cell), null))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testYieldToBadWifiOneCellOneCaptivePortalWifiThatClosed() {
|
||||
val wifi = TestScore(score(POLICY_EVER_EVALUATED, POLICY_EVER_VALIDATED),
|
||||
caps(TRANSPORT_WIFI, NET_CAPABILITY_CAPTIVE_PORTAL))
|
||||
val cell = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
assertEquals(wifi, mRanker.getBestNetworkByPolicy(listOf(wifi, cell), null))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testYieldToBadWifiAvoidUnvalidated() {
|
||||
// Bad wifi avoided when unvalidated loses against yielding validated cell
|
||||
val winner = TestScore(score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
val winner = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
val scores = listOf(
|
||||
winner,
|
||||
TestScore(score(POLICY_EVER_VALIDATED, POLICY_AVOIDED_WHEN_UNVALIDATED),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_EVER_VALIDATED,
|
||||
POLICY_AVOIDED_WHEN_UNVALIDATED),
|
||||
caps(TRANSPORT_WIFI))
|
||||
)
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
@@ -88,12 +149,16 @@ class NetworkRankerTest {
|
||||
@Test
|
||||
fun testYieldToBadWiFiOneCellTwoBadWiFi() {
|
||||
// Bad wifi wins against yielding validated cell. Prefer the one that's primary.
|
||||
val winner = TestScore(score(POLICY_EVER_VALIDATED,
|
||||
POLICY_TRANSPORT_PRIMARY), caps(TRANSPORT_WIFI))
|
||||
val winner = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_EVER_VALIDATED, POLICY_TRANSPORT_PRIMARY),
|
||||
caps(TRANSPORT_WIFI))
|
||||
val scores = listOf(
|
||||
winner,
|
||||
TestScore(score(POLICY_EVER_VALIDATED), caps(TRANSPORT_WIFI)),
|
||||
TestScore(score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_EVER_VALIDATED),
|
||||
caps(TRANSPORT_WIFI)),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
)
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
@@ -103,11 +168,13 @@ class NetworkRankerTest {
|
||||
fun testYieldToBadWiFiOneCellTwoBadWiFiOneNotAvoided() {
|
||||
// Bad wifi ever validated wins against bad wifi that never was validated (or was
|
||||
// avoided when bad).
|
||||
val winner = TestScore(score(POLICY_EVER_VALIDATED), caps(TRANSPORT_WIFI))
|
||||
val winner = TestScore(score(POLICY_EVER_EVALUATED, POLICY_EVER_VALIDATED),
|
||||
caps(TRANSPORT_WIFI))
|
||||
val scores = listOf(
|
||||
winner,
|
||||
TestScore(score(), caps(TRANSPORT_WIFI)),
|
||||
TestScore(score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
TestScore(score(POLICY_EVER_EVALUATED), caps(TRANSPORT_WIFI)),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
)
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
@@ -116,27 +183,49 @@ class NetworkRankerTest {
|
||||
@Test
|
||||
fun testYieldToBadWiFiOneCellOneBadWiFiOneGoodWiFi() {
|
||||
// Good wifi wins
|
||||
val winner = TestScore(score(POLICY_EVER_VALIDATED, POLICY_IS_VALIDATED),
|
||||
val winner = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_EVER_VALIDATED, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_WIFI))
|
||||
val scores = listOf(
|
||||
winner,
|
||||
TestScore(score(POLICY_EVER_VALIDATED, POLICY_TRANSPORT_PRIMARY),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_EVER_VALIDATED,
|
||||
POLICY_TRANSPORT_PRIMARY),
|
||||
caps(TRANSPORT_WIFI)),
|
||||
TestScore(score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
)
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testPreferBadWifiOneCellOneBadWifiOneEvaluatingWifi() {
|
||||
val cell = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
val badWifi = TestScore(score(POLICY_EVER_EVALUATED), caps(TRANSPORT_WIFI))
|
||||
val evaluatingWifi = TestScore(score(), caps(TRANSPORT_WIFI))
|
||||
val winner = if (activelyPreferBadWifi) badWifi else cell
|
||||
assertEquals(winner,
|
||||
mRanker.getBestNetworkByPolicy(listOf(cell, badWifi, evaluatingWifi), null))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testYieldToBadWiFiTwoCellsOneBadWiFi() {
|
||||
// Cell that doesn't yield wins over cell that yields and bad wifi
|
||||
val winner = TestScore(score(POLICY_IS_VALIDATED), caps(TRANSPORT_CELLULAR))
|
||||
val winner = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
val scores = listOf(
|
||||
winner,
|
||||
TestScore(score(POLICY_EVER_VALIDATED, POLICY_TRANSPORT_PRIMARY),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_EVER_VALIDATED,
|
||||
POLICY_TRANSPORT_PRIMARY),
|
||||
caps(TRANSPORT_WIFI)),
|
||||
TestScore(score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI,
|
||||
POLICY_EVER_VALIDATED, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
)
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
@@ -145,13 +234,20 @@ class NetworkRankerTest {
|
||||
@Test
|
||||
fun testYieldToBadWiFiTwoCellsOneBadWiFiOneGoodWiFi() {
|
||||
// Good wifi wins over cell that doesn't yield and cell that yields
|
||||
val winner = TestScore(score(POLICY_IS_VALIDATED), caps(TRANSPORT_WIFI))
|
||||
val winner = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_WIFI))
|
||||
val scores = listOf(
|
||||
winner,
|
||||
TestScore(score(POLICY_EVER_VALIDATED, POLICY_TRANSPORT_PRIMARY),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_EVER_VALIDATED,
|
||||
POLICY_TRANSPORT_PRIMARY),
|
||||
caps(TRANSPORT_WIFI)),
|
||||
TestScore(score(POLICY_IS_VALIDATED), caps(TRANSPORT_CELLULAR)),
|
||||
TestScore(score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR)),
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
)
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
@@ -160,11 +256,14 @@ class NetworkRankerTest {
|
||||
@Test
|
||||
fun testYieldToBadWiFiOneExitingGoodWiFi() {
|
||||
// Yielding cell wins over good exiting wifi
|
||||
val winner = TestScore(score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
val winner = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
val scores = listOf(
|
||||
winner,
|
||||
TestScore(score(POLICY_IS_VALIDATED, POLICY_EXITING), caps(TRANSPORT_WIFI))
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_IS_VALIDATED, POLICY_EXITING),
|
||||
caps(TRANSPORT_WIFI))
|
||||
)
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
}
|
||||
@@ -172,11 +271,14 @@ class NetworkRankerTest {
|
||||
@Test
|
||||
fun testYieldToBadWiFiOneExitingBadWiFi() {
|
||||
// Yielding cell wins over bad exiting wifi
|
||||
val winner = TestScore(score(POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
val winner = TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_YIELD_TO_BAD_WIFI, POLICY_IS_VALIDATED),
|
||||
caps(TRANSPORT_CELLULAR))
|
||||
val scores = listOf(
|
||||
winner,
|
||||
TestScore(score(POLICY_EVER_VALIDATED, POLICY_EXITING), caps(TRANSPORT_WIFI))
|
||||
TestScore(
|
||||
score(POLICY_EVER_EVALUATED, POLICY_EVER_VALIDATED, POLICY_EXITING),
|
||||
caps(TRANSPORT_WIFI))
|
||||
)
|
||||
assertEquals(winner, mRanker.getBestNetworkByPolicy(scores, null))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user