Merge "Add a test for upstream selection."
This commit is contained in:
@@ -78,6 +78,7 @@ import static org.mockito.Matchers.eq;
|
|||||||
import static org.mockito.Mockito.any;
|
import static org.mockito.Mockito.any;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.doThrow;
|
import static org.mockito.Mockito.doThrow;
|
||||||
|
import static org.mockito.Mockito.inOrder;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.reset;
|
import static org.mockito.Mockito.reset;
|
||||||
@@ -165,6 +166,7 @@ import com.android.internal.util.ArrayUtils;
|
|||||||
import com.android.internal.util.StateMachine;
|
import com.android.internal.util.StateMachine;
|
||||||
import com.android.internal.util.test.BroadcastInterceptingContext;
|
import com.android.internal.util.test.BroadcastInterceptingContext;
|
||||||
import com.android.internal.util.test.FakeSettingsProvider;
|
import com.android.internal.util.test.FakeSettingsProvider;
|
||||||
|
import com.android.networkstack.tethering.TestConnectivityManager.TestNetworkAgent;
|
||||||
import com.android.testutils.MiscAsserts;
|
import com.android.testutils.MiscAsserts;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
@@ -174,6 +176,7 @@ import org.junit.BeforeClass;
|
|||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
|
import org.mockito.InOrder;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
|
||||||
@@ -501,6 +504,7 @@ public class TetheringTest {
|
|||||||
prop.setInterfaceName(interfaceName);
|
prop.setInterfaceName(interfaceName);
|
||||||
|
|
||||||
if (withIPv4) {
|
if (withIPv4) {
|
||||||
|
prop.addLinkAddress(new LinkAddress("10.1.2.3/15"));
|
||||||
prop.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0),
|
prop.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0),
|
||||||
InetAddresses.parseNumericAddress("10.0.0.1"),
|
InetAddresses.parseNumericAddress("10.0.0.1"),
|
||||||
interfaceName, RTN_UNICAST));
|
interfaceName, RTN_UNICAST));
|
||||||
@@ -830,9 +834,7 @@ public class TetheringTest {
|
|||||||
mTethering.interfaceStatusChanged(TEST_NCM_IFNAME, true);
|
mTethering.interfaceStatusChanged(TEST_NCM_IFNAME, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void prepareUsbTethering(UpstreamNetworkState upstreamState) {
|
private void prepareUsbTethering() {
|
||||||
initTetheringUpstream(upstreamState);
|
|
||||||
|
|
||||||
// Emulate pressing the USB tethering button in Settings UI.
|
// Emulate pressing the USB tethering button in Settings UI.
|
||||||
final TetheringRequestParcel request = createTetheringRequestParcel(TETHERING_USB);
|
final TetheringRequestParcel request = createTetheringRequestParcel(TETHERING_USB);
|
||||||
mTethering.startTethering(request, null);
|
mTethering.startTethering(request, null);
|
||||||
@@ -847,7 +849,8 @@ public class TetheringTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testUsbConfiguredBroadcastStartsTethering() throws Exception {
|
public void testUsbConfiguredBroadcastStartsTethering() throws Exception {
|
||||||
UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
|
UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState();
|
||||||
prepareUsbTethering(upstreamState);
|
initTetheringUpstream(upstreamState);
|
||||||
|
prepareUsbTethering();
|
||||||
|
|
||||||
// This should produce no activity of any kind.
|
// This should produce no activity of any kind.
|
||||||
verifyNoMoreInteractions(mNetd);
|
verifyNoMoreInteractions(mNetd);
|
||||||
@@ -942,7 +945,8 @@ public class TetheringTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void runUsbTethering(UpstreamNetworkState upstreamState) {
|
private void runUsbTethering(UpstreamNetworkState upstreamState) {
|
||||||
prepareUsbTethering(upstreamState);
|
initTetheringUpstream(upstreamState);
|
||||||
|
prepareUsbTethering();
|
||||||
sendUsbBroadcast(true, true, true, TETHERING_USB);
|
sendUsbBroadcast(true, true, true, TETHERING_USB);
|
||||||
mLooper.dispatchAll();
|
mLooper.dispatchAll();
|
||||||
}
|
}
|
||||||
@@ -1083,6 +1087,73 @@ public class TetheringTest {
|
|||||||
verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(upstreamState.network);
|
verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(upstreamState.network);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAutomaticUpstreamSelection() throws Exception {
|
||||||
|
// Enable automatic upstream selection.
|
||||||
|
when(mResources.getBoolean(R.bool.config_tether_upstream_automatic)).thenReturn(true);
|
||||||
|
sendConfigurationChanged();
|
||||||
|
mLooper.dispatchAll();
|
||||||
|
|
||||||
|
InOrder inOrder = inOrder(mCm, mUpstreamNetworkMonitor);
|
||||||
|
|
||||||
|
// Start USB tethering with no current upstream.
|
||||||
|
prepareUsbTethering();
|
||||||
|
sendUsbBroadcast(true, true, true, TETHERING_USB);
|
||||||
|
mLooper.dispatchAll();
|
||||||
|
inOrder.verify(mUpstreamNetworkMonitor).startObserveAllNetworks();
|
||||||
|
inOrder.verify(mUpstreamNetworkMonitor).registerMobileNetworkRequest();
|
||||||
|
|
||||||
|
// Pretend cellular connected and expect the upstream to be set.
|
||||||
|
TestNetworkAgent mobile = new TestNetworkAgent(mCm, buildMobileDualStackUpstreamState());
|
||||||
|
mobile.fakeConnect();
|
||||||
|
mCm.makeDefaultNetwork(mobile);
|
||||||
|
mLooper.dispatchAll();
|
||||||
|
inOrder.verify(mUpstreamNetworkMonitor).setCurrentUpstream(mobile.networkId);
|
||||||
|
|
||||||
|
// Switch upstreams a few times.
|
||||||
|
// TODO: there may be a race where if the effects of the CONNECTIVITY_ACTION happen before
|
||||||
|
// UpstreamNetworkMonitor gets onCapabilitiesChanged on CALLBACK_DEFAULT_INTERNET, the
|
||||||
|
// upstream does not change. Extend TestConnectivityManager to simulate this condition and
|
||||||
|
// write a test for this.
|
||||||
|
TestNetworkAgent wifi = new TestNetworkAgent(mCm, buildWifiUpstreamState());
|
||||||
|
wifi.fakeConnect();
|
||||||
|
mCm.makeDefaultNetwork(wifi);
|
||||||
|
mLooper.dispatchAll();
|
||||||
|
inOrder.verify(mUpstreamNetworkMonitor).setCurrentUpstream(wifi.networkId);
|
||||||
|
|
||||||
|
mCm.makeDefaultNetwork(mobile);
|
||||||
|
mLooper.dispatchAll();
|
||||||
|
inOrder.verify(mUpstreamNetworkMonitor).setCurrentUpstream(mobile.networkId);
|
||||||
|
|
||||||
|
// Wifi disconnecting should not have any affect since it's not the current upstream.
|
||||||
|
wifi.fakeDisconnect();
|
||||||
|
mLooper.dispatchAll();
|
||||||
|
inOrder.verify(mUpstreamNetworkMonitor, never()).setCurrentUpstream(any());
|
||||||
|
|
||||||
|
// Lose and regain upstream.
|
||||||
|
assertTrue(mUpstreamNetworkMonitor.getCurrentPreferredUpstream().linkProperties
|
||||||
|
.hasIPv4Address());
|
||||||
|
mobile.fakeDisconnect();
|
||||||
|
mCm.makeDefaultNetwork(null);
|
||||||
|
mLooper.dispatchAll();
|
||||||
|
inOrder.verify(mUpstreamNetworkMonitor).setCurrentUpstream(null);
|
||||||
|
|
||||||
|
mobile = new TestNetworkAgent(mCm, buildMobile464xlatUpstreamState());
|
||||||
|
mobile.fakeConnect();
|
||||||
|
mCm.makeDefaultNetwork(mobile);
|
||||||
|
mLooper.dispatchAll();
|
||||||
|
inOrder.verify(mUpstreamNetworkMonitor).setCurrentUpstream(mobile.networkId);
|
||||||
|
|
||||||
|
// Check the IP addresses to ensure that the upstream is indeed not the same as the previous
|
||||||
|
// mobile upstream, even though the netId is (unrealistically) the same.
|
||||||
|
assertFalse(mUpstreamNetworkMonitor.getCurrentPreferredUpstream().linkProperties
|
||||||
|
.hasIPv4Address());
|
||||||
|
mobile.fakeDisconnect();
|
||||||
|
mCm.makeDefaultNetwork(null);
|
||||||
|
mLooper.dispatchAll();
|
||||||
|
inOrder.verify(mUpstreamNetworkMonitor).setCurrentUpstream(null);
|
||||||
|
}
|
||||||
|
|
||||||
private void runNcmTethering() {
|
private void runNcmTethering() {
|
||||||
prepareNcmTethering();
|
prepareNcmTethering();
|
||||||
sendUsbBroadcast(true, true, true, TETHERING_NCM);
|
sendUsbBroadcast(true, true, true, TETHERING_NCM);
|
||||||
|
|||||||
Reference in New Issue
Block a user