diff --git a/framework-t/src/android/net/TrafficStats.java b/framework-t/src/android/net/TrafficStats.java index 5eed3b53ad..caf3152008 100644 --- a/framework-t/src/android/net/TrafficStats.java +++ b/framework-t/src/android/net/TrafficStats.java @@ -17,8 +17,6 @@ package android.net; import static android.annotation.SystemApi.Client.MODULE_LIBRARIES; -import static android.net.NetworkStats.UID_ALL; -import static android.os.Process.SYSTEM_UID; import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE; @@ -188,8 +186,6 @@ public class TrafficStats { private static INetworkStatsService sStatsService; @GuardedBy("TrafficStats.class") private static INetworkStatsService sStatsServiceForTest = null; - @GuardedBy("TrafficStats.class") - private static int sMyUidForTest = UID_ALL; @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562) private synchronized static INetworkStatsService getStatsService() { @@ -202,12 +198,7 @@ public class TrafficStats { } /** @hide */ - protected static int getMyUid() { - synchronized (TrafficStats.class) { - if (sMyUidForTest != UID_ALL) { - return sMyUidForTest; - } - } + private static int getMyUid() { return android.os.Process.myUid(); } @@ -223,18 +214,6 @@ public class TrafficStats { } } - /** - * Set myUid for test, or UID_ALL to reset. - * - * @hide - */ - @VisibleForTesting(visibility = PRIVATE) - public static void setMyUidForTest(int myUid) { - synchronized (TrafficStats.class) { - sMyUidForTest = myUid; - } - } - /** * Snapshot of {@link NetworkStats} when the currently active profiling * session started, or {@code null} if no session active. @@ -1006,13 +985,6 @@ public class TrafficStats { /** @hide */ public static long getUidStats(int uid, int type) { - // Perform a quick check on the UID to avoid unnecessary work. - // This mirrors a similar check on the service side, but is primarily for - // efficiency rather than security, as user-space checks can be bypassed. - final int myUid = getMyUid(); - if (!isEntryValueTypeValid(type) || (myUid != SYSTEM_UID && myUid != uid)) { - return UNSUPPORTED; - } final StatsResult stats; try { stats = getStatsService().getUidStats(uid); @@ -1024,9 +996,6 @@ public class TrafficStats { /** @hide */ public static long getTotalStats(int type) { - if (!isEntryValueTypeValid(type)) { - return UNSUPPORTED; - } final StatsResult stats; try { stats = getStatsService().getTotalStats(); @@ -1038,9 +1007,6 @@ public class TrafficStats { /** @hide */ public static long getIfaceStats(String iface, int type) { - if (!isEntryValueTypeValid(type)) { - return UNSUPPORTED; - } final StatsResult stats; try { stats = getStatsService().getIfaceStats(iface); diff --git a/tests/unit/java/android/net/TrafficStatsTest.kt b/tests/unit/java/android/net/TrafficStatsTest.kt deleted file mode 100644 index 6e8f3dbacd..0000000000 --- a/tests/unit/java/android/net/TrafficStatsTest.kt +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net - -import android.net.NetworkStats.UID_ALL -import android.net.TrafficStats.UNSUPPORTED -import android.net.netstats.StatsResult -import android.os.Build -import android.os.Process.SYSTEM_UID -import com.android.testutils.DevSdkIgnoreRule -import com.android.testutils.DevSdkIgnoreRunner -import org.junit.After -import org.junit.Assert.assertEquals -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.ArgumentMatchers.anyInt -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.mock -import org.mockito.Mockito.never -import org.mockito.Mockito.verify - -@RunWith(DevSdkIgnoreRunner::class) -@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.S_V2) -class TrafficStatsTest { - private val binder = mock(INetworkStatsService::class.java) - private val myUid = android.os.Process.myUid() - private val notMyUid = myUid + 1 - private val mockSystemUidStatsResult = StatsResult(1L, 2L, 3L, 4L) - private val mockMyUidStatsResult = StatsResult(5L, 6L, 7L, 8L) - private val mockNotMyUidStatsResult = StatsResult(9L, 10L, 11L, 12L) - private val unsupportedStatsResult = - StatsResult(UNSUPPORTED.toLong(), UNSUPPORTED.toLong(), - UNSUPPORTED.toLong(), UNSUPPORTED.toLong()) - - @Before - fun setUp() { - TrafficStats.setServiceForTest(binder) - doReturn(mockSystemUidStatsResult).`when`(binder).getUidStats(SYSTEM_UID) - doReturn(mockMyUidStatsResult).`when`(binder).getUidStats(myUid) - doReturn(mockNotMyUidStatsResult).`when`(binder).getUidStats(notMyUid) - } - - @After - fun tearDown() { - TrafficStats.setServiceForTest(null) - TrafficStats.setMyUidForTest(UID_ALL) - } - - private fun assertUidStats(uid: Int, stats: StatsResult) { - assertEquals(stats.rxBytes, TrafficStats.getUidRxBytes(uid)) - assertEquals(stats.rxPackets, TrafficStats.getUidRxPackets(uid)) - assertEquals(stats.txBytes, TrafficStats.getUidTxBytes(uid)) - assertEquals(stats.txPackets, TrafficStats.getUidTxPackets(uid)) - } - - // Verify a normal caller could get a quick UNSUPPORTED result in the TrafficStats - // without accessing the service if query stats other than itself. - @Test - fun testGetUidStats_appCaller() { - assertUidStats(SYSTEM_UID, unsupportedStatsResult) - assertUidStats(notMyUid, unsupportedStatsResult) - verify(binder, never()).getUidStats(anyInt()) - assertUidStats(myUid, mockMyUidStatsResult) - } - - // Verify that callers with SYSTEM_UID can access network - // stats for other UIDs. While this behavior is not officially documented - // in the API, it exists for compatibility with existing callers that may - // rely on it. - @Test - fun testGetUidStats_systemCaller() { - TrafficStats.setMyUidForTest(SYSTEM_UID) - assertUidStats(SYSTEM_UID, mockSystemUidStatsResult) - assertUidStats(myUid, mockMyUidStatsResult) - assertUidStats(notMyUid, mockNotMyUidStatsResult) - } -}