Merge "Allow test+other networks to have specifiers"

This commit is contained in:
Remi NGUYEN VAN
2022-02-14 05:31:20 +00:00
committed by Gerrit Code Review
2 changed files with 36 additions and 19 deletions

View File

@@ -1536,9 +1536,12 @@ public final class NetworkCapabilities implements Parcelable {
*/ */
public @NonNull NetworkCapabilities setNetworkSpecifier( public @NonNull NetworkCapabilities setNetworkSpecifier(
@NonNull NetworkSpecifier networkSpecifier) { @NonNull NetworkSpecifier networkSpecifier) {
if (networkSpecifier != null && Long.bitCount(mTransportTypes) != 1) { if (networkSpecifier != null
throw new IllegalStateException("Must have a single transport specified to use " + // Transport can be test, or test + a single other transport
"setNetworkSpecifier"); && mTransportTypes != (1L << TRANSPORT_TEST)
&& Long.bitCount(mTransportTypes & ~(1L << TRANSPORT_TEST)) != 1) {
throw new IllegalStateException("Must have a single non-test transport specified to "
+ "use setNetworkSpecifier");
} }
mNetworkSpecifier = networkSpecifier; mNetworkSpecifier = networkSpecifier;

View File

@@ -49,6 +49,7 @@ import static android.net.NetworkCapabilities.REDACT_FOR_LOCAL_MAC_ADDRESS;
import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS; import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS;
import static android.net.NetworkCapabilities.SIGNAL_STRENGTH_UNSPECIFIED; import static android.net.NetworkCapabilities.SIGNAL_STRENGTH_UNSPECIFIED;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
import static android.net.NetworkCapabilities.TRANSPORT_TEST; import static android.net.NetworkCapabilities.TRANSPORT_TEST;
import static android.net.NetworkCapabilities.TRANSPORT_USB; import static android.net.NetworkCapabilities.TRANSPORT_USB;
import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static android.net.NetworkCapabilities.TRANSPORT_VPN;
@@ -727,25 +728,38 @@ public class NetworkCapabilitiesTest {
@Test @Test
public void testSetNetworkSpecifierOnMultiTransportNc() { public void testSetNetworkSpecifierOnMultiTransportNc() {
// Sequence 1: Transport + Transport + NetworkSpecifier // Sequence 1: Transport + Transport + NetworkSpecifier
NetworkCapabilities nc1 = new NetworkCapabilities(); NetworkCapabilities.Builder nc1 = new NetworkCapabilities.Builder();
nc1.addTransportType(TRANSPORT_CELLULAR).addTransportType(TRANSPORT_WIFI); nc1.addTransportType(TRANSPORT_CELLULAR).addTransportType(TRANSPORT_WIFI);
try { final NetworkSpecifier specifier = CompatUtil.makeEthernetNetworkSpecifier("eth0");
nc1.setNetworkSpecifier(CompatUtil.makeEthernetNetworkSpecifier("eth0")); assertThrows("Cannot set NetworkSpecifier on a NetworkCapability with multiple transports!",
fail("Cannot set NetworkSpecifier on a NetworkCapability with multiple transports!"); IllegalStateException.class,
} catch (IllegalStateException expected) { () -> nc1.build().setNetworkSpecifier(specifier));
// empty assertThrows("Cannot set NetworkSpecifier on a NetworkCapability with multiple transports!",
} IllegalStateException.class,
() -> nc1.setNetworkSpecifier(specifier));
// Sequence 2: Transport + NetworkSpecifier + Transport // Sequence 2: Transport + NetworkSpecifier + Transport
NetworkCapabilities nc2 = new NetworkCapabilities(); NetworkCapabilities.Builder nc2 = new NetworkCapabilities.Builder();
nc2.addTransportType(TRANSPORT_CELLULAR).setNetworkSpecifier( nc2.addTransportType(TRANSPORT_CELLULAR).setNetworkSpecifier(specifier);
CompatUtil.makeEthernetNetworkSpecifier("testtap3"));
try { assertThrows("Cannot set a second TransportType of a network which has a NetworkSpecifier!",
nc2.addTransportType(TRANSPORT_WIFI); IllegalStateException.class,
fail("Cannot set a second TransportType of a network which has a NetworkSpecifier!"); () -> nc2.build().addTransportType(TRANSPORT_WIFI));
} catch (IllegalStateException expected) { assertThrows("Cannot set a second TransportType of a network which has a NetworkSpecifier!",
// empty IllegalStateException.class,
} () -> nc2.addTransportType(TRANSPORT_WIFI));
}
@Test @IgnoreUpTo(Build.VERSION_CODES.R) // New behavior in updatable NetworkCapabilities (S+)
public void testSetNetworkSpecifierOnTestMultiTransportNc() {
final NetworkSpecifier specifier = CompatUtil.makeEthernetNetworkSpecifier("eth0");
NetworkCapabilities nc = new NetworkCapabilities.Builder()
.addTransportType(TRANSPORT_TEST)
.addTransportType(TRANSPORT_ETHERNET)
.setNetworkSpecifier(specifier)
.build();
// Adding a specifier did not crash with 2 transports if one is TEST
assertEquals(specifier, nc.getNetworkSpecifier());
} }
@Test @Test