From bd5745effa805a77de263e48444dfee1831f998e Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 22 Jun 2022 09:42:54 +0000 Subject: [PATCH] TestOnly: add setEthernetEnable support to EthernetManagerTest Also fix the bug in teardown that setIncludeTestInterfaces(false) should be called after the interfaces are destroyed, otherwise the call to ifaceListener.eventuallyExpect(ABSENT) may receive callbacks out of order (and it doesn't actually wait on the interface being removed properly). Test: atest EthernetManagerTest Change-Id: I6650c028c121d932f10219d04d40d1ad60d9d4d8 --- .../android/net/cts/EthernetManagerTest.kt | 41 ++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/tests/cts/net/src/android/net/cts/EthernetManagerTest.kt b/tests/cts/net/src/android/net/cts/EthernetManagerTest.kt index 458d225954..799ee0bc46 100644 --- a/tests/cts/net/src/android/net/cts/EthernetManagerTest.kt +++ b/tests/cts/net/src/android/net/cts/EthernetManagerTest.kt @@ -22,6 +22,8 @@ import android.content.Context import android.net.ConnectivityManager import android.net.EthernetManager import android.net.EthernetManager.InterfaceStateListener +import android.net.EthernetManager.ETHERNET_STATE_DISABLED +import android.net.EthernetManager.ETHERNET_STATE_ENABLED import android.net.EthernetManager.ROLE_CLIENT import android.net.EthernetManager.ROLE_NONE import android.net.EthernetManager.ROLE_SERVER @@ -44,6 +46,7 @@ import android.net.NetworkCapabilities.TRANSPORT_TEST import android.net.NetworkRequest import android.net.TestNetworkInterface import android.net.TestNetworkManager +import android.net.cts.EthernetManagerTest.EthernetStateListener.CallbackEntry.EthernetStateChanged import android.net.cts.EthernetManagerTest.EthernetStateListener.CallbackEntry.InterfaceStateChanged import android.os.Build import android.os.Handler @@ -77,6 +80,7 @@ import java.net.Inet6Address import java.util.concurrent.CompletableFuture import java.util.concurrent.ExecutionException import java.util.concurrent.TimeUnit +import java.util.function.IntConsumer import kotlin.test.assertEquals import kotlin.test.assertFailsWith import kotlin.test.assertFalse @@ -162,7 +166,7 @@ class EthernetManagerTest { private open class EthernetStateListener private constructor( private val history: ArrayTrackRecord - ) : InterfaceStateListener, + ) : InterfaceStateListener, IntConsumer, TrackRecord by history { constructor() : this(ArrayTrackRecord()) @@ -175,6 +179,8 @@ class EthernetManagerTest { val role: Int, val configuration: IpConfiguration? ) : CallbackEntry() + + data class EthernetStateChanged(val state: Int) : CallbackEntry() } override fun onInterfaceStateChanged( @@ -186,6 +192,10 @@ class EthernetManagerTest { add(InterfaceStateChanged(iface, state, role, cfg)) } + override fun accept(state: Int) { + add(EthernetStateChanged(state)) + } + fun expectCallback(expected: T): T { val event = pollForNextCallback() assertEquals(expected, event) @@ -196,6 +206,10 @@ class EthernetManagerTest { expectCallback(createChangeEvent(iface.name, state, role)) } + fun expectCallback(state: Int) { + expectCallback(EthernetStateChanged(state)) + } + fun createChangeEvent(iface: String, state: Int, role: Int) = InterfaceStateChanged(iface, state, role, if (state != STATE_ABSENT) DEFAULT_IP_CONFIGURATION else null) @@ -214,6 +228,10 @@ class EthernetManagerTest { eventuallyExpect(iface.name, state, role) } + fun eventuallyExpect(state: Int) { + assertNotNull(eventuallyExpect(EthernetStateChanged(state))) + } + fun assertNoCallback() { val cb = events.poll(NO_CALLBACK_TIMEOUT_MS) assertNull(cb, "Expected no callback but got $cb") @@ -285,11 +303,17 @@ class EthernetManagerTest { @After fun tearDown() { - setIncludeTestInterfaces(false) + // Reenable ethernet, so ABSENT callbacks are received. + setEthernetEnabled(true) + for (iface in createdIfaces) { iface.destroy() ifaceListener.eventuallyExpect(iface, STATE_ABSENT, ROLE_NONE) } + + // After test interfaces are removed, disable tracking. + setIncludeTestInterfaces(false) + for (listener in addedListeners) { em.removeInterfaceStateListener(listener) } @@ -396,6 +420,19 @@ class EthernetManagerTest { } } + private fun setEthernetEnabled(enabled: Boolean) { + runAsShell(NETWORK_SETTINGS) { em.setEthernetEnabled(enabled) } + + val listener = EthernetStateListener() + em.addEthernetStateListener(handler::post, listener) + try { + listener.eventuallyExpect( + if (enabled) ETHERNET_STATE_ENABLED else ETHERNET_STATE_DISABLED) + } finally { + em.removeEthernetStateListener(listener) + } + } + // NetworkRequest.Builder does not create a copy of the passed NetworkRequest, so in order to // keep ETH_REQUEST as it is, a defensive copy is created here. private fun NetworkRequest.createCopyWithEthernetSpecifier(ifaceName: String) =