Fix EthernetTetheringTest testTestNetworkUpstream flaky am: 95cb089853 am: 3b9d3c49f6
Original change: https://android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/1878054 Change-Id: I7424f6ac20ea7a56db1f4428dd0f01c9854054a5
This commit is contained in:
@@ -106,6 +106,7 @@ import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
@@ -278,7 +279,7 @@ public class EthernetTetheringTest {
|
||||
final String localAddr = "192.0.2.3/28";
|
||||
final String clientAddr = "192.0.2.2/28";
|
||||
mTetheringEventCallback = enableEthernetTethering(iface,
|
||||
requestWithStaticIpv4(localAddr, clientAddr));
|
||||
requestWithStaticIpv4(localAddr, clientAddr), null /* any upstream */);
|
||||
|
||||
mTetheringEventCallback.awaitInterfaceTethered();
|
||||
assertInterfaceHasIpAddress(iface, localAddr);
|
||||
@@ -361,7 +362,8 @@ public class EthernetTetheringTest {
|
||||
|
||||
final TetheringRequest request = new TetheringRequest.Builder(TETHERING_ETHERNET)
|
||||
.setConnectivityScope(CONNECTIVITY_SCOPE_LOCAL).build();
|
||||
mTetheringEventCallback = enableEthernetTethering(iface, request);
|
||||
mTetheringEventCallback = enableEthernetTethering(iface, request,
|
||||
null /* any upstream */);
|
||||
mTetheringEventCallback.awaitInterfaceLocalOnly();
|
||||
|
||||
// makePacketReader only works after tethering is started, because until then the interface
|
||||
@@ -392,7 +394,7 @@ public class EthernetTetheringTest {
|
||||
final String iface = mTetheredInterfaceRequester.getInterface();
|
||||
|
||||
// Enable Ethernet tethering and check that it starts.
|
||||
mTetheringEventCallback = enableEthernetTethering(iface);
|
||||
mTetheringEventCallback = enableEthernetTethering(iface, null /* any upstream */);
|
||||
|
||||
// There is nothing more we can do on a physical interface without connecting an actual
|
||||
// client, which is not possible in this test.
|
||||
@@ -405,8 +407,11 @@ public class EthernetTetheringTest {
|
||||
private final CountDownLatch mLocalOnlyStartedLatch = new CountDownLatch(1);
|
||||
private final CountDownLatch mLocalOnlyStoppedLatch = new CountDownLatch(1);
|
||||
private final CountDownLatch mClientConnectedLatch = new CountDownLatch(1);
|
||||
private final CountDownLatch mUpstreamConnectedLatch = new CountDownLatch(1);
|
||||
private final CountDownLatch mUpstreamLatch = new CountDownLatch(1);
|
||||
private final TetheringInterface mIface;
|
||||
private final Network mExpectedUpstream;
|
||||
|
||||
private boolean mAcceptAnyUpstream = false;
|
||||
|
||||
private volatile boolean mInterfaceWasTethered = false;
|
||||
private volatile boolean mInterfaceWasLocalOnly = false;
|
||||
@@ -415,8 +420,14 @@ public class EthernetTetheringTest {
|
||||
private volatile Network mUpstream = null;
|
||||
|
||||
MyTetheringEventCallback(TetheringManager tm, String iface) {
|
||||
this(tm, iface, null);
|
||||
mAcceptAnyUpstream = true;
|
||||
}
|
||||
|
||||
MyTetheringEventCallback(TetheringManager tm, String iface, Network expectedUpstream) {
|
||||
mTm = tm;
|
||||
mIface = new TetheringInterface(TETHERING_ETHERNET, iface);
|
||||
mExpectedUpstream = expectedUpstream;
|
||||
}
|
||||
|
||||
public void unregister() {
|
||||
@@ -526,19 +537,30 @@ public class EthernetTetheringTest {
|
||||
|
||||
Log.d(TAG, "Got upstream changed: " + network);
|
||||
mUpstream = network;
|
||||
if (mUpstream != null) mUpstreamConnectedLatch.countDown();
|
||||
if (mAcceptAnyUpstream || Objects.equals(mUpstream, mExpectedUpstream)) {
|
||||
mUpstreamLatch.countDown();
|
||||
}
|
||||
}
|
||||
|
||||
public Network awaitFirstUpstreamConnected() throws Exception {
|
||||
assertTrue("Did not receive upstream connected callback after " + TIMEOUT_MS + "ms",
|
||||
mUpstreamConnectedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS));
|
||||
public Network awaitUpstreamChanged() throws Exception {
|
||||
if (!mUpstreamLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
|
||||
fail("Did not receive upstream " + (mAcceptAnyUpstream ? "any" : mExpectedUpstream)
|
||||
+ " callback after " + TIMEOUT_MS + "ms");
|
||||
}
|
||||
return mUpstream;
|
||||
}
|
||||
}
|
||||
|
||||
private MyTetheringEventCallback enableEthernetTethering(String iface,
|
||||
TetheringRequest request) throws Exception {
|
||||
MyTetheringEventCallback callback = new MyTetheringEventCallback(mTm, iface);
|
||||
TetheringRequest request, Network expectedUpstream) throws Exception {
|
||||
// Enable ethernet tethering with null expectedUpstream means the test accept any upstream
|
||||
// after etherent tethering started.
|
||||
final MyTetheringEventCallback callback;
|
||||
if (expectedUpstream != null) {
|
||||
callback = new MyTetheringEventCallback(mTm, iface, expectedUpstream);
|
||||
} else {
|
||||
callback = new MyTetheringEventCallback(mTm, iface);
|
||||
}
|
||||
mTm.registerTetheringEventCallback(mHandler::post, callback);
|
||||
|
||||
StartTetheringCallback startTetheringCallback = new StartTetheringCallback() {
|
||||
@@ -565,10 +587,11 @@ public class EthernetTetheringTest {
|
||||
return callback;
|
||||
}
|
||||
|
||||
private MyTetheringEventCallback enableEthernetTethering(String iface) throws Exception {
|
||||
private MyTetheringEventCallback enableEthernetTethering(String iface, Network expectedUpstream)
|
||||
throws Exception {
|
||||
return enableEthernetTethering(iface,
|
||||
new TetheringRequest.Builder(TETHERING_ETHERNET)
|
||||
.setShouldShowEntitlementUi(false).build());
|
||||
.setShouldShowEntitlementUi(false).build(), expectedUpstream);
|
||||
}
|
||||
|
||||
private int getMTU(TestNetworkInterface iface) throws SocketException {
|
||||
@@ -592,7 +615,8 @@ public class EthernetTetheringTest {
|
||||
private void checkVirtualEthernet(TestNetworkInterface iface, int mtu) throws Exception {
|
||||
FileDescriptor fd = iface.getFileDescriptor().getFileDescriptor();
|
||||
mDownstreamReader = makePacketReader(fd, mtu);
|
||||
mTetheringEventCallback = enableEthernetTethering(iface.getInterfaceName());
|
||||
mTetheringEventCallback = enableEthernetTethering(iface.getInterfaceName(),
|
||||
null /* any upstream */);
|
||||
checkTetheredClientCallbacks(mDownstreamReader);
|
||||
}
|
||||
|
||||
@@ -690,7 +714,8 @@ public class EthernetTetheringTest {
|
||||
private void assertInvalidStaticIpv4Request(String iface, String local, String client)
|
||||
throws Exception {
|
||||
try {
|
||||
enableEthernetTethering(iface, requestWithStaticIpv4(local, client));
|
||||
enableEthernetTethering(iface, requestWithStaticIpv4(local, client),
|
||||
null /* any upstream */);
|
||||
fail("Unexpectedly accepted invalid IPv4 configuration: " + local + ", " + client);
|
||||
} catch (IllegalArgumentException | NullPointerException expected) { }
|
||||
}
|
||||
@@ -746,9 +771,10 @@ public class EthernetTetheringTest {
|
||||
assertEquals("TetheredInterfaceCallback for unexpected interface",
|
||||
mDownstreamIface.getInterfaceName(), iface);
|
||||
|
||||
mTetheringEventCallback = enableEthernetTethering(mDownstreamIface.getInterfaceName());
|
||||
mTetheringEventCallback = enableEthernetTethering(mDownstreamIface.getInterfaceName(),
|
||||
mUpstreamTracker.getNetwork());
|
||||
assertEquals("onUpstreamChanged for unexpected network", mUpstreamTracker.getNetwork(),
|
||||
mTetheringEventCallback.awaitFirstUpstreamConnected());
|
||||
mTetheringEventCallback.awaitUpstreamChanged());
|
||||
|
||||
mDownstreamReader = makePacketReader(mDownstreamIface);
|
||||
// TODO: do basic forwarding test here.
|
||||
@@ -951,9 +977,10 @@ public class EthernetTetheringTest {
|
||||
assertEquals("TetheredInterfaceCallback for unexpected interface",
|
||||
mDownstreamIface.getInterfaceName(), iface);
|
||||
|
||||
mTetheringEventCallback = enableEthernetTethering(mDownstreamIface.getInterfaceName());
|
||||
mTetheringEventCallback = enableEthernetTethering(mDownstreamIface.getInterfaceName(),
|
||||
mUpstreamTracker.getNetwork());
|
||||
assertEquals("onUpstreamChanged for unexpected network", mUpstreamTracker.getNetwork(),
|
||||
mTetheringEventCallback.awaitFirstUpstreamConnected());
|
||||
mTetheringEventCallback.awaitUpstreamChanged());
|
||||
|
||||
mDownstreamReader = makePacketReader(mDownstreamIface);
|
||||
mUpstreamReader = makePacketReader(mUpstreamTracker.getTestIface());
|
||||
|
||||
Reference in New Issue
Block a user