blob: d118c8a0ca3c7e76072c2d1ac58a0c4da0c88eb0 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.net.cts;
import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
import static android.net.NetworkCapabilities.NET_CAPABILITY_MMS;
import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED;
import static android.net.NetworkCapabilities.TRANSPORT_BLUETOOTH;
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.net.MacAddress;
import android.net.MatchAllNetworkSpecifier;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
import android.net.UidRange;
import android.net.wifi.WifiNetworkSpecifier;
import android.os.Build;
import android.os.PatternMatcher;
import android.os.Process;
import android.util.ArraySet;
import androidx.test.runner.AndroidJUnit4;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class NetworkRequestTest {
@Rule
public final DevSdkIgnoreRule ignoreRule = new DevSdkIgnoreRule();
private static final String TEST_SSID = "TestSSID";
private static final String OTHER_SSID = "OtherSSID";
private static final int TEST_UID = 2097;
private static final String TEST_PACKAGE_NAME = "test.package.name";
private static final MacAddress ARBITRARY_ADDRESS = MacAddress.fromString("3:5:8:12:9:2");
private class LocalNetworkSpecifier extends NetworkSpecifier {
private final int mId;
LocalNetworkSpecifier(int id) {
mId = id;
}
@Override
public boolean canBeSatisfiedBy(NetworkSpecifier other) {
return other instanceof LocalNetworkSpecifier
&& mId == ((LocalNetworkSpecifier) other).mId;
}
}
@Test
public void testCapabilities() {
assertTrue(new NetworkRequest.Builder().addCapability(NET_CAPABILITY_MMS).build()
.hasCapability(NET_CAPABILITY_MMS));
assertFalse(new NetworkRequest.Builder().removeCapability(NET_CAPABILITY_MMS).build()
.hasCapability(NET_CAPABILITY_MMS));
final NetworkRequest nr = new NetworkRequest.Builder().clearCapabilities().build();
// Verify request has no capabilities
verifyNoCapabilities(nr);
}
@Test @IgnoreUpTo(Build.VERSION_CODES.Q)
public void testTemporarilyNotMeteredCapability() {
assertTrue(new NetworkRequest.Builder()
.addCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED).build()
.hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED));
assertFalse(new NetworkRequest.Builder()
.removeCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED).build()
.hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED));
}
private void verifyNoCapabilities(NetworkRequest nr) {
// NetworkCapabilities.mNetworkCapabilities is defined as type long
final int MAX_POSSIBLE_CAPABILITY = Long.SIZE;
for(int bit = 0; bit < MAX_POSSIBLE_CAPABILITY; bit++) {
assertFalse(nr.hasCapability(bit));
}
}
@Test
public void testTransports() {
assertTrue(new NetworkRequest.Builder().addTransportType(TRANSPORT_BLUETOOTH).build()
.hasTransport(TRANSPORT_BLUETOOTH));
assertFalse(new NetworkRequest.Builder().removeTransportType(TRANSPORT_BLUETOOTH).build()
.hasTransport(TRANSPORT_BLUETOOTH));
}
@Test
@IgnoreUpTo(Build.VERSION_CODES.Q)
public void testSpecifier() {
assertNull(new NetworkRequest.Builder().build().getNetworkSpecifier());
final WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
.setSsidPattern(new PatternMatcher(TEST_SSID, PatternMatcher.PATTERN_LITERAL))
.setBssidPattern(ARBITRARY_ADDRESS, ARBITRARY_ADDRESS)
.build();
final NetworkSpecifier obtainedSpecifier = new NetworkRequest.Builder()
.addTransportType(TRANSPORT_WIFI)
.setNetworkSpecifier(specifier)
.build()
.getNetworkSpecifier();
assertEquals(obtainedSpecifier, specifier);
assertNull(new NetworkRequest.Builder()
.clearCapabilities()
.build()
.getNetworkSpecifier());
}
@Test
@IgnoreUpTo(Build.VERSION_CODES.Q)
public void testRequestorPackageName() {
assertNull(new NetworkRequest.Builder().build().getRequestorPackageName());
final String pkgName = "android.net.test";
final NetworkCapabilities nc = new NetworkCapabilities.Builder()
.setRequestorPackageName(pkgName)
.build();
final NetworkRequest nr = new NetworkRequest.Builder()
.setCapabilities(nc)
.build();
assertEquals(pkgName, nr.getRequestorPackageName());
assertNull(new NetworkRequest.Builder()
.clearCapabilities()
.build()
.getRequestorPackageName());
}
@Test
@IgnoreUpTo(Build.VERSION_CODES.Q)
public void testCanBeSatisfiedBy() {
final LocalNetworkSpecifier specifier1 = new LocalNetworkSpecifier(1234 /* id */);
final LocalNetworkSpecifier specifier2 = new LocalNetworkSpecifier(5678 /* id */);
final NetworkCapabilities capCellularMmsInternet = new NetworkCapabilities()
.addTransportType(TRANSPORT_CELLULAR)
.addCapability(NET_CAPABILITY_MMS)
.addCapability(NET_CAPABILITY_INTERNET);
final NetworkCapabilities capCellularVpnMmsInternet =
new NetworkCapabilities(capCellularMmsInternet).addTransportType(TRANSPORT_VPN);
final NetworkCapabilities capCellularMmsInternetSpecifier1 =
new NetworkCapabilities(capCellularMmsInternet).setNetworkSpecifier(specifier1);
final NetworkCapabilities capVpnInternetSpecifier1 = new NetworkCapabilities()
.addCapability(NET_CAPABILITY_INTERNET)
.addTransportType(TRANSPORT_VPN)
.setNetworkSpecifier(specifier1);
final NetworkCapabilities capCellularMmsInternetMatchallspecifier =
new NetworkCapabilities(capCellularMmsInternet)
.setNetworkSpecifier(new MatchAllNetworkSpecifier());
final NetworkCapabilities capCellularMmsInternetSpecifier2 =
new NetworkCapabilities(capCellularMmsInternet).setNetworkSpecifier(specifier2);
final NetworkRequest requestCellularInternetSpecifier1 = new NetworkRequest.Builder()
.addTransportType(TRANSPORT_CELLULAR)
.addCapability(NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier1)
.build();
assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(null));
assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(new NetworkCapabilities()));
assertTrue(requestCellularInternetSpecifier1.canBeSatisfiedBy(
capCellularMmsInternetMatchallspecifier));
assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(capCellularMmsInternet));
assertTrue(requestCellularInternetSpecifier1.canBeSatisfiedBy(
capCellularMmsInternetSpecifier1));
assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(capCellularVpnMmsInternet));
assertFalse(requestCellularInternetSpecifier1.canBeSatisfiedBy(
capCellularMmsInternetSpecifier2));
final NetworkRequest requestCellularInternet = new NetworkRequest.Builder()
.addTransportType(TRANSPORT_CELLULAR)
.addCapability(NET_CAPABILITY_INTERNET)
.build();
assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularMmsInternet));
assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularMmsInternetSpecifier1));
assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularMmsInternetSpecifier2));
assertFalse(requestCellularInternet.canBeSatisfiedBy(capVpnInternetSpecifier1));
assertTrue(requestCellularInternet.canBeSatisfiedBy(capCellularVpnMmsInternet));
}
@Test
@IgnoreUpTo(Build.VERSION_CODES.Q)
public void testInvariantInCanBeSatisfiedBy() {
// Test invariant that result of NetworkRequest.canBeSatisfiedBy() should be the same with
// NetworkCapabilities.satisfiedByNetworkCapabilities().
final LocalNetworkSpecifier specifier1 = new LocalNetworkSpecifier(1234 /* id */);
final int uid = Process.myUid();
final ArraySet<UidRange> ranges = new ArraySet<>();
ranges.add(new UidRange(uid, uid));
final NetworkRequest requestCombination = new NetworkRequest.Builder()
.addTransportType(TRANSPORT_CELLULAR)
.addCapability(NET_CAPABILITY_INTERNET)
.setLinkUpstreamBandwidthKbps(1000)
.setNetworkSpecifier(specifier1)
.setSignalStrength(-123)
.setUids(ranges).build();
final NetworkCapabilities capCell = new NetworkCapabilities.Builder()
.addTransportType(TRANSPORT_CELLULAR).build();
assertCorrectlySatisfies(false, requestCombination, capCell);
final NetworkCapabilities capCellInternet = new NetworkCapabilities.Builder(capCell)
.addCapability(NET_CAPABILITY_INTERNET).build();
assertCorrectlySatisfies(false, requestCombination, capCellInternet);
final NetworkCapabilities capCellInternetBW =
new NetworkCapabilities.Builder(capCellInternet)
.setLinkUpstreamBandwidthKbps(1024).build();
assertCorrectlySatisfies(false, requestCombination, capCellInternetBW);
final NetworkCapabilities capCellInternetBWSpecifier1 =
new NetworkCapabilities.Builder(capCellInternetBW)
.setNetworkSpecifier(specifier1).build();
assertCorrectlySatisfies(false, requestCombination, capCellInternetBWSpecifier1);
final NetworkCapabilities capCellInternetBWSpecifier1Signal =
new NetworkCapabilities.Builder(capCellInternetBWSpecifier1)
.setSignalStrength(-123).build();
assertCorrectlySatisfies(true, requestCombination,
capCellInternetBWSpecifier1Signal);
final NetworkCapabilities capCellInternetBWSpecifier1SignalUid =
new NetworkCapabilities.Builder(capCellInternetBWSpecifier1Signal)
.setOwnerUid(uid)
.setAdministratorUids(new int [] {uid}).build();
assertCorrectlySatisfies(true, requestCombination,
capCellInternetBWSpecifier1SignalUid);
}
private void assertCorrectlySatisfies(boolean expect, NetworkRequest request,
NetworkCapabilities nc) {
assertEquals(expect, request.canBeSatisfiedBy(nc));
assertEquals(
request.canBeSatisfiedBy(nc),
request.networkCapabilities.satisfiedByNetworkCapabilities(nc));
}
@Test @IgnoreUpTo(Build.VERSION_CODES.Q)
public void testRequestorUid() {
final NetworkCapabilities nc = new NetworkCapabilities();
// Verify default value is INVALID_UID
assertEquals(Process.INVALID_UID, new NetworkRequest.Builder()
.setCapabilities(nc).build().getRequestorUid());
nc.setRequestorUid(1314);
final NetworkRequest nr = new NetworkRequest.Builder().setCapabilities(nc).build();
assertEquals(1314, nr.getRequestorUid());
assertEquals(Process.INVALID_UID, new NetworkRequest.Builder()
.clearCapabilities().build().getRequestorUid());
}
}