Merge changes Ic4b586ae,I1b1345a6,I468ef544,I61b6263e into main

* changes:
  Grant prohr temporary ownership of ApfIntegrationTests
  Pause APF filter before starting test
  Enable new ApfFilter experiment in CTS test
  Move retrieving APF capabilities into helper function
This commit is contained in:
Maciej Żenczykowski 2024-04-02 03:41:31 +00:00 • committed by Gerrit Code Review
commit 609bfabfdd
2 changed files with 42 additions and 8 deletions

View file

@ -9,4 +9,6 @@ per-file **IpSec* = benedictwong@google.com, nharold@google.com
# For incremental changes on EthernetManagerTest to increase coverage for existing behavior and for
# testing bug fixes.
per-file net/src/android/net/cts/EthernetManagerTest.kt = prohr@google.com #{LAST_RESORT_SUGGESTION}
# Temporary ownership to develop APF CTS tests.
per-file net/src/android/net/cts/ApfIntegrationTest.kt = prohr@google.com #{LAST_RESORT_SUGGESTION}

View file

@ -15,37 +15,62 @@
*/
package android.net.cts
import android.Manifest.permission.WRITE_DEVICE_CONFIG
import android.content.pm.PackageManager.FEATURE_WIFI
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import android.net.apf.ApfCapabilities
import android.os.Build
import android.platform.test.annotations.AppModeFull
import android.provider.DeviceConfig
import android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY
import android.system.OsConstants
import androidx.test.platform.app.InstrumentationRegistry
import com.android.compatibility.common.util.PropertyUtil.isVendorApiLevelNewerThan
import com.android.compatibility.common.util.SystemUtil
import com.android.compatibility.common.util.SystemUtil.runShellCommandOrThrow
import com.android.testutils.DevSdkIgnoreRule
import com.android.testutils.DevSdkIgnoreRunner
import com.android.testutils.NetworkStackModuleTest
import com.android.testutils.RecorderCallback.CallbackEntry.LinkPropertiesChanged
import com.android.testutils.TestableNetworkCallback
import com.android.testutils.runAsShell
import com.google.common.truth.Truth.assertThat
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
import org.junit.After
import org.junit.Assume.assumeTrue
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith
private const val TIMEOUT_MS = 2000L
private const val APF_NEW_RA_FILTER_VERSION = "apf_new_ra_filter_version"
@AppModeFull(reason = "CHANGE_NETWORK_STATE permission can't be granted to instant apps")
@RunWith(DevSdkIgnoreRunner::class)
@NetworkStackModuleTest
@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
class ApfIntegrationTest {
companion object {
@BeforeClass
@JvmStatic
fun setupOnce() {
// TODO: check that there is no active wifi network. Otherwise, ApfFilter has already been
// created.
// APF adb cmds are only implemented in ApfFilter.java. Enable experiment to prevent
// LegacyApfFilter.java from being used.
runAsShell(WRITE_DEVICE_CONFIG) {
DeviceConfig.setProperty(
NAMESPACE_CONNECTIVITY,
APF_NEW_RA_FILTER_VERSION,
"1", // value => force enabled
false // makeDefault
)
}
}
}
private val context by lazy { InstrumentationRegistry.getInstrumentation().context }
private val cm by lazy { context.getSystemService(ConnectivityManager::class.java)!! }
private val pm by lazy { context.packageManager }
@ -68,6 +93,7 @@ class ApfIntegrationTest {
ifname = assertNotNull(it.lp.interfaceName)
true
}
runShellCommandOrThrow("cmd network_stack apf $ifname pause")
}
@After
@ -75,17 +101,23 @@ class ApfIntegrationTest {
if (::networkCallback.isInitialized) {
cm.unregisterNetworkCallback(networkCallback)
}
runShellCommandOrThrow("cmd network_stack apf $ifname resume")
}
fun getApfCapabilities(): ApfCapabilities {
val caps = runShellCommandOrThrow("cmd network_stack apf $ifname capabilities").trim()
val (version, maxLen, packetFormat) = caps.split(",").map { it.toInt() }
return ApfCapabilities(version, maxLen, packetFormat)
}
@Test
fun testGetApfCapabilities() {
val caps = SystemUtil.runShellCommand("cmd network_stack apf $ifname capabilities").trim()
val (version, maxLen, packetFormat) = caps.split(",").map { it.toInt() }
assertEquals(4, version)
assertThat(maxLen).isAtLeast(1024)
val caps = getApfCapabilities()
assertThat(caps.apfVersionSupported).isEqualTo(4)
assertThat(caps.maximumApfProgramSize).isAtLeast(1024)
if (isVendorApiLevelNewerThan(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)) {
assertThat(maxLen).isAtLeast(2000)
assertThat(caps.maximumApfProgramSize).isAtLeast(2000)
}
assertEquals(OsConstants.ARPHRD_ETHER, packetFormat)
assertThat(caps.apfPacketFormat).isEqualTo(OsConstants.ARPHRD_ETHER)
}
}