diff options
Diffstat (limited to 'tests')
40 files changed, 555 insertions, 264 deletions
diff --git a/tests/Camera2Tests/CameraToo/Android.mk b/tests/Camera2Tests/CameraToo/Android.mk index 7e5911d65bfa..33473143c8cb 100644 --- a/tests/Camera2Tests/CameraToo/Android.mk +++ b/tests/Camera2Tests/CameraToo/Android.mk @@ -17,6 +17,9 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_PACKAGE_NAME := CameraToo +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../NOTICE LOCAL_SDK_VERSION := current LOCAL_SRC_FILES := $(call all-java-files-under,src) diff --git a/tests/Camera2Tests/CameraToo/tests/Android.mk b/tests/Camera2Tests/CameraToo/tests/Android.mk index fe4dc42aa7d9..dfa64f1feade 100644 --- a/tests/Camera2Tests/CameraToo/tests/Android.mk +++ b/tests/Camera2Tests/CameraToo/tests/Android.mk @@ -17,6 +17,9 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests LOCAL_PACKAGE_NAME := CameraTooTests +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../../NOTICE LOCAL_INSTRUMENTATION_FOR := CameraToo LOCAL_SDK_VERSION := current LOCAL_SRC_FILES := $(call all-java-files-under,src) diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/Android.mk b/tests/Camera2Tests/SmartCamera/SimpleCamera/Android.mk index 4e3675f78edf..6003628ffb0d 100644 --- a/tests/Camera2Tests/SmartCamera/SimpleCamera/Android.mk +++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/Android.mk @@ -32,6 +32,9 @@ LOCAL_SRC_FILES := \ $(call all-renderscript-files-under, src) LOCAL_PACKAGE_NAME := SmartCamera +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../../NOTICE LOCAL_JNI_SHARED_LIBRARIES := libsmartcamera_jni include $(BUILD_PACKAGE) diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk b/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk index a9000774a13a..c23d593d4f86 100644 --- a/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk +++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/tests/Android.mk @@ -22,6 +22,9 @@ LOCAL_MODULE_TAGS := tests LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_PACKAGE_NAME := SmartCamera-tests +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../../../NOTICE LOCAL_SRC_FILES += $(call all-java-files-under, src) diff --git a/tests/CanvasCompare/Android.mk b/tests/CanvasCompare/Android.mk index 6a0a93e1bb24..b82ae65b4356 100644 --- a/tests/CanvasCompare/Android.mk +++ b/tests/CanvasCompare/Android.mk @@ -20,6 +20,9 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src) LOCAL_PACKAGE_NAME := CanvasCompare +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_MODULE_TAGS := tests diff --git a/tests/DynamicCodeLoggerIntegrationTests/Android.mk b/tests/DynamicCodeLoggerIntegrationTests/Android.mk index bfb5b076237a..dab83046c28f 100644 --- a/tests/DynamicCodeLoggerIntegrationTests/Android.mk +++ b/tests/DynamicCodeLoggerIntegrationTests/Android.mk @@ -89,4 +89,7 @@ LOCAL_JAVA_RESOURCE_FILES := \ $(dynamiccodeloggertest_jar) \ $(dynamiccodeloggertest_executable) \ +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE include $(BUILD_PACKAGE) diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt index 9ac504ba3e6f..96c7c0a4ae20 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt @@ -116,7 +116,7 @@ abstract class CloseAppTransition(protected val testSpec: FlickerTestParameter) } } - @Presubmit + @FlakyTest(bugId = 185400889) @Test open fun noUncoveredRegions() { testSpec.noUncoveredRegions(testSpec.config.startRotation, Surface.ROTATION_0) @@ -134,7 +134,7 @@ abstract class CloseAppTransition(protected val testSpec: FlickerTestParameter) testSpec.launcherWindowBecomesVisible() } - @Presubmit + @FlakyTest(bugId = 185400889) @Test open fun launcherLayerReplacesApp() { testSpec.launcherLayerReplacesApp(testApp) diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt index cdec51d25d7f..7bc004f6c6d9 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt @@ -50,6 +50,7 @@ import org.junit.runners.Parameterized @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) +@FlakyTest(bugId = 185400889) class CloseImeWindowToAppTest(private val testSpec: FlickerTestParameter) { private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() private val testApp = ImeAppHelper(instrumentation) diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt index 559d95376b65..5703e6cfae48 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppColdTest.kt @@ -39,6 +39,7 @@ import org.junit.runners.Parameterized @RunWith(Parameterized::class) @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) +@FlakyTest(bugId = 185400889) class OpenAppColdTest(testSpec: FlickerTestParameter) : OpenAppTransition(testSpec) { override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit get() = { diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java index 8be3b7e35d42..c06f8fd44c03 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/ColorFiltersMutateActivity.java @@ -60,7 +60,7 @@ public class ColorFiltersMutateActivity extends Activity { private float mShaderParam1 = 0.0f; static final String sSkSL = - "in shader bitmapShader;\n" + "uniform shader bitmapShader;\n" + "uniform float param1;\n" + "half4 main(float2 xy) {\n" + " return half4(sample(bitmapShader, xy).rgb, param1);\n" diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java index 487c8566ce37..79410cf35f7a 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/RippleActivity.java @@ -89,7 +89,7 @@ public class RippleActivity extends Activity { + " d = rand(float2(x, y)) > density ? d : d * .2;\n" + " d = d * rand(float2(fraction, x * y));\n" + " float alpha = 1. - pow(fraction, 3.);\n" - + " return float4(sample(in_paintColor).rgb, d * alpha);\n" + + " return float4(sample(in_paintColor, p).rgb, d * alpha);\n" + "}"; RippleView(Context c) { diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java index 912aee686924..ade94a9672bc 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/StretchShaderActivity.java @@ -440,7 +440,7 @@ public class StretchShaderActivity extends Activity { } } - private static final String SKSL = "in shader uContentTexture;\n" + private static final String SKSL = "uniform shader uContentTexture;\n" + "uniform float uMaxStretchIntensity; // multiplier to apply to scale effect\n" + "uniform float uStretchAffectedDist; // Maximum percentage to stretch beyond bounds" + " of target\n" diff --git a/tests/LockTaskTests/Android.mk b/tests/LockTaskTests/Android.mk index a693eaa4da04..5406ee19041b 100644 --- a/tests/LockTaskTests/Android.mk +++ b/tests/LockTaskTests/Android.mk @@ -5,6 +5,9 @@ LOCAL_MODULE_TAGS := optional LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/priv-app LOCAL_PACKAGE_NAME := LockTaskTests +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE LOCAL_SDK_VERSION := current LOCAL_CERTIFICATE := platform diff --git a/tests/SoundTriggerTests/Android.mk b/tests/SoundTriggerTests/Android.mk index 204a74eed882..cc0fa1cd0840 100644 --- a/tests/SoundTriggerTests/Android.mk +++ b/tests/SoundTriggerTests/Android.mk @@ -31,6 +31,9 @@ LOCAL_STATIC_JAVA_LIBRARIES := mockito-target LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base LOCAL_PACKAGE_NAME := SoundTriggerTests +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE LOCAL_PRIVATE_PLATFORM_APIS := true include $(BUILD_PACKAGE) diff --git a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java index 032da3f0af75..74f6bca4d7a0 100644 --- a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java +++ b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java @@ -19,6 +19,8 @@ package com.android.updatablesystemfont; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; +import static java.util.concurrent.TimeUnit.SECONDS; + import android.platform.test.annotations.RootPermissionTest; import com.android.fsverity.AddFsVerityCertRule; @@ -35,7 +37,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -77,6 +78,7 @@ public class UpdatableSystemFontTest extends BaseHostJUnit4Test { private static final String EMOJI_RENDERING_TEST_APP_ID = "com.android.emojirenderingtestapp"; private static final String EMOJI_RENDERING_TEST_ACTIVITY = EMOJI_RENDERING_TEST_APP_ID + "/.EmojiRenderingTestActivity"; + private static final long ACTIVITY_TIMEOUT_MILLIS = SECONDS.toMillis(10); private interface ThrowingSupplier<T> { T get() throws Exception; @@ -167,9 +169,8 @@ public class UpdatableSystemFontTest extends BaseHostJUnit4Test { public void launchApp() throws Exception { String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF); assertThat(fontPath).startsWith(SYSTEM_FONTS_DIR); - expectRemoteCommandToSucceed("am force-stop " + EMOJI_RENDERING_TEST_APP_ID); - expectRemoteCommandToSucceed("am start-activity -n " + EMOJI_RENDERING_TEST_ACTIVITY); - waitUntil(TimeUnit.SECONDS.toMillis(5), () -> + startActivity(EMOJI_RENDERING_TEST_APP_ID, EMOJI_RENDERING_TEST_ACTIVITY); + waitUntil(ACTIVITY_TIMEOUT_MILLIS, () -> isFileOpenedBy(fontPath, EMOJI_RENDERING_TEST_APP_ID)); } @@ -181,10 +182,9 @@ public class UpdatableSystemFontTest extends BaseHostJUnit4Test { TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF, TEST_NOTO_COLOR_EMOJI_VPLUS1_TTF_FSV_SIG)); String updatedFontPath = getFontPath(NOTO_COLOR_EMOJI_TTF); assertThat(updatedFontPath).startsWith(DATA_FONTS_DIR); - expectRemoteCommandToSucceed("am force-stop " + EMOJI_RENDERING_TEST_APP_ID); - expectRemoteCommandToSucceed("am start-activity -n " + EMOJI_RENDERING_TEST_ACTIVITY); + startActivity(EMOJI_RENDERING_TEST_APP_ID, EMOJI_RENDERING_TEST_ACTIVITY); // The original font should NOT be opened by the app. - waitUntil(TimeUnit.SECONDS.toMillis(5), () -> + waitUntil(ACTIVITY_TIMEOUT_MILLIS, () -> isFileOpenedBy(updatedFontPath, EMOJI_RENDERING_TEST_APP_ID) && !isFileOpenedBy(originalFontPath, EMOJI_RENDERING_TEST_APP_ID)); } @@ -196,9 +196,8 @@ public class UpdatableSystemFontTest extends BaseHostJUnit4Test { String fontPath = getFontPath(NOTO_COLOR_EMOJI_TTF); assertThat(fontPath).startsWith(DATA_FONTS_DIR); - expectRemoteCommandToSucceed("stop"); - expectRemoteCommandToSucceed("start"); - waitUntilFontCommandIsReady(); + // Emulate reboot by 'cmd font restart'. + expectRemoteCommandToSucceed("cmd font restart"); String fontPathAfterReboot = getFontPath(NOTO_COLOR_EMOJI_TTF); assertThat(fontPathAfterReboot).isEqualTo(fontPath); } @@ -216,6 +215,17 @@ public class UpdatableSystemFontTest extends BaseHostJUnit4Test { return null; } + private void startActivity(String appId, String activityId) throws Exception { + // Make sure that the app is installed and enabled. + waitUntil(ACTIVITY_TIMEOUT_MILLIS, () -> { + String packageInfo = expectRemoteCommandToSucceed( + "pm list packages -e " + EMOJI_RENDERING_TEST_APP_ID); + return !packageInfo.isEmpty(); + }); + expectRemoteCommandToSucceed("am force-stop " + EMOJI_RENDERING_TEST_APP_ID); + expectRemoteCommandToSucceed("am start-activity -n " + EMOJI_RENDERING_TEST_ACTIVITY); + } + private String expectRemoteCommandToSucceed(String cmd) throws Exception { CommandResult result = getDevice().executeShellV2Command(cmd); assertWithMessage("`" + cmd + "` failed: " + result.getStderr()) @@ -231,17 +241,6 @@ public class UpdatableSystemFontTest extends BaseHostJUnit4Test { .isNotEqualTo(CommandStatus.SUCCESS); } - private void waitUntilFontCommandIsReady() { - waitUntil(TimeUnit.SECONDS.toMillis(30), () -> { - try { - return getDevice().executeShellV2Command("cmd font status").getStatus() - == CommandStatus.SUCCESS; - } catch (DeviceNotAvailableException e) { - return false; - } - }); - } - private void waitUntil(long timeoutMillis, ThrowingSupplier<Boolean> func) { long untilMillis = System.currentTimeMillis() + timeoutMillis; do { diff --git a/tests/backup/Android.mk b/tests/backup/Android.mk index 9b155c930871..b6f34717658c 100644 --- a/tests/backup/Android.mk +++ b/tests/backup/Android.mk @@ -47,4 +47,7 @@ LOCAL_PRIVATE_PLATFORM_APIS := true LOCAL_PROGUARD_ENABLED := disabled +LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 +LOCAL_LICENSE_CONDITIONS := notice +LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../NOTICE include $(BUILD_PACKAGE) diff --git a/tests/net/TEST_MAPPING b/tests/net/TEST_MAPPING index d659688700d3..502f885ceb78 100644 --- a/tests/net/TEST_MAPPING +++ b/tests/net/TEST_MAPPING @@ -28,7 +28,7 @@ ], "imports": [ { - "path": "cts/tests/tests/net" + "path": "packages/modules/Connectivity" } ] }
\ No newline at end of file diff --git a/tests/net/common/java/ParseExceptionTest.kt b/tests/net/common/java/ParseExceptionTest.kt index f17715a099a3..b702d61a9fe1 100644 --- a/tests/net/common/java/ParseExceptionTest.kt +++ b/tests/net/common/java/ParseExceptionTest.kt @@ -15,16 +15,22 @@ */ import android.net.ParseException +import android.os.Build import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest +import com.android.testutils.DevSdkIgnoreRule import junit.framework.Assert.assertEquals import junit.framework.Assert.assertNull +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @SmallTest @RunWith(AndroidJUnit4::class) class ParseExceptionTest { + @get:Rule + val ignoreRule = DevSdkIgnoreRule(ignoreClassUpTo = Build.VERSION_CODES.R) + @Test fun testConstructor_WithCause() { val testMessage = "Test message" diff --git a/tests/net/common/java/android/net/NetworkTest.java b/tests/net/common/java/android/net/NetworkTest.java index cd9da8eaa727..7423c733c6eb 100644 --- a/tests/net/common/java/android/net/NetworkTest.java +++ b/tests/net/common/java/android/net/NetworkTest.java @@ -29,6 +29,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.testutils.DevSdkIgnoreRule; +import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter; import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo; import org.junit.Rule; @@ -158,16 +159,22 @@ public class NetworkTest { assertEquals(16290598925L, three.getNetworkHandle()); } + // getNetId() did not exist in Q + @Test @IgnoreUpTo(Build.VERSION_CODES.Q) + public void testGetNetId() { + assertEquals(1234, new Network(1234).getNetId()); + assertEquals(2345, new Network(2345, true).getNetId()); + } + @Test public void testFromNetworkHandle() { final Network network = new Network(1234); - assertEquals(network.getNetId(), - Network.fromNetworkHandle(network.getNetworkHandle()).getNetId()); + assertEquals(network.netId, Network.fromNetworkHandle(network.getNetworkHandle()).netId); } // Parsing private DNS bypassing handle was not supported until S @Test @IgnoreUpTo(Build.VERSION_CODES.R) - public void testFromNetworkHandle_S() { + public void testFromNetworkHandlePrivateDnsBypass_S() { final Network network = new Network(1234, true); final Network recreatedNetwork = Network.fromNetworkHandle(network.getNetworkHandle()); @@ -175,6 +182,16 @@ public class NetworkTest { assertEquals(network.getNetIdForResolv(), recreatedNetwork.getNetIdForResolv()); } + @Test @IgnoreAfter(Build.VERSION_CODES.R) + public void testFromNetworkHandlePrivateDnsBypass_R() { + final Network network = new Network(1234, true); + + final Network recreatedNetwork = Network.fromNetworkHandle(network.getNetworkHandle()); + assertEquals(network.netId, recreatedNetwork.netId); + // Until R included, fromNetworkHandle would not parse the private DNS bypass flag + assertEquals(network.netId, recreatedNetwork.getNetIdForResolv()); + } + @Test public void testGetPrivateDnsBypassingCopy() { final Network copy = mNetwork.getPrivateDnsBypassingCopy(); diff --git a/tests/net/common/java/android/net/UnderlyingNetworkInfoTest.kt b/tests/net/common/java/android/net/UnderlyingNetworkInfoTest.kt index 87cfb345e5e0..f23ba26d0039 100644 --- a/tests/net/common/java/android/net/UnderlyingNetworkInfoTest.kt +++ b/tests/net/common/java/android/net/UnderlyingNetworkInfoTest.kt @@ -36,15 +36,15 @@ class UnderlyingNetworkInfoTest { @Test fun testParcelUnparcel() { val testInfo = UnderlyingNetworkInfo(TEST_OWNER_UID, TEST_IFACE, TEST_IFACE_LIST) - assertEquals(TEST_OWNER_UID, testInfo.ownerUid) - assertEquals(TEST_IFACE, testInfo.iface) - assertEquals(TEST_IFACE_LIST, testInfo.underlyingIfaces) + assertEquals(TEST_OWNER_UID, testInfo.getOwnerUid()) + assertEquals(TEST_IFACE, testInfo.getInterface()) + assertEquals(TEST_IFACE_LIST, testInfo.getUnderlyingInterfaces()) assertParcelSane(testInfo, 3) val emptyInfo = UnderlyingNetworkInfo(0, String(), listOf()) - assertEquals(0, emptyInfo.ownerUid) - assertEquals(String(), emptyInfo.iface) - assertEquals(listOf(), emptyInfo.underlyingIfaces) + assertEquals(0, emptyInfo.getOwnerUid()) + assertEquals(String(), emptyInfo.getInterface()) + assertEquals(listOf(), emptyInfo.getUnderlyingInterfaces()) assertParcelSane(emptyInfo, 3) } }
\ No newline at end of file diff --git a/tests/net/integration/AndroidManifest.xml b/tests/net/integration/AndroidManifest.xml index db1850031ff5..2e1368935759 100644 --- a/tests/net/integration/AndroidManifest.xml +++ b/tests/net/integration/AndroidManifest.xml @@ -38,6 +38,8 @@ <!-- Reading DeviceConfig flags --> <uses-permission android:name="android.permission.READ_DEVICE_CONFIG"/> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/> + <!-- Querying the resources package --> + <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> <application android:debuggable="true"> <uses-library android:name="android.test.runner"/> diff --git a/tests/net/java/android/net/ConnectivityManagerTest.java b/tests/net/java/android/net/ConnectivityManagerTest.java index 19f884346e6f..591e0cc3504e 100644 --- a/tests/net/java/android/net/ConnectivityManagerTest.java +++ b/tests/net/java/android/net/ConnectivityManagerTest.java @@ -379,7 +379,7 @@ public class ConnectivityManagerTest { eq(testPkgName), eq(testAttributionTag)); reset(mService); - manager.registerDefaultNetworkCallbackAsUid(42, callback, handler); + manager.registerDefaultNetworkCallbackForUid(42, callback, handler); verify(mService).requestNetwork(eq(42), eq(null), eq(TRACK_DEFAULT.ordinal()), any(), anyInt(), any(), eq(TYPE_NONE), anyInt(), eq(testPkgName), eq(testAttributionTag)); diff --git a/tests/net/java/android/net/NetworkStatsTest.java b/tests/net/java/android/net/NetworkStatsTest.java index 735fa7cf3751..23d5a7e5d5f8 100644 --- a/tests/net/java/android/net/NetworkStatsTest.java +++ b/tests/net/java/android/net/NetworkStatsTest.java @@ -50,6 +50,7 @@ import com.google.android.collect.Sets; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Arrays; import java.util.HashSet; @RunWith(AndroidJUnit4.class) @@ -616,7 +617,7 @@ public class NetworkStatsTest { .insertEntry(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 0L, 0L, 0L, 0L, 0L); - delta.migrateTun(tunUid, tunIface, new String[]{underlyingIface}); + delta.migrateTun(tunUid, tunIface, Arrays.asList(underlyingIface)); assertEquals(20, delta.size()); // tunIface and TEST_IFACE entries are not changed. @@ -697,7 +698,7 @@ public class NetworkStatsTest { .insertEntry(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, 75500L, 37L, 130000L, 70L, 0L); - delta.migrateTun(tunUid, tunIface, new String[]{underlyingIface}); + delta.migrateTun(tunUid, tunIface, Arrays.asList(underlyingIface)); assertEquals(9, delta.size()); // tunIface entries should not be changed. diff --git a/tests/net/java/android/net/NetworkTemplateTest.kt b/tests/net/java/android/net/NetworkTemplateTest.kt index 64b774cc4340..ab6b2f409867 100644 --- a/tests/net/java/android/net/NetworkTemplateTest.kt +++ b/tests/net/java/android/net/NetworkTemplateTest.kt @@ -31,11 +31,16 @@ import android.net.NetworkTemplate.MATCH_MOBILE import android.net.NetworkTemplate.MATCH_MOBILE_WILDCARD import android.net.NetworkTemplate.MATCH_WIFI import android.net.NetworkTemplate.MATCH_WIFI_WILDCARD +import android.net.NetworkTemplate.WIFI_NETWORKID_ALL import android.net.NetworkTemplate.NETWORK_TYPE_5G_NSA import android.net.NetworkTemplate.NETWORK_TYPE_ALL import android.net.NetworkTemplate.OEM_MANAGED_ALL import android.net.NetworkTemplate.OEM_MANAGED_NO import android.net.NetworkTemplate.OEM_MANAGED_YES +import android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT +import android.net.NetworkTemplate.buildTemplateWifi +import android.net.NetworkTemplate.buildTemplateWifiWildcard +import android.net.NetworkTemplate.buildTemplateCarrier import android.net.NetworkTemplate.buildTemplateMobileWithRatType import android.telephony.TelephonyManager import com.android.testutils.assertParcelSane @@ -53,6 +58,7 @@ import kotlin.test.assertTrue private const val TEST_IMSI1 = "imsi1" private const val TEST_IMSI2 = "imsi2" private const val TEST_SSID1 = "ssid1" +private const val TEST_SSID2 = "ssid2" @RunWith(JUnit4::class) class NetworkTemplateTest { @@ -60,8 +66,8 @@ class NetworkTemplateTest { private fun buildMobileNetworkState(subscriberId: String): NetworkStateSnapshot = buildNetworkState(TYPE_MOBILE, subscriberId = subscriberId) - private fun buildWifiNetworkState(ssid: String): NetworkStateSnapshot = - buildNetworkState(TYPE_WIFI, ssid = ssid) + private fun buildWifiNetworkState(subscriberId: String?, ssid: String?): NetworkStateSnapshot = + buildNetworkState(TYPE_WIFI, subscriberId = subscriberId, ssid = ssid) private fun buildNetworkState( type: Int, @@ -94,6 +100,95 @@ class NetworkTemplateTest { } @Test + fun testWifiWildcardMatches() { + val templateWifiWildcard = buildTemplateWifiWildcard() + + val identMobileImsi1 = buildNetworkIdentity(mockContext, + buildMobileNetworkState(TEST_IMSI1), + false, TelephonyManager.NETWORK_TYPE_UMTS) + val identWifiImsiNullSsid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0) + val identWifiImsi1Ssid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID1), true, 0) + + templateWifiWildcard.assertDoesNotMatch(identMobileImsi1) + templateWifiWildcard.assertMatches(identWifiImsiNullSsid1) + templateWifiWildcard.assertMatches(identWifiImsi1Ssid1) + } + + @Test + fun testWifiMatches() { + val templateWifiSsid1 = buildTemplateWifi(TEST_SSID1) + val templateWifiSsid1ImsiNull = buildTemplateWifi(TEST_SSID1, null) + val templateWifiSsid1Imsi1 = buildTemplateWifi(TEST_SSID1, TEST_IMSI1) + val templateWifiSsidAllImsi1 = buildTemplateWifi(WIFI_NETWORKID_ALL, TEST_IMSI1) + + val identMobile1 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI1), + false, TelephonyManager.NETWORK_TYPE_UMTS) + val identWifiImsiNullSsid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0) + val identWifiImsi1Ssid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID1), true, 0) + val identWifiImsi2Ssid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI2, TEST_SSID1), true, 0) + val identWifiImsi1Ssid2 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID2), true, 0) + + // Verify that template with SSID only matches any subscriberId and specific SSID. + templateWifiSsid1.assertDoesNotMatch(identMobile1) + templateWifiSsid1.assertMatches(identWifiImsiNullSsid1) + templateWifiSsid1.assertMatches(identWifiImsi1Ssid1) + templateWifiSsid1.assertMatches(identWifiImsi2Ssid1) + templateWifiSsid1.assertDoesNotMatch(identWifiImsi1Ssid2) + + // Verify that template with SSID1 and null imsi matches any network with + // SSID1 and null imsi. + templateWifiSsid1ImsiNull.assertDoesNotMatch(identMobile1) + templateWifiSsid1ImsiNull.assertMatches(identWifiImsiNullSsid1) + templateWifiSsid1ImsiNull.assertDoesNotMatch(identWifiImsi1Ssid1) + templateWifiSsid1ImsiNull.assertDoesNotMatch(identWifiImsi2Ssid1) + templateWifiSsid1ImsiNull.assertDoesNotMatch(identWifiImsi1Ssid2) + + // Verify that template with SSID1 and imsi1 matches any network with + // SSID1 and imsi1. + templateWifiSsid1Imsi1.assertDoesNotMatch(identMobile1) + templateWifiSsid1Imsi1.assertDoesNotMatch(identWifiImsiNullSsid1) + templateWifiSsid1Imsi1.assertMatches(identWifiImsi1Ssid1) + templateWifiSsid1Imsi1.assertDoesNotMatch(identWifiImsi2Ssid1) + templateWifiSsid1Imsi1.assertDoesNotMatch(identWifiImsi1Ssid2) + + // Verify that template with SSID all and imsi1 matches any network with + // any SSID and imsi1. + templateWifiSsidAllImsi1.assertDoesNotMatch(identMobile1) + templateWifiSsidAllImsi1.assertDoesNotMatch(identWifiImsiNullSsid1) + templateWifiSsidAllImsi1.assertMatches(identWifiImsi1Ssid1) + templateWifiSsidAllImsi1.assertDoesNotMatch(identWifiImsi2Ssid1) + templateWifiSsidAllImsi1.assertMatches(identWifiImsi1Ssid2) + } + + @Test + fun testCarrierMatches() { + val templateCarrierImsi1 = buildTemplateCarrier(TEST_IMSI1) + + val identMobile1 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI1), + false, TelephonyManager.NETWORK_TYPE_UMTS) + val identMobile2 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI2), + false, TelephonyManager.NETWORK_TYPE_UMTS) + val identWifiSsid1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0) + val identCarrierWifiImsi1 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI1, TEST_SSID1), true, 0) + val identCarrierWifiImsi2 = buildNetworkIdentity( + mockContext, buildWifiNetworkState(TEST_IMSI2, TEST_SSID1), true, 0) + + templateCarrierImsi1.assertMatches(identCarrierWifiImsi1) + templateCarrierImsi1.assertDoesNotMatch(identCarrierWifiImsi2) + templateCarrierImsi1.assertDoesNotMatch(identWifiSsid1) + templateCarrierImsi1.assertMatches(identMobile1) + templateCarrierImsi1.assertDoesNotMatch(identMobile2) + } + + @Test fun testRatTypeGroupMatches() { val stateMobile = buildMobileNetworkState(TEST_IMSI1) // Build UMTS template that matches mobile identities with RAT in the same @@ -117,7 +212,7 @@ class NetworkTemplateTest { val identImsi2 = buildNetworkIdentity(mockContext, buildMobileNetworkState(TEST_IMSI2), false, TelephonyManager.NETWORK_TYPE_UMTS) val identWifi = buildNetworkIdentity( - mockContext, buildWifiNetworkState(TEST_SSID1), true, 0) + mockContext, buildWifiNetworkState(null, TEST_SSID1), true, 0) // Assert that identity with the same RAT matches. templateUmts.assertMatches(identUmts) @@ -151,14 +246,16 @@ class NetworkTemplateTest { fun testParcelUnparcel() { val templateMobile = NetworkTemplate(MATCH_MOBILE, TEST_IMSI1, null, null, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, TelephonyManager.NETWORK_TYPE_LTE, - OEM_MANAGED_ALL) + OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT) val templateWifi = NetworkTemplate(MATCH_WIFI, null, null, TEST_SSID1, METERED_ALL, - ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_ALL) + ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_ALL, + SUBSCRIBER_ID_MATCH_RULE_EXACT) val templateOem = NetworkTemplate(MATCH_MOBILE, null, null, null, METERED_ALL, - ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_YES) - assertParcelSane(templateMobile, 9) - assertParcelSane(templateWifi, 9) - assertParcelSane(templateOem, 9) + ROAMING_ALL, DEFAULT_NETWORK_ALL, 0, OEM_MANAGED_YES, + SUBSCRIBER_ID_MATCH_RULE_EXACT) + assertParcelSane(templateMobile, 10) + assertParcelSane(templateWifi, 10) + assertParcelSane(templateOem, 10) } // Verify NETWORK_TYPE_* constants in NetworkTemplate do not conflict with @@ -207,15 +304,14 @@ class NetworkTemplateTest { identSsid: String? = null ) { val oemManagedStates = arrayOf(OEM_NONE, OEM_PAID, OEM_PRIVATE, OEM_PAID or OEM_PRIVATE) - // A null subscriberId needs a null matchSubscriberIds argument as well. - val matchSubscriberIds = if (subscriberId == null) null else arrayOf(subscriberId) + val matchSubscriberIds = arrayOf(subscriberId) val templateOemYes = NetworkTemplate(matchType, subscriberId, matchSubscriberIds, templateSsid, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, - OEM_MANAGED_YES) + OEM_MANAGED_YES, SUBSCRIBER_ID_MATCH_RULE_EXACT) val templateOemAll = NetworkTemplate(matchType, subscriberId, matchSubscriberIds, templateSsid, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, - OEM_MANAGED_ALL) + OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT) for (identityOemManagedState in oemManagedStates) { val ident = buildNetworkIdentity(mockContext, buildNetworkState(networkType, @@ -226,7 +322,7 @@ class NetworkTemplateTest { for (templateOemManagedState in oemManagedStates) { val template = NetworkTemplate(matchType, subscriberId, matchSubscriberIds, templateSsid, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, - NETWORK_TYPE_ALL, templateOemManagedState) + NETWORK_TYPE_ALL, templateOemManagedState, SUBSCRIBER_ID_MATCH_RULE_EXACT) if (identityOemManagedState == templateOemManagedState) { template.assertMatches(ident) } else { diff --git a/tests/net/java/android/net/VpnTransportInfoTest.java b/tests/net/java/android/net/VpnTransportInfoTest.java index fee65f06bcad..ccaa5cf7e9f7 100644 --- a/tests/net/java/android/net/VpnTransportInfoTest.java +++ b/tests/net/java/android/net/VpnTransportInfoTest.java @@ -63,6 +63,6 @@ public class VpnTransportInfoTest { assertEquals(v31, v32); assertEquals(v11.hashCode(), v13.hashCode()); assertEquals(REDACT_FOR_NETWORK_SETTINGS, v32.getApplicableRedactions()); - assertEquals(session1, v15.makeCopy(REDACT_NONE).sessionId); + assertEquals(session1, v15.makeCopy(REDACT_NONE).getSessionId()); } } diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 7ebed3967520..f277e94a7bd3 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -44,9 +44,6 @@ import static android.net.ConnectivityManager.BLOCKED_REASON_NONE; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; import static android.net.ConnectivityManager.EXTRA_NETWORK_INFO; import static android.net.ConnectivityManager.EXTRA_NETWORK_TYPE; -import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF; -import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC; -import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; import static android.net.ConnectivityManager.PROFILE_NETWORK_PREFERENCE_DEFAULT; import static android.net.ConnectivityManager.PROFILE_NETWORK_PREFERENCE_ENTERPRISE; import static android.net.ConnectivityManager.TYPE_ETHERNET; @@ -57,6 +54,9 @@ import static android.net.ConnectivityManager.TYPE_MOBILE_SUPL; import static android.net.ConnectivityManager.TYPE_PROXY; import static android.net.ConnectivityManager.TYPE_VPN; import static android.net.ConnectivityManager.TYPE_WIFI; +import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_OFF; +import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_OPPORTUNISTIC; +import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_DNS; import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_FALLBACK; import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_HTTP; @@ -1387,7 +1387,7 @@ public class ConnectivityServiceTest { final TransportInfo ti = nc.getTransportInfo(); assertTrue("VPN TransportInfo is not a VpnTransportInfo: " + ti, ti instanceof VpnTransportInfo); - assertEquals(type, ((VpnTransportInfo) ti).type); + assertEquals(type, ((VpnTransportInfo) ti).getType()); } @@ -2896,7 +2896,7 @@ public class ConnectivityServiceTest { callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent); // Set teardown delay and make sure CS has processed it. - mWiFiNetworkAgent.getNetworkAgent().setTeardownDelayMs(300); + mWiFiNetworkAgent.getNetworkAgent().setTeardownDelayMillis(300); waitForIdle(); // Post the duringTeardown lambda to the handler so it fires while teardown is in progress. @@ -2974,15 +2974,9 @@ public class ConnectivityServiceTest { mEthernetNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET); mEthernetNetworkAgent.connect(true); - // BUG: with the legacy int-based scoring code, the network will no longer linger, even - // though it's validated and outscored. - // The new policy-based scoring code fixes this. - // TODO: remove the line below and replace with the three commented lines when - // the policy-based scoring code is turned on. - callback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent); - // callback.expectAvailableCallbacksUnvalidated(mEthernetNetworkAgent); - // callback.expectCallback(CallbackEntry.LOSING, mWiFiNetworkAgent); - // callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mEthernetNetworkAgent); + callback.expectAvailableCallbacksUnvalidated(mEthernetNetworkAgent); + callback.expectCallback(CallbackEntry.LOSING, mWiFiNetworkAgent); + callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mEthernetNetworkAgent); assertEquals(mEthernetNetworkAgent.getNetwork(), mCm.getActiveNetwork()); callback.assertNoCallback(); @@ -4253,7 +4247,7 @@ public class ConnectivityServiceTest { () -> mCm.registerSystemDefaultNetworkCallback(callback, handler)); callback.assertNoCallback(); assertThrows(SecurityException.class, - () -> mCm.registerDefaultNetworkCallbackAsUid(APP1_UID, callback, handler)); + () -> mCm.registerDefaultNetworkCallbackForUid(APP1_UID, callback, handler)); callback.assertNoCallback(); mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); @@ -4261,7 +4255,7 @@ public class ConnectivityServiceTest { callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); mCm.unregisterNetworkCallback(callback); - mCm.registerDefaultNetworkCallbackAsUid(APP1_UID, callback, handler); + mCm.registerDefaultNetworkCallbackForUid(APP1_UID, callback, handler); callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent); mCm.unregisterNetworkCallback(callback); } @@ -4279,10 +4273,9 @@ public class ConnectivityServiceTest { waitForIdle(); } - private void setPrivateDnsSettings(String mode, String specifier) { - final ContentResolver cr = mServiceContext.getContentResolver(); - Settings.Global.putString(cr, ConnectivitySettingsManager.PRIVATE_DNS_MODE, mode); - Settings.Global.putString(cr, ConnectivitySettingsManager.PRIVATE_DNS_SPECIFIER, specifier); + private void setPrivateDnsSettings(int mode, String specifier) { + ConnectivitySettingsManager.setPrivateDnsMode(mServiceContext, mode); + ConnectivitySettingsManager.setPrivateDnsHostname(mServiceContext, specifier); mService.updatePrivateDnsSettings(); waitForIdle(); } @@ -5685,7 +5678,7 @@ public class ConnectivityServiceTest { for (int i = 0; i < SYSTEM_ONLY_MAX_REQUESTS - 1; i++) { NetworkCallback cb = new NetworkCallback(); if (i % 2 == 0) { - mCm.registerDefaultNetworkCallbackAsUid(1000000 + i, cb, handler); + mCm.registerDefaultNetworkCallbackForUid(1000000 + i, cb, handler); } else { mCm.registerNetworkCallback(networkRequest, cb); } @@ -5694,7 +5687,7 @@ public class ConnectivityServiceTest { waitForIdle(); assertThrows(TooManyRequestsException.class, () -> - mCm.registerDefaultNetworkCallbackAsUid(1001042, new NetworkCallback(), + mCm.registerDefaultNetworkCallbackForUid(1001042, new NetworkCallback(), handler)); assertThrows(TooManyRequestsException.class, () -> mCm.registerNetworkCallback(networkRequest, new NetworkCallback())); @@ -5747,7 +5740,7 @@ public class ConnectivityServiceTest { withPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, () -> { for (int i = 0; i < MAX_REQUESTS; i++) { NetworkCallback networkCallback = new NetworkCallback(); - mCm.registerDefaultNetworkCallbackAsUid(1000000 + i, networkCallback, + mCm.registerDefaultNetworkCallbackForUid(1000000 + i, networkCallback, new Handler(ConnectivityThread.getInstanceLooper())); mCm.unregisterNetworkCallback(networkCallback); } @@ -5904,10 +5897,10 @@ public class ConnectivityServiceTest { if (vpnUid != null) { assertEquals("Should have exactly one VPN:", 1, infos.length); UnderlyingNetworkInfo info = infos[0]; - assertEquals("Unexpected VPN owner:", (int) vpnUid, info.ownerUid); - assertEquals("Unexpected VPN interface:", vpnIfname, info.iface); + assertEquals("Unexpected VPN owner:", (int) vpnUid, info.getOwnerUid()); + assertEquals("Unexpected VPN interface:", vpnIfname, info.getInterface()); assertSameElementsNoDuplicates(underlyingIfaces, - info.underlyingIfaces.toArray(new String[0])); + info.getUnderlyingInterfaces().toArray(new String[0])); } else { assertEquals(0, infos.length); return; @@ -6051,8 +6044,8 @@ public class ConnectivityServiceTest { // network for the VPN... verify(mStatsManager, never()).notifyNetworkStatus(any(List.class), any(List.class), any() /* anyString() doesn't match null */, - argThat(infos -> infos.get(0).underlyingIfaces.size() == 1 - && WIFI_IFNAME.equals(infos.get(0).underlyingIfaces.get(0)))); + argThat(infos -> infos.get(0).getUnderlyingInterfaces().size() == 1 + && WIFI_IFNAME.equals(infos.get(0).getUnderlyingInterfaces().get(0)))); verifyNoMoreInteractions(mStatsManager); reset(mStatsManager); @@ -6066,8 +6059,8 @@ public class ConnectivityServiceTest { waitForIdle(); verify(mStatsManager).notifyNetworkStatus(any(List.class), any(List.class), any() /* anyString() doesn't match null */, - argThat(vpnInfos -> vpnInfos.get(0).underlyingIfaces.size() == 1 - && WIFI_IFNAME.equals(vpnInfos.get(0).underlyingIfaces.get(0)))); + argThat(vpnInfos -> vpnInfos.get(0).getUnderlyingInterfaces().size() == 1 + && WIFI_IFNAME.equals(vpnInfos.get(0).getUnderlyingInterfaces().get(0)))); mEthernetNetworkAgent.disconnect(); waitForIdle(); reset(mStatsManager); @@ -7831,7 +7824,7 @@ public class ConnectivityServiceTest { registerDefaultNetworkCallbackAsUid(vpnUidDefaultCallback, VPN_UID); final TestNetworkCallback vpnDefaultCallbackAsUid = new TestNetworkCallback(); - mCm.registerDefaultNetworkCallbackAsUid(VPN_UID, vpnDefaultCallbackAsUid, + mCm.registerDefaultNetworkCallbackForUid(VPN_UID, vpnDefaultCallbackAsUid, new Handler(ConnectivityThread.getInstanceLooper())); final int uid = Process.myUid(); @@ -10409,12 +10402,15 @@ public class ConnectivityServiceTest { return UidRange.createForUser(UserHandle.of(userId)); } - private void mockGetApplicationInfo(@NonNull final String packageName, @NonNull final int uid) - throws Exception { + private void mockGetApplicationInfo(@NonNull final String packageName, @NonNull final int uid) { final ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = uid; - when(mPackageManager.getApplicationInfo(eq(packageName), anyInt())) - .thenReturn(applicationInfo); + try { + when(mPackageManager.getApplicationInfo(eq(packageName), anyInt())) + .thenReturn(applicationInfo); + } catch (Exception e) { + fail(e.getMessage()); + } } private void mockGetApplicationInfoThrowsNameNotFound(@NonNull final String packageName) @@ -10435,8 +10431,7 @@ public class ConnectivityServiceTest { } private OemNetworkPreferences createDefaultOemNetworkPreferences( - @OemNetworkPreferences.OemNetworkPreference final int preference) - throws Exception { + @OemNetworkPreferences.OemNetworkPreference final int preference) { // Arrange PackageManager mocks mockGetApplicationInfo(TEST_PACKAGE_NAME, TEST_PACKAGE_UID); @@ -10483,7 +10478,7 @@ public class ConnectivityServiceTest { assertTrue(mRequests.get(0).hasCapability(NET_CAPABILITY_VALIDATED)); assertTrue(mRequests.get(1).isRequest()); assertTrue(mRequests.get(1).hasCapability(NET_CAPABILITY_OEM_PAID)); - assertTrue(mRequests.get(2).isRequest()); + assertEquals(NetworkRequest.Type.TRACK_DEFAULT, mRequests.get(2).type); assertTrue(mService.getDefaultRequest().networkCapabilities.equalsNetCapabilities( mRequests.get(2).networkCapabilities)); } @@ -10913,11 +10908,13 @@ public class ConnectivityServiceTest { mDone.complete(new Object()); } - void expectOnComplete() throws Exception { + void expectOnComplete() { try { mDone.get(TIMEOUT_MS, TimeUnit.MILLISECONDS); } catch (TimeoutException e) { fail("Expected onComplete() not received after " + TIMEOUT_MS + " ms"); + } catch (Exception e) { + fail(e.getMessage()); } } @@ -10993,7 +10990,7 @@ public class ConnectivityServiceTest { final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback(); withPermission(NETWORK_SETTINGS, () -> - mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback, + mCm.registerDefaultNetworkCallbackForUid(TEST_PACKAGE_UID, otherUidDefaultCallback, new Handler(ConnectivityThread.getInstanceLooper()))); // Setup the test process to use networkPref for their default network. @@ -11041,7 +11038,7 @@ public class ConnectivityServiceTest { final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback(); withPermission(NETWORK_SETTINGS, () -> - mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback, + mCm.registerDefaultNetworkCallbackForUid(TEST_PACKAGE_UID, otherUidDefaultCallback, new Handler(ConnectivityThread.getInstanceLooper()))); // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. @@ -11083,7 +11080,7 @@ public class ConnectivityServiceTest { final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback(); withPermission(NETWORK_SETTINGS, () -> - mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback, + mCm.registerDefaultNetworkCallbackForUid(TEST_PACKAGE_UID, otherUidDefaultCallback, new Handler(ConnectivityThread.getInstanceLooper()))); // Setup a process different than the test process to use the default network. This means @@ -11695,10 +11692,12 @@ public class ConnectivityServiceTest { mServiceContext, "internetFactory", internetFilter, mCsHandlerThread); internetFactory.setScoreFilter(40); internetFactory.register(); - // Default internet request & 3rd (fallback) request in OEM_PAID NRI. The unmetered request - // is never sent to factories (it's a LISTEN, not requestable) and the OEM_PAID request - // doesn't match the internetFactory filter. - internetFactory.expectRequestAdds(2); + // Default internet request only. The unmetered request is never sent to factories (it's a + // LISTEN, not requestable). The 3rd (fallback) request in OEM_PAID NRI is TRACK_DEFAULT + // which is also not sent to factories. Finally, the OEM_PAID request doesn't match the + // internetFactory filter. + internetFactory.expectRequestAdds(1); + internetFactory.assertRequestCountEquals(1); NetworkCapabilities oemPaidFilter = new NetworkCapabilities() .addCapability(NET_CAPABILITY_INTERNET) @@ -11721,7 +11720,7 @@ public class ConnectivityServiceTest { expectNoRequestChanged(oemPaidFactory); oemPaidFactory.assertRequestCountEquals(1); // The internet factory however is outscored, and should lose its requests. - internetFactory.expectRequestRemoves(2); + internetFactory.expectRequestRemove(); internetFactory.assertRequestCountEquals(0); final NetworkCapabilities oemPaidNc = new NetworkCapabilities(); @@ -12648,4 +12647,72 @@ public class ConnectivityServiceTest { expected, () -> mCm.registerNetworkCallback(getRequestWithSubIds(), new NetworkCallback())); } + + /** + * Validate request counts are counted accurately on setProfileNetworkPreference on set/replace. + */ + @Test + public void testProfileNetworkPrefCountsRequestsCorrectlyOnSet() throws Exception { + final UserHandle testHandle = setupEnterpriseNetwork(); + testRequestCountLimits(() -> { + // Set initially to test the limit prior to having existing requests. + final TestOnCompleteListener listener = new TestOnCompleteListener(); + mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE, + Runnable::run, listener); + listener.expectOnComplete(); + + // re-set so as to test the limit as part of replacing existing requests. + mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE, + Runnable::run, listener); + listener.expectOnComplete(); + }); + } + + /** + * Validate request counts are counted accurately on setOemNetworkPreference on set/replace. + */ + @Test + public void testSetOemNetworkPreferenceCountsRequestsCorrectlyOnSet() throws Exception { + mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, true); + @OemNetworkPreferences.OemNetworkPreference final int networkPref = + OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; + testRequestCountLimits(() -> { + // Set initially to test the limit prior to having existing requests. + final TestOemListenerCallback listener = new TestOemListenerCallback(); + mService.setOemNetworkPreference( + createDefaultOemNetworkPreferences(networkPref), listener); + listener.expectOnComplete(); + + // re-set so as to test the limit as part of replacing existing requests. + mService.setOemNetworkPreference( + createDefaultOemNetworkPreferences(networkPref), listener); + listener.expectOnComplete(); + }); + } + + private void testRequestCountLimits(@NonNull final Runnable r) throws Exception { + final ArraySet<TestNetworkCallback> callbacks = new ArraySet<>(); + try { + final int requestCount = mService.mSystemNetworkRequestCounter + .mUidToNetworkRequestCount.get(Process.myUid()); + // The limit is hit when total requests <= limit. + final int maxCount = + ConnectivityService.MAX_NETWORK_REQUESTS_PER_SYSTEM_UID - requestCount; + // Need permission so registerDefaultNetworkCallback uses mSystemNetworkRequestCounter + withPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, () -> { + for (int i = 1; i < maxCount - 1; i++) { + final TestNetworkCallback cb = new TestNetworkCallback(); + mCm.registerDefaultNetworkCallback(cb); + callbacks.add(cb); + } + + // Code to run to check if it triggers a max request count limit error. + r.run(); + }); + } finally { + for (final TestNetworkCallback cb : callbacks) { + mCm.unregisterNetworkCallback(cb); + } + } + } } diff --git a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java index 692c50fbef86..0ffeec98cf90 100644 --- a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java +++ b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java @@ -16,10 +16,10 @@ package com.android.server.connectivity; -import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF; -import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_DEFAULT_MODE; import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE; +import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_OFF; +import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_SPECIFIER; import static android.net.NetworkCapabilities.MAX_TRANSPORT; import static android.net.NetworkCapabilities.MIN_TRANSPORT; @@ -44,6 +44,7 @@ import static org.mockito.Mockito.when; import android.annotation.NonNull; import android.content.Context; +import android.net.ConnectivitySettingsManager; import android.net.IDnsResolver; import android.net.IpPrefix; import android.net.LinkAddress; @@ -187,9 +188,8 @@ public class DnsManagerTest { lp.addRoute(new RouteInfo((IpPrefix) null, InetAddress.getByName("2001:db8:1::1"), TEST_IFACENAME)); - Settings.Global.putString(mContentResolver, - PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME); - Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, "strictmode.com"); + ConnectivitySettingsManager.setPrivateDnsMode(mCtx, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME); + ConnectivitySettingsManager.setPrivateDnsHostname(mCtx, "strictmode.com"); mDnsManager.updatePrivateDns(new Network(TEST_NETID), new PrivateDnsConfig("strictmode.com", new InetAddress[] { InetAddress.parseNumericAddress("6.6.6.6"), @@ -294,7 +294,7 @@ public class DnsManagerTest { assertNull(lp.getPrivateDnsServerName()); // Turn private DNS mode off - Settings.Global.putString(mContentResolver, PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OFF); + ConnectivitySettingsManager.setPrivateDnsMode(mCtx, PRIVATE_DNS_MODE_OFF); mDnsManager.updatePrivateDns(new Network(TEST_NETID), mDnsManager.getPrivateDnsConfig()); mDnsManager.updateTransportsForNetwork(TEST_NETID, TEST_TRANSPORT_TYPES); @@ -318,16 +318,15 @@ public class DnsManagerTest { assertEquals(new InetAddress[0], cfgAuto.ips); // Pretend a gservices push sets the default to "off". - Settings.Global.putString(mContentResolver, PRIVATE_DNS_DEFAULT_MODE, "off"); + ConnectivitySettingsManager.setPrivateDnsDefaultMode(mCtx, PRIVATE_DNS_MODE_OFF); final PrivateDnsConfig cfgOff = DnsManager.getPrivateDnsConfig(mCtx); assertFalse(cfgOff.useTls); assertEquals("", cfgOff.hostname); assertEquals(new InetAddress[0], cfgOff.ips); // Strict mode still works. - Settings.Global.putString( - mContentResolver, PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME); - Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, "strictmode.com"); + ConnectivitySettingsManager.setPrivateDnsMode(mCtx, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME); + ConnectivitySettingsManager.setPrivateDnsHostname(mCtx, "strictmode.com"); final PrivateDnsConfig cfgStrict = DnsManager.getPrivateDnsConfig(mCtx); assertTrue(cfgStrict.useTls); assertEquals("strictmode.com", cfgStrict.hostname); diff --git a/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt b/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt index 1348c6a1ac19..551b94c7668e 100644 --- a/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt +++ b/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt @@ -16,7 +16,9 @@ package com.android.server.connectivity +import android.net.NetworkCapabilities import android.net.NetworkRequest +import android.net.NetworkScore.KEEP_CONNECTED_NONE import androidx.test.filters.SmallTest import androidx.test.runner.AndroidJUnit4 import org.junit.Test @@ -32,10 +34,14 @@ import kotlin.test.assertNull class NetworkRankerTest { private val ranker = NetworkRanker() - private fun makeNai(satisfy: Boolean, score: Int) = mock(NetworkAgentInfo::class.java).also { - doReturn(satisfy).`when`(it).satisfies(any()) - doReturn(score).`when`(it).currentScore - } + private fun makeNai(satisfy: Boolean, legacyScore: Int) = + mock(NetworkAgentInfo::class.java).also { + doReturn(satisfy).`when`(it).satisfies(any()) + val fs = FullScore(legacyScore, 0 /* policies */, KEEP_CONNECTED_NONE) + doReturn(fs).`when`(it).getScore() + val nc = NetworkCapabilities.Builder().build() + doReturn(nc).`when`(it).getCapsNoCopy() + } @Test fun testGetBestNetwork() { diff --git a/tests/net/java/com/android/server/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java index 6ad4900989f5..b725b826b14f 100644 --- a/tests/net/java/com/android/server/connectivity/VpnTest.java +++ b/tests/net/java/com/android/server/connectivity/VpnTest.java @@ -1023,7 +1023,7 @@ public class VpnTest { assertNotNull(nc); VpnTransportInfo ti = (VpnTransportInfo) nc.getTransportInfo(); assertNotNull(ti); - assertEquals(type, ti.type); + assertEquals(type, ti.getType()); } public void startRacoon(final String serverAddr, final String expectedAddr) diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java index eeeb4fb1d929..fd374bc9e68f 100644 --- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java @@ -45,6 +45,7 @@ import static android.net.NetworkTemplate.MATCH_MOBILE_WILDCARD; import static android.net.NetworkTemplate.NETWORK_TYPE_ALL; import static android.net.NetworkTemplate.OEM_MANAGED_NO; import static android.net.NetworkTemplate.OEM_MANAGED_YES; +import static android.net.NetworkTemplate.SUBSCRIBER_ID_MATCH_RULE_EXACT; import static android.net.NetworkTemplate.buildTemplateMobileAll; import static android.net.NetworkTemplate.buildTemplateMobileWithRatType; import static android.net.NetworkTemplate.buildTemplateWifi; @@ -67,6 +68,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -88,8 +90,8 @@ import android.net.NetworkStateSnapshot; import android.net.NetworkStats; import android.net.NetworkStatsHistory; import android.net.NetworkTemplate; -import android.net.UnderlyingNetworkInfo; import android.net.TelephonyNetworkSpecifier; +import android.net.UnderlyingNetworkInfo; import android.net.netstats.provider.INetworkStatsProviderCallback; import android.os.ConditionVariable; import android.os.Handler; @@ -165,9 +167,9 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { private long mElapsedRealtime; - private BroadcastInterceptingContext mServiceContext; private File mStatsDir; - + private MockContext mServiceContext; + private @Mock TelephonyManager mTelephonyManager; private @Mock INetworkManagementService mNetManager; private @Mock NetworkStatsFactory mStatsFactory; private @Mock NetworkStatsSettings mSettings; @@ -183,19 +185,32 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { private ContentObserver mContentObserver; private Handler mHandler; + private class MockContext extends BroadcastInterceptingContext { + private final Context mBaseContext; + + MockContext(Context base) { + super(base); + mBaseContext = base; + } + + @Override + public Object getSystemService(String name) { + if (Context.TELEPHONY_SERVICE.equals(name)) return mTelephonyManager; + return mBaseContext.getSystemService(name); + } + } + private final Clock mClock = new SimpleClock(ZoneOffset.UTC) { @Override public long millis() { return currentTimeMillis(); } }; - @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); final Context context = InstrumentationRegistry.getContext(); - - mServiceContext = new BroadcastInterceptingContext(context); + mServiceContext = new MockContext(context); mStatsDir = context.getFilesDir(); if (mStatsDir.exists()) { IoUtils.deleteContents(mStatsDir); @@ -217,7 +232,6 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { expectDefaultSettings(); expectNetworkStatsUidDetail(buildEmptyStats()); expectSystemReady(); - mService.systemReady(); // Verify that system ready fetches realtime stats verify(mStatsFactory).readNetworkStatsDetail(UID_ALL, INTERFACES_ALL, TAG_ALL); @@ -228,6 +242,9 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { verify(mNetworkStatsSubscriptionsMonitor).start(); reset(mNetworkStatsSubscriptionsMonitor); + doReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS).when(mTelephonyManager) + .checkCarrierPrivilegesForPackageAnyPhone(anyString()); + mSession = mService.openSession(); assertNotNull("openSession() failed", mSession); @@ -653,24 +670,28 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { public void testMobileStatsOemManaged() throws Exception { final NetworkTemplate templateOemPaid = new NetworkTemplate(MATCH_MOBILE_WILDCARD, /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, - METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PAID); + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PAID, + SUBSCRIBER_ID_MATCH_RULE_EXACT); final NetworkTemplate templateOemPrivate = new NetworkTemplate(MATCH_MOBILE_WILDCARD, /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, - METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PRIVATE); + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_PRIVATE, + SUBSCRIBER_ID_MATCH_RULE_EXACT); final NetworkTemplate templateOemAll = new NetworkTemplate(MATCH_MOBILE_WILDCARD, /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, - OEM_PAID | OEM_PRIVATE); + OEM_PAID | OEM_PRIVATE, SUBSCRIBER_ID_MATCH_RULE_EXACT); final NetworkTemplate templateOemYes = new NetworkTemplate(MATCH_MOBILE_WILDCARD, /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, - METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_YES); + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_YES, + SUBSCRIBER_ID_MATCH_RULE_EXACT); final NetworkTemplate templateOemNone = new NetworkTemplate(MATCH_MOBILE_WILDCARD, /*subscriberId=*/null, /*matchSubscriberIds=*/null, /*networkId=*/null, - METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_NO); + METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, OEM_MANAGED_NO, + SUBSCRIBER_ID_MATCH_RULE_EXACT); // OEM_PAID network comes online. NetworkStateSnapshot[] states = new NetworkStateSnapshot[]{ @@ -873,7 +894,7 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { final LinkProperties stackedProp = new LinkProperties(); stackedProp.setInterfaceName(stackedIface); final NetworkStateSnapshot wifiState = buildWifiState(); - wifiState.linkProperties.addStackedLink(stackedProp); + wifiState.getLinkProperties().addStackedLink(stackedProp); NetworkStateSnapshot[] states = new NetworkStateSnapshot[] {wifiState}; expectNetworkStatsSummary(buildEmptyStats()); @@ -1564,10 +1585,10 @@ public class NetworkStatsServiceTest extends NetworkStatsBaseTest { } private String getActiveIface(NetworkStateSnapshot... states) throws Exception { - if (states == null || states.length == 0 || states[0].linkProperties == null) { + if (states == null || states.length == 0 || states[0].getLinkProperties() == null) { return null; } - return states[0].linkProperties.getInterfaceName(); + return states[0].getLinkProperties().getInterfaceName(); } private void expectNetworkStatsSummary(NetworkStats summary) throws Exception { diff --git a/tests/utils/testutils/java/com/android/internal/util/test/BroadcastInterceptingContext.java b/tests/utils/testutils/java/com/android/internal/util/test/BroadcastInterceptingContext.java index 4a1f96d145bd..3da8b460df13 100644 --- a/tests/utils/testutils/java/com/android/internal/util/test/BroadcastInterceptingContext.java +++ b/tests/utils/testutils/java/com/android/internal/util/test/BroadcastInterceptingContext.java @@ -196,6 +196,12 @@ public class BroadcastInterceptingContext extends ContextWrapper { } @Override + public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions, + Bundle options) { + sendBroadcast(intent); + } + + @Override public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user, String[] receiverPermissions) { sendBroadcast(intent); diff --git a/tests/vcn/java/android/net/vcn/VcnControlPlaneIkeConfigTest.java b/tests/vcn/java/android/net/vcn/VcnControlPlaneIkeConfigTest.java deleted file mode 100644 index 43b80e4c1bbf..000000000000 --- a/tests/vcn/java/android/net/vcn/VcnControlPlaneIkeConfigTest.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2020 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.vcn; - -import static android.net.ipsec.ike.SaProposal.DH_GROUP_2048_BIT_MODP; -import static android.net.ipsec.ike.SaProposal.ENCRYPTION_ALGORITHM_AES_GCM_12; -import static android.net.ipsec.ike.SaProposal.PSEUDORANDOM_FUNCTION_AES128_XCBC; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - -import android.net.ipsec.ike.ChildSaProposal; -import android.net.ipsec.ike.IkeFqdnIdentification; -import android.net.ipsec.ike.IkeSaProposal; -import android.net.ipsec.ike.IkeSessionParams; -import android.net.ipsec.ike.SaProposal; -import android.net.ipsec.ike.TunnelModeChildSessionParams; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class VcnControlPlaneIkeConfigTest { - private static final IkeSessionParams IKE_PARAMS; - private static final TunnelModeChildSessionParams CHILD_PARAMS; - - static { - IkeSaProposal ikeProposal = - new IkeSaProposal.Builder() - .addEncryptionAlgorithm( - ENCRYPTION_ALGORITHM_AES_GCM_12, SaProposal.KEY_LEN_AES_128) - .addDhGroup(DH_GROUP_2048_BIT_MODP) - .addPseudorandomFunction(PSEUDORANDOM_FUNCTION_AES128_XCBC) - .build(); - - final String serverHostname = "192.0.2.100"; - final String testLocalId = "test.client.com"; - final String testRemoteId = "test.server.com"; - final byte[] psk = "psk".getBytes(); - - IKE_PARAMS = - new IkeSessionParams.Builder() - .setServerHostname(serverHostname) - .addSaProposal(ikeProposal) - .setLocalIdentification(new IkeFqdnIdentification(testLocalId)) - .setRemoteIdentification(new IkeFqdnIdentification(testRemoteId)) - .setAuthPsk(psk) - .build(); - - ChildSaProposal childProposal = - new ChildSaProposal.Builder() - .addEncryptionAlgorithm( - ENCRYPTION_ALGORITHM_AES_GCM_12, SaProposal.KEY_LEN_AES_128) - .build(); - CHILD_PARAMS = - new TunnelModeChildSessionParams.Builder().addSaProposal(childProposal).build(); - } - - // Package private for use in VcnGatewayConnectionConfigTest - static VcnControlPlaneIkeConfig buildTestConfig() { - return new VcnControlPlaneIkeConfig(IKE_PARAMS, CHILD_PARAMS); - } - - @Test - public void testGetters() { - final VcnControlPlaneIkeConfig config = buildTestConfig(); - assertEquals(IKE_PARAMS, config.getIkeSessionParams()); - assertEquals(CHILD_PARAMS, config.getChildSessionParams()); - } - - @Test - public void testPersistableBundle() { - final VcnControlPlaneIkeConfig config = buildTestConfig(); - - assertEquals(config, new VcnControlPlaneIkeConfig(config.toPersistableBundle())); - } - - @Test - public void testConstructConfigWithoutIkeParams() { - try { - new VcnControlPlaneIkeConfig(null, CHILD_PARAMS); - fail("Expect to fail because ikeParams was null"); - } catch (NullPointerException expected) { - } - } - - @Test - public void testBuilderConfigWithoutChildParams() { - try { - new VcnControlPlaneIkeConfig(IKE_PARAMS, null); - fail("Expect to fail because childParams was null"); - } catch (NullPointerException expected) { - } - } -} diff --git a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java index 4ee4d611e9b0..9410886c3549 100644 --- a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java +++ b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java @@ -18,11 +18,12 @@ package android.net.vcn; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.net.NetworkCapabilities; +import android.net.ipsec.ike.IkeTunnelConnectionParams; +import android.net.vcn.persistablebundleutils.TunnelConnectionParamsUtilsTest; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -59,8 +60,8 @@ public class VcnGatewayConnectionConfigTest { }; public static final int MAX_MTU = 1360; - public static final VcnControlPlaneConfig CONTROL_PLANE_CONFIG = - VcnControlPlaneIkeConfigTest.buildTestConfig(); + public static final IkeTunnelConnectionParams TUNNEL_CONNECTION_PARAMS = + TunnelConnectionParamsUtilsTest.buildTestParams(); public static final String GATEWAY_CONNECTION_NAME_PREFIX = "gatewayConnectionName-"; private static int sGatewayConnectionConfigCount = 0; @@ -75,13 +76,13 @@ public class VcnGatewayConnectionConfigTest { // VcnGatewayConnectionConfigs have a unique name (required by VcnConfig). return new VcnGatewayConnectionConfig.Builder( GATEWAY_CONNECTION_NAME_PREFIX + sGatewayConnectionConfigCount++, - CONTROL_PLANE_CONFIG); + TUNNEL_CONNECTION_PARAMS); } // Public for use in VcnGatewayConnectionTest public static VcnGatewayConnectionConfig buildTestConfigWithExposedCaps(int... exposedCaps) { final VcnGatewayConnectionConfig.Builder builder = - newBuilder().setRetryInterval(RETRY_INTERVALS_MS).setMaxMtu(MAX_MTU); + newBuilder().setRetryIntervalsMillis(RETRY_INTERVALS_MS).setMaxMtu(MAX_MTU); for (int caps : exposedCaps) { builder.addExposedCapability(caps); @@ -98,7 +99,7 @@ public class VcnGatewayConnectionConfigTest { public void testBuilderRequiresNonNullGatewayConnectionName() { try { new VcnGatewayConnectionConfig.Builder( - null /* gatewayConnectionName */, CONTROL_PLANE_CONFIG) + null /* gatewayConnectionName */, TUNNEL_CONNECTION_PARAMS) .build(); fail("Expected exception due to invalid gateway connection name"); @@ -107,13 +108,13 @@ public class VcnGatewayConnectionConfigTest { } @Test - public void testBuilderRequiresNonNullControlPlaneConfig() { + public void testBuilderRequiresNonNullTunnelConnectionParams() { try { new VcnGatewayConnectionConfig.Builder( - GATEWAY_CONNECTION_NAME_PREFIX, null /* ctrlPlaneConfig */) + GATEWAY_CONNECTION_NAME_PREFIX, null /* tunnelConnectionParams */) .build(); - fail("Expected exception due to invalid control plane config"); + fail("Expected exception due to the absence of tunnel connection parameters"); } catch (NullPointerException e) { } } @@ -133,7 +134,7 @@ public class VcnGatewayConnectionConfigTest { @Test public void testBuilderRequiresNonNullRetryInterval() { try { - newBuilder().setRetryInterval(null); + newBuilder().setRetryIntervalsMillis(null); fail("Expected exception due to invalid retryIntervalMs"); } catch (IllegalArgumentException e) { } @@ -142,7 +143,7 @@ public class VcnGatewayConnectionConfigTest { @Test public void testBuilderRequiresNonEmptyRetryInterval() { try { - newBuilder().setRetryInterval(new long[0]); + newBuilder().setRetryIntervalsMillis(new long[0]); fail("Expected exception due to invalid retryIntervalMs"); } catch (IllegalArgumentException e) { } @@ -171,10 +172,9 @@ public class VcnGatewayConnectionConfigTest { Arrays.sort(underlyingCaps); assertArrayEquals(UNDERLYING_CAPS, underlyingCaps); - assertEquals(CONTROL_PLANE_CONFIG, config.getControlPlaneConfig()); - assertFalse(CONTROL_PLANE_CONFIG == config.getControlPlaneConfig()); + assertEquals(TUNNEL_CONNECTION_PARAMS, config.getTunnelConnectionParams()); - assertArrayEquals(RETRY_INTERVALS_MS, config.getRetryIntervalsMs()); + assertArrayEquals(RETRY_INTERVALS_MS, config.getRetryIntervalsMillis()); assertEquals(MAX_MTU, config.getMaxMtu()); } diff --git a/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java b/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java index 31561901be9e..582275d0547d 100644 --- a/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java +++ b/tests/vcn/java/android/net/vcn/VcnTransportInfoTest.java @@ -16,6 +16,8 @@ package android.net.vcn; +import static android.net.NetworkCapabilities.REDACT_ALL; +import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static org.junit.Assert.assertEquals; @@ -37,6 +39,12 @@ public class VcnTransportInfoTest { private static final VcnTransportInfo WIFI_UNDERLYING_INFO = new VcnTransportInfo(WIFI_INFO); @Test + public void testRedactionDefaults() { + assertEquals(REDACT_ALL, CELL_UNDERLYING_INFO.getRedaction()); + assertEquals(REDACT_ALL, WIFI_UNDERLYING_INFO.getRedaction()); + } + + @Test public void testGetWifiInfo() { assertEquals(WIFI_INFO, WIFI_UNDERLYING_INFO.getWifiInfo()); @@ -51,6 +59,18 @@ public class VcnTransportInfoTest { } @Test + public void testMakeCopySetsRedactions() { + assertEquals( + REDACT_FOR_NETWORK_SETTINGS, + ((VcnTransportInfo) CELL_UNDERLYING_INFO.makeCopy(REDACT_FOR_NETWORK_SETTINGS)) + .getRedaction()); + assertEquals( + REDACT_FOR_NETWORK_SETTINGS, + ((VcnTransportInfo) WIFI_UNDERLYING_INFO.makeCopy(REDACT_FOR_NETWORK_SETTINGS)) + .getRedaction()); + } + + @Test public void testEquals() { assertEquals(CELL_UNDERLYING_INFO, CELL_UNDERLYING_INFO); assertEquals(WIFI_UNDERLYING_INFO, WIFI_UNDERLYING_INFO); @@ -64,8 +84,29 @@ public class VcnTransportInfoTest { } private void verifyParcelingIsNull(VcnTransportInfo vcnTransportInfo) { + // Verify redacted by default Parcel parcel = Parcel.obtain(); vcnTransportInfo.writeToParcel(parcel, 0 /* flags */); + parcel.setDataPosition(0); + assertNull(VcnTransportInfo.CREATOR.createFromParcel(parcel)); } + + @Test + public void testParcelUnparcelNotRedactedForSysUi() { + verifyParcelingForSysUi(CELL_UNDERLYING_INFO); + verifyParcelingForSysUi(WIFI_UNDERLYING_INFO); + } + + private void verifyParcelingForSysUi(VcnTransportInfo vcnTransportInfo) { + // Allow fully unredacted; SysUI will have all the relevant permissions. + final VcnTransportInfo unRedacted = (VcnTransportInfo) vcnTransportInfo.makeCopy(0); + final Parcel parcel = Parcel.obtain(); + unRedacted.writeToParcel(parcel, 0 /* flags */); + parcel.setDataPosition(0); + + final VcnTransportInfo unparceled = VcnTransportInfo.CREATOR.createFromParcel(parcel); + assertEquals(vcnTransportInfo, unparceled); + assertEquals(REDACT_ALL, unparceled.getRedaction()); + } } diff --git a/tests/vcn/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtilsTest.java b/tests/vcn/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtilsTest.java index 546d957d417e..393787f1a8b8 100644 --- a/tests/vcn/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtilsTest.java +++ b/tests/vcn/java/android/net/vcn/persistablebundleutils/IkeSessionParamsUtilsTest.java @@ -52,14 +52,17 @@ import java.util.concurrent.TimeUnit; @RunWith(AndroidJUnit4.class) @SmallTest public class IkeSessionParamsUtilsTest { - private static IkeSessionParams.Builder createBuilderMinimum() { + // Package private for use in EncryptedTunnelParamsUtilsTest + static IkeSessionParams.Builder createBuilderMinimum() { final InetAddress serverAddress = InetAddresses.parseNumericAddress("192.0.2.100"); + // TODO: b/185941731 Make sure all valid IKE_OPTIONS are added and validated. return new IkeSessionParams.Builder() .setServerHostname(serverAddress.getHostAddress()) .addSaProposal(SaProposalUtilsTest.buildTestIkeSaProposal()) .setLocalIdentification(new IkeFqdnIdentification("client.test.android.net")) .setRemoteIdentification(new IkeFqdnIdentification("server.test.android.net")) + .addIkeOption(IkeSessionParams.IKE_OPTION_FORCE_PORT_4500) .setAuthPsk("psk".getBytes()); } diff --git a/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtilsTest.java b/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtilsTest.java new file mode 100644 index 000000000000..0c8ad32b0c27 --- /dev/null +++ b/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelConnectionParamsUtilsTest.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2021 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.vcn.persistablebundleutils; + +import static org.junit.Assert.assertEquals; + +import android.net.ipsec.ike.IkeTunnelConnectionParams; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class TunnelConnectionParamsUtilsTest { + // Public for use in VcnGatewayConnectionConfigTest + public static IkeTunnelConnectionParams buildTestParams() { + return new IkeTunnelConnectionParams( + IkeSessionParamsUtilsTest.createBuilderMinimum().build(), + TunnelModeChildSessionParamsUtilsTest.createBuilderMinimum().build()); + } + + @Test + public void testIkeTunnelConnectionParamsToFromPersistableBundle() { + final IkeTunnelConnectionParams params = buildTestParams(); + + assertEquals( + params, + TunnelConnectionParamsUtils.fromPersistableBundle( + TunnelConnectionParamsUtils.toPersistableBundle(params))); + } +} diff --git a/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelModeChildSessionParamsUtilsTest.java b/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelModeChildSessionParamsUtilsTest.java index b3cd0ab80599..e0b5f0ef0381 100644 --- a/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelModeChildSessionParamsUtilsTest.java +++ b/tests/vcn/java/android/net/vcn/persistablebundleutils/TunnelModeChildSessionParamsUtilsTest.java @@ -40,7 +40,8 @@ import java.util.concurrent.TimeUnit; @RunWith(AndroidJUnit4.class) @SmallTest public class TunnelModeChildSessionParamsUtilsTest { - private TunnelModeChildSessionParams.Builder createBuilderMinimum() { + // Package private for use in EncryptedTunnelParamsUtilsTest + static TunnelModeChildSessionParams.Builder createBuilderMinimum() { final ChildSaProposal saProposal = SaProposalUtilsTest.buildTestChildSaProposal(); return new TunnelModeChildSessionParams.Builder().addSaProposal(saProposal); } diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java index 907cb46d2929..aa4b5f8e208f 100644 --- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java +++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java @@ -96,6 +96,7 @@ import org.mockito.ArgumentCaptor; import java.io.FileNotFoundException; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -617,6 +618,43 @@ public class VcnManagementServiceTest { } @Test + public void testGetConfiguredSubscriptionGroupsRequiresSystemUser() throws Exception { + doReturn(UserHandle.getUid(UserHandle.MIN_SECONDARY_USER_ID, TEST_UID)) + .when(mMockDeps) + .getBinderCallingUid(); + + try { + mVcnMgmtSvc.getConfiguredSubscriptionGroups(TEST_PACKAGE_NAME); + fail("Expected security exception for non system user"); + } catch (SecurityException expected) { + } + } + + @Test + public void testGetConfiguredSubscriptionGroupsMismatchedPackages() throws Exception { + final String badPackage = "IncorrectPackage"; + doThrow(new SecurityException()).when(mAppOpsMgr).checkPackage(TEST_UID, badPackage); + + try { + mVcnMgmtSvc.getConfiguredSubscriptionGroups(badPackage); + fail("Expected security exception due to mismatched packages"); + } catch (SecurityException expected) { + } + } + + @Test + public void testGetConfiguredSubscriptionGroups() throws Exception { + mVcnMgmtSvc.setVcnConfig(TEST_UUID_2, TEST_VCN_CONFIG, TEST_PACKAGE_NAME); + + // Assert that if both UUID 1 and 2 are provisioned, the caller only gets ones that they are + // privileged for. + triggerSubscriptionTrackerCbAndGetSnapshot(Collections.singleton(TEST_UUID_1)); + final List<ParcelUuid> subGrps = + mVcnMgmtSvc.getConfiguredSubscriptionGroups(TEST_PACKAGE_NAME); + assertEquals(Collections.singletonList(TEST_UUID_1), subGrps); + } + + @Test public void testAddVcnUnderlyingNetworkPolicyListener() throws Exception { mVcnMgmtSvc.addVcnUnderlyingNetworkPolicyListener(mMockPolicyListener); diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java index 95a972652bf4..eedaac48293c 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java @@ -54,7 +54,6 @@ import android.net.ipsec.ike.ChildSaProposal; import android.net.ipsec.ike.exceptions.IkeException; import android.net.ipsec.ike.exceptions.IkeInternalException; import android.net.ipsec.ike.exceptions.IkeProtocolException; -import android.net.vcn.VcnControlPlaneIkeConfig; import android.net.vcn.VcnManager.VcnErrorCode; import androidx.test.filters.SmallTest; @@ -181,8 +180,8 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection assertEquals(mGatewayConnection.mConnectedState, mGatewayConnection.getCurrentState()); final List<ChildSaProposal> saProposals = - ((VcnControlPlaneIkeConfig) mConfig.getControlPlaneConfig()) - .getChildSessionParams() + mConfig.getTunnelConnectionParams() + .getTunnelModeChildSessionParams() .getSaProposals(); final int expectedMtu = MtuUtils.getMtu( @@ -344,6 +343,31 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection assertFalse(mGatewayConnection.isInSafeMode()); } + @Test + public void testSubsequentFailedValidationTriggersSafeMode() throws Exception { + triggerChildOpened(); + mTestLooper.dispatchAll(); + + triggerValidation(NetworkAgent.VALIDATION_STATUS_VALID); + assertFalse(mGatewayConnection.isInSafeMode()); + + // Trigger a failed validation, and the subsequent safemode timeout. + triggerValidation(NetworkAgent.VALIDATION_STATUS_NOT_VALID); + mTestLooper.dispatchAll(); + + final ArgumentCaptor<Runnable> runnableCaptor = ArgumentCaptor.forClass(Runnable.class); + verify(mDeps, times(2)) + .newWakeupMessage( + eq(mVcnContext), + any(), + eq(VcnGatewayConnection.SAFEMODE_TIMEOUT_ALARM), + runnableCaptor.capture()); + runnableCaptor.getValue().run(); + mTestLooper.dispatchAll(); + + assertTrue(mGatewayConnection.isInSafeMode()); + } + private Consumer<VcnNetworkAgent> setupNetworkAndGetUnwantedCallback() { triggerChildOpened(); mTestLooper.dispatchAll(); diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java index 6dbf7d552bb6..a88f112f4502 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionRetryTimeoutStateTest.java @@ -38,7 +38,7 @@ public class VcnGatewayConnectionRetryTimeoutStateTest extends VcnGatewayConnect public void setUp() throws Exception { super.setUp(); - mFirstRetryInterval = mConfig.getRetryInterval()[0]; + mFirstRetryInterval = mConfig.getRetryIntervalsMillis()[0]; mGatewayConnection.setUnderlyingNetwork(TEST_UNDERLYING_NETWORK_RECORD_1); mGatewayConnection.transitionTo(mGatewayConnection.mRetryTimeoutState); |