Support beta 4 system images.
Beta 4 system images only understand the NETWORK_TEST_RESULT_*
constants and not the new NETWORK_VALIDATION_RESULT_* constants.
When talking to such a build, use the older constants.
Bug: 134923144
Test: atest NetorkStackTests
Test: beta 4 OS build validates
(patched from Icf28c5dcd622c89c411a87b63d2ce4aa7488d082 using:
git -C ~/other-branch-repo/frameworks/base/ show -p | patch -p3)
Merged-In: Ic97d42c89ac011fa668f0edb23fbb6a13a486e57
(cherry picked from commit eb9e627711a8c2563d45cf62a0206e138c14af0a)
Change-Id: I9e84b9c69e857af7d79a620da0c1ded74f7c2c63
diff --git a/src/com/android/server/connectivity/NetworkMonitor.java b/src/com/android/server/connectivity/NetworkMonitor.java
index 9a8b304..0b2c051 100644
--- a/src/com/android/server/connectivity/NetworkMonitor.java
+++ b/src/com/android/server/connectivity/NetworkMonitor.java
@@ -24,6 +24,9 @@
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.DnsResolver.FLAG_EMPTY;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_INVALID;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY;
+import static android.net.INetworkMonitor.NETWORK_TEST_RESULT_VALID;
import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_DNS;
import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_FALLBACK;
import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_HTTP;
@@ -93,6 +96,7 @@
import android.net.util.Stopwatch;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
+import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.os.RemoteException;
@@ -286,6 +290,7 @@
private final Context mContext;
private final INetworkMonitorCallbacks mCallback;
+ private final int mCallbackVersion;
private final Network mCleartextDnsNetwork;
private final Network mNetwork;
private final TelephonyManager mTelephonyManager;
@@ -355,6 +360,17 @@
private boolean mAcceptPartialConnectivity = false;
private final EvaluationState mEvaluationState = new EvaluationState();
+ private int getCallbackVersion(INetworkMonitorCallbacks cb) {
+ int version;
+ try {
+ version = cb.getInterfaceVersion();
+ } catch (RemoteException e) {
+ version = 0;
+ }
+ if (version == Build.VERSION_CODES.CUR_DEVELOPMENT) version = 0;
+ return version;
+ }
+
public NetworkMonitor(Context context, INetworkMonitorCallbacks cb, Network network,
SharedLog validationLog) {
this(context, cb, network, new IpConnectivityLog(), validationLog,
@@ -376,6 +392,7 @@
mMetricsLog = logger;
mValidationLogs = validationLogs;
mCallback = cb;
+ mCallbackVersion = getCallbackVersion(cb);
mDependencies = deps;
mDetectionStatsUtils = detectionStatsUtils;
mNetwork = network;
@@ -2113,6 +2130,15 @@
}
protected int getNetworkTestResult() {
+ if (mCallbackVersion < 3) {
+ if ((mEvaluationResult & NETWORK_VALIDATION_RESULT_VALID) != 0) {
+ return NETWORK_TEST_RESULT_VALID;
+ }
+ if ((mEvaluationResult & NETWORK_VALIDATION_RESULT_PARTIAL) != 0) {
+ return NETWORK_TEST_RESULT_PARTIAL_CONNECTIVITY;
+ }
+ return NETWORK_TEST_RESULT_INVALID;
+ }
return mEvaluationResult | mProbeResults;
}
}
diff --git a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
index 287d598..c0d9427 100644
--- a/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
+++ b/tests/unit/src/com/android/server/connectivity/NetworkMonitorTest.java
@@ -286,7 +286,7 @@
private FakeDns mFakeDns;
@Before
- public void setUp() throws IOException {
+ public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(mDependencies.getPrivateDnsBypassNetwork(any())).thenReturn(mCleartextDnsNetwork);
when(mDependencies.getDnsResolver()).thenReturn(mDnsResolver);
@@ -354,6 +354,8 @@
return null;
}).when(mContext).unregisterReceiver(any());
+ resetCallbacks();
+
setMinDataStallEvaluateInterval(500);
setDataStallEvaluationType(DATA_STALL_EVALUATION_TYPE_DNS);
setValidDataStallDnsTimeThreshold(500);
@@ -381,6 +383,17 @@
0, mRegisteredReceivers.size());
}
+ private void resetCallbacks() {
+ reset(mCallbacks);
+ // TODO: make this a parameterized test.
+ try {
+ when(mCallbacks.getInterfaceVersion()).thenReturn(3);
+ } catch (RemoteException e) {
+ // Can't happen as mCallbacks is a mock
+ fail("Error mocking getInterfaceVersion" + e);
+ }
+ }
+
private class WrappedNetworkMonitor extends NetworkMonitor {
private long mProbeTime = 0;
private final ConditionVariable mQuitCv = new ConditionVariable(false);
@@ -727,7 +740,7 @@
setStatus(mHttpsConnection, 204);
setStatus(mHttpConnection, 204);
- reset(mCallbacks);
+ resetCallbacks();
nm.notifyCaptivePortalAppFinished(APP_RETURN_DISMISSED);
verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce())
.notifyNetworkTested(eq(NETWORK_VALIDATION_PROBE_DNS | NETWORK_VALIDATION_PROBE_HTTP
@@ -765,7 +778,7 @@
eq(null));
// Fix DNS and retry, expect validation to succeed.
- reset(mCallbacks);
+ resetCallbacks();
mFakeDns.setAnswer("dns.google", new String[]{"2001:db8::1"});
wnm.forceReevaluation(Process.myUid());
@@ -774,7 +787,7 @@
eq(null));
// Change configuration to an invalid DNS name, expect validation to fail.
- reset(mCallbacks);
+ resetCallbacks();
mFakeDns.setAnswer("dns.bad", new String[0]);
wnm.notifyPrivateDnsSettingsChanged(new PrivateDnsConfig("dns.bad", new InetAddress[0]));
// Strict mode hostname resolve fail. Expect only notification for evaluation fail. No probe
@@ -785,7 +798,7 @@
// Change configuration back to working again, but make private DNS not work.
// Expect validation to fail.
- reset(mCallbacks);
+ resetCallbacks();
mFakeDns.setNonBypassPrivateDnsWorking(false);
wnm.notifyPrivateDnsSettingsChanged(new PrivateDnsConfig("dns.google",
new InetAddress[0]));
@@ -795,7 +808,7 @@
eq(null));
// Make private DNS work again. Expect validation to succeed.
- reset(mCallbacks);
+ resetCallbacks();
mFakeDns.setNonBypassPrivateDnsWorking(true);
wnm.forceReevaluation(Process.myUid());
verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).atLeastOnce())
@@ -863,7 +876,7 @@
// Expect to send HTTP, HTTPS, FALLBACK probe and evaluation result notifications to CS.
final NetworkMonitor nm = runNetworkTest(VALIDATION_RESULT_PARTIAL);
- reset(mCallbacks);
+ resetCallbacks();
nm.setAcceptPartialConnectivity();
// Expect to update evaluation result notifications to CS.
verify(mCallbacks, timeout(HANDLER_TIMEOUT_MS).times(1)).notifyNetworkTested(
@@ -877,7 +890,7 @@
setStatus(mFallbackConnection, 500);
runPartialConnectivityNetworkTest(VALIDATION_RESULT_PARTIAL);
- reset(mCallbacks);
+ resetCallbacks();
setStatus(mHttpsConnection, 500);
setStatus(mHttpConnection, 500);
setStatus(mFallbackConnection, 204);
@@ -930,7 +943,7 @@
final NetworkMonitor nm = runValidatedNetworkTest();
// Verify forceReevalution will not reset the validation result but only probe result until
// getting the validation result.
- reset(mCallbacks);
+ resetCallbacks();
setSslException(mHttpsConnection);
setStatus(mHttpConnection, 500);
setStatus(mFallbackConnection, 204);
@@ -955,7 +968,7 @@
public void testEvaluationState_reportProbeResult() throws Exception {
final NetworkMonitor nm = runValidatedNetworkTest();
- reset(mCallbacks);
+ resetCallbacks();
nm.reportHttpProbeResult(NETWORK_VALIDATION_PROBE_HTTP, CaptivePortalProbeResult.SUCCESS);
// Verify result should be appended and notifyNetworkTested callback is triggered once.