ethernet: broadcast state change for server interfaces

Also update the test to ensure mFactory.hasInterface is mocked to match
mFactory.getInterfaceState: previously it would be called by the factory
in the mocked getInterfaceState, but the new code calls it directly.

Bug: 171872016
Test: atest EthernetManagerTest
Change-Id: I9ac959f181c88a7992991923b98a836f2833fa88
(cherry picked from commit f33f276b29)
Merged-In: I9ac959f181c88a7992991923b98a836f2833fa88
This commit is contained in:
Patrick Rohr
2022-06-01 21:06:42 -07:00
committed by Lorenzo Colitti
parent 227dfb5ad0
commit 1f8bd41e87
2 changed files with 41 additions and 9 deletions

View File

@@ -229,7 +229,7 @@ public class EthernetTracker {
*/ */
protected void broadcastInterfaceStateChange(@NonNull String iface) { protected void broadcastInterfaceStateChange(@NonNull String iface) {
ensureRunningOnEthernetServiceThread(); ensureRunningOnEthernetServiceThread();
final int state = mFactory.getInterfaceState(iface); final int state = getInterfaceState(iface);
final int role = getInterfaceRole(iface); final int role = getInterfaceRole(iface);
final IpConfiguration config = getIpConfigurationForCallback(iface, state); final IpConfiguration config = getIpConfigurationForCallback(iface, state);
final int n = mListeners.beginBroadcast(); final int n = mListeners.beginBroadcast();
@@ -436,15 +436,34 @@ public class EthernetTracker {
if (mDefaultInterface != null) { if (mDefaultInterface != null) {
removeInterface(mDefaultInterface); removeInterface(mDefaultInterface);
addInterface(mDefaultInterface); addInterface(mDefaultInterface);
// when this broadcast is sent, any calls to notifyTetheredInterfaceAvailable or
// notifyTetheredInterfaceUnavailable have already happened
broadcastInterfaceStateChange(mDefaultInterface);
} }
} }
private int getInterfaceState(final String iface) {
if (mFactory.hasInterface(iface)) {
return mFactory.getInterfaceState(iface);
}
if (getInterfaceMode(iface) == INTERFACE_MODE_SERVER) {
// server mode interfaces are not tracked by the factory.
// TODO(b/234743836): interface state for server mode interfaces is not tracked
// properly; just return link up.
return EthernetManager.STATE_LINK_UP;
}
return EthernetManager.STATE_ABSENT;
}
private int getInterfaceRole(final String iface) { private int getInterfaceRole(final String iface) {
if (!mFactory.hasInterface(iface)) return EthernetManager.ROLE_NONE; if (mFactory.hasInterface(iface)) {
final int mode = getInterfaceMode(iface); // only client mode interfaces are tracked by the factory.
return (mode == INTERFACE_MODE_CLIENT) return EthernetManager.ROLE_CLIENT;
? EthernetManager.ROLE_CLIENT }
: EthernetManager.ROLE_SERVER; if (getInterfaceMode(iface) == INTERFACE_MODE_SERVER) {
return EthernetManager.ROLE_SERVER;
}
return EthernetManager.ROLE_NONE;
} }
private int getInterfaceMode(final String iface) { private int getInterfaceMode(final String iface) {

View File

@@ -28,6 +28,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset; import static org.mockito.Mockito.reset;
@@ -68,6 +69,7 @@ import org.mockito.MockitoAnnotations;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
@SmallTest @SmallTest
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@@ -445,7 +447,20 @@ public class EthernetTrackerTest {
when(mNetd.interfaceGetList()).thenReturn(new String[] {testIface}); when(mNetd.interfaceGetList()).thenReturn(new String[] {testIface});
when(mNetd.interfaceGetCfg(eq(testIface))).thenReturn(ifaceParcel); when(mNetd.interfaceGetCfg(eq(testIface))).thenReturn(ifaceParcel);
doReturn(new String[] {testIface}).when(mFactory).getAvailableInterfaces(anyBoolean()); doReturn(new String[] {testIface}).when(mFactory).getAvailableInterfaces(anyBoolean());
doReturn(EthernetManager.STATE_LINK_UP).when(mFactory).getInterfaceState(eq(testIface));
final AtomicBoolean ifaceUp = new AtomicBoolean(true);
doAnswer(inv -> ifaceUp.get()).when(mFactory).hasInterface(testIface);
doAnswer(inv ->
ifaceUp.get() ? EthernetManager.STATE_LINK_UP : EthernetManager.STATE_ABSENT)
.when(mFactory).getInterfaceState(testIface);
doAnswer(inv -> {
ifaceUp.set(true);
return null;
}).when(mFactory).addInterface(eq(testIface), eq(testHwAddr), any(), any());
doAnswer(inv -> {
ifaceUp.set(false);
return null;
}).when(mFactory).removeInterface(testIface);
final EthernetStateListener listener = spy(new EthernetStateListener()); final EthernetStateListener listener = spy(new EthernetStateListener());
tracker.addListener(listener, true /* canUseRestrictedNetworks */); tracker.addListener(listener, true /* canUseRestrictedNetworks */);
@@ -456,7 +471,6 @@ public class EthernetTrackerTest {
verify(listener).onEthernetStateChanged(eq(EthernetManager.ETHERNET_STATE_ENABLED)); verify(listener).onEthernetStateChanged(eq(EthernetManager.ETHERNET_STATE_ENABLED));
reset(listener); reset(listener);
doReturn(EthernetManager.STATE_ABSENT).when(mFactory).getInterfaceState(eq(testIface));
tracker.setEthernetEnabled(false); tracker.setEthernetEnabled(false);
waitForIdle(); waitForIdle();
verify(mFactory).removeInterface(eq(testIface)); verify(mFactory).removeInterface(eq(testIface));
@@ -465,7 +479,6 @@ public class EthernetTrackerTest {
anyInt(), any()); anyInt(), any());
reset(listener); reset(listener);
doReturn(EthernetManager.STATE_LINK_UP).when(mFactory).getInterfaceState(eq(testIface));
tracker.setEthernetEnabled(true); tracker.setEthernetEnabled(true);
waitForIdle(); waitForIdle();
verify(mFactory).addInterface(eq(testIface), eq(testHwAddr), any(), any()); verify(mFactory).addInterface(eq(testIface), eq(testHwAddr), any(), any());