Merge "Fix NetworkScoreTest flake"

This commit is contained in:
Treehugger Robot
2023-05-02 12:11:49 +00:00
committed by Gerrit Code Review

View File

@@ -30,6 +30,7 @@ import android.net.VpnTransportInfo
import android.os.Build import android.os.Build
import android.os.Handler import android.os.Handler
import android.os.HandlerThread import android.os.HandlerThread
import android.util.Log
import androidx.test.InstrumentationRegistry import androidx.test.InstrumentationRegistry
import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
@@ -41,6 +42,7 @@ import org.junit.After
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import java.util.Collections
// This test doesn't really have a constraint on how fast the methods should return. If it's // This test doesn't really have a constraint on how fast the methods should return. If it's
// going to fail, it will simply wait forever, so setting a high timeout lowers the flake ratio // going to fail, it will simply wait forever, so setting a high timeout lowers the flake ratio
@@ -64,10 +66,11 @@ private fun score(exiting: Boolean = false, primary: Boolean = false) =
@IgnoreUpTo(Build.VERSION_CODES.R) @IgnoreUpTo(Build.VERSION_CODES.R)
@RunWith(DevSdkIgnoreRunner::class) @RunWith(DevSdkIgnoreRunner::class)
class NetworkScoreTest { class NetworkScoreTest {
private val TAG = javaClass.simpleName
private val mCm = testContext.getSystemService(ConnectivityManager::class.java) private val mCm = testContext.getSystemService(ConnectivityManager::class.java)
private val mHandlerThread = HandlerThread("${javaClass.simpleName} handler thread") private val mHandlerThread = HandlerThread("$TAG handler thread")
private val mHandler by lazy { Handler(mHandlerThread.looper) } private val mHandler by lazy { Handler(mHandlerThread.looper) }
private val agentsToCleanUp = mutableListOf<NetworkAgent>() private val agentsToCleanUp = Collections.synchronizedList(mutableListOf<NetworkAgent>())
private val callbacksToCleanUp = mutableListOf<TestableNetworkCallback>() private val callbacksToCleanUp = mutableListOf<TestableNetworkCallback>()
@Before @Before
@@ -83,15 +86,18 @@ class NetworkScoreTest {
.addTransportType(NetworkCapabilities.TRANSPORT_TEST).build(), cb, mHandler .addTransportType(NetworkCapabilities.TRANSPORT_TEST).build(), cb, mHandler
) )
} }
Log.i(TAG, "Teardown on thread ${System.identityHashCode(Thread.currentThread())} " +
"cleaning up ${agentsToCleanUp.size} agents")
agentsToCleanUp.forEach { agentsToCleanUp.forEach {
Log.i(TAG, "Unregister agent for net ${it.network}")
it.unregister() it.unregister()
agentCleanUpCb.eventuallyExpect<CallbackEntry.Lost> { cb -> cb.network == it.network } agentCleanUpCb.eventuallyExpect<CallbackEntry.Lost> { cb -> cb.network == it.network }
} }
mCm.unregisterNetworkCallback(agentCleanUpCb) mCm.unregisterNetworkCallback(agentCleanUpCb)
callbacksToCleanUp.forEach { mCm.unregisterNetworkCallback(it) }
mHandlerThread.quitSafely() mHandlerThread.quitSafely()
mHandlerThread.join() mHandlerThread.join()
callbacksToCleanUp.forEach { mCm.unregisterNetworkCallback(it) }
} }
// Returns a networkCallback that sends onAvailable on the best network with TRANSPORT_TEST. // Returns a networkCallback that sends onAvailable on the best network with TRANSPORT_TEST.
@@ -145,6 +151,8 @@ class NetworkScoreTest {
val agent = object : NetworkAgent(context, looper, "NetworkScore test agent", nc, val agent = object : NetworkAgent(context, looper, "NetworkScore test agent", nc,
LinkProperties(), score, config, NetworkProvider(context, looper, LinkProperties(), score, config, NetworkProvider(context, looper,
"NetworkScore test provider")) {}.also { "NetworkScore test provider")) {}.also {
Log.i(TAG, "Add on thread ${System.identityHashCode(Thread.currentThread())} " +
"agent to clean up $it")
agentsToCleanUp.add(it) agentsToCleanUp.add(it)
} }
runWithShellPermissionIdentity({ agent.register() }, MANAGE_TEST_NETWORKS) runWithShellPermissionIdentity({ agent.register() }, MANAGE_TEST_NETWORKS)