diff --git a/tests/cts/OWNERS b/tests/cts/OWNERS index cb4ca59431..acf506deb3 100644 --- a/tests/cts/OWNERS +++ b/tests/cts/OWNERS @@ -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} diff --git a/tests/cts/net/src/android/net/cts/ApfIntegrationTest.kt b/tests/cts/net/src/android/net/cts/ApfIntegrationTest.kt index 3ecbdc63cc..0cdd5a860e 100644 --- a/tests/cts/net/src/android/net/cts/ApfIntegrationTest.kt +++ b/tests/cts/net/src/android/net/cts/ApfIntegrationTest.kt @@ -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) } }