Merge "Revert "Fix flaky test for DnsResolverTest"" am: 430bcaa1f4

Change-Id: Ibbc118c40d9f75a4225fc8bd06d21f73c56f1adb
This commit is contained in:
Luke Huang
2020-05-19 01:26:39 +00:00
committed by Automerger Merge Worker
3 changed files with 54 additions and 57 deletions

View File

@@ -86,6 +86,7 @@ public class DnsResolverTest extends AndroidTestCase {
static final int CANCEL_RETRY_TIMES = 5; static final int CANCEL_RETRY_TIMES = 5;
static final int QUERY_TIMES = 10; static final int QUERY_TIMES = 10;
static final int NXDOMAIN = 3; static final int NXDOMAIN = 3;
static final int PRIVATE_DNS_SETTING_TIMEOUT_MS = 6_000;
private ContentResolver mCR; private ContentResolver mCR;
private ConnectivityManager mCM; private ConnectivityManager mCM;
@@ -106,15 +107,32 @@ public class DnsResolverTest extends AndroidTestCase {
mExecutorInline = (Runnable r) -> r.run(); mExecutorInline = (Runnable r) -> r.run();
mCR = getContext().getContentResolver(); mCR = getContext().getContentResolver();
mCtsNetUtils = new CtsNetUtils(getContext()); mCtsNetUtils = new CtsNetUtils(getContext());
mCtsNetUtils.storePrivateDnsSetting(); storePrivateDnsSetting();
} }
@Override @Override
protected void tearDown() throws Exception { protected void tearDown() throws Exception {
mCtsNetUtils.restorePrivateDnsSetting(); restorePrivateDnsSetting();
super.tearDown(); 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) { private static String byteArrayToHexString(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2]; char[] hexChars = new char[bytes.length * 2];
for (int i = 0; i < bytes.length; ++i) { 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"; 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. // Enable private DNS strict mode and set server to dns.google before doing NxDomain test.
// b/144521720 // 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()) { for (Network network : getTestableNetworks()) {
final Network networkForPrivateDns = final Network networkForPrivateDns =
(network != null) ? network : mCM.getActiveNetwork(); (network != null) ? network : mCM.getActiveNetwork();
assertNotNull("Can't find network to await private DNS on", networkForPrivateDns); assertNotNull("Can't find network to await private DNS on", networkForPrivateDns);
mCtsNetUtils.awaitPrivateDnsSetting(msg + " wait private DNS setting timeout", 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); final VerifyCancelCallback callback = new VerifyCancelCallback(msg);
mDns.rawQuery(network, TEST_NX_DOMAIN, CLASS_IN, TYPE_AAAA, FLAG_NO_CACHE_LOOKUP, mDns.rawQuery(network, TEST_NX_DOMAIN, CLASS_IN, TYPE_AAAA, FLAG_NO_CACHE_LOOKUP,
executor, null, callback); executor, null, callback);
@@ -667,7 +688,9 @@ public class DnsResolverTest extends AndroidTestCase {
final Network[] testNetworks = getTestableNetworks(); final Network[] testNetworks = getTestableNetworks();
// Set an invalid private DNS server // 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; final String msg = "Test PrivateDnsBypass " + TEST_DOMAIN;
for (Network network : testNetworks) { for (Network network : testNetworks) {
// This test cannot be ran with null network because we need to explicitly pass a // 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 // wait for private DNS setting propagating
mCtsNetUtils.awaitPrivateDnsSetting(msg + " wait private DNS setting timeout", 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 CountDownLatch latch = new CountDownLatch(1);
final DnsResolver.Callback<List<InetAddress>> errorCallback = final DnsResolver.Callback<List<InetAddress>> errorCallback =

View File

@@ -41,6 +41,7 @@ public class MultinetworkApiTest extends AndroidTestCase {
private static final String TAG = "MultinetworkNativeApiTest"; private static final String TAG = "MultinetworkNativeApiTest";
static final String GOOGLE_PRIVATE_DNS_SERVER = "dns.google"; static final String GOOGLE_PRIVATE_DNS_SERVER = "dns.google";
static final int PRIVATE_DNS_SETTING_TIMEOUT_MS = 2_000;
/** /**
* @return 0 on success * @return 0 on success
@@ -68,7 +69,7 @@ public class MultinetworkApiTest extends AndroidTestCase {
mCM = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE); mCM = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
mCR = getContext().getContentResolver(); mCR = getContext().getContentResolver();
mCtsNetUtils = new CtsNetUtils(getContext()); mCtsNetUtils = new CtsNetUtils(getContext());
mCtsNetUtils.storePrivateDnsSetting(); storePrivateDnsSetting();
} }
@Override @Override
@@ -76,6 +77,18 @@ public class MultinetworkApiTest extends AndroidTestCase {
super.tearDown(); 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() { private Network[] getTestableNetworks() {
final ArrayList<Network> testableNetworks = new ArrayList<Network>(); final ArrayList<Network> testableNetworks = new ArrayList<Network>();
for (Network network : mCM.getAllNetworks()) { 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. // Enable private DNS strict mode and set server to dns.google before doing NxDomain test.
// b/144521720 // b/144521720
try { 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()) { for (Network network : getTestableNetworks()) {
// Wait for private DNS setting to propagate. // Wait for private DNS setting to propagate.
mCtsNetUtils.awaitPrivateDnsSetting("NxDomain test wait private DNS setting timeout", 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()); runResNnxDomainCheck(network.getNetworkHandle());
} }
} finally { } finally {
mCtsNetUtils.restorePrivateDnsSetting(); restorePrivateDnsSetting();
} }
} }
} }

View File

@@ -28,7 +28,6 @@ import static org.junit.Assert.fail;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.ContentResolver;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
@@ -40,7 +39,6 @@ import android.net.NetworkInfo;
import android.net.NetworkInfo.State; import android.net.NetworkInfo.State;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.provider.Settings;
import android.system.Os; import android.system.Os;
import android.system.OsConstants; import android.system.OsConstants;
import android.util.Log; import android.util.Log;
@@ -60,9 +58,7 @@ public final class CtsNetUtils {
private static final int DURATION = 10000; private static final int DURATION = 10000;
private static final int SOCKET_TIMEOUT_MS = 2000; private static final int SOCKET_TIMEOUT_MS = 2000;
private static final int PRIVATE_DNS_PROBE_MS = 1_000; 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 int HTTP_PORT = 80;
public static final String TEST_HOST = "connectivitycheck.gstatic.com"; public static final String TEST_HOST = "connectivitycheck.gstatic.com";
public static final String HTTP_REQUEST = public static final String HTTP_REQUEST =
@@ -73,19 +69,15 @@ public final class CtsNetUtils {
public static final String NETWORK_CALLBACK_ACTION = public static final String NETWORK_CALLBACK_ACTION =
"ConnectivityManagerTest.NetworkCallbackAction"; "ConnectivityManagerTest.NetworkCallbackAction";
private final Context mContext; private Context mContext;
private final ConnectivityManager mCm; private ConnectivityManager mCm;
private final ContentResolver mCR; private WifiManager mWifiManager;
private final WifiManager mWifiManager;
private TestNetworkCallback mCellNetworkCallback; private TestNetworkCallback mCellNetworkCallback;
private String mOldPrivateDnsMode;
private String mOldPrivateDnsSpecifier;
public CtsNetUtils(Context context) { public CtsNetUtils(Context context) {
mContext = context; mContext = context;
mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
mCR = context.getContentResolver();
} }
// Toggle WiFi twice, leaving it in the state it started in // Toggle WiFi twice, leaving it in the state it started in
@@ -257,42 +249,9 @@ public final class CtsNetUtils {
return s; 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, 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); CountDownLatch latch = new CountDownLatch(1);
NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build(); NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build();
NetworkCallback callback = new NetworkCallback() { NetworkCallback callback = new NetworkCallback() {
@@ -307,7 +266,7 @@ public final class CtsNetUtils {
} }
}; };
mCm.registerNetworkCallback(request, callback); 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); mCm.unregisterNetworkCallback(callback);
// Wait some time for NetworkMonitor's private DNS probe to complete. If we do not do // 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 // this, then the test could complete before the NetworkMonitor private DNS probe