Use TetheredInterfaceRequester to check available tethering interface

Used for deciding what test needs to be run. Moreover, the
EthernetManager#isAvailable is not used for this purpose
anymore. The restricted networks permission is not required
as well.

Bug: 237369591
Bug: 242067530
Test: atest EthernetTetheringTest
Change-Id: I1215278271ca6b48e097d7f2cf160416d54116f2
This commit is contained in:
Hungming Chen
2022-06-15 19:06:15 +08:00
parent 1668b2da03
commit f70037fa88

View File

@@ -17,7 +17,6 @@
package android.net;
import static android.Manifest.permission.ACCESS_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
import static android.Manifest.permission.DUMP;
import static android.Manifest.permission.MANAGE_TEST_NETWORKS;
import static android.Manifest.permission.NETWORK_SETTINGS;
@@ -129,6 +128,10 @@ public class EthernetTetheringTest {
private static final String TAG = EthernetTetheringTest.class.getSimpleName();
private static final int TIMEOUT_MS = 5000;
// Used to check if any tethering interface is available. Choose 200ms to be request timeout
// because the average interface requested time on cuttlefish@acloud is around 10ms.
// See TetheredInterfaceRequester.getInterface, isInterfaceForTetheringAvailable.
private static final int AVAILABLE_TETHER_IFACE_REQUEST_TIMEOUT_MS = 200;
private static final int TETHER_REACHABILITY_ATTEMPTS = 20;
private static final int DUMP_POLLING_MAX_RETRY = 100;
private static final int DUMP_POLLING_INTERVAL_MS = 50;
@@ -193,7 +196,7 @@ public class EthernetTetheringTest {
// functions via dumpsys output.
mUiAutomation.adoptShellPermissionIdentity(
MANAGE_TEST_NETWORKS, NETWORK_SETTINGS, TETHER_PRIVILEGED, ACCESS_NETWORK_STATE,
CONNECTIVITY_USE_RESTRICTED_NETWORKS, DUMP);
DUMP);
mHandlerThread = new HandlerThread(getClass().getSimpleName());
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
@@ -243,10 +246,30 @@ public class EthernetTetheringTest {
}
}
private boolean isInterfaceForTetheringAvailable() throws Exception {
// If previous test case doesn't release tethering interface successfully, the other tests
// after that test may be skipped as unexcepted.
// TODO: figure out a better way to check default tethering interface existenion.
final TetheredInterfaceRequester requester = new TetheredInterfaceRequester(mHandler, mEm);
try {
// Use short timeout (200ms) for requesting an existing interface, if any, because
// it should reurn faster than requesting a new tethering interface. Using default
// timeout (5000ms, TIMEOUT_MS) may make that total testing time is over 1 minute
// test module timeout on internal testing.
// TODO: if this becomes flaky, consider using default timeout (5000ms) and moving
// this check into #setUpOnce.
return requester.getInterface(AVAILABLE_TETHER_IFACE_REQUEST_TIMEOUT_MS) != null;
} catch (TimeoutException e) {
return false;
} finally {
requester.release();
}
}
@Test
public void testVirtualEthernetAlreadyExists() throws Exception {
// This test requires manipulating packets. Skip if there is a physical Ethernet connected.
assumeFalse(mEm.isAvailable());
assumeFalse(isInterfaceForTetheringAvailable());
mDownstreamIface = createTestInterface();
// This must be done now because as soon as setIncludeTestInterfaces(true) is called, the
@@ -268,7 +291,7 @@ public class EthernetTetheringTest {
@Test
public void testVirtualEthernet() throws Exception {
// This test requires manipulating packets. Skip if there is a physical Ethernet connected.
assumeFalse(mEm.isAvailable());
assumeFalse(isInterfaceForTetheringAvailable());
CompletableFuture<String> futureIface = mTetheredInterfaceRequester.requestInterface();
@@ -285,7 +308,7 @@ public class EthernetTetheringTest {
@Test
public void testStaticIpv4() throws Exception {
assumeFalse(mEm.isAvailable());
assumeFalse(isInterfaceForTetheringAvailable());
mEm.setIncludeTestInterfaces(true);
@@ -363,7 +386,7 @@ public class EthernetTetheringTest {
@Test
public void testLocalOnlyTethering() throws Exception {
assumeFalse(mEm.isAvailable());
assumeFalse(isInterfaceForTetheringAvailable());
mEm.setIncludeTestInterfaces(true);
@@ -397,7 +420,7 @@ public class EthernetTetheringTest {
@Test
public void testPhysicalEthernet() throws Exception {
assumeTrue(mEm.isAvailable());
assumeTrue(isInterfaceForTetheringAvailable());
// Do not run this test if adb is over network and ethernet is connected.
// It is likely the adb run over ethernet, the adb would break when ethernet is switching
// from client mode to server mode. See b/160389275.
@@ -712,8 +735,12 @@ public class EthernetTetheringTest {
return mFuture;
}
public String getInterface(int timeout) throws Exception {
return requestInterface().get(timeout, TimeUnit.MILLISECONDS);
}
public String getInterface() throws Exception {
return requestInterface().get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
return getInterface(TIMEOUT_MS);
}
public void release() {
@@ -1091,7 +1118,7 @@ public class EthernetTetheringTest {
private TetheringTester initTetheringTester(List<LinkAddress> upstreamAddresses,
List<InetAddress> upstreamDnses) throws Exception {
assumeFalse(mEm.isAvailable());
assumeFalse(isInterfaceForTetheringAvailable());
// MyTetheringEventCallback currently only support await first available upstream. Tethering
// may select internet network as upstream if test network is not available and not be