From 6b44e92fde71d0c0301e8aa9cc0114ce3d98c083 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Fri, 27 Nov 2020 15:26:31 +0900 Subject: [PATCH] Test for the current behaviour of updating a network's owner UID. The current behaviour is at least bizarre and arguably incorrect. Add a test to document the current behaviour so we can check that any changes we make to this behaviour are correct. Test: test-only change Change-Id: I345bd320eced96316d92e520f576ae06b8020d9f --- .../server/ConnectivityServiceTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 7a1cb25b2d..34b26789b7 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -1957,6 +1957,57 @@ public class ConnectivityServiceTest { doNetworkCallbacksSanitizationTest(false /* sanitized */); } + @Test + public void testOwnerUidChangeBug() throws Exception { + // Owner UIDs are not visible without location permission. + setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION); + + final NetworkCapabilities ncTemplate = new NetworkCapabilities(); + final int originalOwnerUid = Process.myUid(); + ncTemplate.setOwnerUid(originalOwnerUid); + + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, new LinkProperties(), + ncTemplate); + mWiFiNetworkAgent.connect(false); + waitForIdle(); + + // Send ConnectivityService an update to the mWiFiNetworkAgent's capabilities that changes + // its owner UID. + NetworkCapabilities agentCapabilities = mWiFiNetworkAgent.getNetworkCapabilities(); + assertEquals(originalOwnerUid, agentCapabilities.getOwnerUid()); + agentCapabilities.setOwnerUid(42); + mWiFiNetworkAgent.setNetworkCapabilities(agentCapabilities, true); + waitForIdle(); + + // Check that the owner UID is not updated. + NetworkCapabilities nc = mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()); + assertEquals(originalOwnerUid, nc.getOwnerUid()); + + // Make an unrelated change to the capabilities. + assertFalse(agentCapabilities.hasCapability(NET_CAPABILITY_NOT_CONGESTED)); + agentCapabilities.addCapability(NET_CAPABILITY_NOT_CONGESTED); + mWiFiNetworkAgent.setNetworkCapabilities(agentCapabilities, true); + waitForIdle(); + + // Check that both the capability change and the owner UID have been modified. + // The owner UID is -1 because it is visible only to the UID that owns the network. + nc = mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()); + assertEquals(-1, nc.getOwnerUid()); + assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_CONGESTED)); + + // Set the owner back to originalOwnerUid, update the capabilities, and check that it is + // visible again. + // TODO: should this even be possible? + agentCapabilities.setOwnerUid(originalOwnerUid); + agentCapabilities.removeCapability(NET_CAPABILITY_NOT_CONGESTED); + mWiFiNetworkAgent.setNetworkCapabilities(agentCapabilities, true); + waitForIdle(); + + nc = mCm.getNetworkCapabilities(mWiFiNetworkAgent.getNetwork()); + assertEquals(originalOwnerUid, nc.getOwnerUid()); + } + @Test public void testMultipleLingering() throws Exception { // This test would be flaky with the default 120ms timer: that is short enough that