Merge "Make a defensive copy when sending NetworkInfo change"

This commit is contained in:
Treehugger Robot 2022-04-28 09:29:27 +00:00 • committed by Gerrit Code Review
commit 8eda07cff7
2 changed files with 22 additions and 2 deletions

View file

@ -1076,11 +1076,12 @@ public abstract class NetworkAgent {
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public final void sendNetworkInfo(NetworkInfo networkInfo) {
queueOrSendNetworkInfo(new NetworkInfo(networkInfo));
queueOrSendNetworkInfo(networkInfo);
}
private void queueOrSendNetworkInfo(NetworkInfo networkInfo) {
queueOrSendMessage(reg -> reg.sendNetworkInfo(networkInfo));
final NetworkInfo ni = new NetworkInfo(networkInfo);
queueOrSendMessage(reg -> reg.sendNetworkInfo(ni));
}
/**

View file

@ -1275,4 +1275,23 @@ class NetworkAgentTest {
matchAllCallback.expectCallback<Lost>(wifiNetwork)
wifiAgent.expectCallback<OnNetworkUnwanted>()
}
@Test
fun testUnregisterAgentBeforeAgentFullyConnected() {
val specifier = UUID.randomUUID().toString()
val callback = TestableNetworkCallback()
val transports = intArrayOf(TRANSPORT_CELLULAR)
// Ensure this NetworkAgent is never unneeded by filing a request with its specifier.
requestNetwork(makeTestNetworkRequest(specifier = specifier), callback)
val nc = makeTestNetworkCapabilities(specifier, transports)
val agent = createNetworkAgent(realContext, initialNc = nc)
// Connect the agent
agent.register()
// Mark agent connected then unregister agent immediately. Verify that both available and
// lost callback should be sent still.
agent.markConnected()
agent.unregister()
callback.expectCallback<Available>(agent.network!!)
callback.eventuallyExpect<Lost> { it.network == agent.network }
}
}