Merge changes I1b2e50f1,I78926bf7
* changes:
gn2bp: Split `gcc_preprocess` actions into genrules
gn2bp: Add compile_multilib attribute
diff --git a/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java b/Tethering/tests/integration/src/android/net/CtsEthernetTetheringTest.java
similarity index 99%
rename from Tethering/tests/integration/src/android/net/EthernetTetheringTest.java
rename to Tethering/tests/integration/src/android/net/CtsEthernetTetheringTest.java
index 97a255f..aea6728 100644
--- a/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java
+++ b/Tethering/tests/integration/src/android/net/CtsEthernetTetheringTest.java
@@ -106,11 +106,11 @@
@RunWith(AndroidJUnit4.class)
@MediumTest
-public class EthernetTetheringTest extends EthernetTetheringTestBase {
+public class CtsEthernetTetheringTest extends EthernetTetheringTestBase {
@Rule
public final DevSdkIgnoreRule mIgnoreRule = new DevSdkIgnoreRule();
- private static final String TAG = EthernetTetheringTest.class.getSimpleName();
+ private static final String TAG = CtsEthernetTetheringTest.class.getSimpleName();
private static final int DUMP_POLLING_MAX_RETRY = 100;
private static final int DUMP_POLLING_INTERVAL_MS = 50;
diff --git a/service/Android.bp b/service/Android.bp
index 50fb4f5..9371b02 100644
--- a/service/Android.bp
+++ b/service/Android.bp
@@ -179,10 +179,7 @@
"networkstack-client",
"PlatformProperties",
"service-connectivity-protos",
- // TODO: Adding the stats protos currently affects test coverage.
- // So remove the protos in ConnectivityService until all
- // tests for proto apis are added.
- //"service-connectivity-stats-protos",
+ "service-connectivity-stats-protos",
"NetworkStackApiStableShims",
],
apex_available: [
diff --git a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
index 6c6070e..96acac3 100644
--- a/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
+++ b/tests/cts/net/src/android/net/cts/ConnectivityManagerTest.java
@@ -2856,7 +2856,7 @@
// Wifi will not automatically reconnect to the network. ensureWifiDisconnected cannot
// apply here. Thus, turn off wifi first and restart to restore.
mTestValidationConfigRule.runAfterNextCleanup(() -> {
- runShellCommand("svc wifi disable");
+ mCtsNetUtils.disableWifi();
mCtsNetUtils.ensureWifiConnected();
});
}
@@ -2898,7 +2898,7 @@
/// Wifi will not automatically reconnect to the network. ensureWifiDisconnected cannot
// apply here. Thus, turn off wifi first and restart to restore.
mTestValidationConfigRule.runAfterNextCleanup(() -> {
- runShellCommand("svc wifi disable");
+ mCtsNetUtils.disableWifi();
mCtsNetUtils.ensureWifiConnected();
});
}
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 9d1fa60..3f2ff9d 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
@@ -57,6 +57,8 @@
import android.text.TextUtils;
import android.util.Log;
+import com.android.compatibility.common.util.PollingCheck;
+import com.android.compatibility.common.util.ShellIdentityUtils;
import com.android.compatibility.common.util.SystemUtil;
import com.android.net.module.util.ConnectivitySettingsUtils;
import com.android.testutils.ConnectUtil;
@@ -268,6 +270,19 @@
}
/**
+ * Disable WiFi and wait for the connection info to be cleared.
+ */
+ public void disableWifi() throws Exception {
+ SystemUtil.runShellCommand("svc wifi disable");
+ PollingCheck.check(
+ "Wifi not disconnected! Current network is not null "
+ + mWifiManager.getConnectionInfo().getNetworkId(),
+ TimeUnit.SECONDS.toMillis(CONNECTIVITY_CHANGE_TIMEOUT_SECS),
+ () -> ShellIdentityUtils.invokeWithShellPermissions(
+ () -> mWifiManager.getConnectionInfo().getNetworkId()) == -1);
+ }
+
+ /**
* Disable WiFi and wait for it to become disconnected from the network.
*
* @param wifiNetworkToCheck If non-null, a network that should be disconnected. This network
diff --git a/tests/cts/net/util/java/android/net/cts/util/CtsTetheringUtils.java b/tests/cts/net/util/java/android/net/cts/util/CtsTetheringUtils.java
index 8b904bc..f506c23 100644
--- a/tests/cts/net/util/java/android/net/cts/util/CtsTetheringUtils.java
+++ b/tests/cts/net/util/java/android/net/cts/util/CtsTetheringUtils.java
@@ -478,7 +478,9 @@
waitForWifiEnabled(ctx);
return runAsShell(ACCESS_WIFI_STATE, () -> wm.isPortableHotspotSupported());
} finally {
- if (!previousWifiEnabledState) SystemUtil.runShellCommand("svc wifi disable");
+ if (!previousWifiEnabledState) {
+ new CtsNetUtils(ctx).disableWifi();
+ }
}
}
diff --git a/tests/unit/java/com/android/server/connectivity/VpnTest.java b/tests/unit/java/com/android/server/connectivity/VpnTest.java
index e6745d1..677e7b6 100644
--- a/tests/unit/java/com/android/server/connectivity/VpnTest.java
+++ b/tests/unit/java/com/android/server/connectivity/VpnTest.java
@@ -1268,6 +1268,23 @@
intent.getIntExtra(VpnManager.EXTRA_ERROR_CLASS, -1 /* defaultValue */));
assertEquals(errorCode,
intent.getIntExtra(VpnManager.EXTRA_ERROR_CODE, -1 /* defaultValue */));
+ // CATEGORY_EVENT_DEACTIVATED_BY_USER & CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED won't
+ // send NetworkCapabilities & LinkProperties to VPN app.
+ // For ERROR_CODE_NETWORK_LOST, the NetworkCapabilities & LinkProperties of underlying
+ // network will be cleared. So the VPN app will receive null for those 2 extra values.
+ if (category.equals(VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER)
+ || category.equals(VpnManager.CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED)
+ || errorCode == VpnManager.ERROR_CODE_NETWORK_LOST) {
+ assertNull(intent.getParcelableExtra(
+ VpnManager.EXTRA_UNDERLYING_NETWORK_CAPABILITIES));
+ assertNull(intent.getParcelableExtra(VpnManager.EXTRA_UNDERLYING_LINK_PROPERTIES));
+ } else {
+ assertNotNull(intent.getParcelableExtra(
+ VpnManager.EXTRA_UNDERLYING_NETWORK_CAPABILITIES));
+ assertNotNull(intent.getParcelableExtra(
+ VpnManager.EXTRA_UNDERLYING_LINK_PROPERTIES));
+ }
+
if (profileState != null) {
assertEquals(profileState[i], intent.getParcelableExtra(
VpnManager.EXTRA_VPN_PROFILE_STATE, VpnProfileState.class));
@@ -1470,6 +1487,12 @@
when(mNetd.interfaceGetCfg(anyString())).thenReturn(config);
final NetworkCallback cb = networkCallbackCaptor.getValue();
cb.onAvailable(TEST_NETWORK);
+ // Trigger onCapabilitiesChanged() and onLinkPropertiesChanged() so the test can verify that
+ // if NetworkCapabilities and LinkProperties of underlying network will be sent/cleared or
+ // not.
+ // See verifyVpnManagerEvent().
+ cb.onCapabilitiesChanged(TEST_NETWORK, new NetworkCapabilities());
+ cb.onLinkPropertiesChanged(TEST_NETWORK, new LinkProperties());
return cb;
}
@@ -1488,6 +1511,11 @@
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(mVpnProfile.encode());
+ doReturn(new NetworkCapabilities()).when(mConnectivityManager)
+ .getRedactedNetworkCapabilitiesForPackage(any(), anyInt(), anyString());
+ doReturn(new LinkProperties()).when(mConnectivityManager)
+ .getRedactedLinkPropertiesForPackage(any(), anyInt(), anyString());
+
final String sessionKey = vpn.startVpnProfile(TEST_VPN_PKG);
final NetworkCallback cb = triggerOnAvailableAndGetCallback();
@@ -1498,8 +1526,18 @@
verify(mIkev2SessionCreator, timeout(TEST_TIMEOUT_MS))
.createIkeSession(any(), any(), any(), any(), captor.capture(), any());
reset(mIkev2SessionCreator);
- final IkeSessionCallback ikeCb = captor.getValue();
- ikeCb.onClosedWithException(exception);
+ // For network lost case, the process should be triggered by calling onLost(), which is the
+ // same process with the real case.
+ if (errorCode == VpnManager.ERROR_CODE_NETWORK_LOST) {
+ cb.onLost(TEST_NETWORK);
+ final ArgumentCaptor<Runnable> runnableCaptor =
+ ArgumentCaptor.forClass(Runnable.class);
+ verify(mExecutor).schedule(runnableCaptor.capture(), anyLong(), any());
+ runnableCaptor.getValue().run();
+ } else {
+ final IkeSessionCallback ikeCb = captor.getValue();
+ ikeCb.onClosedWithException(exception);
+ }
verifyPowerSaveTempWhitelistApp(TEST_VPN_PKG);
reset(mDeviceIdleInternal);
@@ -1508,7 +1546,9 @@
if (errorType == VpnManager.ERROR_CLASS_NOT_RECOVERABLE) {
verify(mConnectivityManager, timeout(TEST_TIMEOUT_MS))
.unregisterNetworkCallback(eq(cb));
- } else if (errorType == VpnManager.ERROR_CLASS_RECOVERABLE) {
+ } else if (errorType == VpnManager.ERROR_CLASS_RECOVERABLE
+ // Vpn won't retry when there is no usable underlying network.
+ && errorCode != VpnManager.ERROR_CODE_NETWORK_LOST) {
int retryIndex = 0;
final IkeSessionCallback ikeCb2 = verifyRetryAndGetNewIkeCb(retryIndex++);