Support checking transport types in NetworkTemplate

This change verifies that:
 1. For a given match rule, if transports are specified, a deduced
    transport type should be included. For example, if MATCH_WIFI
    is specified, TRANSPORT_WIFI should be included if at least one
    transport is specified.

Flag: EXEMPT implemented in the counter-part CL
Test: atest ConnectivityCoverageTests --test-filter \
  'NetworkTemplate*' --update-device
Bug: 419123367
Change-Id: Ic8375e50c3587ef2b757d1c3241f97482d93808b
This commit is contained in:
Junyu Lai 2025-05-23 23:56:01 +08:00
commit 572575ee95

View file

@ -20,6 +20,8 @@ import android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
import android.net.NetworkCapabilities.TRANSPORT_ETHERNET
import android.net.NetworkCapabilities.TRANSPORT_SATELLITE
import android.net.NetworkCapabilities.TRANSPORT_TEST
import android.net.NetworkCapabilities.TRANSPORT_VPN
import android.net.NetworkCapabilities.TRANSPORT_WIFI
import android.net.NetworkStats.DEFAULT_NETWORK_ALL
import android.net.NetworkStats.METERED_ALL
@ -32,6 +34,7 @@ import android.net.NetworkTemplate.MATCH_CARRIER
import android.net.NetworkTemplate.MATCH_ETHERNET
import android.net.NetworkTemplate.MATCH_MOBILE
import android.net.NetworkTemplate.MATCH_PROXY
import android.net.NetworkTemplate.MATCH_TEST
import android.net.NetworkTemplate.MATCH_WIFI
import android.net.NetworkTemplate.NETWORK_TYPE_ALL
import android.net.NetworkTemplate.OEM_MANAGED_ALL
@ -50,6 +53,7 @@ import org.junit.runners.JUnit4
private const val TEST_IMSI1 = "imsi"
private const val TEST_WIFI_KEY1 = "wifiKey1"
private const val TEST_WIFI_KEY2 = "wifiKey2"
private const val INVALID_TRANSPORT = 100
@RunWith(JUnit4::class)
@ConnectivityModuleTest
@ -306,6 +310,7 @@ class NetworkTemplateTest {
assertGetSetTransportTypes(MATCH_PROXY, TRANSPORT_BLUETOOTH)
assertGetSetTransportTypes(MATCH_CARRIER, TRANSPORT_CELLULAR)
assertGetSetTransportTypes(MATCH_CARRIER, TRANSPORT_WIFI)
assertGetSetTransportTypes(MATCH_TEST, TRANSPORT_TEST)
}
private fun assertGetSetTransportTypes(matchRule: Int, transport: Int) {
@ -318,4 +323,69 @@ class NetworkTemplateTest {
assertEquals(1, template.transportTypes.size)
assertEquals(transport, template.transportTypes[0])
}
@Test
fun testValidateTransportTypesNoTransportsSetSuccess() {
// Should succeed for any match rule if no transports are explicitly set.
listOf(
MATCH_WIFI,
MATCH_MOBILE,
MATCH_ETHERNET,
MATCH_BLUETOOTH,
MATCH_PROXY,
MATCH_TEST
).forEach { matchRule ->
NetworkTemplate.Builder(matchRule)
.setTransportTypes(intArrayOf()) // Explicitly empty, or just don't call it
.build() // Should not throw
}
NetworkTemplate.Builder(MATCH_CARRIER)
.setSubscriberIds(setOf(TEST_IMSI1))
.setTransportTypes(intArrayOf())
.build() // Should not throw
}
@Test
fun testValidateTransportTypesDeducedTransportPlusCompatibleSuccess() {
NetworkTemplate.Builder(MATCH_WIFI)
.setTransportTypes(intArrayOf(TRANSPORT_WIFI, TRANSPORT_VPN))
.build()
NetworkTemplate.Builder(MATCH_MOBILE)
.setTransportTypes(intArrayOf(TRANSPORT_CELLULAR, TRANSPORT_TEST))
.build()
}
@Test
fun testValidateTransportTypesDeducedTransportMissingThrows() {
assertFailsWith<IllegalArgumentException> {
NetworkTemplate.Builder(MATCH_WIFI)
.setTransportTypes(intArrayOf(TRANSPORT_CELLULAR))
.build()
}
assertFailsWith<IllegalArgumentException> {
NetworkTemplate.Builder(MATCH_MOBILE)
.setTransportTypes(intArrayOf(TRANSPORT_WIFI))
.build()
}
assertFailsWith<IllegalArgumentException> {
NetworkTemplate.Builder(MATCH_ETHERNET)
.setTransportTypes(intArrayOf(TRANSPORT_WIFI))
.build()
}
assertFailsWith<IllegalArgumentException> {
NetworkTemplate.Builder(MATCH_CARRIER)
.setTransportTypes(intArrayOf(TRANSPORT_SATELLITE))
.build()
}
assertFailsWith<IllegalArgumentException> {
NetworkTemplate.Builder(MATCH_TEST)
.setTransportTypes(intArrayOf(TRANSPORT_SATELLITE))
.build()
}
assertFailsWith<IllegalArgumentException> {
NetworkTemplate.Builder(MATCH_TEST)
.setTransportTypes(intArrayOf(INVALID_TRANSPORT))
.build()
}
}
}