From 3acd429ba38322873ea82e04a02a92ea55cd0029 Mon Sep 17 00:00:00 2001 From: Chiachang Wang Date: Mon, 13 Apr 2020 09:33:03 +0000 Subject: [PATCH 1/4] Move CaptivePortalDataTest to common test to support cts Commit has to on top of aosp/1281921 to skip whole test in Q device since CaptivePortalData class is introduced in R. Result in Q will be: [1/1] android.net.CaptivePortalDataTest#skippedClassForDevSdkMismatch: IGNORED Bug: 152280218 Bug: 150640683 Test: atest CtsNetTestCasesLatestSdk:CaptivePortalDataTest on both Q and R device Merged-In: Iddd00e1c85abe767b1a41a1761d3266ba322dba6 Change-Id: Iddd00e1c85abe767b1a41a1761d3266ba322dba6 --- .../{ => common}/java/android/net/CaptivePortalDataTest.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) rename tests/net/{ => common}/java/android/net/CaptivePortalDataTest.kt (93%) diff --git a/tests/net/java/android/net/CaptivePortalDataTest.kt b/tests/net/common/java/android/net/CaptivePortalDataTest.kt similarity index 93% rename from tests/net/java/android/net/CaptivePortalDataTest.kt rename to tests/net/common/java/android/net/CaptivePortalDataTest.kt index 0071438268..51068c2c57 100644 --- a/tests/net/java/android/net/CaptivePortalDataTest.kt +++ b/tests/net/common/java/android/net/CaptivePortalDataTest.kt @@ -16,17 +16,20 @@ package android.net +import android.os.Build import androidx.test.filters.SmallTest -import androidx.test.runner.AndroidJUnit4 import com.android.testutils.assertParcelSane import com.android.testutils.assertParcelingIsLossless +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo +import com.android.testutils.DevSdkIgnoreRunner import org.junit.Test import org.junit.runner.RunWith import kotlin.test.assertEquals import kotlin.test.assertNotEquals @SmallTest -@RunWith(AndroidJUnit4::class) +@RunWith(DevSdkIgnoreRunner::class) +@IgnoreUpTo(Build.VERSION_CODES.Q) class CaptivePortalDataTest { private val data = CaptivePortalData.Builder() .setRefreshTime(123L) From 424cced078624b53faafca3baf72f0c107b21405 Mon Sep 17 00:00:00 2001 From: Chiachang Wang Date: Mon, 13 Apr 2020 10:57:24 +0000 Subject: [PATCH 2/4] Add more tests for CaptivePortalData Add missing tests to cover all system APIs Bug: 152280218 Bug: 150640683 Test: atest CtsNetTestCasesLatestSdk:CaptivePortalDataTest on both Q and R device Change-Id: I6d3826922f16816d5b18ed3540266442a0ed3e49 Merged-In: I6d3826922f16816d5b18ed3540266442a0ed3e49 (cherry picked from commit d9f9bf34637f699608fa3b919b3c85f3d5514a83) --- .../java/android/net/CaptivePortalDataTest.kt | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/net/common/java/android/net/CaptivePortalDataTest.kt b/tests/net/common/java/android/net/CaptivePortalDataTest.kt index 51068c2c57..bd1847b7c4 100644 --- a/tests/net/common/java/android/net/CaptivePortalDataTest.kt +++ b/tests/net/common/java/android/net/CaptivePortalDataTest.kt @@ -22,6 +22,8 @@ import com.android.testutils.assertParcelSane import com.android.testutils.assertParcelingIsLossless import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo import com.android.testutils.DevSdkIgnoreRunner +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Test import org.junit.runner.RunWith import kotlin.test.assertEquals @@ -66,6 +68,46 @@ class CaptivePortalDataTest { assertNotEqualsAfterChange { it.setCaptive(false) } } + @Test + fun testUserPortalUrl() { + assertEquals(Uri.parse("https://portal.example.com/test"), data.userPortalUrl) + } + + @Test + fun testVenueInfoUrl() { + assertEquals(Uri.parse("https://venue.example.com/test"), data.venueInfoUrl) + } + + @Test + fun testIsSessionExtendable() { + assertTrue(data.isSessionExtendable) + } + + @Test + fun testByteLimit() { + assertEquals(456L, data.byteLimit) + // Test byteLimit unset. + assertEquals(-1L, CaptivePortalData.Builder(null).build().byteLimit) + } + + @Test + fun testRefreshTimeMillis() { + assertEquals(123L, data.refreshTimeMillis) + } + + @Test + fun testExpiryTimeMillis() { + assertEquals(789L, data.expiryTimeMillis) + // Test expiryTimeMillis unset. + assertEquals(-1L, CaptivePortalData.Builder(null).build().expiryTimeMillis) + } + + @Test + fun testIsCaptive() { + assertTrue(data.isCaptive) + assertFalse(makeBuilder().setCaptive(false).build().isCaptive) + } + private fun CaptivePortalData.mutate(mutator: (CaptivePortalData.Builder) -> Unit) = CaptivePortalData.Builder(this).apply { mutator(this) }.build() From e770137062f8f720285b6da4824da55cd40ffcf2 Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Mon, 13 Apr 2020 16:09:41 +0000 Subject: [PATCH 3/4] Add instrumentation to test NetworkAgent. Test: NetworkAgentTest, new tests using this API Bug: 139268426 Change-Id: I0b65be788bb742fd1a8c0ca624e97368462f9b6a Merged-In: Ia83b1c896df63bb18e2aa4b74d6cc09eba990eb5 (cherry picked from commit d89dcb9765b9c73c950661faaf8af9b795934acb, aosp/1284574) --- core/java/android/net/NetworkAgent.java | 33 +++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index 31d7d08209..65e772cb5e 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -25,12 +25,14 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.os.Build; import android.os.Bundle; +import android.os.ConditionVariable; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.util.Log; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.AsyncChannel; import com.android.internal.util.Protocol; @@ -571,6 +573,37 @@ public abstract class NetworkAgent { return mNetwork; } + /** + * Register this network agent with a testing harness. + * + * The returned Messenger sends messages to the Handler. This allows a test to send + * this object {@code CMD_*} messages as if they came from ConnectivityService, which + * is useful for testing the behavior. + * + * @hide + */ + public Messenger registerForTest(final Network network) { + log("Registering NetworkAgent for test"); + synchronized (mRegisterLock) { + mNetwork = network; + mInitialConfiguration = null; + } + return new Messenger(mHandler); + } + + /** + * Waits for the handler to be idle. + * This is useful for testing, and has smaller scope than an accessor to mHandler. + * TODO : move the implementation in common library with the tests + * @hide + */ + @VisibleForTesting + public boolean waitForIdle(final long timeoutMs) { + final ConditionVariable cv = new ConditionVariable(false); + mHandler.post(cv::open); + return cv.block(timeoutMs); + } + /** * @return The Network associated with this agent, or null if it's not registered yet. */ From 0e9a7738d0cd961c853f9ca1cc85334c9caa7458 Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Mon, 13 Apr 2020 19:10:13 +0000 Subject: [PATCH 4/4] Allow testing of signal strength - Let any process with NETWORK_SETTINGS register for signal strength wakeup. - Allow agents registering test networks to assign them a signal strength. Test: NetworkAgentTest Bug: 139268426 Change-Id: Iebfeb9316bcbd8472459c517abb16f1f9d879871 Merged-In: I2b4b89be3e69f4853fd6978d2c8f5c8eb4271f21 (cherry picked from commit 5cc7b18fe7fa94ce2e30572c476df445ed337741, aosp/1284585) --- core/java/android/net/NetworkCapabilities.java | 2 ++ services/core/java/com/android/server/ConnectivityService.java | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 73c6b3daf2..52d6fdfbd5 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -680,11 +680,13 @@ public final class NetworkCapabilities implements Parcelable { public void restrictCapabilitesForTestNetwork() { final long originalCapabilities = mNetworkCapabilities; final NetworkSpecifier originalSpecifier = mNetworkSpecifier; + final int originalSignalStrength = mSignalStrength; clearAll(); // Reset the transports to only contain TRANSPORT_TEST. mTransportTypes = (1 << TRANSPORT_TEST); mNetworkCapabilities = originalCapabilities & TEST_NETWORKS_ALLOWED_CAPABILITIES; mNetworkSpecifier = originalSpecifier; + mSignalStrength = originalSignalStrength; } /** diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 51427c191a..1a58d6047b 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2151,7 +2151,8 @@ public class ConnectivityService extends IConnectivityManager.Stub private boolean checkNetworkSignalStrengthWakeupPermission(int pid, int uid) { return checkAnyPermissionOf(pid, uid, android.Manifest.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP, - NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK); + NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, + android.Manifest.permission.NETWORK_SETTINGS); } private void enforceConnectivityRestrictedNetworksPermission() {