Merge "Fix flaky test for DnsResolverTest" am: 7207fc3400
Change-Id: I60bc8560501761f000098fb959ab5a8edbc23a92
This commit is contained in:
@@ -86,7 +86,6 @@ 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;
|
||||||
@@ -107,32 +106,15 @@ 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());
|
||||||
storePrivateDnsSetting();
|
mCtsNetUtils.storePrivateDnsSetting();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void tearDown() throws Exception {
|
protected void tearDown() throws Exception {
|
||||||
restorePrivateDnsSetting();
|
mCtsNetUtils.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) {
|
||||||
@@ -416,16 +398,13 @@ 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
|
||||||
Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, "hostname");
|
mCtsNetUtils.setPrivateDnsStrictMode(GOOGLE_PRIVATE_DNS_SERVER);
|
||||||
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,
|
networkForPrivateDns, GOOGLE_PRIVATE_DNS_SERVER, true);
|
||||||
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);
|
||||||
@@ -688,9 +667,7 @@ 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
|
||||||
Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, "hostname");
|
mCtsNetUtils.setPrivateDnsStrictMode(INVALID_PRIVATE_DNS_SERVER);
|
||||||
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
|
||||||
@@ -699,7 +676,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, PRIVATE_DNS_SETTING_TIMEOUT_MS, false);
|
network, INVALID_PRIVATE_DNS_SERVER, 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 =
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ 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
|
||||||
@@ -69,7 +68,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());
|
||||||
storePrivateDnsSetting();
|
mCtsNetUtils.storePrivateDnsSetting();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -77,18 +76,6 @@ 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()) {
|
||||||
@@ -239,17 +226,15 @@ 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 {
|
||||||
Settings.Global.putString(mCR, Settings.Global.PRIVATE_DNS_MODE, "hostname");
|
mCtsNetUtils.setPrivateDnsStrictMode(GOOGLE_PRIVATE_DNS_SERVER);
|
||||||
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, PRIVATE_DNS_SETTING_TIMEOUT_MS, true);
|
network, GOOGLE_PRIVATE_DNS_SERVER, true);
|
||||||
runResNnxDomainCheck(network.getNetworkHandle());
|
runResNnxDomainCheck(network.getNetworkHandle());
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
restorePrivateDnsSetting();
|
mCtsNetUtils.restorePrivateDnsSetting();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ 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;
|
||||||
@@ -39,6 +40,7 @@ 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;
|
||||||
@@ -58,7 +60,9 @@ 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 =
|
||||||
@@ -69,15 +73,19 @@ public final class CtsNetUtils {
|
|||||||
public static final String NETWORK_CALLBACK_ACTION =
|
public static final String NETWORK_CALLBACK_ACTION =
|
||||||
"ConnectivityManagerTest.NetworkCallbackAction";
|
"ConnectivityManagerTest.NetworkCallbackAction";
|
||||||
|
|
||||||
private Context mContext;
|
private final Context mContext;
|
||||||
private ConnectivityManager mCm;
|
private final ConnectivityManager mCm;
|
||||||
private WifiManager mWifiManager;
|
private final ContentResolver mCR;
|
||||||
|
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
|
||||||
@@ -249,9 +257,42 @@ 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, int timeoutMs,
|
@NonNull String server, boolean requiresValidatedServers) throws InterruptedException {
|
||||||
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() {
|
||||||
@@ -266,7 +307,7 @@ public final class CtsNetUtils {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
mCm.registerNetworkCallback(request, callback);
|
mCm.registerNetworkCallback(request, callback);
|
||||||
assertTrue(msg, latch.await(timeoutMs, TimeUnit.MILLISECONDS));
|
assertTrue(msg, latch.await(PRIVATE_DNS_SETTING_TIMEOUT_MS, 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
|
||||||
|
|||||||
Reference in New Issue
Block a user