From ce6a5df07384ff39fd95e20ac70ec58a939f8321 Mon Sep 17 00:00:00 2001 From: Luke Huang Date: Tue, 19 May 2020 01:52:29 +0000 Subject: [PATCH 1/3] Revert "Fix flaky test for DnsResolverTest" This reverts commit dd9608b7d1147a4eaf36ea634b9fc2f0feca1145. Reason for revert: This CL made whole test failed. Bug: 153624005 Bug: 150952393 Bug: 151122313 Merged-In: I083529616dbf80421ea6a322bb57d2bb0f2bca62 Change-Id: I002c39d6535fb31b13bc463812517fe1882f1884 (cherry picked from commit 98015badd01863fa4a79c089f371d9a50f2ae98c) --- .../src/android/net/cts/DnsResolverTest.java | 35 +++++++++--- .../android/net/cts/MultinetworkApiTest.java | 23 ++++++-- .../android/net/cts/util/CtsNetUtils.java | 53 +++---------------- 3 files changed, 54 insertions(+), 57 deletions(-) diff --git a/tests/cts/net/src/android/net/cts/DnsResolverTest.java b/tests/cts/net/src/android/net/cts/DnsResolverTest.java index 28753ffc41..1cc49f900a 100644 --- a/tests/cts/net/src/android/net/cts/DnsResolverTest.java +++ b/tests/cts/net/src/android/net/cts/DnsResolverTest.java @@ -86,6 +86,7 @@ public class DnsResolverTest extends AndroidTestCase { static final int CANCEL_RETRY_TIMES = 5; static final int QUERY_TIMES = 10; static final int NXDOMAIN = 3; + static final int PRIVATE_DNS_SETTING_TIMEOUT_MS = 6_000; private ContentResolver mCR; private ConnectivityManager mCM; @@ -106,15 +107,32 @@ public class DnsResolverTest extends AndroidTestCase { mExecutorInline = (Runnable r) -> r.run(); mCR = getContext().getContentResolver(); mCtsNetUtils = new CtsNetUtils(getContext()); - mCtsNetUtils.storePrivateDnsSetting(); + storePrivateDnsSetting(); } @Override protected void tearDown() throws Exception { - mCtsNetUtils.restorePrivateDnsSetting(); + restorePrivateDnsSetting(); super.tearDown(); } + private void storePrivateDnsSetting() { + // Store private DNS setting + mOldMode = Settings.Global.getString(mCR, Settings.Global.PRIVATE_DNS_MODE); + mOldDnsSpecifier = Settings.Global.getString(mCR, Settings.Global.PRIVATE_DNS_SPECIFIER); + } + + private void restorePrivateDnsSetting() throws InterruptedException { + // restore private DNS setting + Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, mOldMode); + if ("hostname".equals(mOldMode)) { + Settings.Global.putString( + mCR, Settings.Global.PRIVATE_DNS_SPECIFIER, mOldDnsSpecifier); + mCtsNetUtils.awaitPrivateDnsSetting("restorePrivateDnsSetting timeout", + mCM.getActiveNetwork(), mOldDnsSpecifier, PRIVATE_DNS_SETTING_TIMEOUT_MS, true); + } + } + private static String byteArrayToHexString(byte[] bytes) { char[] hexChars = new char[bytes.length * 2]; for (int i = 0; i < bytes.length; ++i) { @@ -398,13 +416,16 @@ public class DnsResolverTest extends AndroidTestCase { final String msg = "RawQuery " + TEST_NX_DOMAIN + " with private DNS"; // Enable private DNS strict mode and set server to dns.google before doing NxDomain test. // b/144521720 - mCtsNetUtils.setPrivateDnsStrictMode(GOOGLE_PRIVATE_DNS_SERVER); + Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, "hostname"); + Settings.Global.putString(mCR, + Settings.Global.PRIVATE_DNS_SPECIFIER, GOOGLE_PRIVATE_DNS_SERVER); for (Network network : getTestableNetworks()) { final Network networkForPrivateDns = (network != null) ? network : mCM.getActiveNetwork(); assertNotNull("Can't find network to await private DNS on", networkForPrivateDns); mCtsNetUtils.awaitPrivateDnsSetting(msg + " wait private DNS setting timeout", - networkForPrivateDns, GOOGLE_PRIVATE_DNS_SERVER, true); + networkForPrivateDns, GOOGLE_PRIVATE_DNS_SERVER, + PRIVATE_DNS_SETTING_TIMEOUT_MS, true); final VerifyCancelCallback callback = new VerifyCancelCallback(msg); mDns.rawQuery(network, TEST_NX_DOMAIN, CLASS_IN, TYPE_AAAA, FLAG_NO_CACHE_LOOKUP, executor, null, callback); @@ -667,7 +688,9 @@ public class DnsResolverTest extends AndroidTestCase { final Network[] testNetworks = getTestableNetworks(); // Set an invalid private DNS server - mCtsNetUtils.setPrivateDnsStrictMode(INVALID_PRIVATE_DNS_SERVER); + Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, "hostname"); + Settings.Global.putString(mCR, + Settings.Global.PRIVATE_DNS_SPECIFIER, INVALID_PRIVATE_DNS_SERVER); final String msg = "Test PrivateDnsBypass " + TEST_DOMAIN; for (Network network : testNetworks) { // This test cannot be ran with null network because we need to explicitly pass a @@ -676,7 +699,7 @@ public class DnsResolverTest extends AndroidTestCase { // wait for private DNS setting propagating mCtsNetUtils.awaitPrivateDnsSetting(msg + " wait private DNS setting timeout", - network, INVALID_PRIVATE_DNS_SERVER, false); + network, INVALID_PRIVATE_DNS_SERVER, PRIVATE_DNS_SETTING_TIMEOUT_MS, false); final CountDownLatch latch = new CountDownLatch(1); final DnsResolver.Callback> errorCallback = diff --git a/tests/cts/net/src/android/net/cts/MultinetworkApiTest.java b/tests/cts/net/src/android/net/cts/MultinetworkApiTest.java index 985e313a92..f123187d86 100644 --- a/tests/cts/net/src/android/net/cts/MultinetworkApiTest.java +++ b/tests/cts/net/src/android/net/cts/MultinetworkApiTest.java @@ -41,6 +41,7 @@ public class MultinetworkApiTest extends AndroidTestCase { private static final String TAG = "MultinetworkNativeApiTest"; static final String GOOGLE_PRIVATE_DNS_SERVER = "dns.google"; + static final int PRIVATE_DNS_SETTING_TIMEOUT_MS = 2_000; /** * @return 0 on success @@ -68,7 +69,7 @@ public class MultinetworkApiTest extends AndroidTestCase { mCM = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE); mCR = getContext().getContentResolver(); mCtsNetUtils = new CtsNetUtils(getContext()); - mCtsNetUtils.storePrivateDnsSetting(); + storePrivateDnsSetting(); } @Override @@ -76,6 +77,18 @@ public class MultinetworkApiTest extends AndroidTestCase { super.tearDown(); } + private void storePrivateDnsSetting() { + // Store private DNS setting + mOldMode = Settings.Global.getString(mCR, Settings.Global.PRIVATE_DNS_MODE); + mOldDnsSpecifier = Settings.Global.getString(mCR, Settings.Global.PRIVATE_DNS_SPECIFIER); + } + + private void restorePrivateDnsSetting() { + // restore private DNS setting + Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, mOldMode); + Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_SPECIFIER, mOldDnsSpecifier); + } + private Network[] getTestableNetworks() { final ArrayList testableNetworks = new ArrayList(); for (Network network : mCM.getAllNetworks()) { @@ -226,15 +239,17 @@ public class MultinetworkApiTest extends AndroidTestCase { // Enable private DNS strict mode and set server to dns.google before doing NxDomain test. // b/144521720 try { - mCtsNetUtils.setPrivateDnsStrictMode(GOOGLE_PRIVATE_DNS_SERVER); + Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, "hostname"); + Settings.Global.putString(mCR, + Settings.Global.PRIVATE_DNS_SPECIFIER, GOOGLE_PRIVATE_DNS_SERVER); for (Network network : getTestableNetworks()) { // Wait for private DNS setting to propagate. mCtsNetUtils.awaitPrivateDnsSetting("NxDomain test wait private DNS setting timeout", - network, GOOGLE_PRIVATE_DNS_SERVER, true); + network, GOOGLE_PRIVATE_DNS_SERVER, PRIVATE_DNS_SETTING_TIMEOUT_MS, true); runResNnxDomainCheck(network.getNetworkHandle()); } } finally { - mCtsNetUtils.restorePrivateDnsSetting(); + restorePrivateDnsSetting(); } } } diff --git a/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java b/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java index df2de4f057..824146fedf 100644 --- a/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java +++ b/tests/cts/net/util/java/android/net/cts/util/CtsNetUtils.java @@ -28,7 +28,6 @@ import static org.junit.Assert.fail; import android.annotation.NonNull; import android.content.BroadcastReceiver; import android.content.Context; -import android.content.ContentResolver; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; @@ -40,7 +39,6 @@ import android.net.NetworkInfo; import android.net.NetworkInfo.State; import android.net.NetworkRequest; import android.net.wifi.WifiManager; -import android.provider.Settings; import android.system.Os; import android.system.OsConstants; import android.util.Log; @@ -60,9 +58,7 @@ public final class CtsNetUtils { private static final int DURATION = 10000; private static final int SOCKET_TIMEOUT_MS = 2000; private static final int PRIVATE_DNS_PROBE_MS = 1_000; - private static final int PRIVATE_DNS_INTERVAL_MS = 500; - public static final int PRIVATE_DNS_SETTING_TIMEOUT_MS = 6_000; public static final int HTTP_PORT = 80; public static final String TEST_HOST = "connectivitycheck.gstatic.com"; public static final String HTTP_REQUEST = @@ -73,19 +69,15 @@ public final class CtsNetUtils { public static final String NETWORK_CALLBACK_ACTION = "ConnectivityManagerTest.NetworkCallbackAction"; - private final Context mContext; - private final ConnectivityManager mCm; - private final ContentResolver mCR; - private final WifiManager mWifiManager; + private Context mContext; + private ConnectivityManager mCm; + private WifiManager mWifiManager; private TestNetworkCallback mCellNetworkCallback; - private String mOldPrivateDnsMode; - private String mOldPrivateDnsSpecifier; public CtsNetUtils(Context context) { mContext = context; mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); - mCR = context.getContentResolver(); } // Toggle WiFi twice, leaving it in the state it started in @@ -257,42 +249,9 @@ public final class CtsNetUtils { return s; } - public void storePrivateDnsSetting() { - // Store private DNS setting - mOldPrivateDnsMode = Settings.Global.getString(mCR, Settings.Global.PRIVATE_DNS_MODE); - mOldPrivateDnsSpecifier = Settings.Global.getString(mCR, - Settings.Global.PRIVATE_DNS_SPECIFIER); - } - - public void restorePrivateDnsSetting() throws InterruptedException { - if (mOldPrivateDnsMode == null || mOldPrivateDnsSpecifier == null) { - return; - } - // restore private DNS setting - if ("hostname".equals(mOldPrivateDnsMode)) { - setPrivateDnsStrictMode(mOldPrivateDnsSpecifier); - awaitPrivateDnsSetting("restorePrivateDnsSetting timeout", - mCm.getActiveNetwork(), - mOldPrivateDnsSpecifier, true); - } else { - Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, mOldPrivateDnsMode); - } - } - - public void setPrivateDnsStrictMode(String server) { - // To reduce flake rate, set PRIVATE_DNS_SPECIFIER before PRIVATE_DNS_MODE. This ensures - // that if the previous private DNS mode was not "hostname", the system only sees one - // EVENT_PRIVATE_DNS_SETTINGS_CHANGED event instead of two. - Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_SPECIFIER, server); - final String mode = Settings.Global.getString(mCR, Settings.Global.PRIVATE_DNS_MODE); - // If current private DNS mode is "hostname", we only need to set PRIVATE_DNS_SPECIFIER. - if (!"hostname".equals(mode)) { - Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, "hostname"); - } - } - public void awaitPrivateDnsSetting(@NonNull String msg, @NonNull Network network, - @NonNull String server, boolean requiresValidatedServers) throws InterruptedException { + @NonNull String server, int timeoutMs, + boolean requiresValidatedServers) throws InterruptedException { CountDownLatch latch = new CountDownLatch(1); NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build(); NetworkCallback callback = new NetworkCallback() { @@ -307,7 +266,7 @@ public final class CtsNetUtils { } }; mCm.registerNetworkCallback(request, callback); - assertTrue(msg, latch.await(PRIVATE_DNS_SETTING_TIMEOUT_MS, TimeUnit.MILLISECONDS)); + assertTrue(msg, latch.await(timeoutMs, TimeUnit.MILLISECONDS)); mCm.unregisterNetworkCallback(callback); // Wait some time for NetworkMonitor's private DNS probe to complete. If we do not do // this, then the test could complete before the NetworkMonitor private DNS probe From e196a61cbbcbf54e4bca9eec7c640d980a411888 Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Tue, 19 May 2020 05:34:35 +0000 Subject: [PATCH 2/3] Fix CtsNetTestCasesLatestSdk fail on Q platform The CtsNetTestCasesLatestSdk needs to build against platform (for hidden API access), The JNI library libnativedns_jni used by CtsNetTestCasesLatestSdk needs to build against stable SDK (for running on Q). To fulfill the combination, property jni_uses_sdk_apis must be set. Bug: 151122313 Bug: 150904735 Bug: 150918852 Test: atest CtsNetTestCasesLatestSdk on R and Q platforms Merged-In: I5db3cb28829847e74412d270db7d17b81c5e26a2 Change-Id: I8e9af302b487199b144f4fd791bc39d57f002fe2 (cherry picked from commit 452ef123caa60eeebc1744b14137197c47704d6b) --- tests/cts/net/Android.bp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/cts/net/Android.bp b/tests/cts/net/Android.bp index 46fae33b9b..93a6d916dd 100644 --- a/tests/cts/net/Android.bp +++ b/tests/cts/net/Android.bp @@ -77,6 +77,7 @@ android_test { android_test { name: "CtsNetTestCasesLatestSdk", defaults: ["CtsNetTestCasesDefaults"], + jni_uses_sdk_apis: true, min_sdk_version: "29", target_sdk_version: "29", test_suites: [ From f021c464fdb713934ec2b0bf1a9efd9216c1166e Mon Sep 17 00:00:00 2001 From: Chen Zhu Date: Fri, 8 May 2020 15:26:32 -0700 Subject: [PATCH 3/3] Apply MainlineTestModuleController to tethering cts tests to only run them when com.google.android.tethering is installed on device. This does not change any existing CTS run. The logic only applies when the test triggered by mts-tradefed to make sure it runs appropriate set of tests against the device. For example, the test will be skipped when running MTS on Q because tethering and wifi are not on Q devices. Bug: 154845935 Test: m mts && mts-tradefed run mts-tethering Change-Id: I9e6bd60982d4ef67538ad506e7008366bbf35363 --- tests/cts/tethering/AndroidTest.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/cts/tethering/AndroidTest.xml b/tests/cts/tethering/AndroidTest.xml index d0a2bce811..e752e3a82a 100644 --- a/tests/cts/tethering/AndroidTest.xml +++ b/tests/cts/tethering/AndroidTest.xml @@ -28,4 +28,8 @@ + + +