diff --git a/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java b/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java index c9b3686dca..3b4f46b19b 100644 --- a/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java +++ b/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java @@ -215,26 +215,26 @@ public class EthernetTetheringTest { mUpstreamReader = null; } - runAsShell(TETHER_PRIVILEGED, () -> { - mTm.stopTethering(TETHERING_ETHERNET); - // Binder call is an async call. Need to hold the shell permission until tethering - // stopped. This helps to avoid the test become flaky. - if (mTetheringEventCallback != null) { - mTetheringEventCallback.awaitInterfaceUntethered(); - mTetheringEventCallback.unregister(); - mTetheringEventCallback = null; - } - }); if (mDownstreamReader != null) { TapPacketReader reader = mDownstreamReader; mHandler.post(() -> reader.stop()); mDownstreamReader = null; } - runAsShell(NETWORK_SETTINGS, () -> { - mTetheredInterfaceRequester.release(); - }); - setIncludeTestInterfaces(false); + + // To avoid flaky which caused by the next test started but the previous interface is not + // untracked from EthernetTracker yet. Just delete the test interface without explicitly + // calling TetheringManager#stopTethering could let EthernetTracker untrack the test + // interface from server mode before tethering stopped. Thus, awaitInterfaceUntethered + // could not only make sure tethering is stopped but also guarantee the test interface is + // untracked from EthernetTracker. maybeDeleteTestInterface(); + if (mTetheringEventCallback != null) { + mTetheringEventCallback.awaitInterfaceUntethered(); + mTetheringEventCallback.unregister(); + mTetheringEventCallback = null; + } + runAsShell(NETWORK_SETTINGS, () -> mTetheredInterfaceRequester.release()); + setIncludeTestInterfaces(false); } @After