Thread fixes for WifiStatusTracker tests

WifiStatusTracker now supports sending messages to the background. Tests
were adapted to make sure threading is taken into account.

Test: atest NetworkControllerDataTest
Test: atest NetworkControllerSignalTest
Test: atest NetworkControllerWifiTest
Bug: 190376958
Change-Id: Id80bba6a2abec36a2e58a81552a34a7f74f9a818
This commit is contained in:
Lucas Dupin
2022-02-28 13:27:28 -08:00
parent 906bfd89da
commit cdd02a8856
7 changed files with 49 additions and 35 deletions

View File

@@ -54,9 +54,8 @@ public class WifiStatusTracker {
private final WifiManager mWifiManager;
private final NetworkScoreManager mNetworkScoreManager;
private final ConnectivityManager mConnectivityManager;
private final HandlerThread mHandlerThread;
private final Handler mHandler;
private final Handler mMainThreadHandler = new Handler(Looper.getMainLooper());
private final Handler mMainThreadHandler;
private final Set<Integer> mNetworks = new HashSet<>();
// Save the previous HISTORY_SIZE states for logging.
private final String[] mHistory = new String[HISTORY_SIZE];
@@ -170,15 +169,27 @@ public class WifiStatusTracker {
public WifiStatusTracker(Context context, WifiManager wifiManager,
NetworkScoreManager networkScoreManager, ConnectivityManager connectivityManager,
Runnable callback) {
this(context, wifiManager, networkScoreManager, connectivityManager, callback, null, null);
}
public WifiStatusTracker(Context context, WifiManager wifiManager,
NetworkScoreManager networkScoreManager, ConnectivityManager connectivityManager,
Runnable callback, Handler foregroundHandler, Handler backgroundHandler) {
mContext = context;
mWifiManager = wifiManager;
mWifiNetworkScoreCache = new WifiNetworkScoreCache(context);
mNetworkScoreManager = networkScoreManager;
mConnectivityManager = connectivityManager;
mCallback = callback;
mHandlerThread = new HandlerThread("WifiStatusTrackerHandler");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
if (backgroundHandler == null) {
HandlerThread handlerThread = new HandlerThread("WifiStatusTrackerHandler");
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
} else {
mHandler = backgroundHandler;
}
mMainThreadHandler = foregroundHandler == null
? new Handler(Looper.getMainLooper()) : foregroundHandler;
mCacheListener =
new WifiNetworkScoreCache.CacheListener(mHandler) {
@Override

View File

@@ -251,10 +251,10 @@ public class NetworkControllerImpl extends BroadcastReceiver
broadcastDispatcher,
demoModeController,
carrierConfigTracker,
handler,
featureFlags,
dumpManager);
mReceiverHandler.post(mRegisterListeners);
mMainHandler = handler;
mInternetDialogFactory = internetDialogFactory;
}
@@ -274,12 +274,14 @@ public class NetworkControllerImpl extends BroadcastReceiver
BroadcastDispatcher broadcastDispatcher,
DemoModeController demoModeController,
CarrierConfigTracker carrierConfigTracker,
@Main Handler handler,
FeatureFlags featureFlags,
DumpManager dumpManager
) {
mContext = context;
mTelephonyListenerManager = telephonyListenerManager;
mConfig = config;
mMainHandler = handler;
mReceiverHandler = new Handler(bgLooper);
mBgLooper = bgLooper;
mBgExecutor = bgExecutor;
@@ -315,7 +317,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
}
});
mWifiSignalController = new WifiSignalController(mContext, mHasMobileDataFeature,
mCallbackHandler, this, mWifiManager, mConnectivityManager, networkScoreManager);
mCallbackHandler, this, mWifiManager, mConnectivityManager, networkScoreManager,
mMainHandler, mReceiverHandler);
mEthernetSignalController = new EthernetSignalController(mContext, mCallbackHandler, this);

View File

@@ -25,6 +25,7 @@ import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.text.Html;
import com.android.internal.annotations.VisibleForTesting;
@@ -34,6 +35,8 @@ import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.wifi.WifiStatusTracker;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.util.Assert;
import java.io.PrintWriter;
@@ -53,12 +56,14 @@ public class WifiSignalController extends SignalController<WifiState, IconGroup>
NetworkControllerImpl networkController,
WifiManager wifiManager,
ConnectivityManager connectivityManager,
NetworkScoreManager networkScoreManager) {
NetworkScoreManager networkScoreManager,
@Main Handler handler,
@Background Handler backgroundHandler) {
super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
callbackHandler, networkController);
mWifiManager = wifiManager;
mWifiTracker = new WifiStatusTracker(mContext, wifiManager, networkScoreManager,
connectivityManager, this::handleStatusUpdated);
connectivityManager, this::handleStatusUpdated, handler, backgroundHandler);
mWifiTracker.setListening(true);
mHasMobileDataFeature = hasMobileDataFeature;
if (wifiManager != null) {

View File

@@ -125,6 +125,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
protected DemoModeController mDemoModeController;
protected CarrierConfigTracker mCarrierConfigTracker;
protected FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
protected Handler mMainHandler;
protected FeatureFlags mFeatureFlags;
protected int mSubId;
@@ -174,9 +175,15 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mMockNsm = mock(NetworkScoreManager.class);
mMockSubDefaults = mock(SubscriptionDefaults.class);
mCarrierConfigTracker = mock(CarrierConfigTracker.class);
mMainHandler = mock(Handler.class);
mNetCapabilities = new NetworkCapabilities();
when(mMockTm.isDataCapable()).thenReturn(true);
when(mMockTm.createForSubscriptionId(anyInt())).thenReturn(mMockTm);
doAnswer(invocation -> {
((Runnable) invocation.getArgument(0)).run();
return null;
}).when(mMainHandler).post(any());
doAnswer(invocation -> {
int rssi = invocation.getArgument(0);
if (rssi < -88) return 0;
@@ -231,6 +238,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mMockBd,
mDemoModeController,
mCarrierConfigTracker,
mMainHandler,
mFeatureFlags,
mock(DumpManager.class)
);
@@ -291,24 +299,6 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
mNetworkController.doUpdateMobileControllers();
}
protected NetworkControllerImpl setUpNoMobileData() {
when(mMockTm.isDataCapable()).thenReturn(false);
NetworkControllerImpl networkControllerNoMobile =
new NetworkControllerImpl(mContext, mMockCm, mMockTm, mTelephonyListenerManager,
mMockWm, mMockNsm, mMockSm,
mConfig, TestableLooper.get(this).getLooper(), mFakeExecutor,
mCallbackHandler,
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
mock(DeviceProvisionedController.class), mMockBd, mDemoModeController,
mCarrierConfigTracker, mFeatureFlags,
mock(DumpManager.class));
setupNetworkController();
return networkControllerNoMobile;
}
// 2 Bars 3G GSM.
public void setupDefaultSignal() {
setIsGsm(true);

View File

@@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.net.NetworkCapabilities;
import android.os.Handler;
import android.os.Looper;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
@@ -130,8 +131,8 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
mock(AccessPointControllerImpl.class),
mock(DataUsageController.class), mMockSubDefaults,
mock(DeviceProvisionedController.class), mMockBd, mDemoModeController,
mock(CarrierConfigTracker.class), mFeatureFlags,
mock(DumpManager.class));
mock(CarrierConfigTracker.class), new Handler(TestableLooper.get(this).getLooper()),
mFeatureFlags, mock(DumpManager.class));
setupNetworkController();
setupDefaultSignal();

View File

@@ -84,6 +84,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mMockBd,
mDemoModeController,
mCarrierConfigTracker,
mMainHandler,
mFeatureFlags,
mock(DumpManager.class)
);
@@ -117,6 +118,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
mMockBd,
mDemoModeController,
mCarrierConfigTracker,
mMainHandler,
mFeatureFlags,
mock(DumpManager.class)
);
@@ -136,7 +138,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
mDemoModeController, mock(CarrierConfigTracker.class), mFeatureFlags,
mDemoModeController, mock(CarrierConfigTracker.class),
mMainHandler, mFeatureFlags,
mock(DumpManager.class));
setupNetworkController();
@@ -157,8 +160,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
mDemoModeController, mock(CarrierConfigTracker.class), mFeatureFlags,
mock(DumpManager.class));
mDemoModeController, mock(CarrierConfigTracker.class),
mMainHandler, mFeatureFlags, mock(DumpManager.class));
mNetworkController.registerListeners();
// Wait for the main looper to execute the previous command
@@ -226,8 +229,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
Looper.getMainLooper(), mFakeExecutor, mCallbackHandler,
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
mMockSubDefaults, mock(DeviceProvisionedController.class), mMockBd,
mDemoModeController, mock(CarrierConfigTracker.class), mFeatureFlags,
mock(DumpManager.class));
mDemoModeController, mock(CarrierConfigTracker.class),
mMainHandler, mFeatureFlags, mock(DumpManager.class));
setupNetworkController();
// No Subscriptions.

View File

@@ -31,10 +31,11 @@ import android.net.vcn.VcnTransportInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.telephony.CellSignalStrength;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import androidx.test.filters.SmallTest;
import com.android.settingslib.mobile.TelephonyIcons;
import org.junit.Before;