Merge "Simplify per-target-SDK LinkProperties tests."

This commit is contained in:
Lorenzo Colitti
2022-07-26 05:53:05 +00:00
committed by Gerrit Code Review
6 changed files with 51 additions and 288 deletions

View File

@@ -36,10 +36,10 @@ import android.os.Build;
import android.system.OsConstants;
import android.util.ArraySet;
import androidx.core.os.BuildCompat;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.modules.utils.build.SdkLevel;
import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
import com.android.testutils.ConnectivityModuleTest;
import com.android.testutils.DevSdkIgnoreRule;
@@ -114,11 +114,6 @@ public class LinkPropertiesTest {
return InetAddresses.parseNumericAddress(addrString);
}
private static boolean isAtLeastR() {
// BuildCompat.isAtLeastR is documented to return false on release SDKs (including R)
return Build.VERSION.SDK_INT > Build.VERSION_CODES.Q || BuildCompat.isAtLeastR();
}
private void checkEmpty(final LinkProperties lp) {
assertEquals(0, lp.getAllInterfaceNames().size());
assertEquals(0, lp.getAllAddresses().size());
@@ -139,7 +134,7 @@ public class LinkPropertiesTest {
assertFalse(lp.isIpv6Provisioned());
assertFalse(lp.isPrivateDnsActive());
if (isAtLeastR()) {
if (SdkLevel.isAtLeastR()) {
assertNull(lp.getDhcpServerAddress());
assertFalse(lp.isWakeOnLanSupported());
assertNull(lp.getCaptivePortalApiUrl());
@@ -166,7 +161,7 @@ public class LinkPropertiesTest {
lp.setMtu(MTU);
lp.setTcpBufferSizes(TCP_BUFFER_SIZES);
lp.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
if (isAtLeastR()) {
if (SdkLevel.isAtLeastR()) {
lp.setDhcpServerAddress(DHCPSERVER);
lp.setWakeOnLanSupported(true);
lp.setCaptivePortalApiUrl(CAPPORT_API_URL);
@@ -210,7 +205,7 @@ public class LinkPropertiesTest {
assertTrue(source.isIdenticalTcpBufferSizes(target));
assertTrue(target.isIdenticalTcpBufferSizes(source));
if (isAtLeastR()) {
if (SdkLevel.isAtLeastR()) {
assertTrue(source.isIdenticalDhcpServerAddress(target));
assertTrue(source.isIdenticalDhcpServerAddress(source));
@@ -1295,56 +1290,73 @@ public class LinkPropertiesTest {
assertEquals(2, lp.getRoutes().size());
}
@Test @IgnoreUpTo(Build.VERSION_CODES.R)
@CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
@EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
public void testExcludedRoutesEnabled() {
private void assertExcludeRoutesVisible() {
final LinkProperties lp = new LinkProperties();
assertEquals(0, lp.getRoutes().size());
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE));
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 31), RTN_UNREACHABLE));
assertEquals(1, lp.getRoutes().size());
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 0), RTN_THROW));
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 127), RTN_THROW));
assertEquals(2, lp.getRoutes().size());
lp.addRoute(new RouteInfo(GATEWAY1));
assertEquals(3, lp.getRoutes().size());
lp.addRoute(new RouteInfo(new IpPrefix(DNS6, 127), RTN_UNICAST));
assertEquals(4, lp.getRoutes().size());
}
@Test @IgnoreUpTo(Build.VERSION_CODES.R) @IgnoreAfter(Build.VERSION_CODES.S_V2)
@CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
@DisableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
public void testExcludedRoutesDisabled_S() {
private void assertExcludeRoutesNotVisible() {
final LinkProperties lp = new LinkProperties();
assertEquals(0, lp.getRoutes().size());
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE));
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 31), RTN_UNREACHABLE));
assertEquals(0, lp.getRoutes().size());
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 127), RTN_THROW));
assertEquals(0, lp.getRoutes().size());
lp.addRoute(new RouteInfo(GATEWAY1));
assertEquals(1, lp.getRoutes().size());
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 5), RTN_THROW));
// RTN_THROW routes are visible on S when added by the caller (but they are not added by
// the system). This is uncommon usage but was tested by CTSv12.
lp.addRoute(new RouteInfo(new IpPrefix(DNS6, 127), RTN_UNICAST));
assertEquals(2, lp.getRoutes().size());
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 2), RTN_UNICAST));
assertEquals(3, lp.getRoutes().size());
}
@Test @IgnoreUpTo(Build.VERSION_CODES.S_V2)
private void checkExcludeRoutesNotVisibleAfterS() {
if (!SdkLevel.isAtLeastT()) {
// RTN_THROW routes are visible on R and S when added by the caller (but they are not
// added by the system except for legacy VPN).
// This is uncommon usage but was tested by CTSr12.
assertExcludeRoutesVisible();
} else {
assertExcludeRoutesNotVisible();
}
}
@Test @IgnoreUpTo(Build.VERSION_CODES.R)
@CtsNetTestCasesMaxTargetSdk31(reason = "Testing behaviour for target SDK 31")
public void testExcludedRoutesNotVisibleOnTargetSdk31() {
checkExcludeRoutesNotVisibleAfterS();
}
@Test
public void testExcludedRoutesVisibleOnTargetSdk33AndAbove() {
assertExcludeRoutesVisible();
}
@Test @IgnoreUpTo(Build.VERSION_CODES.R)
@CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
@EnableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
public void testExcludedRoutesEnabledByCompatChange() {
assertExcludeRoutesVisible();
}
@Test @IgnoreUpTo(Build.VERSION_CODES.R)
@CtsNetTestCasesMaxTargetSdk31(reason = "Compat change cannot be overridden when targeting T+")
@DisableCompatChanges({LinkProperties.EXCLUDED_ROUTES})
public void testExcludedRoutesDisabled() {
final LinkProperties lp = new LinkProperties();
assertEquals(0, lp.getRoutes().size());
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV4, 0), RTN_UNREACHABLE));
assertEquals(0, lp.getRoutes().size());
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 5), RTN_THROW));
assertEquals(0, lp.getRoutes().size());
lp.addRoute(new RouteInfo(new IpPrefix(ADDRV6, 2), RTN_UNICAST));
assertEquals(1, lp.getRoutes().size());
public void testExcludedRoutesDisabledByCompatChange() {
checkExcludeRoutesNotVisibleAfterS();
}
}

View File

@@ -26,7 +26,6 @@ java_test_host {
"tradefed",
],
static_libs: [
"CompatChangeGatingTestBase",
"modules-utils-build-testing",
],
// Tag this module as a cts test artifact
@@ -38,8 +37,6 @@ java_test_host {
data: [
":CtsHostsideNetworkTestsApp",
":CtsHostsideNetworkTestsApp2",
":CtsHostsideNetworkTestsApp3",
":CtsHostsideNetworkTestsApp3PreT",
":CtsHostsideNetworkTestsAppNext",
],
per_testcase_directory: true,

View File

@@ -1,54 +0,0 @@
//
// Copyright (C) 2022 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 {
default_applicable_licenses: ["Android-Apache-2.0"],
}
java_defaults {
name: "CtsHostsideNetworkTestsApp3Defaults",
srcs: ["src/**/*.java"],
libs: [
"junit",
],
static_libs: [
"ctstestrunner-axt",
"truth-prebuilt",
],
// Tag this module as a cts test artifact
test_suites: [
"cts",
"general-tests",
],
}
android_test_helper_app {
name: "CtsHostsideNetworkTestsApp3",
defaults: [
"cts_support_defaults",
"CtsHostsideNetworkTestsApp3Defaults",
],
}
android_test_helper_app {
name: "CtsHostsideNetworkTestsApp3PreT",
target_sdk_version: "31",
defaults: [
"cts_support_defaults",
"CtsHostsideNetworkTestsApp3Defaults",
],
}

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2022 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.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.net.hostside.app3">
<application android:debuggable="true">
<uses-library android:name="android.test.runner" />
</application>
<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
android:targetPackage="com.android.cts.net.hostside.app3" />
</manifest>

View File

@@ -1,80 +0,0 @@
/*
* Copyright (C) 2022 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 com.android.cts.net.hostside.app3;
import static org.junit.Assert.assertEquals;
import android.Manifest;
import android.net.IpPrefix;
import android.net.LinkProperties;
import android.net.RouteInfo;
import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests to verify {@link LinkProperties#getRoutes} behavior, depending on
* {@LinkProperties#EXCLUDED_ROUTES} change state.
*/
@RunWith(AndroidJUnit4.class)
public class ExcludedRoutesGatingTest {
@Before
public void setUp() {
InstrumentationRegistry.getInstrumentation().getUiAutomation()
.adoptShellPermissionIdentity(Manifest.permission.LOG_COMPAT_CHANGE,
Manifest.permission.READ_COMPAT_CHANGE_CONFIG);
}
@After
public void tearDown() {
InstrumentationRegistry.getInstrumentation().getUiAutomation()
.dropShellPermissionIdentity();
}
@Test
public void testExcludedRoutesChangeEnabled() {
final LinkProperties lp = makeLinkPropertiesWithExcludedRoutes();
// Excluded routes change is enabled: non-RTN_UNICAST routes are visible.
assertEquals(2, lp.getRoutes().size());
assertEquals(2, lp.getAllRoutes().size());
}
@Test
public void testExcludedRoutesChangeDisabled() {
final LinkProperties lp = makeLinkPropertiesWithExcludedRoutes();
// Excluded routes change is disabled: non-RTN_UNICAST routes are filtered out.
assertEquals(0, lp.getRoutes().size());
assertEquals(0, lp.getAllRoutes().size());
}
private LinkProperties makeLinkPropertiesWithExcludedRoutes() {
final LinkProperties lp = new LinkProperties();
lp.addRoute(new RouteInfo(new IpPrefix("10.0.0.0/8"), null, null, RouteInfo.RTN_THROW));
lp.addRoute(new RouteInfo(new IpPrefix("2001:db8::/64"), null, null,
RouteInfo.RTN_UNREACHABLE));
return lp;
}
}

View File

@@ -1,85 +0,0 @@
/*
* Copyright (C) 2022 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 com.android.cts.net;
import android.compat.cts.CompatChangeGatingTestCase;
import java.util.Set;
/**
* Tests for the {@link android.net.LinkProperties#EXCLUDED_ROUTES} compatibility change.
*
* TODO: see if we can delete this cumbersome host test by moving the coverage to CtsNetTestCases
* and CtsNetTestCasesMaxTargetSdk31.
*/
public class HostsideLinkPropertiesGatingTests extends CompatChangeGatingTestCase {
private static final String TEST_APK = "CtsHostsideNetworkTestsApp3.apk";
private static final String TEST_APK_PRE_T = "CtsHostsideNetworkTestsApp3PreT.apk";
private static final String TEST_PKG = "com.android.cts.net.hostside.app3";
private static final String TEST_CLASS = ".ExcludedRoutesGatingTest";
private static final long EXCLUDED_ROUTES_CHANGE_ID = 186082280;
protected void tearDown() throws Exception {
uninstallPackage(TEST_PKG, true);
}
public void testExcludedRoutesChangeEnabled() throws Exception {
installPackage(TEST_APK, true);
runDeviceCompatTest("testExcludedRoutesChangeEnabled");
}
public void testExcludedRoutesChangeDisabledPreT() throws Exception {
installPackage(TEST_APK_PRE_T, true);
runDeviceCompatTest("testExcludedRoutesChangeDisabled");
}
public void testExcludedRoutesChangeDisabledByOverrideOnDebugBuild() throws Exception {
// Must install APK even when skipping test, because tearDown expects uninstall to succeed.
installPackage(TEST_APK, true);
// This test uses an app with a target SDK where the compat change is on by default.
// Because user builds do not allow overriding compat changes, only run this test on debug
// builds. This seems better than deleting this test and not running it anywhere because we
// could in the future run this test on userdebug builds in presubmit.
//
// We cannot use assumeXyz here because CompatChangeGatingTestCase ultimately inherits from
// junit.framework.TestCase, which does not understand assumption failures.
if ("user".equals(getDevice().getProperty("ro.build.type"))) return;
runDeviceCompatTestWithChangeDisabled("testExcludedRoutesChangeDisabled");
}
public void testExcludedRoutesChangeEnabledByOverridePreT() throws Exception {
installPackage(TEST_APK_PRE_T, true);
runDeviceCompatTestWithChangeEnabled("testExcludedRoutesChangeEnabled");
}
private void runDeviceCompatTest(String methodName) throws Exception {
runDeviceCompatTest(TEST_PKG, TEST_CLASS, methodName, Set.of(), Set.of());
}
private void runDeviceCompatTestWithChangeEnabled(String methodName) throws Exception {
runDeviceCompatTest(TEST_PKG, TEST_CLASS, methodName, Set.of(EXCLUDED_ROUTES_CHANGE_ID),
Set.of());
}
private void runDeviceCompatTestWithChangeDisabled(String methodName) throws Exception {
runDeviceCompatTest(TEST_PKG, TEST_CLASS, methodName, Set.of(),
Set.of(EXCLUDED_ROUTES_CHANGE_ID));
}
}