summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-06-24 01:07:44 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2021-06-24 01:07:44 +0000
commitd94973bec4a1807d1910a66e6490e473121e120e (patch)
tree4f67cd5d4bc05decfd6c85f4dce1813990e366dd
parent97c0ff6c0f3ba6c2aeb73502a3e9b9991c1b350a (diff)
parent1db2e1600bd9fbaec6e56627efb4ecb77814627d (diff)
downloadnet-d94973bec4a1807d1910a66e6490e473121e120e.tar.gz
Snap for 7486544 from 1db2e1600bd9fbaec6e56627efb4ecb77814627d to sc-release
Change-Id: I87fda7e740358b8ff20242ec1bda022f0f93684b
-rw-r--r--common/framework/com/android/net/module/util/ConnectivitySettingsUtils.java127
-rw-r--r--common/testutils/Android.bp1
-rw-r--r--common/testutils/devicetests/com/android/testutils/TestHttpServer.kt10
-rw-r--r--common/testutils/devicetests/com/android/testutils/TestNetworkTracker.kt4
-rw-r--r--common/testutils/devicetests/com/android/testutils/TestableNetworkStatsProvider.kt13
5 files changed, 148 insertions, 7 deletions
diff --git a/common/framework/com/android/net/module/util/ConnectivitySettingsUtils.java b/common/framework/com/android/net/module/util/ConnectivitySettingsUtils.java
new file mode 100644
index 00000000..b7eb70b0
--- /dev/null
+++ b/common/framework/com/android/net/module/util/ConnectivitySettingsUtils.java
@@ -0,0 +1,127 @@
+/*
+ * 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 com.android.net.module.util;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+/**
+ * Collection of connectivity settings utilities.
+ *
+ * @hide
+ */
+public class ConnectivitySettingsUtils {
+ public static final int PRIVATE_DNS_MODE_OFF = 1;
+ public static final int PRIVATE_DNS_MODE_OPPORTUNISTIC = 2;
+ public static final int PRIVATE_DNS_MODE_PROVIDER_HOSTNAME = 3;
+
+ public static final String PRIVATE_DNS_DEFAULT_MODE = "private_dns_default_mode";
+ public static final String PRIVATE_DNS_MODE = "private_dns_mode";
+ public static final String PRIVATE_DNS_MODE_OFF_STRING = "off";
+ public static final String PRIVATE_DNS_MODE_OPPORTUNISTIC_STRING = "opportunistic";
+ public static final String PRIVATE_DNS_MODE_PROVIDER_HOSTNAME_STRING = "hostname";
+ public static final String PRIVATE_DNS_SPECIFIER = "private_dns_specifier";
+
+ /**
+ * Get private DNS mode as string.
+ *
+ * @param mode One of the private DNS values.
+ * @return A string of private DNS mode.
+ */
+ public static String getPrivateDnsModeAsString(int mode) {
+ switch (mode) {
+ case PRIVATE_DNS_MODE_OFF:
+ return PRIVATE_DNS_MODE_OFF_STRING;
+ case PRIVATE_DNS_MODE_OPPORTUNISTIC:
+ return PRIVATE_DNS_MODE_OPPORTUNISTIC_STRING;
+ case PRIVATE_DNS_MODE_PROVIDER_HOSTNAME:
+ return PRIVATE_DNS_MODE_PROVIDER_HOSTNAME_STRING;
+ default:
+ throw new IllegalArgumentException("Invalid private dns mode: " + mode);
+ }
+ }
+
+ private static int getPrivateDnsModeAsInt(String mode) {
+ switch (mode) {
+ case "off":
+ return PRIVATE_DNS_MODE_OFF;
+ case "hostname":
+ return PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
+ case "opportunistic":
+ return PRIVATE_DNS_MODE_OPPORTUNISTIC;
+ default:
+ throw new IllegalArgumentException("Invalid private dns mode: " + mode);
+ }
+ }
+
+ /**
+ * Get private DNS mode from settings.
+ *
+ * @param context The Context to query the private DNS mode from settings.
+ * @return An integer of private DNS mode.
+ */
+ public static int getPrivateDnsMode(@NonNull Context context) {
+ final ContentResolver cr = context.getContentResolver();
+ String mode = Settings.Global.getString(cr, PRIVATE_DNS_MODE);
+ if (TextUtils.isEmpty(mode)) mode = Settings.Global.getString(cr, PRIVATE_DNS_DEFAULT_MODE);
+ // If both PRIVATE_DNS_MODE and PRIVATE_DNS_DEFAULT_MODE are not set, choose
+ // PRIVATE_DNS_MODE_OPPORTUNISTIC as default mode.
+ if (TextUtils.isEmpty(mode)) return PRIVATE_DNS_MODE_OPPORTUNISTIC;
+ return getPrivateDnsModeAsInt(mode);
+ }
+
+ /**
+ * Set private DNS mode to settings.
+ *
+ * @param context The {@link Context} to set the private DNS mode.
+ * @param mode The private dns mode. This should be one of the PRIVATE_DNS_MODE_* constants.
+ */
+ public static void setPrivateDnsMode(@NonNull Context context, int mode) {
+ if (!(mode == PRIVATE_DNS_MODE_OFF
+ || mode == PRIVATE_DNS_MODE_OPPORTUNISTIC
+ || mode == PRIVATE_DNS_MODE_PROVIDER_HOSTNAME)) {
+ throw new IllegalArgumentException("Invalid private dns mode: " + mode);
+ }
+ Settings.Global.putString(context.getContentResolver(), PRIVATE_DNS_MODE,
+ getPrivateDnsModeAsString(mode));
+ }
+
+ /**
+ * Get specific private dns provider name from {@link Settings}.
+ *
+ * @param context The {@link Context} to query the setting.
+ * @return The specific private dns provider name, or null if no setting value.
+ */
+ @Nullable
+ public static String getPrivateDnsHostname(@NonNull Context context) {
+ return Settings.Global.getString(context.getContentResolver(), PRIVATE_DNS_SPECIFIER);
+ }
+
+ /**
+ * Set specific private dns provider name to {@link Settings}.
+ *
+ * @param context The {@link Context} to set the setting.
+ * @param specifier The specific private dns provider name.
+ */
+ public static void setPrivateDnsHostname(@NonNull Context context, @Nullable String specifier) {
+ Settings.Global.putString(context.getContentResolver(), PRIVATE_DNS_SPECIFIER, specifier);
+ }
+}
diff --git a/common/testutils/Android.bp b/common/testutils/Android.bp
index 1a7b4375..d29c1cd9 100644
--- a/common/testutils/Android.bp
+++ b/common/testutils/Android.bp
@@ -35,6 +35,7 @@ java_library {
"libnanohttpd",
"net-tests-utils-host-device-common",
"net-utils-device-common",
+ "modules-utils-build_system",
],
}
diff --git a/common/testutils/devicetests/com/android/testutils/TestHttpServer.kt b/common/testutils/devicetests/com/android/testutils/TestHttpServer.kt
index 7aae8e3b..39ce4872 100644
--- a/common/testutils/devicetests/com/android/testutils/TestHttpServer.kt
+++ b/common/testutils/devicetests/com/android/testutils/TestHttpServer.kt
@@ -54,12 +54,12 @@ class TestHttpServer(host: String? = null) : NanoHTTPD(host, 0 /* auto-select th
fun addResponse(
uri: Uri,
statusCode: Response.IStatus,
- locationHeader: String? = null,
+ headers: Map<String, String>? = null,
content: String = ""
) {
addResponse(Request(uri.path
?: "", Method.GET, uri.query ?: ""),
- statusCode, locationHeader, content)
+ statusCode, headers, content)
}
/**
@@ -68,11 +68,13 @@ class TestHttpServer(host: String? = null) : NanoHTTPD(host, 0 /* auto-select th
fun addResponse(
request: Request,
statusCode: Response.IStatus,
- locationHeader: String? = null,
+ headers: Map<String, String>? = null,
content: String = ""
) {
val response = newFixedLengthResponse(statusCode, "text/plain", content)
- locationHeader?.let { response.addHeader("Location", it) }
+ headers?.forEach {
+ (key, value) -> response.addHeader(key, value)
+ }
responses[request] = response
}
diff --git a/common/testutils/devicetests/com/android/testutils/TestNetworkTracker.kt b/common/testutils/devicetests/com/android/testutils/TestNetworkTracker.kt
index d8dd67a3..36c09ce6 100644
--- a/common/testutils/devicetests/com/android/testutils/TestNetworkTracker.kt
+++ b/common/testutils/devicetests/com/android/testutils/TestNetworkTracker.kt
@@ -26,6 +26,7 @@ import android.net.NetworkRequest
import android.net.TestNetworkInterface
import android.net.TestNetworkManager
import android.os.Binder
+import com.android.modules.utils.build.SdkLevel.isAtLeastS
import java.util.concurrent.CompletableFuture
import java.util.concurrent.TimeUnit
@@ -39,7 +40,8 @@ import java.util.concurrent.TimeUnit
fun initTestNetwork(context: Context, interfaceAddr: LinkAddress, setupTimeoutMs: Long = 10_000L):
TestNetworkTracker {
val tnm = context.getSystemService(TestNetworkManager::class.java)
- val iface = tnm.createTunInterface(arrayOf(interfaceAddr))
+ val iface = if (isAtLeastS()) tnm.createTunInterface(listOf(interfaceAddr))
+ else tnm.createTunInterface(arrayOf(interfaceAddr))
return TestNetworkTracker(context, iface, tnm, setupTimeoutMs)
}
diff --git a/common/testutils/devicetests/com/android/testutils/TestableNetworkStatsProvider.kt b/common/testutils/devicetests/com/android/testutils/TestableNetworkStatsProvider.kt
index d034a7d5..8477151b 100644
--- a/common/testutils/devicetests/com/android/testutils/TestableNetworkStatsProvider.kt
+++ b/common/testutils/devicetests/com/android/testutils/TestableNetworkStatsProvider.kt
@@ -30,7 +30,12 @@ open class TestableNetworkStatsProvider(
) : NetworkStatsProvider() {
sealed class CallbackType {
data class OnRequestStatsUpdate(val token: Int) : CallbackType()
- data class OnSetLimit(val iface: String?, val quotaBytes: Long) : CallbackType()
+ data class OnSetWarningAndLimit(
+ val iface: String?,
+ val warningBytes: Long,
+ val limitBytes: Long
+ ) : CallbackType()
+ data class OnSetLimit(val iface: String?, val limitBytes: Long) : CallbackType()
data class OnSetAlert(val quotaBytes: Long) : CallbackType()
}
@@ -42,6 +47,10 @@ open class TestableNetworkStatsProvider(
history.add(CallbackType.OnRequestStatsUpdate(token))
}
+ override fun onSetWarningAndLimit(iface: String, warningBytes: Long, limitBytes: Long) {
+ history.add(CallbackType.OnSetWarningAndLimit(iface, warningBytes, limitBytes))
+ }
+
override fun onSetLimit(iface: String, quotaBytes: Long) {
history.add(CallbackType.OnSetLimit(iface, quotaBytes))
}
@@ -56,7 +65,7 @@ open class TestableNetworkStatsProvider(
if (token != TOKEN_ANY) {
assertEquals(token, event.token)
}
- return token
+ return event.token
}
fun expectOnSetLimit(iface: String?, quotaBytes: Long, timeout: Long = defaultTimeoutMs) {